From 75c7ac9b17df30a4c890a298695507a4d6c4907e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 29 Sep 2024 02:30:05 +0200 Subject: [PATCH 001/127] Update sbt-scalajs, scalajs-compiler, ... to 1.17.0 (#4071) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index bfd5f408fe..9e191815ee 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -11,7 +11,7 @@ addSbtPlugin("org.playframework.twirl" % "sbt-twirl" % "2.0.7") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.6.1") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.10.0") addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.2.0") addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.0") From 1046bcdcc9e32f0a4119c5982b26399d3eb2419c Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 30 Sep 2024 02:42:56 +0200 Subject: [PATCH 002/127] Update jsoniter-scala-core, ... to 2.30.14 (#4072) --- .../oneOf-json-roundtrip_jsoniter/build.sbt | 4 ++-- .../oneOf-json-roundtrip_jsoniter_scala3/build.sbt | 4 ++-- project/Versions.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt index cd6b79c9fc..0f9146c1b6 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.4", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.11", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.11" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.14", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.14" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt index 13f8f435d0..ea0dc7cfbb 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.4", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.11", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.11" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.14", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.14" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/project/Versions.scala b/project/Versions.scala index d4592797ac..fff1e8d534 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -66,5 +66,5 @@ object Versions { val nettyAll = "4.1.113.Final" val logback = "1.5.8" val slf4j = "2.0.16" - val jsoniter = "2.30.11" + val jsoniter = "2.30.14" } From a79a8b731426d777ce6ac55593a2b6b893b12537 Mon Sep 17 00:00:00 2001 From: adamw Date: Mon, 30 Sep 2024 11:02:49 +0200 Subject: [PATCH 003/127] Add adopter --- README.md | 1 + doc/adopters.md | 5 +++++ doc/adopters/fugo.png | Bin 0 -> 14207 bytes generated-doc/out/adopters.md | 5 +++++ 4 files changed, 11 insertions(+) create mode 100644 doc/adopters/fugo.png diff --git a/README.md b/README.md index ef3cf3284e..ff235277b3 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Please email us at [tapir@softwaremill.com](mailto:tapir@softwaremill.com) from | Broad | Kensu | Colisweb | | iceo | dpg | hunters | | moia | pits | hootsuite | +|   | fugo |   | ## Teaser diff --git a/doc/adopters.md b/doc/adopters.md index 6b86241a9a..de943e777e 100644 --- a/doc/adopters.md +++ b/doc/adopters.md @@ -41,3 +41,8 @@ Thank you! pits hootsuite +
+
 
+fugo +
 
+
\ No newline at end of file diff --git a/doc/adopters/fugo.png b/doc/adopters/fugo.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f5d63dcbfeda00380b6ff467d7954e7dc32e20 GIT binary patch literal 14207 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 z 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 literal 0 HcmV?d00001 diff --git a/generated-doc/out/adopters.md b/generated-doc/out/adopters.md index 6b86241a9a..de943e777e 100644 --- a/generated-doc/out/adopters.md +++ b/generated-doc/out/adopters.md @@ -41,3 +41,8 @@ Thank you! pits hootsuite +
+
 
+fugo +
 
+
\ No newline at end of file From 618c40c982a671219acb811f65504776673d0c16 Mon Sep 17 00:00:00 2001 From: adamw Date: Mon, 30 Sep 2024 17:04:24 +0200 Subject: [PATCH 004/127] logo update --- doc/adopters/fugo.png | Bin 14207 -> 23217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/adopters/fugo.png b/doc/adopters/fugo.png index a7f5d63dcbfeda00380b6ff467d7954e7dc32e20..d66b2cd43b6e7366700262f09cca1f62cd88172a 100644 GIT binary patch literal 23217 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 z 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 From 2364f5a996dc9e0c878aa49799a2ca07a0bb7c32 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 2 Oct 2024 02:48:03 +0200 Subject: [PATCH 005/127] Update pekko-http to 1.1.0 (#4074) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index fff1e8d534..715996a5fd 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -14,7 +14,7 @@ object Versions { val sttpApispec = "0.11.3" val akkaHttp = "10.2.10" val akkaStreams = "2.6.20" - val pekkoHttp = "1.0.1" + val pekkoHttp = "1.1.0" val pekkoStreams = "1.1.1" val swaggerUi = "5.17.14" val upickle = "3.3.1" From 1447f4d867b9a1a070d34dd995815aab998e0d0d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 2 Oct 2024 02:50:25 +0200 Subject: [PATCH 006/127] Update netty-all to 4.1.114.Final (#4073) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 715996a5fd..a771b6f8b1 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -63,7 +63,7 @@ object Versions { val openTelemetry = "1.42.1" val mockServer = "5.15.0" val dogstatsdClient = "4.4.2" - val nettyAll = "4.1.113.Final" + val nettyAll = "4.1.114.Final" val logback = "1.5.8" val slf4j = "2.0.16" val jsoniter = "2.30.14" From 4cf9d51468bec7abd75623a023c9f54cbc59f8f7 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 2 Oct 2024 09:27:21 +0200 Subject: [PATCH 007/127] Update jackson-module-scala to 2.18.0 (#4067) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 40c871b9b8..260a941ab8 100644 --- a/build.sbt +++ b/build.sbt @@ -525,7 +525,7 @@ lazy val perfTests: ProjectMatrix = (projectMatrix in file("perf-tests")) "jackson-databind" ), "io.gatling" % "gatling-test-framework" % "3.11.5" % "test" exclude ("com.fasterxml.jackson.core", "jackson-databind"), - "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.17.2", + "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.0", "nl.grons" %% "metrics4-scala" % Versions.metrics4Scala % Test, "com.lihaoyi" %% "scalatags" % Versions.scalaTags % Test, "io.github.classgraph" % "classgraph" % "4.8.176", From acfc76da3fe753656e4b835985b340d846dd5351 Mon Sep 17 00:00:00 2001 From: adamw Date: Wed, 2 Oct 2024 17:49:48 +0200 Subject: [PATCH 008/127] New adopters --- README.md | 2 +- doc/adopters.md | 4 +-- doc/adopters/budgetbakers.svg | 46 ++++++++++++++++++++++++++++++++++ doc/adopters/ematiq.png | Bin 0 -> 131646 bytes generated-doc/out/adopters.md | 4 +-- 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 doc/adopters/budgetbakers.svg create mode 100644 doc/adopters/ematiq.png diff --git a/README.md b/README.md index ff235277b3..913a642bfd 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Please email us at [tapir@softwaremill.com](mailto:tapir@softwaremill.com) from | Broad | Kensu | Colisweb | | iceo | dpg | hunters | | moia | pits | hootsuite | -|   | fugo |   | +| ematiq | fugo | budgetbakers | ## Teaser diff --git a/doc/adopters.md b/doc/adopters.md index de943e777e..d9919c9f60 100644 --- a/doc/adopters.md +++ b/doc/adopters.md @@ -42,7 +42,7 @@ Thank you! hootsuite
-
 
+ematiq fugo -
 
+budgetbakers
\ No newline at end of file diff --git a/doc/adopters/budgetbakers.svg b/doc/adopters/budgetbakers.svg new file mode 100644 index 0000000000..809689faea --- /dev/null +++ b/doc/adopters/budgetbakers.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/adopters/ematiq.png b/doc/adopters/ematiq.png new file mode 100644 index 0000000000000000000000000000000000000000..b15347a9883991da307e232ac613b721e03d82d6 GIT binary patch literal 131646 zcmeFXS5#AB*DV}SL6l}is(=ARdPk~?ilGY%QbI&}uK_|=5UhX!MF z5Su0l#9Voj1^7+dneek95Ytn4Jw3BPbNySwkUM&+3fEOtWfWxw5m@_b2_Oe0*QTRXdFMJo=UI@_M;U9+=bHC=KtN3cd2KmTh>pz?vJ7}ke#lO3qBV^`Wvd*v}0dQ;~7mfO|ojF&yQ%%s8In+=_~xF>F3 z-rf87ZI;S{axU2`vKwL?3cf9<%!w&B3BBF7`FXw8FSIV-x?XY|J9k!c#?c{3_QWZe zZCH7y=|$Jy2M%RIuUT3qudQ?({+W}r48UEJmTNCwNJ~YB6{RU-P7hc-!8^kpxW#UR zc+R~!^P>mUTE0(i)o;qoKfA_AL_6Joa$!`(ve#PJFi}+Kei}I3#_R58Wv7;u<#5i;~HvVkx6}ZrpW9iY&FX}$7RtD`;I2{qid?@MqoRKcYSM;~_O<|(d)2I41h zAdoN!a{K0k(9D&I@KhCd=;b|Mc#_?mVzauP(2ZH|8)sbZ4kBJY6IOV+@!^wrUwX@r zb9cBuzRU*SB|-)<$k!cxnW4%&^4Ih?Ux>C{wU7OAHJ0c2als45M!}YeHDaG`gyAR$ z_xB4J52y@I`T8~62D~o1Dva9TNu0MD!Y@bSDPv6%Oh9b>@6Z1t@V^NBUm>8bkHeh) z&z&)b1*x=12o{P*9kOxR6GiX)N|Kyb4OU5oZ$qx5I>Cf_iKI0}R4gEh4 zX%4?N!uH>HBd5Qc{P%UUJ$Eqkf8T6BD?Rt$*QGphS^s?<(;&QZ{J(EjPB=*X_w{4B zlbZi0rNeLj?<4*fDA4~#6bSVHd|p_|Ktatq*DyhlNnHXXBw|8>pou(iN7j^FZeIl0 z$?0VVzzf~w<{dZV(e0}Zhqw`Xxa;4n5xnBT%61|+dRQx3AE|3wY`KQ}jtA((PCO)X z<{bVj9=2zfHMbnZ7$W0Yo&Q>kkOMMPR;gtAu)wCT;Z%bP^r$*BC^~HDwf&f!jTXo@ zE-NOmI5l7je0ewmnlizZyDw1(qaQE=x$v{^%_q|ZMe;}KH4@fhyVSiZo8rk}(`r@_ zsMK^g2jhv}~WopL>E+CCr#_L7CS&xFf#Jqxj?FSP z4>pcZv)0;TQo~&}J1di(=7uj*A(Ke=OUvEhlA$v|8}aCtpLf_NSA877Ox z*O-O_H)YOQ4JY~97hAT!wmjkbqI5t^Y~^^fb0D!I`)?HFNQ8`U&!t>O$tDpXJ0k*{ zNnQRs(@q!7zX_&!gcfipWEJTd(0z;_rhys3R(YyYL$cwe_G|uX6Hy%6RZInCjt^AV zh`mFVZL>j)HK&t095?eD@xWPp?TKz$)?DosyEv`wH|%?O%=Llfd=%s`0%>YQO9fv} za~NUHO-woPKw3%cnnLW0PoHmoJn`^P277DjzPkVsT}o2YJxqQAHy@$_&G# z?n@wU#2+bj=`K<$W7%&m*SNa19&T@YR@qFzf4*ilX)x~q{`urN2*jt8+XLs)_j$WV z6Im~!w_XtcX|fcE-zv9t=S&%9>l)3@M< z9>+}J+10TYc%!VQp)JD3&4AE=4NhbF$G%J19t%_KzBTE2#b2;_!3h~nFycc!>qufe zHcFS!lS_fUPg#9PrnME?N3=sgBcdzESDu@997~C~75{iZLLBh~xno;5JBjK7W|;Y*6v=iRWsdmA}*L3(osQOKb^N|Rbov>JgwrO2}IeN)Gu@~fC} zDLu8{TpbJa2FgZMnp?_Rr})99KJTIL2CAY&cRf9!!jsW1aXHPnmYmCegbg4IiXkji zC(u#X335Q#hRE7nSYdL=Gc*`siwR%B${j8t=iJHk${>Wz)Vv-p#q0YGx^SPrQr!3@ zHyhSxd+gDlhvHu@WPKEWn(yT4hR>SFMix7)AjxLI^yC32)F|g8>au_em)nr{(EJ#& zRWUkKwq(@=XC;Ps7#&K(720pwOgv@+kjOO0q$Yq70je{(`~hU2drDin6`VT7mtn3; z#~;H|&2ivpS;DLf?DD(0#@`RC=aZCzJVG7!Yi)`To%+6wNOhGqB>m=|+yAvi=Q3rS z{xvXbS}qt921TkBTS`U0I~ksv8UR&o$vq7bx~z+qAqzt6-_Pl%9E^BW;Q*+oADj)w zeFdahXwt;i&&!PU#@`lr9aBTvVB>H2L_Plg5a*q=Mz)hGPti_$TBFiRY*(F6-pcCy zZcL{RIjjt$c!}DVnSJf2BL3oHtwX;R`&#`f;Lxk0cvOvLl!WBdi^+5}^1usMe=RbK z{B5mv)-C)F$Q50B&hJ{PxsI@2enFJB4)(qw!WId;M;m}N`c~OAI0G?omy&3l^xNgq zKpq$|^7+n0U}XGyd$e72Ls*p!V*`1@9|wG19@Vqk?t1C0$5iWy=#O)*N)ZdN_ad7T z2gma|!$y9an$X-KI%0YW>Lw*M;N3FznLM<0v1K&QPuuU>NlmCZAYAPR`zmzzNKPl! zwpbY!_>|Qv;!2&d29Ctfqsc+GYip0NvIE5unF7j!@5-&MvKGIhisjRf7X;T=siZ=6 zQAeNBbEunxvLR(Y_vte$3psh!;e*(mEf4XcwSF$j-T-#(FmP(Cq+@;m1B^S0x%>1@ z=En+{R95h=C&b5uwz+cDg|Aqyg4k!wgRAd09Ez= zOO{AE81$$LBYwW%|Fa063jG($1m1XzCgo6FFN9!K+!XXN?m2*o79kJYl#QIT|84n0 zdlSn}9J*{s`vMeEwZfV+pXW6P(o@&oh6a?f+Qv^YjO`uO+)I1 zVzGj+u*-Yaj|+562Sg-MtH!Jn6k&6vIlC$8lw4Fl_#l;!xXT;6Z5@KNUBU%s{r+X-ty zP2$4ar#o{Rp}1D%eZj`>N~K{nTS}=xTb_m5E%>{*jIR^huUv zoKtP1GR3_otGX1MrHW@6+>$`84~BkL9UF&7riWyaNNB;Hf%-`mt;qX9bhKKhCDIV^kYc!M&53t(DZ z>sld`0`m@CW7nCBuZUxovgd`x3Xz? z=9#Gh?F~3ug`k&Ky!2py04!%pLxOe7Y>HQHYK2C^fdVeE3*2yp05hV+I7|IGwV%SS zrg=yO_{ov{WTg6#@v^Bgflf}cEF4n#|IYx6*JedHAdPD!twS6Mt261roNEuzYDrY% zLtLZ6i{2tXDZk#LB90pZ$`sPF&_Ep9vfco6ewEo2#TY4Tf>*27_I2xCXJK%SQz%mh z)?-rfQnO3f)pX<|cisdsx*$3Q6nre-0cFo8i^rx(XEIX`P+t-h9^+D9t)ccCkLfvR z*5qZ}*e6F7F5#}8!maJx#b{NLZwMYt@P1^CV58TNcg-UG&iA)p@UMBh^iam3UI8*B zIJHy!&FB{D#^CT)evfVcJcdl~Z(WP%;$O|>i)j#9Ic}$lNo{vMsm|!iOmcYCT^J&U za1MI>m=&l^3!U*<29i4jZoe=SBvq+1Cn~B&dla{E=(@RXdy9!OsGzUeB`{ z7jR=KhtE?u#oU=sLeT;xw&j&s1|Ip3>-(DQgC@z~31xM&)-!O1H&2@K04dS9DpBD< z6`L-+ofUP%LKCK1IL7PMf%6>DN-b5f$c1`j=qV55MpprtPxzh<{_{#>56Qol)ySLk z<#&Swv^!n`MWpmZMwgOTQ|-RCS}1Z*1_LWN5kyW%h}LP*YM$4xpTEyoFtQcF>>i}Z znhpd;NZAe9f9aQ1Lk-7YU7Yz^<_OJY>QRlcu6bA`(i0LQE%%urR7_-e5-vsT72{!i z)0=05nPq{vWfk8YXFp<#I`}^CH_xy}Mx*DZ#CGqii2{u1)NMBc_#q;YMs)%Y__|V4 zZ^QRJur6}WR*BtkwrxbRLa2its1&#BV^^D5F((5#M1!a50D1}}KbfwyIr0kjM7oOC z`OE~UHzX<^uGgJS&i61trxOBh@ z77~tgxr8sC$sNwh;@mgx&2QLy%M`P9%3}wk;RNO2smDL=n|Lm~H@dg)#cXOkox^e} zm=jhLW#4)%^4z1^v2IiEkPo|i)v;XPP3$c7dm3i0q#RH;Cl+&iu1G9W)a`7~8D*## z8!E>6E)QrFa{$GfPv!U9v4XsLh~`@TYl~pk?6xiEfWySaE%k_n6_Ntmjp`Xpr-t&D zZB-(@`>t&w!MNCv_r z{?h=1M>e5iW)XQX29~?Cg*X6JVb%kxyUn^pk9ysF42Y!7gtyY&==xWi|s zFr7g^^DO&>+{}>sqzjE1rfB#bJ}ZrE*NUC7z)GPcNCM7!Bw!Lz(7;*MUV#lP&-Q{H zBW)#)_2k9}e@Ky~e{$B<9Zv6xF2!Gg4iv1a^)I6O7xA1;6qTrpAd}))z}nn4m7H(H zq%Hy-JypR`VTV$#2qB@$6|z}sVOZ5VsBx9xGVV+m>MB4sn}FnIwlp}<;U1PIH}=J zj);iQp-!3`?Dm^??8`y9LE&?y@gn7QH(|aDNm=Rr!RLA3@W$~4=fm9NpBlsm8&D97 zSx-nYH}Q?bS~uSN&_8-<$PMkfJS|eK9}Hn!3i>vHk2-gEDN)VgtwK!iYG65=a^=8+ z!>QWiiH&n@tzYEoHh9T2IvH;zwmZ0?MHvY4w~>=)<5p=w@#)xbGqZyMXhgy zcZHF{Nb}1IqgC0}hZ6}-q2Xa(5>OOwChS281UeP;&GzzQ^=W7go4K|)p=MF|X#Vf; z>7%8;!zi7{_>(d7yC>w=g`_ZcP=no9;3m|ZEiz)d{6d+lP^QDuw<7?kVW5qbhI0Gu zrkV=@H%)>|3~9WE#6V7MMM9Gi4TVXS<36a>GLXFd&;VhLgh6OzL!usX&M~E4nt(Ep zjK-%1lweLjGX$I+w0TDbvi>^Zw-UP;XWH-9ln6)UlqBY0jgoVgX?oQd_gVRA{H_+B z`2u`0MO?VF0s`UZbgLnD!t_p&UB|}GxLt~Uz^kdqf$4m9c|zQ-w~LuQCHW?PWh8k) zbYCgG1RdP>)Np#q(5JqqFVN@Udk_QFza?i#oKkKaWqC_VHu0QPDTt($PGt{gdd{{t z7Q$LP_F}zo=LH9wA8K={4eZCR=(OX#;F=^x%PAw@W7((@ z&w(viR!~z&1m*eB{@-*pXbn`lIbeJfG+Aukp=T&5caH{3iGZHXLWIJ`B?uKM6GQ>HeTI2C6MzoC0;KdORiaTpFVke>kaS z`Zz9r5{Hc(XQog(akt(|{L%=m91`<5tmlv#B1bCesoDCR4O_0bz~^xc=Dmnfh^d@q zG>!#DdQ`Pn7uWbyXb%U{oju$0aEZgAyBYQgv)Hw*!ekj6yN z`cE*eq0Bp;gPT6ilpHaJj>rKbty|l+29j2C(9Xtd7=aJw*(j0DkihEb3qQ#8eDGA( zobCs69S@*xW?#kFSsCnBgO9`rx+VeC?_&OqP}CgS>7+KJ74Td>$exU`aO+noK(QQa z6DckKVrxXVA9(9@_I3srT!l?mneNn3JmHoC#L^&h}0|1WfLhT4h8FvEmsb9;&@5rCR1nbc`Q;$JY7+P zB5UHUZZ3SG25r+sr+c_CpPrggpKrd|HF^_WdWnuZ`3pFC3T~)4;mo*nziHwC*7Kp} z*NI1qUisaGdX-d_6}_}MrGc#y6EynYL7)R8em^e^mgDf-1v(u7&CB-c z-5P+?wzf7QDa|}8CzYmP$aAbd#6XhEW-5-+1Hr;@LbA)k1Um8{-b8J!VXMis1VWP& z1vMrCeKs7E>U$0I_ppp-SU0UfnouHvuspD9Bh#25jXH$259W>iRTp9ktj{_q+6~t4 zLx}9w#IG{T90wb1k&zR=lWQn4tGfocYG4d8c2S7{7VC>=H&NuUsH#Xzf9swA#Bn93 zo)oqf42Q1Ktt)53{xk$^imBiRntBK_=kLO z%Fh40NppTG?S*-VA@aZm(9rLGEg0Y>37!U$Q}zaRF61XMAtkA_ui%p3e&>dLr?*>M z6@zeyJCb)ol0&|v2EZlfVc@zegmY=wgdKtdvI!-!zJp+n&a}j&>c2NXG)Ag9UAi{l z`hH*q5cjJ8h=;s+y!mnA1#>0Du(vb&#V$Rw(Q!Xt&4x;*c%Oy?asNs-Zh@k;4&qF8 z8@yX1ud*d(@9?JXacPp-?TOC%wy1MYmbvye69yjNqpm7Xm1IrikbLAFdD2JAOI!Qs zK7VV!EKaVslK0eddlvI1$J~z@dJE?<3|w}9Y`snqMEC6C$`9WVtrrA|3nWMvVzj5b z4{I-Ff^!J1)c`x=?ZP?Iy$VN56hbSZ9ZrvMsz!sZVXHNijFJ)-Oa@8fcU4w4$+Ii5 zd8GCr;waet*2feRZm*UmPw&`N4o?f61muRl+=w(kU&6?Xi1Eg5BbTbYZ$HCR2tw=yC9Eb z^lor%|BOwEfFsq?%(Kga6hP8mLND^wevJv64bv<2h*eKxNf@&5*n~9+MXgFPm^K5zp$@*dCf(bi z{+C@aHSiKNaoSv$Y*OXTE>%@RkwvpRbn#_+Ocl20dp059Qzqh?aBo~h_})RsMzI>> z`Rj|!er$D5*%!xgSK8&o5Dx5w?_^psc*a*f z=bSOAmw|H#BR>H>>b(@;aq9w|Q<5NV_5j_4$I4K<4iK!!Vi8(7o1tJO;rZ4r?=}ZJ z)3LW0{%VEzvSA9!cXsu=p>+axM(-_-3o9!t4_XEB+dRYnfR6lkNn891j58J&*PS%$ z)d=fB1Ib2;46mx0Pfny6x5d5w<4^k|g7F&>YxqV2?@)7Rkgi8#3HD3j;+XV<0n_+= zBk|`|4*A<~4zO|j^UehgCD{QLkz5}fc6U#_-BIYf7uFrFNpJoGmam%~_emgnhE#Ca zWd-3E(JLWJzgxUu88)ODb-c?`uTOoHYnZW5O-huYvZtI6FhSDQfkyoSw54tYAadHh z*1*k}D?kGdRNRcM-jlj%b9)%dQ~ZVkB&so$<_na7(jW!D$@k_ul7tfR4IT~G-&Dxz zRZPT>{^!!g04=dQG?u)UpF;S3ocoPDxFz{hZl?D0a7%|=XD@+_1|xdEi?v`jc_EVz z40iFD^GDgtnQB|Pp$!OoeC!~(osuYARoHRK%LD(VQv);DKI_8=%K!bgHK5C*z@dQe z%{R5VG2V9h8yu3#10FG7O-dG+UU_L~4EdNu5+ztESV`lw{Edbv{8-1_rRC)xodCTo zC1!`Tx&osx8HtJ0$noe)-DSH6YB}%S-LC4Xi;ZT=5yX>~*5WODVj(vq#-4tITYZAC zeo_|f-s{>FS*po88m(K^n7ygHz}?P^!) zp{5fHmzFcB4;a~%6P3&1tc;*Ym3u?>T-D!`yBd4+-ccKe(o$yh)CN473s4az<-0=J z$|CuQX3z1vO`OQw(WWqgHiV80^r&stb#n9jtgUaDA4v9?gM_-Pf#k#<&vMf{2e;$8 z3T0e4b~I7bP_jp%Qc(I!D(wXCEnzMw?xO5#38$sp9jgzrPLi0^rc9B}olT7A%&YKQ zNEo1#Ci|cJ=>T@OHZTY}C}hv_o0i5!BYiu#^P~Rs{{;CxuTop!Lh&!cNjK31Zg|z0 z!PrEBiEryER_fcW(aK`Jj74wPRE6d~<73R;>yOXY+h`J$!S~ZNe}&z{3btVQ1eS7{ zp7ANWwX$wCl$|r=zcf3p88*q0WQevBM<9?~qkMmgdMZ6_I6i+xc;Syad(xpy8M|hl z)Bvixjc!lZK}yfoPu$5Whm76oF>WVaRA@hos4Kn3AqPtFDG`Kf>g_*VOow_dD^}&k z!b2-KREGAJ;RP%N5+lE*obR(&&HWNxe4{R%sA8vl{cfFGa=E=NiDHsfQn)YQMDLH! zaT!o0_WICO8mGh}Lmryo#s=nV5`F8|>t}7{>R}*R5w+Jd0+N{Vk8`@Nf1mHEoK8Eo z^CLFp;5WP46*S<{_}Lf5mcvkUQ{r_V0Ld2#CC?=gp_jV5d>;_e8*+xU%SbzXkhb)~ zA;cc&!ie!zvjG6pe@ms&z$N!+BS11q&3#ci{_Uv8yn~S@%Mv5?xZZtIO)yhY5QlBJ z4qJOrb@L6M;zzD`gDMpC_&z#VlJ}S~KC0Zi^*BA|j^HY`xW>dcuZs6&uzJI&D#Z^z zA+6lc>8(aCHIEgxbztu<{8vqrzbsCy%Rr)3SQ!$g&z=&3tv>U8f&@n&dJ2Ez$bYkV z8`_ALor-6sB!?QCmBEMuM6&^`2w%maS4mF~cEY}#SF{}4#BzSDcS^muz<)9MP|plkgAE-?;pAcsw#tyLiOyf?SEGw5?*k^KUg2r2bof|V@vv{mQLcv<#;%7@th z)6NI*eH4$oH;Le*sXunK$B$>)x8i1F9e#Z;_T0nXaG6+L34ecBMy6kZL~R1}pEOn` z+#G&qgsr>QyaTXmvZxvQ^MZVX2*jBT^h_fpUwvTW{S)0s0aggjz_%eo#wn4%S(7wiL zp1Cb3AHGA)l^Xn|p&qw#!57~s`D;|g>v9?Gd|ITch9cb(3O!$Uq^x0!j&%`8*;MHr z$<&h49PZ}>doV}ajTexaT{n{UYHkhOAVbVw=94M**4owEsa^?=q#n;K`(wfMRV`|73Z3k} zFm>TshZo7~MFY@LT#ED1V1Y*l$_{$!5$D2(b3Xe-_*P7oeMs4gQ*9m!{+2PQar&+C zFflWbZeosq2Ad7uBbVh*p&+ig$~n1S3Fu`lYW2d@7ebW_5w~w#Q=382aQhB1=1^&_ z^sL2q&5U|EDo#P#IN@VCHL4>+rmaO#CGWoiLb<;y2DU7`i!djva{?Jzpp@-}tooW~q?#F`c!euKRzFJOs z$H#e1`Re|ra{J()nbW=PSH9G}Pb0;#wD+3lK5arsRA|6LknVo&Qs9wz_Y9jwz2UB; z39WS%E`=(}INw4E+wE$-p{&kjH&3d|npz7MvgFa;8#9ozS03rToPk&%5_M82z1X!; z@aCXt33OsE@KKU!#d>`p(TOpkF-KbQ1tvVjvp30ffWhoT2^(FeVZFi6K|Fx#<9bhW zz7z;|NEDcmPH6_MJq5OYaONEna?q12Ku2{G$pd(^fV_FI`w@I}C>>M-1hjJN`kN$s z+{NvVcGsl<@dsTKfUvJmrRhQJKg_)YvM797o}ep(srS;Zmj=1Ed`;1>sVkUrz9@R{ zobWGhahs5+PhGz>LcmHpT}8W^;HPAGFOd|>e>IpC<6{#j7N|G=x0`3n70 z*Fhl8bE$5d;c<4U4)yp+p`fg4<9&M9JyM z5%>W$^y%fXb)j>?&y+r=($?A4RvSg5*#AU?yTx;YVHKR-ptT%xgS0vRl=1Q)nM?y< zVT1Sw!y4&bCTA@tlL&@bSEL^4eVek`uAU+vPnzO}1< z{?Sy>F^|@Wif&!H2ycoz>(^bxK)f}{M-RW8E~6B`C4Tc`7jufp@-P#6BS4;CwOo_H z9jb9DJA^`qhhO>?6)04FVmL5BNXV?`^dAKpgkyE8nox^5T#_M6@x z;}26CjE~ajE*f$jDALk)p_I8q z^Ny)U0PK_c)VI{v&lN~H7?N;XgnFJ6Uq^ljk!znEmf<2|+xke*Nsx0?T4&PBG?(cc zE`ncJ{a5Ahu3@wL(CTOBDW7gwX{tcMM!l>3rQb%i=0(YTmcRaaBQ^@#xIK0t`j>rz;`L;NX74E{)OADMchvTe0WL>Rz3P$C< zBG3IwSA9ll@9SO;!>i7z%l7&bmDo-X%Nw8jTF~xUeb{v!O*YGb$G^^s_3kaeR;-3_ zcn&j)O4=z<)u&bB=dX{VcU#E8Muq!>LTergS8D554e+~u>_ zo1t0mY71>!J{(>%X6RHu9o(3DacDR&pEzqPtK|^x2;%>4Qrd1H36-3eN;z;k`;>EJ zyOO&-j1 zAW;g0iZtwr?ic&cCoP*wQv-&8K5JdaL$kiKm5(lhLUwWNHm29aAHywlM`q8IdOkKCc;n^SRDJ$@B<-a5nhYQf?9 z696BUHn)h3Kp=e%R;qH+o%VQ9Xx7L;&di`O^u~5zg=hZHy;^uw)mqh}XLSNRlQ_b{ zg4*KHQ{Q%6FF~C^FE8vbWL`>JRb+>%6?k9N@=EY4Y^Qx4p0K;zM!BonUI+7aT45)y ztZNCY+M_+xUG+oD1cNJNmAE*DW)?a3sWT@$Zxl`tgBjGu%CVJl2CrL*ruR}%L)OM4 zwckm^9P7orVv`_mbx%VmOpS3^DVRs{UB@!`8xxXDX(Rymg9hLtVDIJGyj!iNb~Ogr zKT!Ec{Y3E%E^WJUz~cdGXyG=wP0J2~N$oMAc^eX2?CY)*YOo19T0_IcLmr9$lmjEg zW26-}L1tFK=4ghHCXO&Z+v?MT0UCgRp4*duiidS?)REYzfG>+iQn4o9`X9>Z2C8b5 zu|zW!up*oAU~_BO45ZW{*OvHDbG$Pla~UN_&d4fw`W%-r8(XGnz;Sky6*W^$TE8JU ziRFlT!<6i@>r>6KJ=RAxT}t$c{tj5nQslj)^tc4l>SHRRH(QU6AmuEIXLT$umhKu6 z;VU*fT5%t}p6Se9e@EUX`B~x{1)<4%8{^+lm+X`D`r!DG=#Pk#pjE!7zQ~njMd}lH zDZ;Z58(fPEKG})uz(q843#jqyE+vS_@3Uvs1iQC>ptttLXD6x=UqkMBE5sAPScVlE+ilA#q zvuIa?{ryDEV(HdYi*(?6Z!Qbood=@|nt=j0{GK-n|JDc!DeFJb77$#6@g zuX@+hJh=B%rbyshcoY_Fa14ziK|mLcP&E(g2Qu#6bWoyu*2UvM}Q0GctCe+zC+Cd4M-m`$|s zIMu3~4Y8xHfrsghV>z?H!#UQvDsN_Om+6$`q$}hrYqQEWG8*0Y2IES~uec2agKT5&zZU*8O6 zfrwK*uQs~t(pVj9j$fm%b*=1?dUQ_H6HRy?9y1<2o~t@hnNd=Pjk0m%$f#23y5*D7 zE{pycTYvcX!|57a;l%LIwtmwNB^Kx#ix7y9C&m%G*oT}RfBmcK%d89ftaY$pfP`M14)eZwks9gtPw!=)_; z@sa$Ad~2IK#vv(D7mvF?6I6L5Pe=@MtSyKv@vI)|I>x?|^<@mbz8S=z421ODD`%Um zWXjag9*wx$_Q@o7v03Y@TCf`a9+UUS-1zsTT~F5R>iFS$B~xMqbve#55B7DxSN-=_ z`e<%8mczR$>s1ECw(70JXCpmWRif%WW$UQw?@*>pzTwe_&0obHRvc|@)$3V8T?HF` z4td>TeW4YJ!41WbonrEqvuACCiyAIv)bCm3uwdohmIult2#>`?=CZ{W-xyL}s#ckG zQpay+j7L0bUu*e`ha36$Y&1zAp|hq5}dGCy;)#=>hakJkD9PE z&x#ewU3wPv?1ub){lsN;CcMqyXdqthOl-NMkv}LxX>-5~w@#B+Dx3aE{K1Knn%qDIxP)r~?!F&5gx6JHa%X6wg>EvJh({tP*fwGIuB z65p%xyX!gQHBzeDzfKJMjq6H4kKzI5kNCcQ6V%P`An|W^6$n&Qh>j=OX8KL7Dgj7= z?D`;)(oeo7w0z9#=_A**u34Y!-@?{lTRIXBMjzi@aCs+r?BvPomstF796!SwHz)jA z^y;OP=`mI}oz8NU?e5_yfT#e%JCFMdHRSaV+datB3)EURZ${c!`W zoq0E#$N6J4^!D5yNCz}MUf}4Tsj|Qanv@ac%F^I&_ZL_co+%PL_!fk?pxYOvN_q9< z`SZJ+CsT*SwhHaTd}Q2JK2U!c9OpwDuuFTXl<{x8{2l7Qkm}5vm7%AHFy?c;$Z_jb z>xxu&wZjpw#KhTV=aXasaGZ1{)*{S|A>yVLsJt=_3SRP6`g%zD_T!1$lFV-|``^E!Enjng!^@u-nhcTA&RxEy6; zdwe^4vGRemwaRQNDbTi{_zBluQKCrEIF>$s?MOO2A_p2+SHO%V} zkc5fg>)93g#1rcxN5qzH4N+09W9zjAvwp$n^_gmK-^MDyg+&82K|IES2^AmgxSCn- z%+(eg^H)ujE@gSkFy85YR&D(SLEm;4kC(a6h@E^Oz>YOYs_^vf^{y3c?_S3*3 zxDUp2@bD5-Ky~g7=I_GO86vq(b-XXV|Kbwv>@zwg;_m&|lrAT$Z zN1eQS@~<*(lhLIzS1|BPF6Y9-m<^-r)s?(8&c8p(y!qNnGj*T37yG8#TJat);@(c* z-)GkodveAel6WQ4)67orHSXVHHow?np0->};EfHMs(bgnD0E0Gyf+cftM&k)f2?#T zryO+_ooeUYw?JUO)Ba<-{!!`Ra z_wfVXvyF=}qVFbDFTZn%(Xc|Xn}l)oMi~>-CtOI9il@2=&dz-8<>$(7J7Ki47sGsB zNrKtMgpla7g!|4fZpkS;ztf;*-oCM;nfp}uc9yS!>*rUGp?srBMVWVRlzV^au#gsf zzj)k6vgn>hfeY!{?D=>{_Y(frKfJEde?o)!UCSMcm6IS`o?Ur<_HpLjX zf)Y{VhE&4_uQU8 zn7Ta%=4tmGKM%Z!{Zk~qkB;iMIJ+(cB6>7lN_}uFe)Qd~a9w5RZa2+nq2Gs&71gucoAyv8G zbwYpM5anP{@rc~LXT&RYCqY?D$U#ewr^%+Q$Q|{kvVGLw)vHC+)l_ONNX90>3XuL#Kx4pwUT_s9;^X~|Z7hIXNyq1MC1$zJ(S!^TC&s^ti zuBh3oPppW$%(5PKX5(mK(&fc31<>Sc`)mPg?*IYUJ4+xtu&8PJf2i9vu1_)e+WEPi zJE9%^Hxe@H#B+{x-zTNEJd3#GBZo;ezNMos*(=bFe{G4*$YeIR@}AoW$8 z+S(o9a_(CBF{YO-C4CRm{R5dG(zWdGeNkJ9(@ybSN!oVS+7<64^n9drI4B}4ij=L{ z>YrKFa`b1&-;(_dLO6ztX}zB(v0|(K(QSJzICo+N?~7kDpn8vgRdHG!RMMUPqx$%n zI?g>ByrNhmZ&u)VxPrgC{$elpJ5A7ELl9TG#>IAj&R3x6h%?tcmv0CFb@H@K8_#v& zl2XbuHQHyb(-$+UzNE$~c6qd6Vl3ZGGf+oojj5jzDQq1lB^)c@G{=e6?AVO ztGSydi(1p()t^!CwwW$ZnJwZLrQO>+diB?al|%%hdX`s|=F#(GdIe02IE)0f8wtLy zP(5G|>vJsp3k6N#pDzYx#?Avb^%lhXalUym&f4q@T9t=O165K{?%cbIJkIa_0_`G| zMf_$wg-nA(n+J?%)q!^}+8ZrOD`hBvb6m`3sPpG@WdEj}eey`urx#%$ju~v5z+}ig z2L>!R#o`rNa%4L_MN{mUufgvMU;PtLz$zx!WIlXylrAxO9=fN_92J&4l;1h3d|oZ) zTER#_@D0>E)`d%1rqb2Yq1pUwW{xxE4tK5^!MiyXPv=~yP-mgK(hb@xj0P|c;)M%Z z?!A!{$+z$&lbRw-BCby63Fc@?!YS8J8#9NUfwNt7CY1pTf}*mxa^GK-$R})&_KqK| zPwrpmvU%6l*61bc$1bg-u$NxZ^Y(q;7mCt{hgeBGX0D?+ee@XQN0Z$~jT+cF8L`~z<~jmb__6c4C9 zf7KTfU*rnr)NKhTL<0)DbY8wVP>z9(uh7-I&j7UY4gmhc711Qnx&#QT`yb#{<=}OL z0Hr^_Dn@=YU1~I*6DRprAcxn4*+a4pc>!Fx?_T}>4^MK;ZN=LtwiDnh^H~pAW=3et zQ7KuNlMnaO9lz-C6fjv2=3ASAkj%H_PPwU`f6vk1%gHefeVLY~FW^GtWE2BM*f++MC{Rc!URE?!NJJ^wZzE zAB%IUuY%%5x&jkOH8fL2v`TK7Ro1x=Vm)pb6=Lm69w$oe#Jn7;hP7RfE)9SoqWZOl zs0W(QTCH9dx(uV3Lc1c?2u(`SD}?M5lm5Z-|McN0VNq95s9^o(D?oZAF|Diitj~Fc z+@9M8*=xWBx@`j3V|2OS8Sm5Iz8Gh3{)rlDob}>XyB#g}7cFVYeFkwVriMv9Z26Hu z`*l&~J>ao_2A=}rQ2o*?V@r@Q*QZlwDj!X};6cDHphBO9SIhI-ZoaQ6L)`X;pXZ{5 zU&y$abv=%G##_=1A+}t4f$1#w0waEKenkl?rTF~Lr5=OXB7uK3lkr{DF8;jFu}>YI z*O)KxezB(?8v8VN+zQ63@)AD$lC%_`F}kj*$N4%zdg(klj`Sy()%@I6Nou?j@&Urs zyQ1@K+qQA>`ukZf$)v2V+o{VUq`Qye{y(0+Ix4E}4fhP)2uP=NBPm@{(gGqShyx5L z-OZqYba!_sfNIg7+7cT{k%`S?>_!RZmnGDJ>*`A zm(!8Yiu`Er9p0vu8wA8P=(Xy3@F$qgO^>^K`O7nk-i#lWCiyzywAlq0$2aD2tqBK; z|9Q5lSy`(id%V!}m3Ck9(u&RDX~;jR*WvXlE2HFDs1|SCf+$tr>A=1GZT`Ku70Ef; z+aY6Q77f|C4uG~kXD(nsX2riR>QZ2YnX|G&I`G^_KrQn#{Srg+jVK-J=<;+thCRN1 z>*^sOglKpb*&hSslHRtFA!m3jaJ!jf`s40S1_NxDHYFQgwBH>w)rwbhXh;^39trT? z7sF6|ZA;=5qh*g6E1Hv`QBoWoVGT8Pb-DN;jDZPxV3Xva22CClIzhX8UzAM5+UdC& zC)}|_6CmVmV$F1bVBm|#GU%iBAHy$fyUGI@J`fqL>wHr*fke!>WCw5)pIXmojQjPk zZA(hj)x7) zek_e#u8xMno9fxc!)p9b^Zn$ha+Zsab~BIa=6h{Pkc0CG{c_|Zj^mon9N^yiZ$)1% z&rcXJs%v8ZvapS^^y=lrXEscfd2^1!SE|ig^Y)lgslA{WsR~}S87PKcoG}wDr5qvi z1CI`#x-!6IRzixyfGd@=iJf*^yz(O&cQf%io|hhk1gH8W9&7~y)T2(I@^$Q-A2{eq7^F2G16c|2NTr{VBowe~Zb>Xqh zPlk$-h_d4QT0ZCVs@#0Z_i<>Cm2c*4JX*7Nb#8a-J7l$VV*SThFlYJ$g8B}n&S)2p zWqf!`+gQW9GWULa&`ZYGm$=RhxN$10iY!(jH|0Pn_eVTNC^Ru)xYXohO~>rKVCtyp#aBnx8^|-{+8vvGfC65)fft za(l8j{CPKW@ipc=7rQ5Yc%n%wi;al7>lxk4O{H*%AVpJkY=+>6H!QiTVGT<#s_t)8$}Nn_RiwRK%;LfU&=qhr#6IQ3Gd27Te_KXcRNuOOlCK8)E1s}D>T(-S zt$*?p6Y+t%bMlimIN#1>r#vXF`*s@mDbgro8ieAEQnTHblHsba>atM79pjJEKAd4O z1yK4oi~8Ra?=fA|wrlz-_0QC%-m=R6Ssx!nXT5aH&c3eflDzTLaFtLQJF}LpJ#xlU zFFqWZhvwF=6ERIriljsEG+b_Wssd9hOBU2+9ri>BZ+uLbs36X9Z794q${tv2YyC-6qC!)-~@EqAW4BHZ!p z1D2%H%$_3c$mnvm*8-X%xc`P`zFKz|y{!t$TkL)~Nw!$qI%D&aj!^xQY~A{NOibQn zf^hOy=)vOm<1vKk7mQo>m*ZJ(<$K2fl_wn!H?44NO_F7Wvyy4OfgCBaJK4m~JM&FH zZNs3H{lgtaQ`0z*wKG;(WT&duO|@J3lLTRTuM^6ksl8d_?%}vxy!kr1n*5KqaV28x zq>Q=CoNa04s3V}gG;d|+-kl;9P*c%`?Bg)(e`#KkXw!HWjK*LMfUImovM$vm#a-CZ!y&BTEghQ2>#hV zA*UZpeNV8f$7^7mPEgIg=>tt+SQyHXZ9R|G+!4^;! zy4j3wI`D$?|GcjxY_l2r*LIKwd*riNg!4LiDAcr|A&^;_()rByH%wcf*R*K3rN!a_ zp_Wb)k0_~0@t>2H5mew$=)bhf!BK4wV)2iYzv_8bTSndOmgLh9N@z@{>JbSiF|!yE zD_=G?PBE_+HmSUbF1NkS0p^^&-)!&VK`hw4!tpWGTM_&x|opz_7iggjJ6eq}i zQg`9Pj`MrCti^XcpFPfUs_^VseMn>`^ArDyBfhDp{}T=0i-$)Bd{W}3&V8Eg;sw?! zQbfJ|l1WYiz zk7L(>ET+;Ng2(&dP|hV@;54nzMa$lOIPk?;R?qZ1Bz4twJpIqi=G(aHtYKd?y7a`$ zamQ%Mn&)+ckoB3RDl?VrzZNr1!eWcImutM~B^xcnb!Kd8X~_Y8(^=6vVC>H@s*r9n z)cA0v5`lZ;JRCbAtg(9;w)gm(Iy&Gqkdy&A^Rsyea4Y;eo7WYk>J!1r?Q1S#h-4X{U< zM6b;lxdN)MVgnV^YUD%1_jYDHA~*sOZ?f3ZAV#d&W!?|kKfeDF?%IH^k2#HtR6JAy zY%w5DXd6CTmI7v;R+%R`9&T1Vgv4H77CVCRpsX4796Jg}J&72WnbNr_$|E+DdZR{Z zUj(0pB%sqMpQPHlM>8Q8y{dkrKHo3)upxubylS>m_Xy-SH&RX`6YrZ)n!2p%X|hqS zoBxiSy;QcMKFKXgb(y-96QF(f5;|p`b)pq2|E8bUG+c%J{(!WFox7>sgZQ!%`HZ8| zS!2J5Ebn^}(^d)Av@r=kJcR7EQ)s{2!5^m9H{6c6aVAc9hFE0!lnI%At8vM$C1vca zoTHG7`5t&B+bC8U7k<$_b2}(I6vy7M=zzm@xsc!Paug59OE0#eIlW0iz$d)}d@2^! zX<*+HSd_U_JdSvzfa~~_k|c_p39{642lyPhoUA^wxtJb)eHqTKvhkuE2^2{II*dKK zoVV{%5-=pI(I8isiI{_&UH=d7g_Lv1sv_~!0tee92xpD&jbjHmJr*t8$M9x*lw^_Q zC}Y2dCD)Wn%to(@&1;^noq%Y1JHlJ+cIekfb>x7^A9~C&qASX&Dw#9lk+jdB58Zj6 zI;~on95?c(#AA0$GYsO@ITx!fy{9Q90d@Sf;&?9OtR+(@Lj1@Uo0+ndJdb`VKY!?3 z&<|nmQx1Fy2~o1Na6S!N@n&tnLW+=fR(XnnlUwMHHMy~KSghg3*Y zY|A9kLn->$NDI)r1SGBRj*Tfk6EACp4kLItP_x}Jb8-Ahj}BRzi`}sZ<#T7kZNt?* zXnYSpX62cwW+}RMOmM0DoCtoJVplZL>-XaG7gIk?Z|VjNngVCxCoFF7&@zm*O9+sqW6xD&g~tIE)~h9Rqv2} z;PckD3V~>vZi^Mg*Iu*J-Srx~Hfcia{iEUIb5L;fewe;B_>api3JPO$R6=wAF}J^T z7##igzFf^!^M&%3!ENl|q8ksgyn00gr%l3gjyg|tN>5&XjPzC~I_-n+&fwXrGnrBa zWE9?}-g>~PFQ*A|CgRNMgEVUW$N)&l1;O1-A{-snzi_vC|BP>F2}q-Ok7&rGO8t0Q z+kkf8ls}-;-a-xB*7xABu_7_f9>UxHi!%6n`8*u7Ko1O7??81i@=Eq4RgEEKO7+G# zzrT4Ao}HU~R=E2`=Z<#Ff&|q|Ze=%_+<$5bIRdlTeuBLf#kdLTlV5mgOJ|A+u+MX& zF8?^`6TnShmcswH%86et(4@qu5I9??{u*&xaT* zU6OjWb}#SNU(nnDg*yF6QMYq#^ta<-Zi&RdWJ)HdpN&RPqo?Hq?tQjcM>m+HPcAD@ zr&*b;v1yzmwMbq|iC>ZrmL>QkecivM%2SR|m)BN;L(CWG$m0?C7Q| z1w%pdiDto*Jl@ewz;&&NBkgrFeoGzG?^RCnsscnS?0qHRH1iJljpOMtBtt*}hIIRh z+vu$rvuSr=8BX$I)e_5W6~%8vrQwxiMZHCBPu-C-@wA~Z@9?1}aX|$3a!-h%x z`zE(4#Dq{B<+FC~-4cPX8P7Kww2cUYVslk(jR;&Na)V$6XC|fl$#y$wfdVl?_msQRi-S;n< zG|i(_jnjMk!o&nPex*`RArym*eY|5w#L;hzH0QGr+bbP1iSlA#0iXfNkJB%4FCf0& zkSq!J>n-_++t1Jv0E~@vV})_hOmLyK47UXb%JF>yTe+q^xY;Sq2=-uQ;w^c98yZrGJnDLmB(fZ)^a=4!E6 z_vjMm%Zvo7@cnX?s`0Z&C;o%A%DTMEf<4*eNw&B*d+oU>CH{KFaltUwg15TGr7EOV zs9;gol?l`6Kq%|7F;#DyoLrfnKwq?sc$NP!IGf1*IM;raZSoN%=TPR`8d|st?)!(1 z&uhz2^{l34(hIXmVV3%Q*DO{2^6Jv9`V#Ll8O;lWnXgS zzh%`V?xWtl5>%>~eIECSf2OO-)_&cn#anD~x8o}`%2f|=0r}}s;tWT|3v6(YGmU~& zDF+@oPuV@Ee>*wkmYX-?1_*+{1yeuL1VY^4%t8lij$9Zd@)R?)fOAt6LK4O6+7vl& zx5d&V%IdBI>|rm_K4L^l-J_1~CoaG9k>C3=!maY9BZZ0Quu27`WO)&Cg|l~SJ=A> z_CteOmB~ag>i&A-9t@v)pmXaxx`p0iC{E+(&|ap_xSU~UJ0eF3zG&eQ1Ij#2Ltc@Y zN!aGV2~xw#La?sK@Q+?2b6M1tT7mGDHeMAf#f~V>({Ktl2u} zR;Pu=>GDm{aB(yFu}Iy4tA}D0Vp=J7?psI&qB^BbpOLX&$V(Hdc9F2E4&$}i@b%!2 z9t&6_rauS$HqGe2l5}Gx?TdiNMPPqeH@^OBWdF$6?VDFZs>_nwy-=0a4&lBp|0A9f z%So(=BdP}{9Y0)jaE zr8Fxj12Y_2W#zW!Pcsgl(4;~|+9#54)IYq%%D^-nfcJ)S2HgLYNgaiM{ife(MnXJ4 zp5(oslcrv{nSa6;@oT(Y){c?k`VH(*G4oV}{h*vw&bLkv-DVzgu(!b$^4-#I4E zEG$HbJaZ`>ee)k(YkS^1ebnH#?Z>TxTF1J{y%g)mNE^*-o#IS>d>`m!Qm>ZVCXvwCb_q}J0k_H zG+b$PcxyH41+(50kp1Vgi9 zB`TfbY@_Lhqu=9xsou#w{B^C&XM-qxjdo&tPJHMXyEk~Qrb+(e zy85`NEOzi?Z$G;&*^5Q`qL0VnyO;z<3f|>;@!**;CQ^Z*BWHY2_@Y=A1WQc71)`I8 zN=ll$L^VUwiZ5^Sy5S9)5=Qk}WagpqH(>T!I{Ue5CB9deuwS^S$V^wB<*$Igo}^)U zhJ+3udh4;C-!>ma5TC>9svYy=a$Jh|Gs{esGvA*qX!NgbVgzxzC0?rJYkM$e3)9hi zOzkM1&=QCbZN`Yv};eUQ6C@fahRaR>ZaS@F7l4#*t zcR@O+5oVegaF=ZVd-7(7W$(RiXz6jobx~Wzy6FCTT~Wv(1a|%U@)PvTdIC zsYqoTa>Pt(oYbZcVb`tRuUrhR719q^l=CTcQZ*ZTYs5oax#v)gkpS6hTy|Rvc0EBP z5AZiGX6QmRnjc^+$bhmr>B~I^ugaM^j1!XrT;5v!h^H?Mn<2cWU7| z*@WSCE=v@KqUc6%KxMLimNerN9ecUtP!?n|wiXYxR)R0<_hLHZEj-*iGImX3h^lvu7 zoW8m^=f|&W{sA3SgtJzn--RV8o{Rns{ABd2=oGr|Yw{#si*d`FPg7thySFZ}uY1&l zr0wI(aD#y0^GCm!E6W(E8+%?3P8ckq{o^@S(bjoyip+@2Ue~3bmjoYqG$vK5T{w$E z5B4GqBJTgY_}4`kuijk-TBLSh_Of>8(@8|2G5144cO~Q9i2)ZBYw5~eNQf%hry*-O z2MuW67K{CDU?=ZR8F&+Q-I3dsYT{a){Z&RGX$U(_(t`;bt)e~Oq7cVVi|GLq*f-cN zV-g!z(Sww{+*tK5E%m1CFikm`>~lP~{4GA9?VG+7Nhp6~Wf`IJDj2F7z!?eQy~H$PI-iiNe#b z3|5hWBhf52eMOtF4k6sEP|rF3e+tI3e@-zGkr!qB%0lr^hnHZX@z@GN$Frl~_2A%^Pitc7p9Flu9pjnXSHiO^l^}<+4&fd@jk_ANM3%Dpk=S6K8rA4m6T~X8n}_q ziW_Egs?Aczf48VE&FL??jTXtk{M`Kxv43mln)~d|sgP1uSq%nI`O+kJnyU@tY~;TJ z3ku&k1Yx%!SXe0siYMOyS6BZfEG5kuk+QybvTWv{ovz#Pr?RJk?{YH@0g-^k_I7db zkEZZt<>nWKxQE{q@`eTp_zm{o1{Y)h<dCcQq#o~yG;L}yN}@8L_ZgU-Xv#8S zb&HP-Lg%|eJvW^I?|)DR?Gq}Fe`Vu?9G|9nXNWXeT!ggrs~*b~crH#2GK;5>Z{^k> zK4I3S#N7>o#15NMu#HyP#Mhe^8L^sX`VAx9&1GTe7uS|^w##lx2gG$x#{D$Y9~fU@l+xA9#h(j*~RH3G(yErhF`xW@T&IZmx88@NQiS& zQ-7f8nKL1$53t0V&A2Q=e?GjYrOjWwE|q;eyB@0(lv0%X=}nzn(csgv>ffwZ$kYU( zI@-7=qNf;XIa<3Caa#2&2kc{Rh%)@4>prKFj;w!lB?(_{U))1wfkNPH8IS=@x4TM9 z#&TyrV4iiXN}?pu(fvICANE(Cu(}U}XMhC^C+}Q42AKMvTm8EnW>vX5XQKg6s!ja^ ztqctnaWsH+AEJ5+8S5v_eHuo+VM??4(BfF=59G;%(9V}xMLa9L<#=Dey>0qQ<=d$>*iE+7qg?fP4o2RhTXui+G@cezsdZHzT%&18;i}3q3+I#~*v#O!* z)LwJEj5o;SYnbSEC+A=OI{2@}ai8vEx zvS6)tIfup{(}K-2jnbQ2>V1jpmA@CJm`oiP)vDg2@?s1YqF+=M(pdbm-$Qbh-^hQM zC5Bd+&+6bR>uK!OrHX=wngU}6LVj+M^5newW7l(vW8x z8bum-+5J3wWBw`}S_Dy~jI%r3t^J+a3*4&_RXYYweAX=1`xr9e&%GIbk*{B=4%4J0 zn>{Gh6qkw*pUGoSC^h}CBabRd*=GP0lndTxL7QX23}t<6(8Xd)P>b$CQR@1Kw9gtB zV<+bp{!1q1d1}djd<`%2;)1mC{&+Wx@=8IRHl-Gv=QP%@GaJ6Ii2CP}B>t88Nj>RY z$jlc|l&@Eh8LnD6kP>|_sx^U0-aPeWb}k+Dl~o7Hs2r5P(L7u53J7l^omZbjBlZSq z#{T{A*tkL{rv@2|*Ku!oB(2nE^%@<&=9k}kH_~2;*!JKHA>r_#c%PY#&@f%#ohhug zDRZh9Gp>92w4kM(QDM^5=(S3@M7+dD>WFJTWNAs_zB&l=@$@rbw;KK((34P*Nl|t? z{O1e}de8&4nRg}~SYDeL^(c~lgY1SNvOfV+(&a9toH>wvlriK9{=h95DJ*Zh#Zt}^ z-n#LEsalnwif{|RQhDMt1jtn}C8FzoD?2r^jfyw=jB8pkn24B@c zt6ufmzp2uBo|VPx`f4u+mJ}s2ADhNkudGe>TA9xkOBCJG5$5I>rAir~J5p|>8C~YD z+o`Z?!O*7H=Zv`(B83~H#TfMSO^MTi$9GMs+48262lr=Uzb(7_Md>MD|3Sm;uSE_-|U)E zaWTUnzDQG-hkbCzh{SnxQp1!pUUg$ljBhG#q}TZ=`jXWL93gco=MMOE**Q&q?*dFQam(vWG=(ZF`BU; zMI)Psm>oC#L8&c|?uXDJot|1@?xxsRJmegm`E_ie$#z_HQ#t_%;a%eseEYpn)Q$^^8O|y_b1ynk?Te2| zX6NhopY#pE8~1tPGs4R$o4;_4$kZ1B@^LFLi-ylX@(LQbY5cot!qi&T=a8 z#wmN`gTYDB4_8YXAzIH$0n28RS?>=q3p$*+Q-ZlUsyBz(!>^ol*pMJHI+Hg8uCt|}JW8Y?>taEvP zxKkB1ezJLy<*3A)L}|^*9@`>%ZP9-zF+mtU_q5vBdwFzBQZ0<@H_|SLFG$BucGzv? z@*#tv9Lk{XWf7wc)jPVDxC=W`Slo!#WY?6<=EUdOOa4UuG%@oRm6!2$wQr1{s^t#_ z{;rn%!fzRuR5p!@4R_|7j+C*R#rGY!YLMgNmr7ZYH17djOV?bdep4XW9_&Kafic5{ zAZM)bkil9jtbHM%6MtzA=v1v;#Ms}ZS@EeKbN|GlFpcBN05`{Mro3jry`A2Y$)kW= z$-)qvom;?E!|;OOL~*sUK=@HJvzz%nj3ZMk`n|(((uYm5oZ+ zQT3{6^^89*#&dA+Ws7P7&AR?Yev}?*FBsljG4fUVhMRaHVDLwY3cCGhw~%YJp#!J z-kO@cca!oQXYR0==*KO3VWhsHr6-P__Q;CIS~Yok>9mH8PW%PhCZsAF6<^W`?K^>y zGxUqu?aJwAy#?N)R&%MpiAG*htzQd2_;=|bQSpa_63tym77Z_2Ek7D}MoUUIu@ZzI zTx%(OZ>CoEvyr(~^Um`Rn{Y};qTwT!(}6GfB47Ox-qyBIH4xb)DJ>!!%q^Dm zBQZrxg=Lx;6I9X`k`G?%*U1(+lb-uad^1bZ{q(f4lwK!Gu~oqr9Hi4nIPA0(=&$`6 z-!a5DSrP>DNtfow-8>m!lLuX?Zn=+FWC3-MpLwVR;&+EU7Lovml1BSzx}=;m6k`u~ zfm@l|K>aT<{Z3DND=s0;b6Cq#^zRFW)Q{T#%Q5cc&b~dFpDva7PYkkiFCd^I{`-u` z4P`g-XtV+n_@J-Z;8sMU?~D=%$qoThcc91;>Vm(dOGseebGyVtB2)$UF=%DOw>&ou??Kl5c z<<834VW62qndTcLVe0Hr%L>}T2lq(i@O#Tv^hLtff{fsejl}1(80*dJrCwJ#k^ply;s$vqPBm0kxqzz;&9}^tQ#1AftrBOk_;*f-C{Au zrzFPE&}C`iaR9HtG;vympr%rNstAXQ(xg4jO=FFt@VpM%@bqZT<1xRuU?j%o7L~Z_o2xirYhr@LN`1z=9ER_w4^>7 zg^{v&*{}O79on*|VDa7D_fr|o+WI(hHhCN+|7+**tTS;})Av6HN!HqJs=iOWnCdrd zY*kTWHof_Nk7(YlciLH39FJQtQ+Z~)zy8#3DB`r{QI>pNwaAtF>ySQ3+sm`&{-MX) z(o*3AWO*&02>FNh-oum;?eM^bmKG*{2QzxYhs6ekM`QmW9d$-k=;dnbqnf7PONTj~ zDwX7@*bOn`ni?`dDu+T}wE_!^=_P##tpd@SG1J^(EZUEGV|L=>&5e?M*E?F~o8RBE zaI5Gwd{^!&@rYo@P8ZlGk^U!UHQwXiDmhdrN16oO>IpYOsAsMh=%|&Mhp%F-uw3Qg zN2;s-08^}G;KdU_U5_@$W6T2g8e<{lzdo$H#rPGPq9uS-~N9YQ(oQQ;liD7Kx|?$!qu5uSKPD;ejkhxt)U@PZD{m7jBFm%~u!^%t(GCgj*< zZ~hmyg8{p4Yy2L~=L{8pCu4=hd+JDFPfIR~?p8%Vog-J!R&s1_%Wzf0n+^sGQR{UOurL~mYK`gdwIq5xxi<+`}7+z zz|hvXEMwkZqPluJ6ZJNdmGuj7H!GJbO$GZNS^0L-YG?IaMolo|hUsn$m>wcY+`R$` zyiIkJdf&6M3{LJyJ|FcH?h^%FEe`ze|6aneu&5NXiF7J4;Lb}#f{HJ41!GY5y`1nc zyyz#3K20M@;UV(zy}Z{Gn)Iz_3fz-F;-64Hv+q(L zf)gS@QGjEhR{VzULc{^`BYvExyG9j-GnHC3sjcUS-m)$=s~PGcr(3prlIve9#yS$Y zUt0Ta!p0#m{t!k;C?p|jBwBOQDIr2Ehnt?R#phzpsCk%mCMvkYCW=Gv(^;q7%fpVu5D(Y zfLLSoy3%QTkU{U5%#)>U6t_P;emxE;@o3aCA{ae>J}Q^#Q(jQsq2>;)j}Ae1AGavn zG=QTwdj&7tXUag&Y3M)o4v%CYTxtQ;J3j~Hi~^v>@Lg;z&rA@$k%5C&c}DT=^Y3~} zx3!UZKWuQ8$^a%25IpOj?BMQ80ndSEhHfj&GwS1szDJMT5r$wZlrzqfB@q1ZcAoeK zZ2|K-6TApe+?dt$)Q(2)$+MvY#mZ?xsAQ>fV=sg+xxzkpljfxuJGQQfz_Q6 z2q9Vu0EcR&Ue#dit8d(1?oe!VN(!*u73x~7eN8ec{BEK3f;W0}nI0^`nkqHS(5unA ziVx%P^NT&G23;OoF{pam&s>Ep@#|39A4M6&%{`Pc2AH()9*E`VY3x1hyiYSspN%xf zc89PqNAin>(}MMp(SfgCtze(HYbJ9Uy&C6NMk(Dx;ZEpWZmS(t3;$KNvU~W_4~Ho| zHd`vO%SE&Cho6kLnxSKSUC4l0%9k?PFYhQ*C8=J&&K!@r{Hz_T>Es$$7}jJ#J?fP| zP3OUOzc^aPUpGEQ^mQ7|hP=S_>tX8F(H4QsX8pNI`8a%;S} zPthaxNa0xM7?*!~caPkkX`)%iSRS*15tL7OEf}n})LzB%jXv?Wnk__^kHC8n9+RpU zB`q2Hr40r*&QCv;8~m&(X=;2CEjL{C)!kCG;#e+W-0^8GF>*0dx9Fr^7PoI*Lz!wp zFt?xy-E{}xG2o8S+E-;kNYZ1pSaA)ICfd57H+a8TI34+grefU`Z}zCGvOs3VU(t#fo905$<(?PG4Jl2Xb$ zf2KSD+y7l4XLuLd_c9=7Z8R%4pCsM>FQ04222@sCfxl7yLOT%GVdI_^N6CaflGHqv zQcPDKf8o)Y&MO&s4A9QmcUD&Q&eZl*YzXF(1M6WR0K+(Y22AHk@WSxbF(oNG+CkOz z{Yp3XUfCSiXUa{DS|9Fw6deS?A%vZrX%ZHKzk9_iJ_u)Z2F|5F zV_}Js`sLddIoQ>(X=(CKY|LRxQTssw&8F<+Mm4s{Iv@Uzu~Pb9+c}RInZJ8{!eeEi z*fs27BdUKqv-4=ab0q)StEJ1RzqNMr4KFC)RuV5*&Wa!6pMGLU#{SBmwDwd0n)B8U zQv6pe`T1+X-1Ij3{%2-=3AW4uwIqGHSQTo@TDwOHmv2(T7d{iz??2Tm0Us-oeH9eV4zBlACwN;K^+7!wRr+@fb~9OBU8 zU#vtd#xp$vj({CA;5kD4Jv3>*@4PA?*!LuTh)x^@QaS6L=VdFBv}7&B@X?Z6LP3~# zCZ;bNd~v@^MM3hgiy>GTj;q5MBf2CC{6(bP_O?Z~V|Cx5j3a>+&VDekhq<3bv+{^D z9>&8;4$MQkgCJKJ7ySD1^+{J07Xiy)^$_bj%Zpku)kH;j!+=xVeJwyYSBwR%4~l#9 zy#|Fxk^Osx)bhEz18aaK_7dqAP0s~~$o_wjT*y+@#?X=U$6l*mn!T21Ttgww|H8?T zrcM@~(s-Rm-{$flOYMpJgX)k{t&5R%%P&-;>Hx-BZ6?RWefbd>%?w^kY)X=x zV(r>|!*4rzYhR_s^qu0wZ0vvqyWR>r;SSmqAI9q|A=y{5c(6s$y+8{7)-Kg=ab`S7 zJnr12H`<<`r#rLQ)M$8=>1IdgIc<-Z9i%lXA0JhMmm?$($MXUgaKE-ywf$Q>~aL$e7tVOE&kSe^H+Bnh+v4Fd;Bj&`Xbno z0omtj+AdAoiv4*bR;8ts%#gFDUFaY)s&@}5@=KtN)4R(~cC4wk0EyLM!_GyXlRcSr z&g?6n<(nPw4Mj<1C_LdqU(i=GL3bKA#|)jh#*F8X4fY-1RU%l&$15y|lY)!6J5|VTp3I}K2 zAV5XQXtMiM&$8rPMi8(Ne-nImw98$%iv8oVxQjWME+5}r<}+8{88{yFi(6$iV+@Ar z-o#u0+20oKBL)AGu98Z;>MeS`emO+mR6HImO23Wsv{g%=>b{jH zX$IYu=XW{!87ijpl&I9zvfj~!DjUggKZO9+yx~m!F*H~ydx-3SRWc*bjPtqa@Y^7% zpQt$|y#Ln=Fi0~rYlMi#hLh}mlg*+2nmeY+hrcI%fh{N_09|ZBb`f`%3`U5giZNF+ zylt>}YhUBHFlOUhM3J@~capuuB!(ovxV}g>uLNIh7D1csS8u`IVrCjHnk|r0Sgj$( zIc85J&2-Y7yo_h(_>f`lYmoEjLl&2Mq~&ifL&-}6)S*#t8Se;DF5}>p7#;nW+UcSW zxYu9yS)YZ*>$E7;JD0lkp_A-IQ5kQ z-*oH(3$6!_v5zkjc3~|=q~NSuFea$n!d9FTB4vSYY!D$BL_%EAkd2g zU7V~gYC;nWK7SH(2S+g_VIOs=pzV$yQH_&iNkN9l&+pFWb;)b;1Qe&U9Clk8r7^x` zj*W2?rp8XJYT&mU z(tcy&w?`hgHKA}Qq8p)jgTMLfzN@227&O$=klmtwMO$as7Y3o{Sxh>6UcIzOl8k)x&->g`LLS56|bNyqoyA6qXp zX6>6u5LN}lkgZ8M_T(INcrr}$Oaj5m5hYDdfpX=Tn?dyUUgcQLr5eo^MJ6{>guK+U(43=^xY#WRB~Yb(EGB zj2`**JvQx@4(eF2zVI-}M(N=L*6`61tpX%#AX7Ir#{M~0px^07h582}86H0<_7)z1 zcRzel{|0&>a`3qltuMH)=A{q$gtLhZZDkg3uku9+4m>m!zRbM)KtnagR4;aPe|Edm zQKhfu(Wuhj908d99Bo^{@is%ifTvm)-?tyVr~_B4XrLE1fVh=6#t4b}zffT`{| z3*YD2MZU(}kDt4r)PJ!!IUh&K#MeK#8wO&F?5_d@^Q7a&(UTiP0oNb{pBaekXM=zp z1aal@wj<|0z?Vp2@CqkI3A&8DCIPVO%N}Rt{@k*99Mk_BXlLlY21&jt?G0JS@oBo3 z+3N7&Ezd^1QtNSp^e}{h9(uJt70MuJ+IlMnp97hMhkhV#Hz9C!(t4fslJZ^>J%%sk z6?0WJ25FRVC)iY;`}n(U1#zz}7dr6_Md;##1HRCI&8JxHILA1@`n8UZK?3s zW7{%HLPE;{CfPa|&<6 zm~%kP&m>p}yTq43&`16^RAg?5MD*=o?&koOb-IMnhGfvd_mP3*K~nhz+0yyq>wO#4 z4;LP~F~lF~91~{O&Y}o6)s5|LgX!vuvgTD~`FF4N>Wuumx57m_KRST&H0WRC2= z93vdl%avq@ZTktqxq4~3WW87nQ`U~2NA=49x$irB@5xDkEibGystBJR> zMTgXLLwjt7?KNo;HWsNyuaXUUbwUxEcxoq65kaY{OeKBrI zy_@*HJn-$*^Un{bu_}u(#t2AM|8_4KoRF&q6myCi0f`z0)~4zS)05+VTHhE}Vvi5i z7S#sq%6C)GFh~5@$Q=}NwB^~rw~A>0U>H40|6Ahss9mV>Q#_LL6H9OLK=Op`rm_P`T8x5Zqt+qw}QCJ#MR!0@F2?oRh2IiV~DBte-VVD?SY z7N5eAnoa9dNQH)?Jz9t7cV@(Nc!Btu_|)l8>CmA?L{j9&CCBKDin3+#Neq^)Dmz?- zD>@4;KU5QVbEpM-qOB+sKYz0!yS6gyHNIzhY`(Mxwq?jmwyoB=#F2u{cIwJLOD`B; zK_FB@e1A^4Rr4@oxYot!PLe^}?{&WeuBN9D)jVL($$U4PAaE`LuYmZ%V{`?;r{70Y zfVH#?aO%9lz%rKzGCBE0!flUbuP*S?HH8oCI`@#a|O?F-{j|tAXDT<;SU9hxEgMo0m6n5)yl7 zsgBd6w4t09G$LW$1T0PyA%va?iT(!?we3ONL)j;-5HvH3!i-Q$?dX?$fbzE)x|ku2E5s%WExf$4lgS1?Ts@71IW% zJ^Dn34oel`6-|5+-)VihAaHjw6ugYTBp(Bn?}yf{Dk(=v3GE?*wxQj*Vy)3R+l_cH z3>BCLPMu;$DL%)_)$${MPkv%U`*L`Q%bC5eo=vcCwlhaY$9l8RjUo08qHgb;=<@E( zPP-CG3)0XyOEv1K@BjDVKW9u3pmf5q`h^T3e*ya&xDgu4;f>VU54r#Eid8ZMA!dhH z+`cWn#D*j=z2dsjQmKg3XvhMh7rLd{_Sr{BUmx*uLam1YbvLmg_R11OFDgCCBm7s? zuWk|;9KrYY+o=6@Wav+wPwj{++kjjLiQQ)JL%IXt^r0u~ClOWePRBqS9;kYFor?{V z3#50zma%)(@UgN%#0`+7bB_DuS$Er+19vW4W0skh{(SoGwrHG?4Wd~}5#~E%B2Fd# z_z-W+X7O9qUa-2!mv!LWQvc2AwND1&g~<5`7g9R*H-k?jGwKxr{WzMPug;%n80SdN z?W4cDz@a%Nw#ezuJC3Bt0eZXPRs|i~HAOxiU5!PcANO<4sruVR6*N*?{Z}nLMb1zM zUc0?kJ+*%ALSEvlhEyEuRxUepX(J}_na?+vIxy`}^kIPh*n2WDYtHLFQRoJ1#^pD` zL+gIMR;$spv{w3;XSPwmQ&#O#73JV#wJB}dGm?uoz9Lby6pPDC7=nhq1I}md($8{k zgN|C*3xi3;o>-7494NnTNlCR~7`0>Z(wbu=`TD9?Ix~;iiicMU>vQkzJ9}X|xL&mh zErIv_x!dk``<>a4%KU%(G*%zc774BZdfUNCt21(6A*6?5PLT3^|M#= zUxUMcIRM74?5W)o`ws9$x?s#9Xp$a74_=Gej*Ng#su(T|F7^%uyqbfiJ<$ zdn#cc!tb#6k~fSP7RCYEuWpcs3Nong8{1 z)T3@1F*Y#!gLH6=+X2=EJ_NMAE)R)B<*-iNxgiSXcZs}1IrRh2 zHJ`kCkczM&9K-HsNI&#fD0dM0{C@a`ORL&~#bZ9_-O zbh2@wZcBn)lRSEkAJs~yjV{GAF`L>&QW4?msa z?x#7ec~%9F2BoLpn?K3wtyZtw{QHNY9bkxTU%R+%c>Sk^?dpKyuzjU=ne2FC#B{nR z`5{Z6NdHtmz*!4&`9}5_sfu{`St0jwtWde(&CztZnGSyWY#!Pd)qe_WA18rs1X-zKMGLD=M!NR-Seprkh>ekyO ze!u&ixe*LR1%a;o1ujsBDsTRV*zy9e?S8;sp>+TFQ-=e16Y_~TBw3kkFck=OFb#^TmVA~ucP8EqNu_FO;g1Qm=HY$O~Y7P}y+&Kl|3Oybn4bSh zRo?Fb;`bw13<^rldavlzOT1XN`6SXuUf)&3str}U8aNPAWcn!iAj;I1CAQ~1zn!Vm zAStmsMu$X0?BPckq8>kv&MW^uJQ+FwDYkAuhe@;=e2}B9G{~;fLfYTcBL|&lWyN<^ zC8Vn5QN+A5MyTqFNel(U$!(WU;&5fef?p(~D_bPJrwmKW<_u-PsPn7UL9R2|*7jyJ zqKb?kh}q<#h`zyGIg8Ld*fSq%%5v4i|J+BU*;NGf4&8ol|x%(X>{aP3*xq;#8~X;!xFp^ z?D;ve=IabqFXQI|?~%!f#>`Y!+a2)rg8JnV2j!E>sTtCdS8gQVvS6QS>o9zavUv!^ z>-MD;(mv{ z*SdWc>Cd}czraS*Kyxz^#(vITV>o-M^80~$pJE1t)Z@9k5+)-1q?-M;!3PWAfnxZb z!?7nw5Fgzw?om0`OSHOU_xlm^qqFm>{-~gA)JbE>Kd!roqm6W|m>Xpi|Hk8nm!?rw zObwEbQ?HG01nGi!?>NbrjlM0i`Pg;*@eun){dL$I;MPpjsi=fpHv!_YN;jx|Jh8B=YCg;*04jDcIga(II2`1$wc=zFcngYZz<+k|v2# zv^%O?qeB+46m`DkHq46ltxfHU4Qq!#>MW3PnJN;7l+ABfyYMeW*00iDu0~M3gi7l8 zb7ASIhcJFY#IEtiPQaMS9>#k&Ks_#S^?cujJf6j|p=Kf*ckOWjwN92=a*f#=r!U*f zzXaqvtYs*`WNUs;>TTH4Iee3{np2z0j^PPmIk!P#ro;`5xvT9{md_^kV^+jI7JZO^ zIF6D004~kPV|t(UK?G?5`A$srp-^TF4PqL8)1G_%RrNUSI)u1rdfHTY90rZA?-wSz zo=di=t0buY`w5|kTbF_Xi;XHEz}6)A{Ss(FgO_0D}UB?G8%%85!}Gl-~(mO3t^7l(y?TB&j;XgxP>ZY zzP0N>q_@h^D+aWC84?CByjgw2!HOdR=XU7IYtWoddHm-Qw+my)af)CPj|61lGf04G z#OoeoX71mKw<@VJer`GbHQCp@SkOtwT3H9IGF>_|73fGmB3KQ2m*R?tJ&Div>w3k$ z2}DggYqH|{FSmMJ0#1kI85wo@i%=E5SyR_F4X2oiV=VKM_9<#L>@(P)KIQ$1Wrk&G zoH)jsxi8Qny=d6??Of~$b)MNbg=unGg4AZF?BRm03+SM%m#)Uin7V>%)YoFI?ZAPT zb=cwWU?!V&kpYZnzw2HV_LF3WA@-1DT`e%{+NTRXX{{s|`xTH_?WAy=RegNeG*dm^ zpwvLl+!g#gzvaMt(@@MA;8lYs+aWV9r<>>cl`U{3$Pr`(Gw+1p<~mMe0d@2pbXq-`Igqm9tN)C;6saAFU8P+Y<9e?Fx5!&JewiK7m-bULh&+i{< zF1J1=8*8K-x2)fCNwbH*_IH$xEP!I*TTNgc6>Y8P>4&EjgU-F^tE~1XH5+%@j5~5QTljW*-GiR#%}RDu5u2dSornY zBXW?Skx+zAzb~Cp_7^B@_nvtt`jOV1XTPmYa?~qRi1K_t8(v*#F~7-6*)(8Z^Kz98 zWjeXx_AZ`E2#h?vuk6FE!O_s8B{H-;A|VQ@m*4Qh&W@ZudY6>is@OGIx+O&{gd$y* za~K98fUK~f?*2f%O2r>-k$;#uh?(tJ8>+w6YTa^l{(0zkLcKFChG>q=jqh_{&}e0R zo|U|~l}BTH{p->Rww15>cYQvn)N|IX18c0Vib*50=?1?osM*r{VzKuQ>%?K+^T(wF zm)0Lg(X9lO%X1F_v10F08@c@-lMX=;=iL$1-F?ac{%15oXdL$#vLYC76cA2Ah}Vyq z$wHb=yNN52Pd-3yDCmiTj&%ef)z8U^VDS2Ue{Cij|8|pA)$V__(340I1oQ=C>VfJ2 z)wdGy1g!3^q4xYS4%L%2ieN)N34~-up1KomkJ3Yh1$(cW;LCrF0=tQqu~(L%S7VR& zcWEdHp$wS8Qd44gQWK!}V)1$5X!61-`aLY5x8^uVRhQd=YJt87D*vGtnX}Qh2+ab6 z^2%kQ$wN{k(+__|+1e<(^L@lDv5A@Ts}*BOcyp~UYa5@B0opp)Ef^mXURko zYtne!1JSecMF`$b9BCGf5aIK(!;f7vHBrazsx$6sZ)eOmzA=jW85fNwv8wJ1HBB$v z{}xr*s8CNncdE@cv#Iz(98P2Kx28#nj$!a8eay*E2&?F6YpM5nw@Qir;@cXZ9xGAs zkwPIOYv}vzo)kf!wnavd0n5CU1^UM$>(nWmD0o1yzy8_NckTnrjZU{!`hn_4mkC+^ zj?uxIQI@?sXP-8`Mf=*?-fa6Pk7i)U|7?1%nSuxxjzKvis7ftyTehZF2e zPE-Boua^%7B-%hQifqLK&;u-F0ap_sZDQu0{JqbI%|gi+F7L{du_UZT#Gb>1>z#3| zKo?Mj7&*FDp^s{$|I>Do_8KZcLdczx$x*O3GYqq65Tgi+Xbx`*Uys)a_t%bOGQZES z6;P<6GC@-k;x;kvZ~!r^c7_0VJ8&Ryh|_SB&(>@sN#j8$hLFoN<+AM5ht)JHptoQkBk?<6$r~DURhym-@l^j<8zBo%)!!QmbWua!=Vc zB6NLwy2b}jrAdQi(8=J&NFXeWWcf)nRoWC^n=b;}33594w3#>WQon6%+g=^oT&ecZef=AJ z`gYh+4L!6(sD3_qKxMOOEF?sO6|;WWqIuh5?UF^xMhyO9Zkkr+a^cD>bbg0+fxur7 z3(bL8))lX1q!IBd0=SJp2g*t?xQ-X(fZ>CjulL8ThT@^=U(1o! z!Qgw*TgIXjUK&<1nv!Z%g0pXaM`XIDw=4w4U7kF&r7z-lu*;LaS4Zl*Kg})rm~~w> zP|fdGqQ5nQdz=Ql=nAdm-=ZZ6pCA16Pw#;&=)@Oa?0T+J4EWI!LNzhC7k7dn`%g%4 zEl3)p16J+jhho(}PJAu2S^?YfhA{(+mgeh};}lO7A0PqW@X{2RB30nx?kmUT_oeI1-+b= zJ7D%&{zR-h6Pmjo327JTEqX9%-~@sfq?J&GzG_6_hU442e19C>eh-e3jyOCv=23|K zaAgXtEX=qkH6T?h#t<>nx*!!JA*B$!TOGD;{czv9bfHg>irJ} zpC5^l2f{adJW4!?aI>8`o5NcfqpuvJP3Xys*vvSy$$E#q1~vz6o`wg_|E~P1wyCx1 zEdpYm(e;e=_9%;=UJkszj5{0^9bF7oO5+;hvc2R&ZMqH3@;s!Vs7h+;JTP>>nY&{e z5k{lbM_BREaKKi^lg>aSWe8ommH%+mp018DAF$@~^mj=%{RL)YC*k-Ei9T1N=2^0anuYj*!SU(B0Wu;Y1iUEKWy z_%Pzt+-|Z&218mSt;W5ALIyQ z<&^k=FND}9n4APQ;Zu72ilg^Z;-P83=q-~F$dyENL?+o(RqS}aQYj1p_;_`Fn_A7^N_@vtFr(i_rZl)hS#x4e?OaZbM0N^R-wInoIjYya<=x>w(eWiz$q^ z_RINiJxdZ(%_CxZ7~P4B;9dwxR=rudz>Qh8|lgsbQ(5odO0#{+-KT8xyBK# zvBw_Rk0U`7#@;0hczJcWA0NY-}TPR5}jTC0=jo{H)woE4FyBi#UmWRbz*nwL*c*2Pnm}xE4r|Vhh^YICZQbnjK0h7 z1)~VgHx*D`2H^Ci#<62{;y6~!8xwGHNIZ8Mm;Cyfs=Wpk&r4B#GAQn{v#vg!WjXhs z6Th@6KPH&VyD_}{PXU-5{*xEY~;6XS5{p^?)K=`X9N0EF7frkv(~`x$`)_sPkA{l z#GMQdTI84%mzGA7g|NjJ4XIrF znn0y*Wuuu9YJr?jkO^B< zxqx`sWUtlP2{hjL_UJ@Jc85+Q4l};r_j6>Mn|ixsTZP{BFQi~K7Uudvn_C%s`%~`n zB{dI~S?!Ayw=Kw zXkV0cwo!Y~Ks3pr|$j+P11YEnZ(B;tuIg%for_28OQbHDfr))njOgff@D3%yu zC}whgqVTVSDWEC#5eEQ~3R!2^HT@3!=ov71Wc!|RhqABaoo(RMt)DIfaD6rY`aqDQ z_Y?H$SfP*dlSn-5 zp>Ol!h&TNL>3QEYlNB1!mw>FN6eLYvK@N-S z4LTAa6u2^|v-+)bO;ERf!r8(n*f>;mm$a|AeiCbgb7LIu0bRt59380gC z>t><4ZU~2W2gonmk6$0#czBT06J(mFnZEl@bS|v>ej@O5W$lJ~16fxyZLv=OtBEk5 z7Y`ed`9_n>hKo-IMQi7r(?+9xPZmf!?n znyYrkVUj67=)OKNgBY|rmW%x2%*aT0ftqhH zUSEH2mGO6?M9;WP{3}t5jIjZQhD;KAr}9qb-^=QqXd0*%jDc>ebUxd<)!B4sq?8|6 z1%MU(HHS2sM|H%am74d+<+=ea};Yfx#%0gA7p0ce|x2#xD}0S-yb?yDaeKYWrpfP zC4=OmQur>HxNDkf#ebNKi(c^5X^n}S!#ibhKl1OJN+qGTRyVs>9T@pHDbb;*#pueR z@7E^@3yUt>nj`g^Lt!;AW+zAQW9irPO*)ONwys0x0&3I(Q_G=_o+>Hi**I&SkEtRS z1@a##X6OJSlth5Ah(L)E4E5XwH$&X7ymli?Z1S!jsV{(dT?m>EB0kwBKBV1e_oWoA z)~C1#ckTu6T}YG=NAEJkp2K&WjcgD%7UF3ZaXOHXh}#!WyeW{r z%SZc+!6w2|s0H#e!Pvf}U2dsB^KNC2$Gfmtb8m%_g4wC6>{(2$ary+-KM%Hkx6mhb zl`@1M{gI#Xu{2&CdOrIBIlLuX17K_E4SKX4A>qd_BZX)fk`+Vabp;ZMNn1D6SohyM z^`~1M|J;`oB&1pyPgh8KjPlqJ$l^F}Bb?MfdW0lS>BonGKONBl3hV);kTEX*i8gayq&%rIg_ZHnb6zT6QkwKlecRMA1Zv*?NoVB)4ew%=CY-Py1PW& zMKPp#QL`OYLdUZ_@5I4t26VbRFR(DLQ91a>+0w8cjiGf{w2v`33>)MoY838zJFPT@LLZGr92@}fM@-MPkOB2)7 z{zW;iH8Zs0j%y>+XSXUd?p;y66va2)x4*5Hk&xFgFbWMrX7Z>;@+^KLv7C6`8Tv4$ z`IlW06;`}29F|fRSgX>+54rNOEai*)vi08B!G$pC<&_s??CHPOni;P4*NJ3sFBrnl zAs&WX*Y)dL=*!)(qg<+y*dm^pd2UfQ`$=nwM85H*E76U+1T%Ucin2Y-tT*Aww4A!O z`xEHq(^PqOk8oB+41BZ{E*#=KrU^{2gs>}opzFutxxWwZ*nkr=bxo()s2-#W&4tW& z>-BS{4!&x(rtLCZ121OrS-L#mD$3Wf>)T;=@s@ti{&c?n9rb)QeA;EZN7R0@P-YJE z@FW-h_t)@G*0x>vYjjF12>_sY+VSL3Um)9oJ)ht(lK_7b{U3DI9FR=H5`UrV&DDFg z1)>+qS-1j96$}o_cSP{R0zjVmGm4WV^XUru+JL4-HSzi-LKB}aU^X*V{H77y7Ql^` zuMs6-eF*%YXRz=3_uy1`N``KSj>gCLq_b7vg=(A@?Q5jK=p2?J_Kop>8q;KTV_7JU z&GSx?k0LQCoRQ|&r$+NlcqJvtx=M_5?=FVu&d{#zszD6DAbt2Vd0v%$8(eC4Ezcc4 z!0jw{a(VxqXL&Rtc7<_z%o09Ie?{KWPOL3aGr;{qCFkGyU6y$SdqiaKp0RCv(O(2fYkNb0#ENNM6$>a)aM$c+ri_59zlE5ErjU_N<(d%aS zg0=UKj@gwv-2u;HzH^tupPli0W+BRY{8YsGwjHpx8Jr)=Aa)SH909j1Ki`up9j&pW zn9ZCX6%Y3DS^0rZX&MW1!_)dIq34-+Fm;A^ABD*}Q2-ATxKMuVQD1`VR1`LRx}{YW zwMRMM^;iOogl=^F+};9*Uk*lS@H&YQuW%t|L|EHFXWkH?S}e&aX`+N<`ChV+bq`!= zc`aw@{RfXSH>_>TpK%%G$VpUm{@xmp90;|+PdCq~<9mteS0b?KlD1KINXnJyQou1W zGtT{>Uy_Ct*9dnNrkmTiBtKk!SRGJa;2jP}bQ+)fe7!_Pcd*$Zv+DGGOw-H~34{Lj z#APmkF_oaW&t_EOJz1UC;B-diCyTz#2EN(h29sIyibEo~ra>0=LE!O5?pCh$*&BL-7LClViG_8vWYU~)OyT|SxH;@?t#{G#JQoMoamwEW z&q2O#7P@^J*?3~P@YFuCz*lii+M@OA>sNc7uL$ONH&IF|h}=9T4x3Ce?}F^D|E%9* z0p1?xk+&bayc6|B0Z|9N`8kYA3l$<>QFIysA_aq`3B52_%l3$Tuz)yR8B(bSGVm%G z`SfW7i0Ok-gchRPACRge(k{F@gdV1DV?sGHBRTHbeLWy<|GHMw*${n$OG|Q_vb%{# zB_8JQs&*j@AhCb|q>Xp>Ft6}O%1s%yFs3FU)^e3xyXJG5!JixE>}SjD?)k-#E}I_* zT;VVK@64RyCkkwOGu~cA;H@Ikmz(u&tlO2`tA1&-){TZy3D16XF&|x)7q|@ww?ka{ zVIxga=NM;p)cVW;`tN4TqwE7L%SyKer=eU9Q(P#ie(ano(asBHZfVNta%n^JtZ(t7 zwOuj=LaEWuN$Y`_3cN{mNOtw1@YB^{)Ln1-Opkx0W+PEEP=Jc$PX1 zH3L*CRelh#T|>N%1+Sl;IJg{U#UMR2Iwj@23YViVu=61ThSlL@Oj0c{8MMJC4l2&#&`8n zacC~LNvO5qrUjO*u5qX<;WxKGl;OIOFS}sPu*UUGM2JBh__Eb)b{u*D@xfkE0Ss1UZ_n!T*sJ22WNhAos?* zZdfaP(8nq+9o8gR5m}5^T=6gXWO5gq+m+@e1kJL31h zHYTr|GmFayHbzkzE7I^;58A7FT|JdsJYlpqdK<6e*c8QA?%ZMr+PVBfnB=c955zA6 zZTP>HBgh2zPK%n5#4t@?{d;#mrtX?rr@mo*#QXJ()c9=f4srw(A{34K zJE(@MifQqTs#|7}kouQ4&DNU0crH2KHxsItZ&U&A0_DuDv*1q{vziH4s1$X}l!*@0>uO6P6RE)&B1f4e!mn-hyM_)aLofhqD$o zwIZ93I>hTquFShJM4EwoEe+;@v_7^r2M9LrM)(Z*zArHw&U_xui8*#}h&C6B`n~px z;AfM4#9`&>QBaIm46|#1>!R8&gO6?d_PGhwY}0|r&bU^3lVbUPHzrg?QdVqU)=xZB zcek1SZGYA1rhvT@gV;K+;fO}<;9$9lKJEvOdsDy`b!y*XejU*H=k{UL+KA+LTB?O6#%43r)ZvAECubL%^mj{JfnzX$Vman2qbYCQ9uiq__&&xRG|-H zB?~Id-+Q$Rimg)dL>z1)jYoJd(9|W3n>MDI(l56@5jn25r*=q4h=*4nNviwlZG9nP z{A_W6 zfH04UAzrP62+bEV{YVPA3;90cOIw`JhVLhou&6G2>Ft2 zD$uy_Xa0ZvQvM`u+a}x$Rg=sDbnLJfagJ01_Rxk+f7{)%@IwFQveq!k;}?k- zO*esd1Sd%(as;c%>{A$RzM6Y@1DlU5UJd_&lav1Ld#s~-uIrEA_WNqG4hw(T@ro{< zKg-gnh88r2%aJM(6s5d-$7DeJG7uZ;)(N7y*V6!glv}OLrI&fZh;BXV#$C?sEL}Jv zZ{UhG%;+%*dja&`yngQ&Lk;e3r5qfX`c|@(qIeoRtg=Qg8Vf@U;oi;1aJ!89PFM=Z zDW^w>&KGoMxh0SD;mhw#0XWm)poaQ<(~hl5oA7h%4q{OC7|!EM`QTfR5Jd&i{t_H@ z__+s1uL?6+K+|jZ9mt(ulZ(p#Ol5Dc+P^g^qy{Kw9|G2x_%K)9ngM}sYo~XQJV>h~ zow}e1mX_rw0OpNVLicX2HW2Re4V`pyyr_p;;v)AIn9MtG<9Xh<6W*n1!f&gD8AgU zsp?USt()5^HF2h7hx`hX1Qnj-n4$Ejy~Q#%RKtDWLuMd z@7qn=fwgC4)a-(lNea^CZUJYR;pkx9h45+3*#{~uvjNys`y8g|J_MRWF6fMN$q`Mr z`(vjJ;Sze{{%FO@J;Y+|&NxO^ssvR(w+#RaCw#-w(h$wZ3QYO;d6n0WJHK9ndByja2bE*^6vuJ7yq@FYJoG-^z}0Iij! zmxgycL?JUR1J~nczl(usLrA$EV`PA4#cG&DKAvicoE2%Vq>{OAt6qljH&_*~nFk8o zBjc&r&iQAiii3b>U)7_^<+utqT_9d!IFd5kEN+c1&Z)KK#t-s$dr_znN z>gKT5WhO;z)ff2MFdn{0pI@(~Uv5o4w}_Z~^6U&fUO!;g)pglvt)}z=Q(^(~NQ`+S zc|Jv067ZrM6HVsLIyea=rw~L#SJ1|NE_^0> z{&PxrQ2C4X`^#9p$q===hn1=Qoo@$xRk_RY4sg3!;kEI!Ar!^{b{e5jeQ}lptmLP@ zSq7kqB?4+1%uWr!V{y_59rB`eQm_L1{ZSM*{QCqKQmGA^EdH?v&P{-TL8j@wdILE^ zUvV#DD9>GiLCDEq3olkhyN}KqAJ5x%?y~LPTLYC+I3EE^74N%&(Z^hiU;BaTfpkuB zLD$2n3s>n#FgdFvb>_>3-w@^&--dPcx55?W?>0y#_C%N~uWZ~799u8iG!Q{Q-e65c zD>UwK6Odu|2+q5M5OoLNP3|CR9^WIDuEyb-%SiRu#7=zsP6|PVZpb-4}!F3CFK(TF1haoVM*Yp7}nAcEsUqn}Yak_oj=FGS5MC z%Qa@>=p}T9v>={GRa&JYwfB-GJUsgj-z`(+-#taJkT$x~^{1W&3_TkbsD<5EA|e}6 z#xs1f6}pLKR?&+yk08qrGn_)o_`*5`e;sG8?!Xp<0Yq#?RH!(p@Sl>`IYXG%8(|Tk zi;G(A0zUw;0kdDZWq2PJLGk|agx#5Z_me;k+WMZVQ1e8Jm764P_gM7m5xrz1DX9qbSL}bc0w0o8gAZvo7`*v^=^&v zd3wm!1uXu~XeiZ1GBJhUK*7G&`Dg#0si7WPK%X*~Lk#;*6z*wTI~M0%-9ZoKdk;4f z1;us(vc|r>odv!xxRHJP^PCk;Jvo_&wZF`t&8L5OhR5#AjkQGmX znGNZaVKtJrC(|?)^J%mEDjUS}GIX%QV4sYZ6>>W&c4r33R7W0H-G1-QtNrS1jUv2Y zlSEo*nqarqR%^3;q9XWh06GKrzI|dL`^K@`h|FSxg_cgH%9vwP%}#Lsx*V;Y6{ih& zjq5`9BqmDCvrVbWSQJTA2W4Q)8bBIm1BI79B8Uz^#2PVyEixq^*6f>#j&DanqoSJF zr`Z{@76b;Au*5-)NszPsQOF(Jw-#i>?n3#9Qw>NvYUdw_=NV40H;?Z&`I?)A8;uYd z>wjF9URCFhL@`I{2&w+HIC)b!WbuK1*hpn^7e5_Nc7-A1)=;WMg1B8b)x^d*UE#=u z`66Xq*5CzNyrmRxQa_8UJ)+krq60FH$2(n;;TJz$oi0K@p~<>wQxiMWKom#l(FiV@ z%j^c(HRDg`Z@j9AH+6dn+!@E(0&bS_n3oC^TqrJ<)?gMNsW<~%t*rvJ+Y2KHojB!5 zDFfgCWy0|5iDZoXU{tuC0cpSQHqkQNuMEWD`}*wO5Yi!5Y^=3434cE)b0(;awXtWl zsUwm2*G=z%yqr0$=zB`2GP4Y_cT`#ydKhK%*WFJ=DOOkfI#K9(&go*tK`+}!n)HeP|CDBW5)UQIq19q2by#cW+lC135n=&B zuyxvqQLa2)`bmQqH(o+1yQ8XA&EeMCM81$B<4$lAA><1QP|-X5Gs6zoUqI&97Dv4A7f!0=t{X97|heW-zlN z0~E|gd~v9#XXVN=Zoz>LT$K~&9{4!GuIuv=AAz!Ka)-7c#3A>32Sfs#e&zW`c*1BD zG5rC4T>F5qvYyqY3bgF-{hy)oA?`qM1wE+%4uabVo&t?K*MO8uX5?8j{P?oD2mx2lxX690MoC6z>CxXvMw{DZYeU#N%e zw5d^iC6)SoRQ78X)7ZU|FxlLnJO~nyD-h6oBz#xbo&E?Hbr2eq!RuDH-MngB zm>8Nh&(|#_RFGZ}KO4UbmbOf~U2h5R_BB)IoA zhzVj85-*?t7<<#=dE2Y~wpD&nzX>lp`2BQ9;={dls{{n9ORZqAw~P6#U*h;e|26tck~w82T7GH$KHwXEX5pw2xQ*0~%dnrIiQO zU~n!L$&*2{!h)N3f7JS!V;k0#0_ThKSBx5oGltaT);v1}s+t)k+Ko^toWANDHR_;E zi|&pzLhYmdOU(1zvJL!Y7*Wr+i%FOlaB7} zq;_!cO}b#_BUuYqegEwM6it}yNTaLoT5VjReg9qvjM2RU1}@^RGIUWRm#VZ zE1WcD!)PD#x4Yl&=OFVhx!suFY{!u;0 zc%tONP|~?(!tDV=kSPAXmWP5*ap27`ng5+P$hTOJ1N4y)ekrzI^I%ejd-0^leDO(d zU*D*$d`qk1kOx#nToAVxKyVXmFokJvRGK!L+WZ?MugD1+ov1n|5G9$n>q^HHyYLL| zWKdETdCPi8(e`TxwkcZ7^^On6l7P>{J8hYGo-Kp=_TALr{FLQ8@Y;G@i3nh@Rx*zW zmeL%#UW-WD8iJUfusrb;lh?==BTtm%ergCz*(v9@M^tdQC+E z5QwKS_)#|tU^7rDqsZFH$X@B#bjhOgNG1+ESm7_VKY#XqJHV+Y7sgGO_%7Lz(^C}9 z0Oi{;+&etPfA@P5QkFVWYHX=|X~Pzh68?rBTFB_1xdEZTg)Uo9F(U$%Ev(7LUu&Dn zQA~y5^Ru&#E#!2sbVz$d=qug7BRL~RDqMz!V(L8&s}$ zsvssB8RG`}Q?e=-T*hY;OY9a7$%1_J0aEAB?h15Pl%&P#9H}wt@`o9+vR1lf62Sa& z9d;0o5#ghC%DM^)^Fr=D0h@V&4~u}@+X5{~fN|lXq+>8n;^V2}NTh>_V`lv2Gl^;ar{~cev!zQ)kcMvaW!}gbaS(6Xb%+!_wKT)6(G>Nc9(PSA6mNvk@dAx# z86C~gHp@ynX`_O2F6qlAJSWr8R%v^++LI@#jr+d(?yI>;mfwXSv_3GyPRL|k7rsfb z?zK^>3|O=3zyz-PkKaYjMM{MwC9*oAyKrKBFY|nlQ!<}XM#aQrVy)QiZ^H$*t(3Qv zCNA4u(%UXIjt16`k*L2lhzt)R4C6B7HB9Q?52LjjE{#02+mk9Tb!t7pcH>4-#?Y&T z#dLTi?pI4Dx7*FnLloG);21sX4&?#E5QAj@RgVldVHgnhbIs(xI(GDs+z!a&DWh=X z9s+Q5r6W$gIC|}%Cq4*nx(0A3j^1Q8;-ndU(eJ>LK}!(?&9~h#6PoKQVLakY)~aVh z4hsBu1`=FSO!-$|D6`={C8-|~k>vTEbh(n0UY#zM!O)JQ@E5b`nshQ55T4Fi(tkTv zbcR~iQ&dpZ5lY;=hj@6}mexu34Sexyn`?%>wcu>`7)?}z&v@%6F?gm)m*Pz=V7p7= z7l>!MD>j^`YBN+6d?rC7_w3ke`qHm+Zy;aA$h+)*Hap#lEukk4njP0j5;su|bGUQc zKL!JM?apdP_isJYJF>3zN(9~#aCg`eOT=b-(iYB6Q;{ZROt9@VGoQP}68#Q~ktEN} zJxq0a4NKdY|1G#~H-K1(LK^_M$Ekq~u)uQnrDiu1@XNBWD}_>gAuSyWa0tGrJYdC%}t z8Abbh>$G%vHS7EP4_ZHyr3VfB6TW6pia%^0kEv`}oj#qEW|q~pMYAPrXBN`xwXC@~ zbk{*ER=_Tyka3{bmS!@n57gzaJ~6%Q(wi4xBdng-&}FL8t}4Eq<|h2E)r72to3LYG z8alEpdGEdFCdSp*HEAgOOirf;owh+(5z^&rC~}={TTRG8+o zIx})}r0K1cZO!Z{%W;Je9fO)n=?@Y~Chp|FD*O9oLi4rmVJE`F=P@D)!X3njWN$2{ z_q@f*95dupO(I%7C6^QBT|qCd`vu?=-@gUjip@m8wrKVY0vcQz31SEo<7;24p(oLg zRZA?mdfYj z{J1)-gqL>TdsBo>FxtlO@YKxGZWyUdL&q*^1=+pK#xWbY82hanpAK>`uOUT*T33j6 zIgDxu&N^0jon>4~qCfQIg~{Qfj-lhyk=RJIRVe){WN*{-tQa3U^Q-I|5;!s!+v2MF z`ZljV#Un7E$M#3xINm~ozX(yC81`{+NheJln`2__Wg*ssg((sxD_|i3$MS6`R+_Q< zuc&Rn%hZRb9+}$q&Q4Orn90dJaro?-4gf;s#3$!`35|juT)PKsDtJe=Nnsc}jEkHL zFPnrCrH$Mf{Pq{2caL%!=vV~w%II04UWopins{xdxD2dEwmMiQ;#41UZwjJeH!V0+ zR${=o8i4Mm#0!uj9yLRhK&Jgz0MWWi-to(6Bi5fG)3+-mMslE~D@ygF9gUY14OT)? ze||k<#8Oj^3;y9aoZ!bQclzQRk%jzFarx1YE)1=|B%TfFaqAhn$)m`@1Pf;b1V)%? z_So9{TJ036C9+=!%$)|s=lLp+Jcl)Uj2ym{3eA4LG43oGi{#<+)NE_DuBX^#1lVe)RiRRsjlgcOVRO%CKLq(lG;$nlyjmU(mtL5(HlnN) znjzq?b^XcDl1N_SDNgEkq+ThZ`ORtgI+Us4)J^#t`hq2AWxRyt23?xJ8gZabDJH?$ zv0P~Ouli>ceH&S@<0P_(F5^S(zX(=vt!_9SzfDi?gZj;>c{ERXO^@+@uk zX=dfhN$y916c8ktb_Y=*pK$6n7853JAs6i9_rv+U%cx#fUx`mg&%bjZ;2=$A3P>UD zo3t4ac{3O`5nRxTkC*xXsQSu)sP|y)rKD7lR8kO@T2i_}P!?D~x{;FZZbU#pN|t76 zmhNs4L8OuH?hYvl-#?yn?tAY?*Dvhs#52!4Ge1Y5q4Qpu!=&pBG6dWx$`DIz0=N=) z%Vv^0>gju!L!W}z!omOY(^!X3CYF+LT_8;?uj_etTG7eE`B$;0A7^QXsL^IN>#%!$ z-cR%V^yYk^xA_T8ngc*`9RQv!{vyYDJEY;T>H&z9Lew13?mg%;Py=*1=-ja0{yYUV z0e>B+`&p^*H|0-iUzbcOzY;uD>tS*vkc8=Py1X`HeD0Es-f=fFHS?GrN@afeI{uh7 z?6QT_=0Wu|COqy^vtAYx*8uE^F;fpM6cSkS&Oxv)?cvR@ql-g5NrvTB`&J|>&lPl+ zEfk)%_n$aqTU=p)af5h?A zHziELsbAz9JaO*|Dd4Tpyk=~(k)E_jmV%jV>9+luFRFeLh8Ln5k}3scq!*TkZUBP| z=f}Bw&^`@x64-Uy*S`1TXAB9TEE0?0{hNy%bS>5%6nLRn zb-M_rN+o5OlBH%D2tFw<Ccgm+$KCHgZ1#IxdqwQ5emGx~;#*-eFa+$_*DoMYDPmo=O*(sDh zfNPWwA?Fb~c-4rYN5hSx3ia2SRJ(+V!kfthzjClED1cU0^m8C}TJ@*3$!7-n1(xqG zF6F%%UsH8mimrP+udj{P9q7q#qxA6bpfWRJCcjD?7QF^{I9l`i?G4ny`8!rct!eq-4Duu>rO?0>aaNK>8gv*;-5$UfHJWUXA0Ba3S_4T zNTJtc4)C+GHYM&A(0IRF4?*5+-~SBQlY6!-1{eZBR#OCArAhp7Y=;lcAK%f1B0gMM zho(o0CSEqbMX@(@vw{|X9UK!6yi$*S?Ha@5d4NXB&r<9`CwXtRfQ^iMD|=e*~}?IsF;g=#q9lTx!AxI9`m zj$xmI9?Lzz)1r7b9KvQSC$!N0>-xQU>4*wRK;eb`Ff!&fjNeNjw^`AKwpB)+Zpogu z`Sd#Tq9>vawFCbk!MlrCl(+GLH21qJL#_;XRM^uG%w0*pI*HRYEomJ}rw3P{&a5|= z-a|*6bZ)Ge3=m>N_UemAkMXI=wxi;+J5N6{q@Oi9S8*aO^?b@NmL3wT7xxlorVu$IH8D*lk?M5gq>)Yaw2AtKXEJJEH zUhBLChuaq;eF>`#4eWvV7(f@Lw$`@Qv=1;SST*H@Z+dv{fj^rzK=MgM&(TP&uL8OL zey5ARLG5hQP~XVt3)HWU0m$}G;VjCUTvJj}v^Wjut_7~}3Oa`bOJ#5NxMKo2RdJ7@ zIHC4e!QA@~&EiD%;u0KEGQqFM0-a@J^WQ^*a!5WKipLp{34Cuc6R_-?ozlC`5lWYr zx#0Zy{L%@PyXQ}N4>++$Cc;{3bLJp@Byv!XF+O2Kd*bSL*2>9m#1n3*OoWU3>=g(# zR4wD_zE|lA7wOZ__^`MXafd)LVW0)QqmZO9Q+9vS_{;j?vQx5px=rM!nPX{8 ziU{txE>VY6@mZFNj7w>q>H4+*Z}N6Wf?+n6(|S1lXKO2=S2~$JkrwBCeZbgC#5O+g z^JU^ei$^EY%ZuGTZbkzK*1q6s-p=J5IW;lYw_%Mrowl9g~GONHba zLV9#dEvZ(e4DSm1T3GwGvP)S2RMFljvW%?*`{2gsi|L4}_O?=;8BMQff|R>Cd}($- z1Z9p${K>Ggs2!LLz0}-v1f*eLSx8~JH&@}j6vW9c7yXO3RI%?;TT7aRoqzhm)IdRA zJbA%ddN7Osvc5iUQDU;0!kA3D@OVv6RPSxbYS&#{URle*&x;#@JtRY%ndg!K{^-sd zNbC#?ZUCl8!T}%sG==b(2gC5S!`69KL|4gPScZj4XPVX5=@7-tRD+F`-7R-_6_WcAUg35qzR|_7L2^iq!}Yzru-lVb59y;qvsWJ7yWYK~=)P(?JlwkWrQT%V z+Gi!szW?`{reve4A&weOCHi6eu3!=pix$)vsEQ8Xo~&_v12XGlm6*@z+I<}x%}ev( ztg5S_+c?jYg8o?KMV`AxSDkp(zylM9uGE*;kws5!_%2Xp3Yo!W73RZOidy_EM9;A3 zzF+MyK25Nb0hgco&?6g2oI&$wiHqM8;c@b^jJw$-D_r&U*4^GORpOF1+#8hp-P3OX ztv-d&EdG8goP7l zJSHMcagFuR>c*8!%jS65oiT{E?xDDUoboHg-T;6WsQy6e5(OqfR4DCUfT9A+L0=ab zP>lcZ^L1W+olQMq7+J zP~}Kn6^T($_r2o(?1@ArBx8sky*fizqP-Cd_x^^r zX^eQEu5@G%(+?EK*%!0U-?|fqV53wPLQtA{ALoue&z#UTlR#Pwkl`pyXADEoP2ZDI z`D?#R@`E^opZc>chOxWy@kazIp`U_8+*q~jQ4v!=(M1>V(6k$Hs&V>s&RQEtXl`%5 zVls4c(kZ9GH{MenFzlG(8|*N8jnxx&%>yp@l@+#X1xVZ zfB>^=x(Lu{c_g{V5A=gGK+6+2B`pZ5!#Mg5$iMzZ+=}GL#cf_@Nhdc0mk%!;*L`{- zjeI?_EM;H%-WYokf5t|3M2O)dU%YuK^spSeq*JP7LpffFfVf*G;!Dyfnhaug za`)0Di-nC6wt+G)r7rPdVIwEvkP#!QPvZwi zl^7_ z9lJks;bkwYH0txr@Gh>5G^f(awV@YvF_!2|o~)?a8OP#|WIHgGgUuULhiiFDCt4D0 zPps-e@e1v@ayA{iRj`?Y=&4Iy*p@vuPFgKbl3J=YwH zdtq8G$q(^V4PQ7o3Pq7CC$44K2ssy=y@MRY7@sS{wN%XEg9GQT57}rIDPDXQb`F;g zPrkAhY7kPQ56Dd>l*7=SFM#xyd6!KIm|>TEiIV}N%~*Y_l)@Q3-I3mG^T5^vH2&`l!H3phaHm9HWH0OOHLLvIn6NnTD-JSs1)@b_wO+z3} zaDA%{VGrWQ1!~ED3oJdTd6}n-)hNSyq02=69BX>c)pz=FR?U86bW18^-R1F~u;R?t zU{z^iZDhfm;eHq|Sp27>l?D1|cutZHeFSi`z@9}&=un?5k+P$v-YTcwA^M!yRzQQW zYN%P!_6Z+D;nlJA?A5At#h5n+mp)Up2cHMHxT8;Mujw&1yTH34No&kk?oZA~e4;s2 zl0wr}#!SUiUw&|XjDfJXJVlv1)#(;4*Q1O^Y7rp(b9;4F9N2#Ho_lcxZX*mLyG2JS zOx(A7wyNCM{?h_5PaVs;&TWVV(*eUUz-M;vNpquwhI_i{KB78*Z(rZ#*86_hj{l6o z2z(T>`hmW}tjMfCl*uW{!0!3aDN%>iBHQO0*egB^F|m@iOtH;!F_sefuY+aPF~W>Y z4Rb?r>4XIYg4fCA)SZfW{I;<6U3I=sQ#bbY1UgT4o=B|zsXigB3uhjg!GFE%KlD;V zY*}X`~*2h056#CxJIrd!;p2)y`fBeB1Fv_^0I@x8y_|5;^aOTe;Rb? z4dTDsLz2E&ZrG;?`Rxr-Ga{R-GVRkO;?aCsv)Sl0R6?53TWfBTEe@CdlH#8$s8_|R ze4YHviG5sMdH+~pwfefCL4#1c0Y&AwLnD^V z_?8l@;sNin^wvmAO2d2|f*iG+uX+eY4BoEF!MZPHmUeoRTpyFdN+tP1KiOMrgE`{| z42CNVH-Y)C@aF1{NBe1LTAF_C>(*{&jLGXw3}x0u3IRoG$^p=6@!SudEBfZF|BJDc zUp{Skz?&0pQY_p)D6caMgxsy}lTygH0D^{ydP7OMEEBtYHJ0K+X`F0TqgnfoCb@R~ zyWYY@bl?R8!p;J1-kPj8BpG35G15gpHOTt*0$~IEnB+sX92Gs0nFTYkn5?KO5hVo= z*I1G@9Ty_gwHs|%vFq$iK6uL)VA*-_SUy^3DN^-=@RT5NAQ2AaEEx+r5J}Le)v|Q< zv*nU6CpT7J{VorwMsYRKc0_94Ot#591)G0G51UN&-q>9b7D17;ra@^7^6!&XduhvQ z#+B`}u{mM#b>qrr6JE*sZAEF}&6KmWZe<~Cy~ZkmnjbHv+Tt{1V4kUgx767?Smc5? zsyv5y>$$t&%3@RtEo}Z-dpZ?5egC*7@}F zm-EF(L|cuyEzAT*C(M``l%0MXvU1+GSK1vdCF9D4zsB~4CKx<2FV*SvonI~B^=Nv7 zT!-94KS(o^Y>jm&6o=fhD7IZSzF9oA!K$~>(oECfdvhr(JI6IrSL8%%s>RSJV>lW? z3lD{X+q2ZIjedr%mhZp}6{Oa$`s=3UxG|47J%08?2^>^E?mv}m`YiM+gz|pMg5k4> z8Ey*TY$J`grVM{QhZz3H?U3?k7|iX{osiOf0CqnjjA{?n@;a1yPU6e|MFr zCX%dkEvQ&+e7z6Qc{5@yq6 z0WSe;@`w-P$O0JD1>)mo^(y>LK`cP0@fqaJA)ih403y zpQGlMG|R?;Wg(>4YyLZwwaQf8h*%Tl9;Hdjgf(pi(}p0a7#umxR!e-jw-DpF3GZga zig5)txAkUE}Xpz?UxUa zZ^bl33i|VGlWh9NQ-hZ_Y{@42f;n{_maGH?BKkkD2JE2$-n9rU5EmfWIKw=(1@y2-Fu#Ez`yD)w6H_GZc zmDG}BGSUhhjZyo8V`gdEIB5clm{E>UVJZ@NXdG+I5ZiwWL9so>&q#&W50kgDu) zWUh+dX#9^tyTsV8EV!MS>I3-_CA4bCI1e?j*8uS?KX9pNO~_Bse<8ikvGo;m$-eva z+RUH?ftJghWXUiQ!MszgL1Qa;w!&J8xw0Lq{L~aDqqcsP83NY6G_K}@oDqLvsbM`k z-)a)bM7#V5AM&0*OC_eMjYuGc_8fSm;0e>9pw&2^4jGQ34)wrbMbO{0CP_?Uo5*Cs zTi)_tW2y-(O~?s^DUEDjli;Vk6TOn13EP*cudGD`#e~hqD{PxQ)>>?9FXa4=e$JofGbv@gAc&_HaJV2SrUKgA@4#>9*PY0c}DC-qdFxQ zoNA*V96dL+*eio-?d9VS7U*cMEag;vzO~9h2GO7IBO8li=5nVXyK`8YU||R87=I6s zAPlepNoP8)VAQNshcxUMPV;>K(U@|nmYXhv>DP#as(0-dz4a1$b*gqfm6Bi5w)9tU zIN&%eSGQ8~`3^)^pIW z!ksj_5zaPVXz$%DJW2m&)|7Kb042JE66L1MDV>OBLeA~B2&;nlFXiGxKduSGNu70$4n)^Z52DRbea|$W35to5B#x7>UOAl8jBr*R z6bpr+>6zI^Z5A~hIS~B}h+^RG-gnhRHXc8V?tHG^4ba=zDD3H2!J9Ejf_%W#Lv^^a zVLyx`NU+Y?#x!>+@P%!YfW}v*9N=wPnm^z*S^H3y>*K>{j73$@!lfkM@xe!W;IAF$m-_zq8yX4)k$J~R(z(k;*r$iB^X#WP9b6B?j`(fl`h6!^H9yi|H+d zG4vqUGde0&`e}R{#II%B@?;@Cuko4QYX7QM2?LD~cVuB|<#B$8 zxC*Qb`tHMwFa|uao;VeX)2bb=rnby)b#vyFP-jR-SnVUmZZiJ!VH$%LFKdbTE1|X-&tEA|c=f(8!gMXu6vuWH zOzWiG``LM;+^$48WL3{ozT50>`_q5!y0i~~ znt@v+f6dY?rPv-q4(t!&S+-)&?Zpd>MpeHq7m~#Gr&-~dmCr8p_{fIaKx&bZB-lt?et9RuTs5enl$?B!o;`U%Nt&92g8^%OA|(Q4h^wlW*OW zzpH`O_bN!Ma{UY~HK^QSmZr+jQu)D}ru;*#`lRMrnRKH59|yBD?ee+!EwAfAbO8n> zo~+Sa^1}hB3uAShxu){FCtuIIx@|5*#4w#MJaO#!uZkyq_H^^KLs&PGH%4=msb+9w z280hgy9C6l`|%E*4b3L($YIwwB0d%gX~{KlrN^1^4{6ZV*>SQN33(e*d@38A<$Z6~kU4M-j$pPsq0E_{+0Zke53v zcji3X4rI-FO+f?gy0hwynTW^VKzEd!EyQB92@BKtRvBAU!cx*#DgP=)7JHUpj-D@- z16o+6YHVDoWO{shWq5`3&UN}OIm!FQzUi%gA2p2mXywV)wJI{72mu=Zfx$T0@%_<& zhqOpS1f7{swrMS1>+6X8?h#$$7vM=alDoCr`o?yn{?(mm-DL{Egn^DU;7%-^+A_@j?;fNFCIMwRAVU*mR$j zj5MHzH|#X=GLX#KM|6IPMAF0}vK^$OB=)AoH@;Zes>U(O=530;LOCq7o74!ky85=A!1EJ~q&#en3k&To?3=pEY{W(Fs`FMaNUkwJar@P%A9NKNu#x(Fd~L*gSd5J?&6ZTOPF(EC2ybYkQICuUGCho0(; z`^4#0+xxQ8kCN4 zsUU5JwRM4MUCBzRYSQ{-PCM|Q8QJ3O+j(yTot)|9E`xC&s;R>L?Q&+3gNmyiQ6 z9N#NUAWl@D6LlL33JBix^)H#eE$saQG^DO%0B6X0U!<@Gg8qU((!kb3AJxSw9!dyPZ$k}JRl@Ws5XC)RzEz`-s)Eeks#&2}&`I7C7Q13wbZiH~xzYSE^i zCp2c(LUC8wP-U8@<)lL_3xmr!M)$~7u)AN@CDNDLya>{Xu*?6A-S;js8dX_#KqUJ7 zK_HB;B!9*9ff!g$YIR91nPa*Avus3;)NJepH_0M03!+$(CQ4_#|3#g#q6r3w5O)KDI0yRXw|!RS}JQ+>7IFy(QLIy z5~fhHo^0-rPF)=nL>l{ zw`MW;n18o&{v7~PU;{_|&V2ru-ybGmp!o@;T);$gm#+GVh@Iftj@O@frw8KrP-OzM zMxK5+|8}*(W*4g@l}pRvup%(tSsn56AZBK6dN>{rj{>ar>u7&~OyDzf2nVc-oJoevANqhTBJOi=b80;_lUp=YThbkeNVbs) zSUZQ;Dtbz(B%IjE=&3Ucf7n3W=)g}n6PJi?P6x}@--Jf;ePF&4u&Bb)az$LZKL9b! zIRd-CGbti%l6#eG^N{ED90aH=FjN*wkamlySeq6Ib6!1rwtED1AH-nc>} z6yCGKO?jv@y-EWj!B-dF>{9|qyK&c8had2FH%nk$;CJ3s=UYkTvWn+<7O%Rw4D}a3 zN5P1BsvVg>hYPljNGi@lqO3Ex9#Y*x$cn@__cXjqlHqP0%o_~jnADy3^hA$L6 zGxcve1#w;eV}Q`s!$Zs^29Wo5N9NyTYE4S`;S;m1^AAUS#;@`{=IQn4q2>zD`B)>A zx(aejC}v!ZQmLuwpXuw&j(=lh9fbH3;mZ=ojDa(4#N}jkgoGl$1SO2Dgm;otSuHu# z1xDMB%joJK_4K{6Mf*Wlq)LzEFTX$Z(y0Wf_y=}d2cY@p(TakgPw}ou$L&AI~FS|+>p0=2@O4~$g&V-5QFMA$is>g|u57h^+v0T0=*^1ory4Eo0gd)BZtSpkBQ|II;NJC=}&HvgpfAw`w_$~g8Wy--9?poFy z`@TQvEqqap^elbC>68pTChFqDGXb(zoNH$;bC{&lYHy1B}P_#OC?C?+_$U-j?{l%EAg#qqYC?xWOXxoQKG zz}tLZjZqCY0Bc&brDbK;yju-hxZGfOWAH=1RGby9fFsE|h$ zKXT2|^tGIS*e#lCaZ|VWBlhO9OLC8Hpmp*D`-#zYet7B>&OI0M_ea1wwuL+S9wJVG zQ)e(4=YKkUvm=wUL`x=G*^y=LlnUE#@DYeCtMs-eR50!GQIYd;pfVR^84XzyocvG~ zGM){x$niKvk1VSQ4sIhwm5U5kr5fqwYH-qDtcy{N zpHlA13xqlwp;$j(4mG8@zI#VKOplg;ke;nLvd?d!zv_wnv^eY2%o1Cz>@8IBNavlh zF8oCd_EX^RPT36hyWYhpkPnrD&^pMHMWsq4>zY8F!wx^(_1Cm>f#((SeB{y<2y1jeefK4~h5yf|)X}CJ|3eWX*NCdDxXbmWf{%)BF+9vrQP~POPfucy`s;WEtV+Kz3!QB}uZ;ANlVV-Fj_nV^Kx&`35qw zp7w1E&U@zzrEtQC-#qNEB&NsL;K{KjP(>SoM)`IERYOjHX_iLJT$3_xMQ6hg1(baq z$E;8l??WD~h&53+5ep%r81hRnI*4%^ioo&P_%7*7aygCBEMNcYPYoV!pI$-3nAoW= zB#AY?ca`&QOF((TSGlHb&QZ_X< zOAPr12wnEnczo%2Rpr}4Sw1>sjxs&s3Cw8OIkFRZQH*x(k<+uyc_uo`D{L`TKvh!k z;`E4+ibJm2=<9R+JgH42Ytc%KfO3g9g|0_|xM2H>gDO34*r@V3wuLKj|lDvU2`$IcGTi*_V=Mo z8@r;)M0YIhwj8bqv9WIT!N~O6%<7o@eK(XbQZKyUY>{T?-^6c$9^Zdq zg)qb^Xz4SGH|wt`vwNG+3??Loz&koR3EQ`r#5EJ0YhfvuomD;6Y<8n-nT=&%W-L2! z5I;tOlGiqeZCX9{u36N=Wmz52SX=VPxZFhr%xN+^!H1aI@3T}=!t>6ff-9Z4P?oyD z!ye^Umg&2b+mN#pMeIHcg>zY>Dad|Lt5pp7#>GZEDfykKk(Nac<+RU~NxnPI(mDoV zq2`)-H;j)g!5sp`2*bB@_T21fAQ2~LO)a6Y#`6gv6awVKIHch`X!g1C?lJbal(4l-6`^{0-?9;&r z7WN?5{+C}tdL}EU#0d^e1<{@z4WW?V3%wxn8}LrV&MJC5N{gy8HsJ;ak{&`|m+&;>Yu|_r zt}YH{i9p8TC{%qbRIC8B3gYARQ)gIrTee%}SuJp^$wetI{z#W3J?P$!{X^S2y(bGQejOM1NQWx0 zE@KzuiM`Ewx1yZv-7n5=(+dsGH@5KV^1i`exnCiw?MSt916KO}hCpW*-R8{&=my`P zp=_S?Z@L^HL{h_rW^_4V8``0?@Cb8T(p7wA*B!U`cFtip-s2Q=qbahg{d(3kUA)tt z(q`@5_vxAnrj7~2$r;bi7<;)tgw9ljUhCB$IeJcv-_JL=wA8qmLRqge_tocYR($SBCI}%uPRyW z|8lVrmRp`yydhWjuOz>ACzYGxxe5z}kdfgbP-u9g?xP~(o>jO{27&l59R~qEAtibX zAn|}^F_p2!BnA4SltMAJJc5Y?QEa@wXKpk@U|)>>ByX?UXR4E<#O%7}9hCyE#TbFP z3xR;4c9}~_960;x@M|l33*KuvYaFP!ceu?8nQx5Ga|g=;)tRpMeCe*~Nm7|PdJdCD zP+KktCsH-EKStT8r^&TNJSKqW+hlH_)dcyr&+2s*{j0Bbb*foWlLEN=N#@dN2q8R- zivavQ2?x`)-x=f+vZGEWLo-S@FR?Gp;wmBJ?HOVIBr-X559z+q(@m!Z!_9+V+(J0)n;r_3hvHU~8kI6qB<4Dx% zLi*l7D>;nIJ}I5KKOV9%eYX&5z8#r+$$*-)Wwd@!9Kr9fKO#2Lk#ottc(6v7f_P1A zUWh*4WCNe9xIGg6!M_h=jv`F$1coIyIff-vm61U`J2{5sN*f7V%dC$A_OC2X#0`)c zd*5AKwJq|wpqBB771`-=y(;1Lz_85Po{Jv*gFa0oJN5W4wN*nU=p@bIhKtiJ#OsgK zsp#)(r!hGpLbY?%dD}RbT&P@$%h3?;2JwiS%3+6G3_hn$6wzV#Ci4(xy<*CH7whRQ zOvUpg%v6TT$-NnR9vs-mp@8EM_7_{--^BRq5RxE}LZxBW%hE=zK@ZA>Q|f zZQ4SQ30CNofH^jfTj@N?e<868U`vRY5e9W%M~x+^%=4yiv#a(@O1`Z&x=BRH`Od zgTFqY5FeiIMw2dci{I}92HeN zRXq1el2Y2?VNr8^=a2za%%o7$mbEYp?HK%1{i5-;bD6zZ$`4|xF!~Rn(jq$VH!}jA zR6*fr{s4u6cu+ueA!Jy;h}%#9mQA2{clNY@HmG76iF4v*l_0G~6&1Wt`W7odCa9q>nH0^JC*MuAteLiABIrK?Tr^|S3u3+~T}1YJ zLPO~ohDt#b##J!f=QYSIGaalO@r^UrH3ys}0A=m(iqceg`|P>_Z5RV3BO!pR--l6U zMxBfhxMMDMp`g1fV#9^8NE!~u2|$eBZTZ@+#M)3trd*J^b?)D<)P*XI{QA@OM$b%L zKQ@8*&s>eoa00o4lDrS)wQ%gZS^e!nM%^1Emq)QfIl{sR)w5DXPu;aE!sXzikMgA- zuTJmp$#X!kfq?v9jKCl}c-05GA>V3q`s)_Ocnp`}i5q5aE-~?=eCDXrFn%=OfM+1r z?1XfXQuBjki1Job{8(UXTFE!mxSluTy3EzB9!drAO{*Lk@#Ti_O`h8VsOY&sE_c!x z;p6O3e%->u%iQumrFw4&=l!=e2e%%w^+>*I(+58wYV@r-ict-!RMjnn+q5yhI6ABI zb!aF;26B+hA^h8CGuaIq%j#q2l?u(@jLho(0_wR!&?m^l(%Xio->*mzkIjbI{~Sme z_N3V;Tz{tDyX0f+RsMGKjJ4?}l7}@ey~?5Aq`wwHkcHFNj;)7IU)OVn5%j&_u8F?0 zAnOknjO`l&6Z!ggUZ83qb<&q{#uSC3E?X??>nyt*m8gVuCxDB&$}gR#+eBv9n&|FzfFro z9_3!2NZ@)A8+{f=Zx==>7s*pIE#Hj5ko8|1A4}ld#&6}$t)WhbDP*j!iRjezgqa(A z3Xfw?KyEt=GmmWAEM?B7NAY8)~d58_R1yJ7H*>4(}B&TG7)jY zOXAjpgFA6z>fePh@KYR|-`85GsdI`pgsgr+=vQhKP-)H|eEco0;^Bb(3cO|0w$nshN8eLG zNGIx3Y9)(|SwWlQ_C%oiL@Z(2h*kpoJiqB?dkn!RF7|0p?>0h71bO3a*Z;!K43dK$ zm`m5s|D{J)zM{U7A3y;O=Qzf~-6_-dYF%wmJ)in?bc@ILDl^f_?M}trdBoQfVU*nI zRs7M3Vn9)GRGCkw%%y*HHLnPt3X-FdCM@hxA6u+0UkJ*Z+ctUL8i|lWy)?FBQ{9;y z>a2Q|L|=fbcr(?3$s{`@VVr*iIn!FAR8d8<-WMR6*&9GzYA zQYY$r^0GaSq5Ll>Yz2d7sZmwK*W5OrI9bPj6RvRI1LnVzr@xSZAH{Ky5A~7;lwS95 zh3G`(Wg19_*`sm{fEdzqID>6wT({OE5EQ^n|4535uLC~EYcUuqYvU4=P9htQWEMy= z`8Y!_=d|+8Y9QwMC_}^ceJ$> ztV1AM&kG@*ax3V2r4Yaj=|qlT6fsIpxAd=@|CsOt3Wd5U>tpT9=|djbWq33$?1Pc#FUp7%>Li=ku^xZA_10m^~wdQ_)-lMBsx?l_q4xjCH6V>#QUGxqD#pO&Tnp3pJ+-(J2p=z% z0R%%zf+wXW$C4@ioLuN3xqm6f+`3y26YDXOjeJXFX`O!9wWN)%R@!a=oq^<7JLM9D zRpC%7yb8TQJ@RK0MBaT`Lymn&OL(ar)%{5?Gl!c1v8RO@?`Mo70=&vCud&iCj3sy8 z%jAS$Xk~5+)@d{!+N9YqB6-uj?-m5J zu9#MhR2rzik7LJ1MfZrReG(t8T{y({D1h`XxZ2eB6T{NW%Raw9geuFJVVm;RTIp~7 zt`vSZA|a=m^n0R7t1M-|Nh;G4Yb8nV9XvkEdw4=8dQ>xQ)wpKYj`n+G8%q>|kFIm$ z(hGF+)M|*TuR@%mSeHI-mNc zYtFP&aQDM~J)q9-M7NLF6NG3x&;Rmsv)&($4XElkcM?qYUTxP=% z?K-ymEmf0%4-=T4Q{jCM@ZzOS+p9#}&?T4KdR5o#>s!WxdV*wAMpn~7{n`4p-=EYs zBBRRc(IpAFKTHeA0i;dd{ed#<^XuDL5TfMYZx5JYQ*rQ0g#-By%@Shlui{~i$_IXb zbiq5l*H4su^c^#yWz*t@Szdfw zHD(2tlbX=Vy4AlwUT1|7=n&Oxfo3a^L96mUX8~X?fy^H5!db_#Fjf|xM`0;0SrWt) zBh$m{LW}Nxelh_ZP}=yyRieampY1GosPe0}D4D6JAYlqg>y+;P?$E}J(2s^enw}#f zLr2E^_<@?LA8<}joH?1oFy`vhxv4)D7nx$M^N_wnDdbBs4^OGxtaLwcD~Ri~663xn zt?s`+{hj$fa2fxfSl~Bs9Hf4{gdFz!_D}kJT>opB<9wZ0OK8GnCWl**lO4F=^?q}1^ z3$%}A_G`D5RiG!_OY>VS9ZEG_oxY+R9d3bkK>x5D_feo^Ce z#b4h3FS6|hXr!O}r=!}Z*IfUz8?_)!&|LiTouLu`6}B1MCQmFIjex}iZqAnIr6)|) zRJaW1mV}E1^0X7?x9^h*6=Ry3A1j1cZv6Pd>?+Uk6FeSzG&WYY( z%|9;Hk%3tjMMD4c5JDkSnLHe9L`KIKzct4M~qol|1WMKCNkHXs|> z@cNo7UIn7|V+83=cnQ-xQI*#&w2+jE?R)~>COn&#U5rzmJFyUf7lx5m#VfyJDq~GidH6_53&sgyaciW6< zy?m*c@hVF%mY;vT|NQIrOOZ!AFB0%HLn5N{!zslyZi>54knO^Tq1~SXpk&qO)_Mxw zVXN2-=rdK+gmW{AuWyaNGUF&fOi@Gz3L>Gb+ZK#1@|$eoUf$jX&P<~%xovYTmvNX6 z-q6%W{a=GT_#wam5(6zA-cxYA9qDM7k3eFNmvm5?E$0t_SeoK4kgrnQXps7n4?~A% zcBEnDIUjM+$@UhcJhlzGYk;ZG`g)8smTry+f*7>-!xAEb-w#&z*q_H}E4>w(SQ!cR zl&)U5FzQ|dua}7I%vNwN!4#%YH@ITp*jd#iW!K(uravQ65=jz6zK1f;)na2#FeH={ zNarHC!YZie(iw|tu4i0`SkEkS&U1Z*uTDpF?PQZ>MX~ z(lO)83G)UX0jy+*6L87lU-HHJ<0k55V2uz>=NJ2D?I|eDPui)2C;3p_SAE<3$nBz? z?rcHSuBq2d05PR%PS^&C96L1Xje)U6xk$)eV7bb}KXmN5VE2$4&p*Re*QFf-S0`zm zz!z)ePAiOG3UqChrnGbKKac3SlJ$AqTs`6z%5XK`%I{;cjc#C%v+!`~7}VU%6TAJJ zyTCt(U+COb3=)D1c@|!PW99M|3Zq~&A>`f;9Zg-j;DJBfyH-Dl{B7u{yvNRQXh*pF zyJbYhcndLAF#s>(!dakhr-r1N(L^Q%cGrITAw@%&Kp>_Ie#90r+S4c3vR@GK(${u* za@B0o{Dk?>Ml72_g^4K|@K!;mNu8@Xo$iC5J*km`!6@Q_a*RzQeh0b+DwHp6j=mX) zhY;SsPe{;K_y6I?9Kd7pp4fwHCX#2PhLn2BC%L^1^M#CxQHe>3MOVzNO;7 z0h_SHC%~wodnp&PHef^aWUI?_p@Yw0mE3GWrYij(#|U%5k$BF6YAt9(oAM;^9GT?Y z2Z!W2FFG&)qQWSAg1n!|Tyb)Q$?{hN8S59&|aJ+Z)@dfbzNEVr6RA+#LB zzZ`9NBTc9VFd0F58i}2g#V4Jk0+7Wn8_Z1|inzI6u{T=Gzcik#Qtzn@NSt718sITQ z)?4p_ylE&Cr>ijAm=dF7;6ouE@5wr6p;p0oKU(-g<*C{Eu?+o6+y$_#n;3h`4k9b| zQ!+}4I_L|`W6CwZUYAQrt*%PB`!K#JmN08?3%*_CjKhe^mtiwDcL?s-lCl`!OIYxo}Gblj6n)m3mu&6n4R^=ryg6fp7Ta@z}+yTjSD|2Hs8a`=~nm zI|#=!Lxj4IYuAMf>7vrZ$U!N@Ggh(SxV@kCA=1^}N#_i?xV*g;#o= zSdBDwmz>P54V(sB^nB%!=DPmgrL^v?s)g#|O)X1{XZLk9p2jv3mBax&hy2aJ^y8)9 zHI?9UBi>Hae+v?Dho$0vJNXqY^ZT61c`oA+Mk0>KX$dw!&#`k_<3%aD?i9^?9Vas z&P&C-F_XAe-l0Q%af3%4cS2P_0S8dfp#WtjEDdJ9%h(`)TiKIfPVHNlDT|PjX#he= znO?5q>9nrj-kI8Q|9^V1si-BfV=^<0QWKS#Tck zoYF}-Z4C;{0j)HGH}$YyA-eP=Uq1=dmBx)=;e?ayA3)9I8ErAYom43(PfshBpB?=X zOwOuz8AoGied7b(X#1Pl(@+x*j7gYDO=tmwsLUI5+jdQK8N9ncmk9Fn0S<^^nrX|R z7UyqpZF34P=U|--+}yU>CW0ANXMwm?(&O{X>&kzz6*q%R%vo6)+ix~N6s8EbNIp0C@f1@$jDxH zZ``ms;5~g3QTY2hn__}t_C2Vs(z_twbla9|f{T*1i$&T9Uo6BM=#3xalfx zjQl!wB!A9wGXEik2+jjco%QFB>Bm;TyNj!F+EKFY|C_sE zEtOcFC*z;VVC|{1Yq?7LSNIag#(yJ?PepOLNQYcONy|o({H(ReH~xvT(LSz+5`y)x zhYZ^0aE};7Dnxju;r5&2a}u8GluEAL?1&$!VL_@vH)&T!!~$i%^l%twVi(kDCPR^? z>kb&ia!h>6Yjq*-3ihbWeE^TEc|Dqu3&SsO;Ke1sUkXzWs>n{JF z6#k4+_%q%A`pOZ2n-9i1K?4_!uU!~a2L@8qbQzGt8;p*%fn6yejoaaO(W94eaNm89 zj{lit=8SCjP4s>$uRcYegeuPD350$z6DC;I*x92f?CMZ|K5UbrskkbU`o;Rrs@93z>rg~-a;7_6dgs{=hS8=?ZY0!me6Oew7xZUj1!!@5pFYQqqPCzM(0{D~= zEV~9O^7s$n-qlX+ERcQUBV}i|Q#w_r8zwPVIR9;e+w1?xz)s#xC>x4NJt5 zG=eut3U?;g(L}M6P0KyfkA2RQtIp>#G1UdMH)W`b&!YN!{!Ym=PV%u`=j`EXs#1h%jAUnNE4-2Ev*wJGzGc+jZ ziJoEqPv&+0EL&c97KKg>^B;LDq^82UT}H!5$0kE8l+Xm4oBx#7_`Yo@zUnj`U1LO0 zR5B9>mJvZH*kF**kn<^4I>M4DMsuP8MMe|whOgt+heFp0-};9*YBJ>b&Av7h*;4Il z$770vzeR0Y`vAqvXlvH)hUY{DNWqH^q>8nZx=aFwn=^_~;?W75J3N__p2hFu!%NxX(b#@EscLB zczT$h26ZcQ*AzEcSCMCCK3pHrVFTM_?z`p19!!A53W#uy@N#0KSB9k1=d|tOGvhqw zeFGLkhO)kV8qg&48HZq?R)#V-*@r+*)c6ro*xLMlY7nYd6$>M0L@|aXP*8sOrmewt z=?Wy?3Bc|1Y;>wk{UK@5MPK?{g0S#gvJ`ppN!(znL+Pg9?(Vql|}-O z#RQ`FNk9!In|>iLPpAz<<7^rM4K0^eA;;evYoKqx$Nzi7P5z}{hTBH1o+*C*P*28L zqBIjfmP4{LkKC?<^V&zSlEa*kigt_YN2)j6UC>6u49$20d!CxATbCv|HB)7rsf5XR zs$%I2337{nK&ZjU3$H-By?ccz_< z1{QYV+tW=X8m zh;3A3zpCOZ3;=}%04VVN^lNNnTfVRaZ8y3b^EIDic}@Y@{NFIyKE?{ia|rl$B)k&j z$q_Iz)F|8!z%0w2NHB=i?8fKnRZM_(QY2ECUC%~0fw^KcTynFuP8}iqNA+GF%#S{xy&O-Z?imA_p<{;C zSj0Z`?q`yHMyR5c-MoKN)EBtD)t%pGaP9Tv@ruX!b`CVQ$fzE_YkPKvcNL>mF+Rd5 z+;T0+!MI}T-LtHH_Er{PB4_^z6KtNdKd1gb;f{cnOD`$z&IOSCdp}e*D=HUa?IZyx zw(X@i)7I_31Dh)M{sl)>O-WUmx$OYX>Z&)79oy%)XYj}&##NI#N_KO+w3 zGks5!pDS8?4d5Icvv_uz3(XyUTWKDPI-w{qDY+$AQ556hPz`ygu>GBuI{weA82Xcv zaX+O4f^%rc+#v8T(LBw{7Q%AL4G@DH|316f&K3u{4P)orL2nx{pz@KKg5$M&+ z{2~iMW>X{U&M0$_$zWRzx0)EwMk)UQnf0wqLyeJ#5oVZXyo{|Q^Q}vHHb5Vnq|0$- zfc*G#7GXoGsh|vf_Jq&cB3I)nk>kbL$TS{9ESh1nhb)V$yB@~Cl{55+hH=ox(vFeyjp673d`EXUj!O666b+4R!dxoi`WPe0iX zAo<^>-16I8kmy%66zJ|D@Oq=WaJ zru_q~>#<_H#BY8hG`$mAORH9F_?}iHMshaif{OAnG4HL((Sz;+&saP4&@w-fqZe}%KgB}-G(oEsZC6!PuCSPh#~d}7tvtes7ymG?%B$ecX*fm>AQOpoLJ8lHvWMJ4 zcWWdkQ&PbQx_kH4EY~Zfzv{}c9y(|!A&Y%0aJfAh`WA#>4hb`EGZ#NK{BlL^nVkiL zu3Fx41XUFoyd8#M=yHATkq4CS7?ewk;il(^qJ6tRa1>gSD=Nb6?`v||jJG~NR_YlX z-8jxE=MKUYQsBNg7Y&T3#`mJFZC%JTAkRgQ;y&;Xm+lJ21^E}9U+FY#I;z%@Q3J?p z^igA-J3e14WMnJg-^rP}ir_TWk8A~1u{Pq&v~y?iU#|Hzjx;{RQ2wVn2z<_tyLj~D zJ**V}M4FmXJFi$^)!|$Yk9o))8GTEqH;+SV7ddQj)O*%)ZYlpAA^XFJLH+xOkRV37 zeOC?Tdn_HD5GF8XFXUQvUKhs?rXO9(y_BWLWkrUA^j{;0jw#P9 z?@$sXMGrGpo_aCe)seAhhZv~x&#F&lG6J`ph= zG-1ePJc8R@+TZr(E2{|%7g)$~*n0p1+zdpAw|?F7)a^aJ10XSFI}ho9969`A0qp@w zDR&odedL6{BL!-(YQ(J5-Ejb(G6gPl0V!1InaTTBCWxR+a@A6Yqe`!Y+y?#W*DTgQ zmwMi)1+4SP?pWTlq1&*e=Zy&tHs>-TqoYU1;!J3Tb0Rs*4Pu~Syf^%IPuTzmP}^Ui)@nfR-X8~$?hVl zK75Z^;>6ygLgNc$UOArIBll6w>f`V@L!0x}TF&x3^^%kW`QtTnhk)yx`Y>{w{z8^i zaiftUZw3Wh?!&M`JG=Jl#Fe4p%%Ql}tnw4ml?g_rk%$kXTd>AQK2E8I_c@Fr1r^)H zE}c9WB0~<|q>1DeE#MzWLseeen(=kWr4?i6M$N0Rhc^lygqLULoK4;?GdZ7P;YGzZ z*vkgyl{;*oRyyXEF>OBc388`11OjeRjuY+4N#8&BG4^x<00ggeKxk_z;=qtdeY zCy^xutFc$P2QKQ+tRF=9><@JZFBi|3Y9D4<8c4f6u0dIMe4w(DzU z2F{1MBKY*x{fOs8$G#NWIeazNor`k%G!HM+Ms<4!$SG6w0lAaj79CMVh4MLxf{}s! z`8)rm&t%|hed$%@L6c+d-Zoe~d;HmnrpBoo0RwO`douhHUVZ?`{Z}|A&0Kn;ZtWD? z9ZStz-`c4H&_yC}RmBS@sfus^Cu^YwxW^aV*D!bee)5_vnrGBBu)Pd=@=1AHKljP_ zOJvFh7r_(z&IJ4B48nM>Ir+5;(s3(@vxfMRc8QI`>I`CA12!^fjbSn_X0Otf?fhQ* zS|%ou4M$hrCqkAB=O^UHahom|F_9ybXN-df`Z@@SZ=mi(1wp-Bmf* zYt}O(nyPRyo$+3SKYmT4mrVgRH^t>+ayW&-+ar!BDS5ipw$(CcW1ItFwKKLZ8B|TX zwzc9sPF%S8of7u2pbMY9$W}1WHbt}`YgGs{5NoI*$RccG z$F8`5rdQgrqNEl06Q*c3WvHMdv?Gea zH;k@11m+i0$7>{na4hC$Q`HE>&T*OIa@a&ns}{9um*%d9IrX~U6Q!%l_i!c_$fQ$* zgYlENlCVCmu887GW**K>9Fxm|_InCWYv&mwyxGR%z*t9zGEy!C3D_fzG6F%P;w)+n zR|Tv{qF(*)xaOIbeT+e=jqc(qv1}kCf|=jI2QBP8Wb%50O^F7xfm7w=L#LQCg(@jv z*HxJyo93G{;lxLX=3vBAro$5J;kE+M7v*=qRa2RQyU&QZ3U+G1qKJ^>1@gBBMp3XI z>%@M^WlJ4f*sxf);NhaG$Dhm$+g1bH+SY`EiIcB9Pa40668_K0D!2LuNw`sXY^&=ToFk4^4 z;tz>4d(c5%&gs+JC+1Aq5ky4Tclwc22EsqPN-K=cH|5GWwuSM)@u-P=ciSIKbH&e> zSsYD}wHG|$OLXp-SH9p-GAkL%F%I}=AL-y{vw7P-MD^8wC{@XjFH29c>e|OY3q1G3 zYvKUTNf96k^@q2@tH@U9o&x&{RYz4WE^ciV{oRi5QhzO$zzz27ntXT?VG#~f%%61w zLpVH|36_w*9M7d8({Ge;@&R%I>-)jw{;unQoH9ewQmbCUuIptkE#{MOCmygszPVYN z^<>O0_8rLoN-5@PI`Pg3QnMBm6KZdq&;{AlI5>c^(Z*Hf(bpU-C`=!ktyl6Y($pD4 zYIL)U_M5;uoG)(~qUI_Dm~6c+W4bCab??cj;<<1YRO#8=(BXYBaSZ26#4VZrQa@%q zhcg#)!_DKS2vU;^n?l`(Y?7t*#zYRXiNEC|ch0{^g*L}4x_-m7#|nbP{o_&y;Tkuc z_)`4HR@2A-bwpJ#5#P<*XnHRE9d+P<8uO;^z|%d~{$f`+c9mB66RB?OkhmDv#R$0- zYs`qdlAntt1rY}?;Og=$puxAVz~Yn0^Ca`@80l?xLiaabA$KLHPV zASRaf-?UC11PV{z&P>%;vI;GfQSu6Hpz3mDXWlv2=DXv{Kq&emD|28VDW=wGHvZ3| zg-%`cYvZ2_ltKnDYiaeqC&llxh&WFdHPXhl{pp&lfTx^(#aUtYK;f%lq@6O*^Jl+V zPM3$kML)$gWxzz6_s1fxJm^CMzj*&T7b@2JTy7Gk+)Hf1V<>!-a*g^3e^^N#!Gd-k zx#(+Ne8z=yQvQMRgMd7c%Q?OP{o?$4AcOxu7w+-04;_fE9=LGf+qgSpz$q1!3qRt# zeWP1K{>x4fdX=+^;~mIw?apWLLsTAa&;n6Xp2|uVU{%6cnUEIy)ghMi;WO@!xR4Zs zRDhRHB0IFmEEvo5wRd73EKX`N&wc)~fi)r0JE{9tOk6kH>bK{QWu<FOv)G+GJV)RV|>bM@}od~Zv=0}BIBzsgiy(^q)+LAcP`5{-V%a?y=K>| zspJ=>rpc|f{lJiy+gXK;fKufch^C03!dA71LqB^eL^A1r!UgfhoMr{B=bwr{U0L59 zEoNlcQj+{;*5SCZ>4N#VW4j%%;3#w2G49w-6Ddqsx>?B@{y0F_uRqvcXIDTx!^VoX{xuPOy)+dF^NqvK7kx>4Fz<$T$+=u?G2!n#@M$-w$cj#HZrZb`c-=%a!U#(U0n3Kok}w+4>PQ)QaFcO#H_iqz9Mwl zz`WW8xc<*|mO8%WZ98CMez}HQBR53f@+sKpp^o7F4nO=*%n%}9q+-+q-pFx>Q~ew& znC@TUrjN0qzT&Xk{Ma|?PEEb?cG+Pg(TM!9d~2RrjKV1R=D~ISWu4*w_a1tBoX`P3 zK&XLyegku9fYHB0MG4Hafdvv@Yh>GshFa@DjAe{s0x@58Nc@yoOSRBLv7@87Vh=RRupVOvys<1%*Spszw>OImgH>>b&pH_TReTk7 zoNj|WTvx>YSgfcbVyW+c61Vu1nFV^{o{a8rXi<#ZOlW~W#oNcNMi}e9Vs6a^#OU_4 zaV5gyDKV~oJO3lSXlP?T7m!v0(9_Ad7BVLZj2{8$dH8NHoV_FlyC}*)6d5lOEX)TX(bYI%tx03Ze+p5b9FUO#NuBc$I z{wTL;scOdAqhPgBp~*(hvRFHz4MDxTrWs&_o!N<_yO*F4H zFj(5mwB8EeOHE0|0?rbi8dj28?=g_N-MTR=Mr}KXl-E%g2`AUw{l0TTp6bvt&UG-Q z=2N2uUI+O6rCa1C=gY;JdtGFbyg;hT|ML9$qUui5a^BS6#XI0QcB5VWhy!E`rlKG- zIlyH*27U#H1D3TQRlQm|02rv?q7bjh+eTpl6AK=Rst<9xvKs9LXCU4N8IX$wLCWFM zkIJ#O=W@P*$;WtaW`oXc$Rp$W=d0Z~(}RX20SihNzA;sep0ah$k<1vik0prLIh|~l zin`h}E-#_Csxo0G>n+ByNB(tcGYha9Dr@z*g}51UwXv@a?OyqY^1{=R#+zax#}B#` zc70mSB5n9KC(|&cgMMPid-0eHOfU7_xik3Uu>MvA*7Z0?cuZPcuK8FYFrq}kPTSk? z&l?!IBx}es58v7MfzNcw6vs)vTyMTEUV9y*m45YcSv+!t`&}ey1Oz8PKg%Tj=u6~_ z!iL!wg=Z6|uO!jH8?~*&ryL;vN&thlUISFaf9Lu?VFgp~ATxy^5xY&55TZULR^9Qx z^dw2VgX}KdGqmA+mk>SB3PGYYQtws7KD7JNwlYp z_OSAuhan()P0Kl4I@m?A z%JRyGc&EmV!n^%>9LyOT?y6;jFDzBEM+FWTS#kIH`^dM;=#}}%wHYSHx z+oo)Mc_xmtqrV@N?*+Ib6`-7c<#vCN`70Sfy&ouQ9P=79Js`&b*+*>GrDK!9(N- zU5kn2p$nT^K1=dcl8R#u-Xp?~lnz0@03>^OSB2%mMcn_Ze^vUx+Sjd}A)qM2{Y-(b z<_&OO01`Ph3IN`xCzCXgwGT`{dRu1A$eqm~tdZ}tKQ6`G>0&{LV7;jhf+f}xNS@26 zreJ#+>jk;6&>zq~VdB-h7F1{bvz=7+K8fb;kxkacX!nP?gauXP2;_9DpTh@pT?uOv)wlHT&6p% z3youffsI@_ZpNNKw@jLnO3zRrhzSWg$4<-45bLcpDHHWRAa?#n*PjYkv1BV#HZz%A z;%+m4bd_>U>+i25xqu-;4zkykz&nSM}=tDMcw3_wn4;Dv7i zJU>qWrib?d-JKI~9)k?a7tetJGyI#OfZ>JV5;w>ZXb-8E3b91Iflqvyna2_VLJeTL z1Q;YcmGvp{ASo*{zGFWrl0SfFrB>+?n0U^+KRYa8^)w3D#Y55k*W?vu>Yc;1d0dQp zqnW|LNB?~Ee9?#oSh97)M!Og?gqZu*M#`*f__+4mdc;+O-_#3{GyBCY z-ChX@akPT1|FGyZQ-HQDD+ibqaot&`%8f->VPqX#X_6RZQI~E`yeP~izCF<9NDKc| zy|Q!hg9xH|c0Qu_U0r)?-MpcH>%labQP@ylt3hRw<5}WqYTjP~HmofsuNgTe15uTH z6kPseK+S#>+N2kWu;^C$#+}akVaz)DE9c5YHSV{$^C@%Yq_4|wZYRs(e@l2-*T10f zIIcmI?r}W3RAOq^<0W9av3omn@2QHV-5xo2@=A`K^|2B=rfmR+h@`?7a$7=@qUINB zMl%t`SQ?lzBfa-x?x^{QU9N}mHfmw+XxPaE)0Fz2xeu#u%fskuFB#)B%N!)&l!6Fs z&nh)J(!~bZR<}b1e(yn9ipxfVQYHIXtiy4c=? zW%yce_nVETuIF%=KgLhzNjum1?+?#{1l|G|L-Tpb;OU-;;Ie-a5Nj1TNCHDcDNfK- ziF1$H#>pf=L_mx~G zE)M{tj}9^0EHjVdEH2w*R}X^KT0PR5#Fukc@Y6uUW*{{)Ly^9^WCl;-*5<`t{)Ub% z2p>Dyg|FfpvItUo7_dl?$5nMFLkO(jDGEHo>WQl;d11jR6Y)~XwAxg@|GSH(d{#Xl zWq}*phxX${wwJQo6BTbRtt7QPwN0wr1CWlGF0;C@yuI>2mFNjMH*Dgoza>WhqR}dpexPRC$3Bdg;bym z2VVt@e(rgyyO+Do-y4WJjCb_>{rw1dR-L$)R>yZs0LC@)qgCPGnwlefzu6of8xP`2;+!;?dZgc5n7sb7zDT6lS`YETd*7AI= z9I)!(|0;x)d%;LPJ=ZA+7ozOn#z)@OwSWDwrhh9U*VjLSa!^Bw-OhI{HQ77X%L`IN z5ND92L6w>vF<0E&rRIhy9WeN)_?>|va=V!OR656e$90MGt)Qy*o4bpT z3Q7g-NboO>6qholC2Y$x$&X3d^WJBU{CV&;&7zKjC`Z}x)k=}#8WEr~c>5q_k-Wlb zkF!g0#o=DT!PL7?=)U*)7{Bv5&#&a}k~F}0QGh9S>rI1*;POQ=FqpJQqW9~ue5Qnp z*9NgJ9D7ggTzbz&I{)&BR6%ErJrAqh#reV&MiI44%NJT8Ril5XH#Vz8g469i3O*2= zZ)&QcJhf^g;Z}b~O!*6w#pu=V2|S098jJI+hH;N!K7_2MFiN61@FgK+LuA+Sl3#E! zVA3>MJ^qzqm|J>eJkTDrPk=5$RC&|&{B(r6udROsRKlObuA0TEU9xKh!Kr zwW43SC_T^hcWf+kLVjVN1@D+@-dDKp<+N2Sd}NX#ukFLtf6nYq^J;0pp{f1sFy5*5 zfPrj|rrKql1BbAIuF33k=6y#gkY)`8ly>4hfs(cPWo^b>uL|n@czV*`_WsEgwq{I9 z1ctpba!6%;E|7iEPj)7CgxP+KMnX*-ENMs(YrmM@ zP|2Zb$1|kED}-o2?v+8f?d|9eY<+eMogMOcgVq>L_I*mcTOOZd#KkxL!2C4vzl61x z2w!TKxL1q5*0WY97ooZkIuiToorL#2_nlv#bCO>Ap;;o^)x(2okIpVrrm2whi>Ae8 z!y3{c0WQL;7xE`L67?gB_1Ek5%RXXH?|62zuY3#yr~AC$*PZBW`BUu1@17pAeT~}~ z;rmd1B8N|LZ_`;Qw*Hmy1x;z}L?0riZ=VIcfuhIvs_0uv_rG6x%(ZF#U7dDot@ui_2 z)71O)^BI%%5_8%SjAtv5vY4A^**yhiv96RN{+gDk4~Ch>aM7C-@sO^upWf7rFr_AC<9b2yBo-&{?`U+%r88V}M zDP1vQv`s|xt)erX`IRCynR_^LKZW1BcWu@^(Yx6^({z|P{h5K4=7^l-OK!M@p6I^Zw zox}n<7yxmX*?=FSi&~I%27K0_IBr{xZWvNuFcT1wl|(anj*2~q?fk())2+t*Hdm=I zKNZTz)Q!uo$T-_dwquv>XZCz6V;*=e&L-ta*)u{Tp88x^X9q6h*^Y0MvjP#!mIF*2 zmVs?pm{5gX>kpX{s;7hUj-_sn#H5;HYw3|Qg2+*FZP;hNR>u>+mRlm@El80Sfjg~P z=h=siYkQmg{zuJY6myO@5lAZiLlxxt+U2-F)O{a|4J$v7MZ>p%vP)_BSeJ#_-F)HYlePVLk;9tH2m z1(AIOv@jaLY!idEQ)_o@_TERfSMOQsPtixqKH?xQJm(fczH@pI=GM#~!R08ycK3fL z`llKu|9Nf=faV_UoBjU#09jWIT{0~S(h{da2Fo0D%<|dTuhP270LzK39KT@%JnS#a z8R_k#F7!ps55D>8r(1#ti;|= zlGWu3)h{|}ZSR>g5RRnR?2c>%G5KyUPH_6RUMMo$b{(M-F=5WF%iQQR10CS<7U>VA zVw(HLC8FHeA@K^zm0#cijZbxt?7C*!ulQ2pIdk|vg{G83vu}Zar^uV_o)TV`HSCpk z&M_RPwsXbHQ2A}2)MkQ68Mba;29v@=SK4PUPMttLivX7*+gFM0IrPl-{5{r%eebEP zYcHL1#L>Sovk*Y-0rXz$bAWco*%1T=r$85zt9iEJo^YUS_56wHr>~A{3zRBNqlw%< zNhq&vw;f!@nA}H?(;DJ9)v-*-Yp+PY#D7BbYED=qx7fwU=xC`wXK;=xA@@3HT^%gD z+BD_4ur#<1+eao4x1L*@0vl%7Y|nq0(u7HIs^h&${bAh4EX-I&?zZ_V8nlSQDeY6- z)0{OkpKUIrXsC1;@JW^|^br}p9Tt!~36z=En-c^Dc`l#EgTxX)&?s^ye=Is{NJEw2 zMC>0P(XteCPM024Gl>^VD6Gqvh9cS2^(N*9z9Qj&+9ro@Dax_`;1P+OaCQIcuP9mI zOIK+&#!XoMVt-6>^5z&=GU$TsTH+VcbhQBJh66OHP{8%7(8ii3RvqW^#WO&7WfXk* z&uokJ=IES^fQn)ob7L_;t*Pe(9IC0PZa*UHy=9hP#>VrQVEsPm*YkEh69;kvRVZ~W zb8SFHy4Z^!ZS|`45!&NlkKjcWQUmQV5*F(yEybnuE;gye>0$XjCUIL=;`y#mohvcA z2J-xTx5=Hg#gpF*7tob=9D}-uQ3F58@5B?@i{T<(0`Av$mkABMA)?t6E`D)JUa!tL zKa*VfnePTd&;pBDwC&CC@p|iR!Spu7{ru0tk7hB(e$!dU32rJOO@_uhLH^h?c#gz5 zyQTg0or`o<9)5)U9ATcD)iVAv%CB+H5;_{G*l{>J-VtoJ`xUYOnp@B?r5E>>%AIpK z5z7|by+?7}?z?36hDor?X$mOPmtsL=Iyan*Ab`M~a6DVaFGuNtjeB5n!w?w-$g!|4 zlGm%cyv@$y2^y1Kufo@>jBlbbL{qY4uzc1Y=(K+VVM~Rw!amsn{s#CJjZ%FPVoIQc z*wdtg$;;sK+`(sh*s5SqI%}CT^d;v zDXb+XPQ8#_=+%-6@_Z5Rw!&q)oRLOkU%D+vVQa(LQArh3YI$t>4w2ATCL20io}WcFS`CO?PW%{qLlV04pt< zBJM3Y3Cxn-CvsKZL3F^MUEU^h@o|3hEu|kr_u`f3I@Y999W*{$b=&Xx$OqcaftANA z7b~uxtoC4DoI*oc%X2hi&D0a&C-H95edsV!k+kl32WuI5wQ< z%Q00F_W^X#K$n**puXkR3lX~yzQ$_0e6>anquRB**QTg@cc;b4n^*bO!iO*>4u{W0 zst>v5wuwRfe7b~4#Xs}h!ey(Gx32hu0pk^eQZY11*CyN_)#fd%u9=MSXgRK51Bk#a zN_v zlOnQl3%q;B$g|{f z%s)SJk2q&}^tOQS7p8Xb*YIiQMyzjhZAA@pBM|2tWD7gPVvq5)` z!2LsMapdp++@#(oH{2DQJ&%ieH!y#m5TAmS~Nvwk*7}Y8_r&P8?abLZ;3#$?vcq7RPsWj*U(ZfS&gSUs?`v z^JVkt>CZo*sZISSMJSCHr$~;1b(Ca@uU~F@@o{bat_33wZYj|CF5JGY{>U7z>Gy z?bF)WajAD~oysobS?(0|A9G*!MRILD4GnRRJmC)=%&DrU7DFnexvXuOQi z8l-zeX;@sTf;@nsILSV+`p|weqT2#Y*4Gn+epa8*@D&I&QygbJe4{Qgx2(%KVUfLTLcgtV z=!7$7gTLKD^)k7N~s@QYA37 z_mK;02X1$~_<2DSRL2MSP#qd80jBmqsjpqmxAS;C57@Td`12WqW?YAFq-F$nY;slH z+$Uc8NtEs$KH}E}I+mB0}mB!EwvklUV-%t*gt$38x0k zMpG-adc8VI)kAa{Y#bbO6;~T?TJtb|PvlM1{R_0#50;2G$r^gq^3jq+25Y8l*?7Bx zl~y4iG#*A-MVap{K6Xg1AQj>hqf~^Ky5y!+yeC^lCS4SG`>&o@``EPeZ61@zdA<#n`2)$Ud|LCL@= z1n|JyH_jzdB*2uOe)$4}ltm=q_6$|>}uON?zup{hR4oUs8AiF7!URSh* zQu5cb#^f6UobT`TsZwxc>^u?PPIsW($oSe+Vxa7pB(K(F;1z0^@g}EvPd#>V!_Oo! zla^2P@#87GVO76LCE~EIjLaWh9zR#QvY@fp8#HMmIbAKRsVA^rvSS0A6>B>$%MqVI{g;-q!DS@9bf zl2||ELC1%H_%9o$v)dD@%1K=O?q8gUP9mwVrV8=SUlPE9%`pV>M(%jG>AC?Rk$Pou zPHF&TFbr(Cy8TsiZ()(P$7&z#1MPa@f3g8lf)hv$loW?~;Jl@0oQC1;cij9>g zeiddyrRR;HCfV1_jefwCv6B5^xPaFUOmGAN?wBdHx<{XwBv9)aKCe<+27+q6QZ+Sm z3-mL($ATWcf-9v*hkKc(eO`!+l zqla_dHV-@=&AtfMp_F95(J9XegADY5q2lse!DTLBx@am2TzSG7HXvaL?oxmnKe=9| z2zC7PHD0Q-048V&vdd_3XQ1G@ea-q|e2d8k%uv8Z3Wy8ms+g5Wb0ITuN>QlUXvuHY zD45F5%%Os>+5VJNqI860Di)W_y9PVRh`JCMGL!!XQWG*X{6Uo}u^ckIyqTfK5!DAE|x=e;#wYHEs--0`r?R39a=QAj2jSuW)rz3>)0&2_P^rGru=;2{&oN zpIPHn9+b)tnXA&G#Rxx(aB{zvPRyA`PXA#m-*{Zt_yCfY?eRQt(Jy+T{d{>jD=z1~ zzhy8Flc=DH^K2zc_VIlVx1N;w0sqP>Vm4UG-IHCvqvVB@YO1N7ZNE*R-}H>X=?_u> zG876DuK{#&0Zu)F{zpLnG?I$mU&c8BWMS}LVo(Zrh6FhMPC>R_!<)5*=Eq~J*H+s- zEpD~ngr+bC=h3th_R*|v<70>)1S_?ZFdG%=Bi z*DTDq)xQqMGsx6zq}8xqNZ^63Z@a&E`sX`ydY{;s-L&{HjoDS3t{rT7f!A((KjQc; zALdH?=}5xVIKzHVLQXt>KCML2166$I?eg~ofv@KY##jX4=AxdNaSlclIpOqPqG42) zSf44Q1cqGX>)cs7*RNvlWc_|qZ!fy|m0<%h^?#}vQ;hyz2o=~}G4b#pe_uO{}94J4GoKhWZ!X>HTsW^H76%zD-<@R%M;s1+F!*!Y7- zAf%b9WpHm_E%1T7y8RSoQ56^cpSb(xs4DT>N0+-du`c#{XZKSY_Jj5-$Y?wxMb8{D z0ZCWbO_$xeug4-VR!~SH^8A}9YQeD6^~Kh_N6N)3 zld?Mf=qVjHoAUto!ThLPC$F~eHTDVOd@lRYyLyz6|7o0S*H`>KJ%LI>^yk3WbBT8N zMOcg=uD{cIiNL3_y{A{8l;EG&6^nT@NURHrfXXGb*$)PSKzf3}wEfv~9Dy$Im<WI&E=kJvS{fgleme`77?48hU1buuI+i*cDv@;V@dq z7U6iJ2)(VRhWX~sFxe$j_Y!G&%LZ##veNwEiT8}T|-JL-5nwzInvV207`e?56?a4-nIA#iy!av zJ+b$Gg6>4t;$1YA8h$~OP;hth<|gYyqcYFeLWo$TX`9j4PsP|l(6s;Zoln^o#>QN$hd3)dy$AWwTpq@@LjIeqhLNGZn;+#e^&!Nlnou=O}rMu z(}}{Ci5zI7b|y~Ud_h8JeLJ@I7p6c@6V94;)9Z&NiJFAO-xG7Ku66W;EKzai z4Dnx{1+r8K$6-!2bSAFj=M1VFo~ukIohddF`p6kQ@W3ld|8VIRp=95JtuzMe%ptSYt3$Ug*9=(+fWTj42)*Olwj`5K-3-F z8{yo0pbgw4#`>4WEyFd!JKT4iQEBJbcl=xCxMh@Jjyo8PZ;p@7E%ARs{ia_@;*yiR z6hV_jkOCj~%LU3u`huj4Lc!%4csUTTi_oExVu*C>9<&5>R^-7>C}y59{Cj8}#p;XDqE3X!lH7*J;5xk5RSwS-(w z^V#5)q8nsCT~g#qh%jFrufB6BB2UCCV7~>h>{W9zRKV34mxu#&$N_@YQF9|T8r_V# zeRNWnzhD5h_MCzv9loc8zX%YIMk07LN1xs_Q-Za)X8+TnO2gaL^8h6of8Q} zVZhh-(*q+fBPNtXZQ$f`e%^K5eIeY~<1n6sXTtsPKcv-5A3rZk;-WT20D&YIxH`Jj z?uASCoe|}-9d`11`Wc;I{RT{P^a?YW1nIZdEW!}zUsE=8hMn{~>!G4lr)Z(a@;f%r1e@Cp2Ut3mjg-z3zyH~5D_}2WpS+8DNg33#> zrq7Lm8{6`4Cu-kl4mF{&Ji~;2z?y_7nD$0miSiHM@iqu5r-}88<)_X)ovg1wXl7`^jkm|gL23eEY8-9s?;17}u*`g2&XkNiCpK@OXdlf`<&bHrYK1MdT) z%~367-%}KqraCTNXkgT$QC;6mCJ+7~`Ko4?J2$6Bha*(s$!Crk25&Gf~b=tSdmJ$dvY-Kd4t&akmT{CSHy#V+d$pExakd_`0%;;ec}8 z{7fg?%3aCG4f$_91bdx(Go$pG^Y=6;SQ2-^O3LdA@=!fUtOoFa9~7WAIz+(iTnH*7 zkWJl@Zt;RK%E$+y8{a@}fRwiYJ29I6zX4|j`>4AfU0E2cAB>2+X zTN3v#6^*~Ai`4J}wNaE8cn3EAB|`dL?Lhc*nNVD7uW?yt{oEOl1o&zjyv5p_=9n?w z##+nv{Q9oyXxvN2(X@S5$qHO2Gc$gdn@0C#RKn7!Ow$CVF)?)c$f<~+`zM=G+d+ETCI@q1|<$rqtUMH$%^$(g4 zS$t9Sf?W>_AX{gyuJc5E7{oX2aiD16#L;Xgz^_2tW%15-Swc|jCYz@kd+b*aaa_BC zIwQm2X_lw>8+ZLx1?#n$M|`ZP$hAT`o}&yl=QaE(cCFA1u-6l1Vu@`&?T_RA5n*+k zeYfLn@!n;fF=*nYB%OcmmNVMtBx+iY7Pg;q1^RVI$S#F3Qu*Cy3Y@Z0p%#C)0 zNYW4ktz6mnSDQK@H8nT}5|c{+XaHqp1jMc@lyo-?S}_GJCA)WUBLZypg8vhY)Of08 zFVj~kLC-3I9J~8dh-y$soUE&s>+WF_h*o#s>HnqV@D-D|uNJlO2MGhE6qlG zJ0>a&g4NhqJ}tXNkbJWywb{OAyD)lgH(z5b$r)dB%cB=_Z18HpU5-h!fcdjx?S}%0 zcdP|<1pOfbv||Li)-^?u4&wWW6lH_%@m6tzmzKQ{I_#X>Yw-4MAAKM{*qcy&@oQ3Z z(bvP57bilU(MHD_a{iFT7g=@kX6V*2NL%K11;RDq-#s@}1eA}%hgpcb3hpNYFC=?K zyq@Jegl92A2NDndA63Hhp3;WgIQV&lBW z`$eSFwFC3m2IVs5*Y!eUOA(L&vrl-U2ZG8usm6iY40mMGXK}1=HBwR#1$4f}nOD6R zZ+#(8EE4U%&HcIY-@=LC{f39yt@v2*4EqWP<5W`oKzH*Tz4Cn-Le2_^fXIifX$|z) zPFd>chbkcFA)#gK|E2^r+Ms$b5ZRA-*hy*yV29%km^fM&3n<`Vt{PPmmz5LLWVS~g z`d*smtp&cY&7BS^4z1>!^QRC)>j=dSn&ywS@Y8ok&A2p?zgP>?KG;2-9H4eG&Fp2= zleqvtv`e+KmVUCDj!*W$%YDUelHoW7sflo)5^8zR_1g3;GsusMY3e*v$${pkZb&x_ z_sG;?=B7-}5Sk^!K*VZgV6J$Due9ez*s{Ruxc+;SY4p-!aO_gICV@+p`$LR#Hkf*B zl#d{GC-0mpC{|RyK!O4>mGZ??B?mN_)3bl*FQP7ZFoX;90_J`Ehi&xryP``z9URCVeMH@-PdKis%F7KN(MOcq(kCQ=!-ujr38HlBo>hy+V> z&v0PAT{kgDEhGH4hTqaQxRwNeRuY@vkob%4gaAHKI+E?S?dv?dA`pNJd+`{c+$tE48-%~4-YB5R}395JY{Ue{|x0rGvwxOzFi{uDp5IvN%%Uwq~KAB zoH8I3#2&1J;`3uL5BAg$c_m8-K{YD0?D{`nd3k_#I9C7uH#Ivl(1iXT(}@hwj*)$6 zgE@3XQh=Ccu&M@v3USwB^ed}MXfzi%+s}|x>fPFY$FS^DATpA`Z&u)ODquG|R3ZU$ z)Mw2TRRcS=vAT#0H&=%lpkq)M@Em?Iy9r~f&Au#NvK#2~gYT$t-4LRxExg0jLHx|7 zH;uAi4+2VaHEWE|cULXjo^Ol?(dVNWHrpU%VC&`Oye9-6QFJ-<^1aL|fp&d>Gy`tNxWmz`9)!3z z;?Oszo?ONypS<<>dt@vS#=gxH+mOt2ea@Cui>bEgIrJX^t4A7`TgDrTJc3YFqhTHlQ9WiWK zMvpgYt&r5y1q^}0>cb;K4$&9{n0wnjLH;y#q(k6^5x{hFrx$0p%;?p*5P}wTkKd(J zNj^IJgTLrv1mHgo^#6<7G$ok|kp)}4$jSN$+($_s^U7^qRI?7sr6VY(&Px<NgXv~Ac0>x94<|l-a4$)Q(+V=e)KOk_l*qtjISAn2*%?N^eG8|X6nbvsZfh}0I zIj5pY_XN0u0=774lk2M6_|)_~EF3}#3Z4`!c32t()%}^bfV*xL|Cs&Kw4ZC zV^k{n!Ki?fSo#!L9HMZ=EECUbRU@(EX&@2!9RJ=AFpPM^$>oVSQMcpTZz2-t7~n^K zc+5*-8AT3Nuz1D35{G_r)1OPTfkPM%$EF|{`8Ctfulm_yf}~f ze#K#>a{8G`4}ii++(uuHkOK+<36c*_FfFKIIvPNOD`CC?qgRJ>lBhQ%s(!p$2?Dv1 zgMoXkyWV0P^PY+gv9@phs`M1J;>>_EwUToVvY#4s)y;xaqY7~26IHZvJ53H^rg)Qk zW^hgeIHrR;zw{f>FTIv28`;DF{e3tFHL6rtF{NJp@EGygLu%_*Ulg9YG!u1P7$_c zkf!ha_>`Zt9=s4(h}V{n{sM#+L9fjZIqrW4!9kQ=BAk;CL#MOa^sBXM%c*@M8YvvU zjmUwlhxN$TUuqxFNNB9U_;^t|mQ62_gqz1q*D# za1b!Ko=BQ1pw@m6Lg*l0s)BM_-2^kg2caKs!A|Od2J}WR&c|$ni^|yj6hQ4E0bIf2 zz&h+cpo$)SK{4Voy9`t|2sVQ4mkhFk zM_ayiWdg#-*F<_&%8BDKLNe$6xy^Dy(@k4~etFeH9~eMvfC>M1&b~@F}Cyc^M`pKUdyq z1E+PErFYt4M$yY(a)0}_IS+VWi_my(UepL3Y(>o;SDXt~db*!1w_VhCi2H5NHQqi2 zcn-_3zl5lb5=@((AV`}RInpTFAuXr^E)+B|*X@8Tgi!w}^zbSem<{+?zdkF04oXE5 z%y7T&fSu&kqdfUnMK?VS`&;*n1o`p{0CE5TTD1W?_{jABR1;~zY10Mx6E(Eu=pE-# zfeH$Rs?HLFsY?<+!`BgZ3G4%AE_P<}s{1hGHmdC=J&Ph)uiCVy`UP^Ga)a}Qh1`i| zgNm$TxJ00m0QdCHj}^%$hI%=LuLyCKRmG$7?hTy9xfn~L=V!dyi3Ul{U$()~(M;IS-||^~C+=s|8~14ycM?xG zhJxiItPA{yFTK}i;I=F0&v$`ley-rg$5O%H`&rIK#K~vJXZ;mzoD?@5;ErP;>fMv$ z-y?NZ<`p@kS6R-%!K%R&U;MC*#^e3-<$iz%kD;*oHm8r7!+WjR=#MAO8eLl9SwJ2UW=kL=hZ%pNcm_4b-TZ-1o>G(wh z1U+D=5Uso1{dw0Y5S&240HtIggjkLVat#9Ltss)352gLI_h`3s0o=jXpi5viRp9^7 zCTfJ^-|2OCq_&p`U|UrPs>Ht(R%|-B<c)x=^>h+?y!IfEk&Ytqoi1oH&ua`T*omI*L1rMK7o=~~ z2;S0`QKAzZAl|R8|d0_gIp*~cwH9d(9AxClJ{UdmYbFC(; zKkLC-!G|k273K289s2hg&l(T#y2C_JfQUvQXR!ZlnbRIk%7uz|e3-=#;S04jZ(Nh* z9LTG)b*&slcaxzACrE*2NIAQBWaXD*`;0A_R6_qYMVa5Gu&ocbBb@7GUf9>?Cz>N* zB?!pitH=eK_29T)1IjTZ-c9xe`NX&CcR>We6T1P}DRh0^7DS1?q6x&bH>2H2zT4eG z2%vSaSz{1GJ7z~B!TtUPNC)YXL8hHW(O;*F{|`P@RWcO@0CR{Sn)*on+xDMFfpu@AhPo==PBr@izZF&$}AuKul@5FBc z#{#^JsUrX9j@ACC_||)ekq^+27al4ybnaz$?D$~o!tU{Urz6Nd#aywde?hOaX82EX zu%-RgX=_sDjJAG2F+45{dtQfXv3bYV_|RqY)SsE&VT!#DNn1OP)c}TuG1&*=jA}5} zD_DW@r$@=KCLC1Z$1kbV5JuyS{GF7^AGGA55k@kC=_c^CRdE%u7YA1u{QSy4Hr`JI} zNbA2Zj5w)RBj38J(=A}ovLm@vK)Oi#wSMJQ(>m_)I3XEvu6chUznHP%XYeI1JLDO% zYUF)(dqd)doxVpSlx@+ERCw}@8Fy^?V}p_H3j*fk^*cJ+_pZ%!hEsWqJ>O|&8uMeN zDdx-Zg*i4~ukXSgzj3`wX?K$Qszcs#&Ia|ukaT$hXo8qA?*Sv~4_@Wyi=>$J6(jio z?YQag9mHKc%1j3kp`t+b8;+<4vZ5$U;|4du?xPa~s6tO9{6Bt5uyU4G5Nq<<3FEPj ze8B3ODohFjytp=Yn&q~q<+3GB_Tr$;w-^Y zzv*Yu^TX$w%V!yx70rL#-yC6ry4Ww!6hNWL^5_ZVO~wQ&B=DM`h_oW3YHH&6GE=eF zetMog%$_@n6$E1u{Y;5-ACzZPZ!Zedq7HwoPh-7FH)nVVIx^a$;5 zfAZ>V;?0rx9K6Z>@>al1g#%-E2&wH1M%4-RZmynL|8353dGUPWb=>ajI2Uy-!>G^d zumLw{D?f2W3M%ESRrHM=(>IbXy$@Rko_<``ShNyjH?Aco)u_77gR!kLuA0rZ8*C~Q zT6@}18a?K>SEWV-RchlqqD=svPB5uEdpk+zN4aw$n-WxEUB7i1FI!tHz zL;&1xL%Q787_0^`_P?S<5D5y%MSB?dMGrWKU9b~8kT{tER+g|nLotA+nS=c+$kiT8 z)4w7f<%W%jjF^*AC&k({t=Ei^tA=tfb|ME=bfIX=Ig0^5;PbxmB`(`JvHd;fbo& z{X`e*m?ri=R8CFeWzbkyl{K+SJlQpW62~yC6J($k#>nky5CYi-enAtB*R+skINT@W zdYm@d5?4l({>95bp!UjUO+gc#jrh8W$^$~@Po>{!NAV}v^-`(eI=SRhk}em zw`-xqnn5}9oAh`cd;vQla9-|N6RIco|BHsmU87NX5MRkwXu@C?TUIis8>`~os&&Mg zJ0JM0s!#lDK3bM3At%6!!{lCUl}lsiH)|w8mW6Lzf82^C_1v|lY@wG5_noRaSqWjS zck}L>;=O(S^np5(g;wD+FUnG<5~Gd@rDDp1UknF=z&&EpOT!ywGTlgcgKV!j%_;`K z9@^4c6jKYTDKQBkU^wP;{$js7$&n9@Kpnu^Tsu%FXr)DC@YD2Dd!WrD2X$qhlZ`v@ zsoA%d_k)Q_Ob5FEbI*+_dkoy?``9Z%NIn*$S6?*-S!SMXQv-r4F9;yPo(IE?1Tr37 z`M342xk}>+YbyhMq{JVqwV&(CsQeOtDnOXWWS!Gw&nY!`XRtlkn9Iu=k7X3r&K#Ix zdCGhgWf}^&(+eb?c5!3$>g}|W;3D^&Psxk>OvG~p2);3P;;H|MF~sXKKRG6$wan0b zux%cG6Xd;3^Vz~^&2{8ECYC#mM>uLy9}-c$HQzT?tMT&2T#X4{-d0S$cWko=B?@2G z>H>?6)@BFGK3?Ys#2-&(bInZ>!RAk9oHelou1%s@2C4}OpEFf-K+L0PE{!|IZnIR6 z(RK#K2Lt~e-`r1JqaBZLF^$=&48;l6g;s9CXH>mo@wUHLL?_S|`7i>j$z8RHCs-ZL z1)=3?U1x5q;@x-pP%cJ6L_%%quZ`h^(%=>Fk=AJC<_cH_V3sH9o)s=r3RVor zBIh}#kMvA4PoLV(W{y z_>kZAr--$QgMG^7AS=+gkT2r*QJ^)*7;R+}fOmC|9t{H(CZ%q{0M7moP$UVm?=M2d zvfb|~0F`{DQHhDlK%i_wee}u@v>c`A(n9s?-c&@eqz#DK)6Z!BNx3UBOoeR%hyWBC z>3!(BGN>*8?xElt@Hv%H{E~c$fN|c5gvcW|p-%9J{KK7`3@LVtbRVhSGvV zWN?FP=9>I1>S47!uH+dJMFZrpt52OboEvX#X0GtIKy~u6rwvQk@^t@v?sLU|mJMGpuCuBX(Z2d7(M?v%Yb7 zB>fb{AO^y6QhFCPHBDx_6kEE4#TSV7rt>@4aVo+PuEgv-u8uzI&*LgkE$i4Q@Sp<&*K{{Oy(jT-03R~R+5G-5o*389pr!lR1A&78 zTiOee83I8JB97*(@yLUqZNxJ9cfg$Jk3|##;t43|bDaD$d<3$O#Lbn<=#?c1O4P*y z)WybpHJUQO?n&<+I`2h{t{`-mn|JS@s1XSu`zSE=J}ejhC*QvR{td5Y0=fwW?E@!= z`GcvL3U7PnkoI)kM!k^^aX~m3hiHG~{xR1#Ssga*bz<1LmZ#e!g$=>4%kyT~iR*fU zmTF$@(c6Pg9IJfrvMUKBzk^Y7m-U8&Mf&k0pb3XSvI?jb43Py}j7b!H`Z*S4Z}`Dh zWEK94R_-{L#gf`Bg^?qDz!fj?QaJhf!X@{6@(E&t^u|F|TxR z7GsJ3sD8F(r(~&1_qB@jps8X`XJAm|MGglUo!Hy<4ey*WTf=bonOTL>xoTOF&;&@)-OR~)9ccNkm@fvo12g(<(?8juPA{ zLAUZC<7h>vYhjSL9$(3dhpQ~p=Au0ix&;p?lTo`R^YZnS4(-S8CtwyDB;rxgNrriD8MU6z z@p8{U*w*GQ4r<2tU@5?M!fqpd`6*&P0lS{=6MU$PF;vp+;(~W&6x&Mph^|PPkz@aO~xcUK?Yk2 z^Ud^2bm~1(d!^BKTKgS>nB25d{Wk(gvN`{xYMFAs-0=#dOg1T?Sn#b?HLFLSoem}Z zu|8mJvQ}o!N)EwWW8lLG=hM!I?wCR9sGM7{4P5<%R$sjN*5@td-^ zfPM<)psd()VyP`-ubgN{M785V|- z@R~OZW*LCj9EOUXsQT$gYBz;WY0>z!z6*Y4qJkjN(;>e#Xq5YaBJ{$bXorv4s>>?y zIDd#WlBl=XGygdnv0&YB%deDjw#%kjc85y-1pach?L0xXU;*wEjghD6Z zOS#5DX$~IKIcCkzWd0{r%Z2F(g$%A4pQBHD8SvVRkcG&5+Dq@`AP%CPB-W)3?bKw?``MO}t~OmJW7JEckt z5Gr~|+Ytlp*V(-RP_&ZvUF=M#$rsZIGgE`&W)*6h{?i*3HKjH))(?{%n6J-!CPKYh zy}!-%+U4kf-lSp5mPLDJWQjDK!}J}QYJ#nBPU$+F$sh(sup_m0=9%E1+R*!Ci_Q>h z(%)R=0azsi@soN8EJ0LF-Hy|+n&n6+|E25ehIZ5tRz zyw*3K(+cl-s?g;y#QZeOR5t2T30NH#HMCmG+$O~e#Afu!vrts95Q#(d?*Bp*&8Yo6Z=C@_i`we1rGiS8n?nnqLq&!uthIM4{_C zj_WzAU1qjuJAZ5 zG!;Cmh)%SHNf*FeDHgB^8z`E}vD3o7z`IY41>rz91InQ(h)VBr0nO#c;IbKI&4`@U z9iSnM|5q>(9@zoCKyR7}f-&lIf*jZ8=0R=scjRn^e=D9ZyT-eBP!v5>ZSLd! zxjqie(Aq>m+Lyp};DxdEIsW-#-_1-K#}enqPnL}8F_lTY7Se&+j;bufnwfT)8@VSJ zHk<#!#i+pRZ2W_RzKTvMRuWU#pmlYaW%@>i^j;_ln7KRK!8q{L*h$!JMxJ)c7~@wz z>@%i=T$Rfhx&%!~pS98pIscrb{!p-WVm?=1Hld|p4`?#}nh%L6aABxgCL!F)b8d(h z-$vytZHf64Z8x)x)}LfF!AF9rH}ZBYcu(#Qc;3eDrwV>ja%UT{d=Z^$cAg&vSK>QX z73~ZV9q22mA*~m(B<2RnbrGexUgy`Z-l0dTK?wB|q*VDC@LhC&Au(_%T4ZW5+G3}5 z{t4h`*ioN==n_WP83iu;aE(SvEHEn5B#8pt|9Xq&@VMuKKn7BIa=MLLMklF0T0~X> z1A+Kd`tn!@JOE~1xn<^6>|{Dd{1q$B3+6j8g423)hhs$cSTC_wcTu7;N-}NE0IL#0 zcZ{#mGl%v#EiXT_8h4kjH5Vo=|Br&u{P_(@)E7|S6Sqb|`}5GS*iBfaJW1{n`if&= z5>D36ireU?UpyOw@F0+jfQrF;=bW9iP@pmAQQc(osBTpzNF<9tt^2H6qrmoO!!b{P z2JU&(LSl`I2`NMWYj&L{q;A44JHIibUgC)`5&}>Jzj$@~v-hhQwevMFTJe=3EW_{#O*&X#kOChVF+-H5c znoLje5{hC6137dDRj&Chwf-`D;6}=j_W#poVUp8C2_zWd0#Tpld-R7k*s zwD`joZg%Jj-6O4}mfa6(A}IxqTHMdWLzx_W?J3&{OKZRZc416(c-h42@gNx!D zaAyzY@B$>JATF@<-TUg!N`=&A6LIc;3&l{G53c=vx)aXU^`3hBQKR`bVTtc5C#aZs zuXgC=RjTcuO#(M)o-kLaSQ%z-i%w5X@j1#MS+ztG8H)`-U<>Sd-5KhyOn>kamPghV zPc8Z@+4{b{kD~&kQB5@#dG~evp*ETk^~C z$f)|o$(n$7ljYhB)<`_-me*PX(%eF>Qw#jw369~7H9UG@R_Q%W6@-ydj(BFeOGhVi z9W^HA+{aBfdf8*h`UW)=-@oU?+*lOywiuxi5#dOlq|j%gRm)xL@u0=K7jmf}{Lh;q zkc18i`-41vMA_N<9dTlb`bE7rG~GWfVcacZdFH?3c*Ulngcw6scPyP$> z9ecVd33aWuiHA-k4BDvFe%}h5e5&(-^JX+KG-F?3uAA z#Oc8!$R)CxH`tzjmGJv}Es!l)=|>=mGAaV{rAtDRhSRW+`13A%yax?F%+N%0lCJjv zNYN9C`wtA!RAkx&gi8*P&v&3N$vO;mM_?Yr*{?>$n2Rvp448dgO6Dq!^3EH6qsN2B(ipV z+Vn8^-LdsCsADIi6)IwPEuE`2Ph?M=G2H>ZDci~432+M(YPmne$C?wO_*M!gG}zZ) zl8U4pkdjq>X9-h+E2*}{+sn9&4@*u*)@-^naAn6bkJNp-{A*G3Is@+(UlEel_$7m3 zdu?VrG|>@BC^B8mU}lLGG_plH!jXN0l3aQa4=Ff@OKm52{_0j_{u8UrjP@=$bK`pB zk3AjPZwF1eTUVSz4tb9F5NIX1)1Nmok<_K#0dHA17x|n$^9It-)w%u(aw3v7v%0pF z!}|KI(I4%1NaZx?1*)}PV}gR(cIFe=Q%j=$@=f0Ip3!;kuV?woZSnhbeUwaWxw!$b zp@?rLhYLdn

0jawZ1Qmr>w2$r`}zXzG8|9i|!q&?X-Y7{%nvqti|Q;7CJB#C)?y zKf!O5HXTlHptLs=Y14Hq=@@y={Qjr5M}*V4|viR&;WPKx41k`sB1Am?Q21v@PIiaRwwIAX`R@re@*DS&<}xSycVD3-;&>N=@`GSJQs^d9!fG_Ac1@~YbsB;WviNTEn*ur>l^7O zZRL&5B^NNbd;5O4jX{7R$^#Ko`)~AMQws{Zq@O(_`9f@>WQw80MRzG`%w%s&zlgwbzV2U+pKD&TdPlQ2 zxc7`u62hLtk#{RgIE(O+%VhFtFcrC3^RTzqeM+6%hx?ERQ&P!bxxDAntoM@)rxAx* z1`WAN$O<&+`EG40U$xZ|)KhpHeiFvF*f6{r{!~!;1)3_f_5;5Qi$+6{1jl-ImH#B& z*WyNKL<*G!ICjj(2Ci!_3~&ijg{OEYdcW6gfl;Qa5PXf26PRXr`;NV*v6xC-zn{1A zef+V>JnDW^>i%;|0%c^vU-R182p)E>FZTUDzjfPG>Ri<584p{0vMi5( z&Ce-$Epvb6;LaRog|04eh$;7x1{0T?$|4*83h(`zHmuBG|7@14O*L6mljPQRHQ+p; zLc%2O>uv;-?iDElBtEmm28f9_QM3m)szXr_e1so;T;3yI}oVCru}y zx;n?jzO4GOc;iQL`VXBOenSXxg5RZA!qJ}(G%1p|w`&b6H5=a9-rUv=av8LC<-FAq zb1DsA%p>CHiJCv=^e3bbbW9v5a`*4F(|uQ&qwpi(tya9tIagjwqbqycpx650LQ^V; z@ycuM54z5$jf&O#=Z40vUW^^7#vIDhNjK)ii5U=W6`qUb!KT#9+j=^Ih!w4NPWcm5 zkR1W|Tasl1spnbTx}iAf4YQyrJJ-7w9eU;t#xt+YYqk*-=SkISNAqxObxD`}#|T{< zr!gpkBx?HjF$=y~z+6cHBp^WA`ww%7eMklptMbBqWE$iSD}Vu;(C9vEE&Mi{4X09+ zJ)BgVzz!^WhD=Q!Tnl^J8wWqRO=L+ajF!v1nh*lajfvYh!}wcIh=Wbd2fS}~spNK@ zKYq}HSF1mJXU+lv9p_6C2K5vUupEFr3g`4b@h?YPc^Wx_Tf#CT$!xSckUgA(?p^p_ zopwRwQ+JO=h+A$_vAJSDOW?(9lFu{6BAVI0VQ1GZw6yeXDR}A$Ys4k614i|;Ecv8j z=-OW?<-0yNbzidW9W1Gtq^&+TU^)L|99OqNI~HxP_%}ueqtw2p$?i^(&D)e&l1YXi=3GB- zm&}vy6}X+48A2R6A|e|X4e$>e3|pTpeA0NPGa0L%ZB8E9_TbB^k^{sSWsZ&msSTiY z7xy6zc=_xc^uw?J;)?_)vX2SV<~C3T{f9BY0(f1NLuLE^M`p+YHK^SSBw1DMV;VwI z=EdWIX5B8a-rqtepn&>*biey@Jx&DXg-)N3WeVwM(jOt-^HK@ z4S4m7L55~E^_f?q{G~M-5Jw{Ropcj<@inhRqsj!+K!wKFB1QZm3FWm^2qp{J z)ip{(4D>n@#@qDU+H>n%*AJ)Jn-pxL>?1S)&a6G!SdRCkq?I;cR9aRU5$|m9&Lk)f z>!vX9fsK4c$k1Qi6z)l)DUfOXK92)hSL&S~yvn{q=4)ddX{Y`;b^P6bq;y>W(dcG# z{8~6jhj5lp_^93Yh=KnfIPeVDKL+u~w|;CX0anm5=2wQyT!ji6|02#!ObqnNg0{ej z?>6;`HGCvzf1v3X$QwIM+e;u5M7#)q#H2g0(77uxFtsv2!>;4VV9#J=v~G%e+3jcr z5HQ9l2sHF>TD*Xqi#8(#QAknQ7G%(I6`BXSML)cC0&vzNe6$>j3A+Hz?Nkr- z9+M|$&hbIXgd*UlM7`U!)XmsBk+V4|EB^G9vkgw)8ah^d=hn4Wlg%O5nJfLA<~2?` z(dRhWU~lEnl-s+NQ^UEf3i9Q~^_9_g4^fVw8QG5jcjoyR%qM`}DJl@qs=NNE`gV70 z&L}gf8~;~~;!$PVEC<~?{3nIhW@-$|gOVO6D5EWGL!b;vb<3&5SCW5zNz+?Xd%nzL zW60bqu-G%G$-wGs*4^A3@v#7onCLp@{q0$d+7c&UrKsiEqnI~B&OmJYKp zsHYqMv>-fppsxn*$J9uWwN*SnL`ILKZ)?ve6%VvdSIjX&z>hSP+z@h%AFkwHFcFty zj7SqJSyV(SBwW7W7-8*|tNA=E>qxeH&m5@ZI4zX&?s8EwmUAyRTZN_+qXE0=1eUJc zPu4r?GC#mHdi#S*$-pI3fs{NpNPx|p9_Z2qvZ(?(Bgy67M~k<*B%dxWb++k<3mSAG z0R1WR1TS5(MskPPFb#`1qCuG(JltxVeI~QNNKtkxaYPy~Qrpm@t{Xk zyVTs}_;Hc|W%59xS3EO{b=-IkN3ARFuLKSMrC37EMhDmIx|_;A!a#O9(cmMKvZm)u z>2Iz&cPwG5;r5oN&m%Y?YNkiu(WPtDvl^67&Nhz3;y~Z`HhETl^1LgN%)!w2{`?k! zkjg2+)x*Bnh>jcQ_F;7x}m zMFaMYSKNJd*DX1`@99dm6SF}Hz3^RCn0t3EH^6&aG_AL35dlfeDXU@7^Z036bYC~RBYay zQ)^OsoepudE}ywt`uUZnqJ|x}}{;R9|uHz1CuX*&I>`*2|?l!(!hqRiU-D zX<$%cv6D7}faE)kE?N_MgF37B8?WZ`WnCa|jPYec6U_iq%uuh!%R!Kfh9R|Ol4@#e zM`%}clEBGD6|zdXI{Wn=2W6eS*(^a#O-IY2dOlAqr5~?2?$Y)S6r4&S-1RCuh?NAqI@`QZ+*@~4i7oI_*~AVoidD;MpPn}1e_c!COjM^TIBZgh*NcOw$cH3;0{f15U1Y(=g>Ob+V$ zU4RQYJvT6Q#g=QaVVQ4nQFZ$iKrsftag5pUHfnP|Th=dWgs6kJB#f&Qxf|q6o|8CX zt9{)277GEd*nv)`C2OR@>092$p6#gTdsumouxOTkCNlOmQGq znn`E#OLgj^*>8~(f(Y^ZJKJoWi(B5<2)OIw^9mO0HSP(HGk$ybkSrOsdwTBWwe$CC z_&j&H?jf5j%`=Vf+$@`Y4Xz?vbs8#^wIuIak!}{1>gP*#3gcIqFj*fRfiySCjVBnm zmr3$3AKSH6B^?hx7N7s35l51S7m}#u|4qlK8iV5hhBYLsTuc7G#IQj!tf8zwVdfgs z7vhM@RC&cLbcWDk$v1lzXfrZuo zF6f3Qnjfuan`cFP&rsJ;kVnd51>W%es=ec}c&14RitTa zr>DQ`Rxm7W49WMFm0H}@$ggW}8>-{j5W|~EK~=FO8}+I?4TueYeGl01 zG_xFD<$+_MyYP`&W-L&&;}%AaVX#El!;cT~J1GPT&X9lg=1ZW4M?O>qEj4 zGa^vbCj65!B!^h;nfv6Tk>&qMIdIeYQ!KpG8pGFdW*_fJkk{SNkT#*#B2tEfVnjw} zSN`DCl&@s=+3X`6!C_Vx!YtkSsC0{7hW>(`V$_k*uzd*GPf7A_CG$p^O z)8QSiH5+1>3__*;4DpoqK#@!R>8-%8^kooay25&cuX>O}p5WB^IiD-oT|CW=dIjFx zp=mYPNbL=bdEXeWRPShnV2fPQdbEWR2uJ3t^P8()3ru81;i+@+TDnQ!^bw1NJXczQ zfs5WfVx*-$_8lKOyeDbO@9TpYV&dVh6e*}LyPeI8G<36;drrJxvcy`6td|Khb1Djz zS4o~QL8chlAdM5zB_rqfq$2LE&Xk3PIaT0*%Q@onr->wmixfHKi8^r zEWS+$Ul6>La_iyhw(>o8hdk}(jn)z07sR!-4oq!@PF|p+bszj6p58Jlu7>9t#@&mx zSaFBqZl$!i4^kWo6nA$o?rx>%;O?$1HfV9T;%7N?sIE_XB~1}?4u`JsJ;ccmnzGOoNdSfK6S2SDfbtr6GcZQv zt)vATO?@BJ2tQzkeDF!mWHR-ZiSyjP2R#o@3%pvW){@J?hDQqdW@I7u+$~G~$izu(4ofdc0JO}U7W|G4Om$HKs zCjRM^P~^ytwfi_xM)Lm7$Cy7&=+-|t&1Tr~P=|S-OHbBg1yCvU`2I>#g=v4~fDH3L9JbUajG^!NQl`cq2ajfS=*bYZ{FFnq zNXXGj`aslnr#?uWoz(E&wmO%#=KSCtI;WS-K!LW%!~h}>V^(uFr>y)en5N0A-E z!9zXd$@RNFRs3oDPId&Ae}rJCnAGa|lIJ!1r3YL|dG95#4lJny?70zWVhjd?jYDm_ z5hqqW2JKdQ-J5f#W?xA}*DyeaqCu5#rr{fYQkJ$0Ci0_63GgLWqn}qw@z?q_xhE&4 zp^oN-msM1IsF9kdYE@itZDn&>XKP_b4c*|KYzC8ONrW${9c~QftnDfc8N`kW&zZj? zQ6sYYmi0Spf^(l3-R@C-U((~R#<2@nJ+x6^1#;%T$ZVqS6~o&nz3}q2%Q=j7<)Y60 zu}qoXrN9lYX>KZ)6Py^~F%uh(Hc^9d;8!Rc@;@yAg=Xb=$o4ivR%FDhMP5}xTH&h0 zb+C`yuNyt=zs>`mA;(zt|9U7vK(P$0f6)P;DF1pCio*w#o6Q%!*Q$)c9ap>72*Wnd zjnNCY!kk`EtinW7uRBLbe42{}e#H2OL2s$}lEu-!y>@;K{fG+wH&p|RbWkV!bZMqp zM;_3D*Bjq|s{h$3Mb)j(sbxR>Y8nxklgJ3{e-dPbv$8ntv_x{aX1c0t9_L|o_%%_9 z|D3Wa6-+V)lTf&AbXjZ+G?&gl)kdQz*N&wor|CBP%5f!s{6`-1)?O#OC&mLCB9hyJ z{PQONo|fYWLr92uB(ZT$h{pm;8qBorv{OTFBDBVPR!w-UMDked>ukp=D9w(qgr31R z#o(@e80bhAJo4usKs&!lL?Mz8@|iBF#K?Wn!D)3XT^{)r11@ggOJJRgm8opXp+_AV zF(!9SY-Z;tCxp0Tq_bF6vNnA`qMP7%o=QBWICJBhQxCP-<7p$9O&?L(RSPbD7$u=Z z8TWlHgr>%$N309Tk^b8+{hD&x-aYm$CQGC;Ps28v}v z6GO(2gwfihaZ)Z__Hs?<8P%27SoLI+Y06+UudPUiEC>bj-1s>|3ZqZZOA4x#!zHl`V!L#FTEDQXd;FxuIS968hls`dm}`_ zm!6a*{_R^lTi%TNQc5`fcLkrLfKNq>yL}%COA1f*Wb@AVxDr`SnN03Y!16Xkcp}YX z{3E!jH8jh=IaWWjG(>9u$Pl4$&4JD{KSen!BJhrPB3)G+dh3cWseZVod&>lLlp_(Y zaleYOgsTag5t?!^DWm1eaCxn-HL&1-rTcue8PTVE+kTkHpJe^c@%QmN&?*yg!XNs^ zd3oPDr|;*1Gz;7t+dl0t_w~1ZDhW>+bt<#yYn3{Wt?X*|r?Y>Ax&;h^z4va65C| zx-G7x687Q?u>TEm2R_L%?mWTh*8qR4R{3q*{2Qs&{gefVkVv?8@R0Bs^shw0a%y0$ zv0^1H%Krl^@dy<^>pLfY=;#a)bf^8f+B$$u{j9guJ7W~&O1Yx0LCf%!cn=DV;_0z4 zefW)8C8@B6YMAwh2z=w4jcRk%w;6Y}hw|^)oXVGFW2brBccKt8Ia3v~Ua%LCbN0yjsC=G>%jXp z{syHrs=5qOjh4@LGIh5~o6XIv|8VIP*VyWA(K~dsQjEOCYPb7qG11)}DbV?zefGED zThHiCR-)+fythds3ml`@WR*>{-OYB6;S$r~LBnL?s4Yc%vlWvwRpWzIhg`W*5li7O zzURwx%?!JFUr8kQcpK`XSi`FV7jt8aeaD-ol_65Sa@2il)fTVJ1hblK3+n4>qX9t3 z1W0CDT9YoO{|8R(l>sFw+@=^3YT#0@6VPyM0t{3Q39mQ;uu=SnKV)q*B!3*nKN%CA z5(U$1BTytRB%qgcq{S1)Ed5oXD+^WKCq06z>!;gsmy!8KqvvmXy;OP`Vm?0Ae{F_3 zIH$t)b=a9J3Y`zJIPuuZ)}2Gu2gh}~GREj(DU7x{g{&i0VqUy$OD7b~8z6`ZjY+s$-4X zNHL?m)Nnet&BY5&16i=BlrvdQ66bcjaIDq3fXQ2Z$k*nflFy;vb=d2lR<*0grAh&B zsBH^7!?(tGEzCs!E6kAL?-u?u1@Gmk>hSdcisN;bbzGR|S4GP@%sC~DSUq3~dl+{{ ze?MSH(ffInZ?J9_H7j!176D&R59zw=J5OmC5|X(4!oCIkGS7@6&tMEP)=K#F z*jt+<_EQc?F5N_ag~Nb2RnTdW;a+#x6)y|7F_!enl*XGRv=v^4qmf$!X34HLM03Xh zefX@Fn|`7yJ6fuRs4hxjcY!n}J`O4jwvdRM_^>35mmbulwr$h6O-^95&dJX@RL}7H z2mY_O>+bq&_3?k&KjHoGPG&{mA;B%W*{bM^ijus*>0r0^(f$f9u>p0Mhu3iwWH_S> z+3MURK{bMAQTQ@MWDnSDhKq5xN)%dbzC^4^>&z%#U@*pxm{ZDB(f5QliEO)Gr(Zli zsE?;xJ*9Q8np(3;=jzwvy&dyXq>^el=di+iJ7l&zDZG9t5UEjUQrDd5gZ#Y<^sv>m z?4;d0x`vx@62;Hx^b4}!q@woC9gR2iRsE9-hy@FizQEqa|7V6^4>QJ{n*Zk!fRyn5 z1xDB#KuGH_4$Whkud6=(+lFBE3Yw_35||LQ4VC;O;IayPP1{PG73X5Y9EKBm-->+I zAju6tMD>wlbck>-V{Q2^9vfhiG)jN5Un>RH&3h{#JrBbw+f?N>{N6D(g7mTxWt?Sc zZutxkW({q9>$04QiulJ96)@PxMY2@A)P9^yX^u@<7+2;N{^gkYJea~Fb@T~S>PDi2#y1;;9$PS@LTk$nLKo|;zak~@$zA7BH zcEco{|8Ja{zX7Nj;MPN4D>vlVRUoe;zdf*<#W3E^ukLXaMi^ZtV%<4H#co%;9YWPg zACLc2$AzZ`Y<~LhSAyA5+}e@=Vae_i#vgiCs)t!~YHJ69*>I-X48^(H^=%aEi5W5ijA3QS#yO~MLX=n)3={fQpW^9!#=J*Ph%KP zH9gPGNwIs2k4p1ECNXNP$tdiT>BEl-|zhX)&56+vj9C_ zltwMWEaI2g^jCAV6hwrWfTk!k4Inp9t|1@zC{IVjq-ffhX}gPaB9)hz6ui^wk*YKo zh>=2~7u~Nz8Mmf(`Yc5+ntRmHh%?%BmSO7GyUM8_n9WXwb)I68bsn}Cw-%_th07W) zcMMy{x^uVSUD2O=? znnPYCoSdxi$s_S1*|L^ZuAFMpLaVJroN+Vx_7HI$* z{r^9GVbTQ)3^r_anDx$pZWngm z6=vwwAmg^uzt>&vIAGfpwbrc(;0cK!Wn!J{FaJD+4gL})dF>V#3>}SC4{f)xS@*Fm z)@e~Xe*U=jS(~{4YJqgI-r*B%nm=w-)TM?!rGn)oLgL3na6^E|VtCzmP6^SsLpK0IaY^Pn3 zHE}d$rY@&^6Y#65mvXV8x$dH!G)s~Cv6=F`mzGi>AFd~=y=lZ9i7yhyC1VrqZ0DH! z@AO;lA6d@(KZQC37S4XgB^^`0hwiCWtY<~dZ`}HPG_G!&Ark}e&Ocp0HrNzg=ig`( zTYaTadqIN%8uRm0Z2WTJe(Gp}KJtt^Auyfrz(xT;gYq*9hFnAT-T;^a_^&Z<->4>g zF9JiEhTM~-nXF1Bq=2)G1dM;co<;u0DDkx8jEy!bIL=j%a_Gz})D2u%V9v7*&vE~O z=K}w%poDOS-KFica8XK%`jAO?pP?_Y1pM|eFdFCV)3&)14)o~-W~QDoPz{3eo)haR z%V&0nQo5%yA^J3X{3fvx3jcCB2M1@G4yHECJY0D$f0^TE*tiVQ$ZJQqKYPGBluf0% zx@^{re~f?pKFB%8wyKfDV!_s!zTFdupSz{y{kD_EOkVFReqQ_lZo>B&x$WBk>*D=P zJ_YSSJk!!l)X$FcO;^q)L5Fe6w}p-cqFVf-UTZ2{lQ+5Vu+764f8BBpwWj)0L*hA8 zH@8oz-rr+@@JMKOT_GBLX?Qn7elDxCxmEk*`cpxWQXLu zIbv>%UA7mogj&L!X2+-t6}c~Gp2&UBc2#%xCnNC`2*;=PQFQ=ug}1yfBgihwGu>fW zSsjmc!If;E?=i`(OaCL#QTgX1mCbLD+!a}zc*z462(Na~#9o%LZNGEVU8a$^BvXH->aV8h5>rki6%ZH)dJq($PKgZp~ zJ@}W7cs|fWDd|lInz>6JmX98Jv)^RlI?AS3ZI}UdoMTBtowYXo#Uago-dHTTRl<#2 zrLHXsc^y;JB>$C-*(xe`ij@B5TFayM4Ly_EVz8gNgzNt4+ZVkGexOck1CXiTQ*W|_ zz2U2h9t#*f)P!wj_XpPW(xULD#lqh;st&VPkxBobB8yH%7M#|2=le9A2are`r77va zx}YU##vMO+V3X5pJKvwE#UpRUG_U6e8+?IaIH|Y+OOC0>KKk#B4#~e`dW2Cq9#S+k zUq7T=W~mIKz=P#r@M0HH8_dVoxBT^l_mm8W2ql<+%mO^ zI~d|F#Gdn}yY>TIYbcjc%@qxv`h$$zM+)d&RcnPNC{HHlm@%=sp6ac+cSpP7RvBa= zOTEOwICkM6zEe%aSy8>S5d(!tv7#T)*OYL%v>X&`cpf7g^_hO!f4w6kM@al*3(UdJ|WX zUmAf0Hou9x-q+T^0|)(ptNWt(T_fWgQNG6#ZMPZt95io9Wa(oOuT!go_z(lg*o61^!MML}@$JzLXPba- zRY$I5DM*e#un;RKa|-oMQk~VG=r7Hc&i$C9p-Mzk%9kb=)hEQ&74d%b<;dpx{O76m z?9}L9d{KIs`mI$8BJI4}>oPM@m|M8B!_S{M-Z>e+lVS;6oWWz`?oSmfRq?sg_&wrY&uAANSj zG*9}qzc}!bFqJUsJ%P)=`@ZiFa-RqjCreascoV#v{k|^A8N74*vD@YF}i-xuO0U6cXJ}LTvt|k`Dp&6NTxXTVG%NK6I=WR@h!JRd@xd0C^tM@ z#YaB0miM2?IDW)UJdOUA%G4jAUkm!#*k|DrujSMN%FzQ*|0eXQBQAw;`D+VyZ>SFn zW&Rxr7s69-$Amt5ptp15i!zDf`W{B#sbma z2}*Tl+5&}~CuI2v#x>X1umJ%^9XZ#yFop968PZ+ZknMtMa=wAHWkeyrt-jJU2)n+R z^G6kB0e%@@@{Xh|SCqc{*rb+mSQ(A=q zVjAriADgMyre%5akyquY?zYCJxRruC_{-;wUuG?IiQ7+A^=b|X=oSi3a6W&zuo~sLe6(HgWNW17#JAhw1qD;PxW-qE7aAIA|s=| zb|;E3Z8I;_rATmJG)ZT2-c8ste{;vld#7uQ)V9^!*))y(bJ04mATQwyu{Q-AvPVf0 zZrOg)b8+6OnwtInLuahRSK7HywndyIb~TXnK9MEzMNLITw%7ZrY_E0U9p{V!omNY| zjjypSw3_1%Z=6di+w7w~LQ*tHat=~&hZSowrf05P&Yy`-BtyibL+yjtz8AtNmP&p) z_YH@oTPrqwXGa}sZmdQ34l#H0*;CovxZ|cy_0Mn+Rf}zzw*gpjwEwcHJb`&77rY*; zPL{tMW)WJ|Y=7#7Sm~Rr-kG>quQEodel{t z`S(Q4=@xNbikBwa)C|H^*Er7$Sfmk_>w#4UlG{eny|S%27IiS*&0%at_p!cva>pou z^B>tqSX%Lo+z=Q1RBZHtYN>l&AA$_CC0e%`B^^yB&?!O|7@U^B^O_R8hh1gxAmB=J*A1iVsJ+c_wKy~YQ&oj!Hz+T(jT zjge9t81ADVN&5wkRk>#iUlZx;A@E<-gtey zX}?T<<;!#2#YA$Wk`GSxGPAEX>%-ox$6;wJi^@N91odqVQ0pSAMIb;<&@mloKIe zExqsUU%&gVQSK|wAM&ARCh5~3Ns8n5J{T6#*FRgEc+m2$9%=ri z5BbZ3vuZ(j=u4A}&+w^?J7G+R)OsQGm;vvx=Ne!Ix(J2Wxk2Z22V!Nto*eb{DAPZA znj$rYfw$8HHE2p>KSTCf)bxsxaP<<$WEsVPq1|LdX zW}^V^&B?&}e9v+AWC{OyOD`kGcv37juLR6%yta8BIcJt7>)@yt-6tl1xzWMIHIv(v zl|-~+KARM<14ViIG3S+8T5=L;k9lW4A~jFnr3qCWFigI!z~qv-t~npvtYPaa+knQd zF|WFoR}%Lnt#p!C6=0JJMs~k(CGS=2W-~P7%UpPSFl=i#xVZ4U)tIQxgL6HF4C> zg_O>?bL>6gbl%F1`Is_x1g=R9PGZ-lGO?;tevES=e}hhSl2j~ z{hb6wj=ICW6O0cV8Zs|`M@6~azWCd$f0l{mtz!naf*8E$jQm=o9)w;zEXcP3C3zDqhh`Y=NbrBz3WLamMm0z=SrCM!C8ucZ4zfSevmShNjPuA1C_Uc?vYz~S5!Bd zsO24^t)znf#-B389XeuFkZXib+~7t!xRiqf1+PzlqxsEk6Q*!OaQ-9pQwRh|JBBE&;w)s5Z+oYB-!29HZ z@zrC#u(k3dahY|sz+bQjS(#5X+-DyW{S8~%SZ3b=G%2;bNnRWw+48|-JBLn_HAk(+ ztV4BP4z!!=LukD#h@iW@<5T`MNDE=SCTbiX1>xY>P^NN-jW_f#$b7z#YN((eHm5J4zirnpn<; zrE{OySNhL*z(Z||5S%qUxij==nQVcr#xfV}e_DXiqb3>={i(UV6LfogZdR|#J8dG`{=Zw@rMMsR*k+1dRHhI#`n&()k7OvG7Q)L^#VdpVE;Xib@R+9|Jb4Ag zED;Z&qDHwb6N)~K#JrM5h=Uh+)l3~RwbunF$lm5h>9O6ys6EEWk^>)ft$^~ec=CLd z`RNaPm&k^wP3+J=A<+*HleCUSv{@(&gPIKGbN0$ z`9W$D$r47OWTD}CSFwM`YQ)LlC_)ddt~Il)@sh=mNk3CNr1_=pPdw5TLisp&`*YE1 z0<4@8#d>Cdjj%1#6{l1wz)U+yai5)5yxvh43y#(#gjrcK8E!y``Ywqb-!Wx^t(kY! zL&Sg0XfTq5Tzve_uDGXl!x5}y49em~+02V1zBoUS2VEDbuZe-o2|6tupY-sU6+p=z zz0ds?9in4IOu3LYf<#UO}w3N*g?gI{pP8Z=}k^iFAV^iev5^*>9j(j&a-zPunIFS`F|a!g;Y66izcLW66dv0_e4bfe`ntQi ziwIuA=&bb{oa)18oH7{;luyZK3DE8@1|U=X@5&{c_^VcBnf(VG8+mA-`a1_e!rMv4?oyH{Ov5%i z1-rb&C;PfjuT{yY-zq3e-lAcFYE!{ErVbWR%|jLy$fQRE(trKHmi@ z&Ouhc4yUFY`3%KrI{JU?A%uZ9T%3lGbbWNZXXp$BK&fJAsot%mZ zHdf2wW1pue|1#EJFP$9oVV}7C9FkHi&l;Ao2A{(~%4cl~njh03P|z+V!$hd0vA;#> z;*fe;sSq8Bs%Z4j>63=Wm+m|O+K;OZ7fVCsiPZnGR}zzITcQZ}|CEmK6Bhm@cvhzl z7EkQ!NKs?EmAck0)2(gsEQfA9hJu*{6oRcvJNE?V@hFytrB=sF4x$gbhZwqXJLNX7 zbbTpOYwe95D(=W?;_6#a4$G=)3p*n;Fuu+9#3vQb^cShUkZHKG`icaXI&~T_-hzH+ z3_BzyH*LBpf6o_uRs-!CPs|KVC}OlWNTh2KSd|?zh2F@P(2*zUirGCZtil(*yt`R= zSPQK&rg(ht6$luvBy&FTXGI43Dfb-Iy9hI~` z*Bz`4tw~5RfUgwcb+{+~WqCSD%&RDL{&q(i( zm~z@XL9TYX?{37#xrJ}yz)=n%|7a{@bYD?)`Zh!YI?OOU9BKOd-45P|5^h*TY(d5{ zc^|$jg}y`Z0hKBlF~h9Z<5Oo9$K3}6Cf+3HMF&XN^OFvl%n`ZOp6@|b(uItyr;d+E zScq|2F`7v~O?1^l-ngk7fv_*9%e8Bt??o?9Q*p=-VvUyD zdyOoaM+@yoRZ&N`nMyRsD8$G?Kc%j(@w)2T$6T4}<`u8Avw8(`r4a_4_|Ph@1c?zKe5G7Ulx{kWnX!2;wX_}J=o6dRARAAMH8*tLTVegOiZNZXeOTCcy_(-`Xh8D#0 z*M<_7P@JJ@IpVUUFw2w*q?yd;ep#|}84%!^BR{4sOl=qr>$h^`CM*E$+^rg4)v?$a zw`n%z{@?*QqeL*BvI@v`zlySog$6Wdj(W=j8n~dk1z8>_8fy}uO7^`(=C?8Y%-khVK zu&M)m>`t-i+pmV-r#4o@FdJhmR%(IFgLTua1s>Kk*xn%2#>ksL5q3wBE&Q6nuGt7e zoantb7!*$qOUT$Fz0Iq@nI*4s_p4XiF0A&>5}cTWfYFf~Z}o)PMs_a`$mJ58+Y?0H z|5;$uo(0>4RllhoN?V}h@(O7MAKz(?&yRI7?jt6Ue>3wFa5MK``k%paQ?D2T72TrK zv)KX8@YxkW8qpA0&*pR=ZvbfU3v;ze0~lqKLIw8AF9be1q(GDEp5pZb6ok)5ZsN4=-^yt&wl{G z!k3FQ5zia#VKOwmy~F*)9h z>9eU~pIy4TCh`@IjngtbY5Y%K9_;Viy?c<#O7;g%Za`YvyF2wYIpE zVeDq|G<5uG2+KCIadC)bvNzHuA%|KUM+Y(XEh zlb9o`ULVQ60{UQuX|Rsj=$x3 zit}Q@rNXX%__3;i_4YdNQ3;g?L>cS5qUBFJv@VV+``z`uR#bt2a*=evEIY=y!QB#QWjbjIt@C!sXrA~1*_G01aO&{ zqAgJr`fr5|RYC-f8BC}UW^QO#Pj^J+B>w@QV2|V6COz9eHMGNe%6MWHi#{5gC5{i9 zl=Z*o&bL(I%vWwkjI4`xud1WF*k;4LJwKlMDN4G@nzrp`xzCTR>2nX+atd?f9xxu? zcZS?<3ev_E2u{psFh#)TvT0q?7J5soHMSPDzf(blu|U~Ry8K(!C_g>tvljEhThOeO zmwV1%TzGJxDBCAc);Ng}(TLX9Fq^k%pF!ulw|V-lypsU(#U*!Ja2p_ZMq{0p6|XbX zX!hM@D1@E=N-E-4E8w`o-SBfg{498o^Gs(Liq1Y|P8jE|qu{7hf~>qQm{=J>;UnLLj%ACX`BFW#~4@qiijU|3LKGjXRikA5P7dCt* zi}^$xIC#aU2S^8e_436Ox62Sb=Rg_@0Ke}5AkkM+;3+Pl@?ioN7KYZbZ&`rZ35p;!fKB+=*V$zk$-lN$bXZpth9 z{deq$x>i3tyKk<>1EKAzqpk@K&5;s@-hI7W82V$dxLOA!PXVlMJNzWTny&mJdn74e z=z)EZWQ(1b;g~b?y^F}l&&2*Wyx=j1Who)ZM$v{IDRt3eaq*IDX}{4&S-b03`2*v= zvrJg2X#JC26}lMPIg~`<@-JfgqNQ1lvAS?fXO^bK<>*xPzPeszqLEHv-mn@*CTNID z*Kc?WQf9@fdlS%PXlMO#%9kQUIR(o;?9sJa?{a1Bnw%YIgH37&r>$cu5fv!ZEcop} zVi|GrvoHEWta*MzO*VJD#-L&r3#ap?1V!DB^$VgZefxVp4M^9c5AB({PZi%&L>Kk> zV(e`5qK|d2E^Yl@Pn{Iom{&7PF|@hpCQA`9u$}At`TK1?CgmW+*wWBd?LQvlqV_8^9fv(-s=cZWv_5@+&`LRlj-c zEbucj6SFhp8-Mjj-2dPRP@xsKh5tt=Cp;%U8pOg4{WYh}HZ~&~U%`cO%TBksda*y7 zH2x}N$PycRFa&>k0ejR(0iA93m`qdMo0r0QSxc`uJ#U>+(lc)Pa zu7P4i_QDeL*mxVK4sw$f;0cILJC+nA5_ynXC$vKNO#U$-F%$`M5yZ&$0k!dG zjN^VU2gk)0(%w)9cm=H3Ef-0gjqka zLfu|#+UkAE)IZN9Sdjw}8ltoMx^|rJ3yoUFq&mEXu@d(hyq{%QFHAHHycWP^dj`Hf zy4Kf^BWv{g&aBgUlUG5s6NER^p|V?zi%%7zcDL5Spv+rm5*wOt9J`SmV1gko^EA9$~%M0NAc>y;RTK@^e&l5Vpc%*>g($iOr%^)Dnjhm^KhakP< z+nFc$=-4s9a$i!@eYB>qWuX-wUU1fYHT9o}`B~wojpDT`j3>KRF{pbBjipL-DQAPa zpUr9Ka&LoLJmSMxK9wNg4Hbk19G?Zm+G~P1p%B6mPokyw8ffgTzRnWGdpOR$@!Cs% z-9YMdFRk^}(w<`i1JTmQYQQkI-X*zyIV9cNa`2>+xKyC9^FocMBHJ7~?2;?TV6H1e z7aUnSEN$U#4bSZmF*LP@^NkU<65OpqzIf@cW=*e1sr`3s!}pp!LD(U zT6`9s?^;Oz#vh2XUMM6yXBQ-D7&r~2_`T=@K6qe1@>5}V*n;#g zwH|Prkodn693ZnkA!M65Pe+07%2>gH9q~KN^$XH3jz)n zDQz4XY5@nvA2c?hnK~bnPI0PCqPh*gk|Z?yG%^sizkD>au(_&*g$9(N+QU4{BH;x7 z!}ZQNL1*Ch6tL&2O=V}iBZl%FZy6#t7Mu*_`!|8aQ#ip9HihB0O^bU>EQR}fJ8hB* zQpLjR1|yw@7$M*96wgHOE+QweUs#ZS$gV+oM?^!88(Pw&n&ege*xKbxb1&}h)#pc= zLF=Ia$-dNlJ5r@s=Q` zT~>u8B2%!-VQtZhv6G%>4iL>i-z)PB?3;}Xoq^b9BKb7Wb zrCp?#{AP_-L~1H%^yqf?1jC;GwS)thq|O-feR5^XH>S9SJAw`>C@bWC0z_Jn$7${M$Ii>lcQJ(4oSE>!tUS<)x~F zUVShX*i*b4rTnIPI{lx9O*4e5o|A~ihG(6{#~@y)IKe&tDzhaM6opPa=H58>W;eR7 z1}wdLU`Udp@?Y8=cN=-{B|FL)EZ=YBf&34ERLMf$+PW66xT|H{4xp9$Oqe zCl2mY#jLJ*G#@)o{AbbG{Bl)A^``QS(Aw@qP9gMx%BB>3CPJ(^V%Px{8{E6lMbs|j z7BQk7^KrkqO^&$<+Z!vk(8x_cr>bDOus6c^3P+9;dZPZ%Nm|Af(dPT4q<;h8Dc=}_S_x_Lx z16N-?nZZ*uTTf`>Brh5)VMoy&Ju7XD7-<0jt4kcS-7KC3Wp|y zDDte+Pb)*3auhFCjf5L*s3kZ@RU{-s(`*<-S1ez=JCd@qsqT25hB+NSJ7iQUtBy8O z--yO{FN!(0fSHg}F6FxoSj>Q9ate1JPRS>vc&ce0GLfrNqHyiY-SU%3oM4d!wp$Af z?n()bQxhTkR&$kDhMw(RI20yF+a%-0Wr?=-n9Vo86dl3CT^t({?CK*<9YBq)EIDwnZxL=ncU~ z@>A1Grz@*+j6V#}1!HmFn=^Z$NMA_=)mk2CV%ap9bUy1JJm?VYo^?wIt;|sciyOxo z6W@szB%um!q-hDAb{ERt2PF7vM|!KF{_X#ugen>=E{UO6FA>choVggMrr3fd#iO>K zyx+d84kJ|xAH{)C3zDV|xixN6vw7&Wy%r4h*F`l5;q6djET@PySA3drHKo4h?VB;* zxzws*(y+Rq^==geXR@){GVdJVV8CV=eQlUQlH3waay^jx+{3@OXIiSN3Q|zI7Wl^$ zu~KTfSXJ=mHGj2f8u$#Te>=d^7J0b<1R63>dMBBED}0(rmAG2 z2cvp$C*-sB((jOzeSY$3d^^W|sbC7f>-MtMA6b)g`7m5&Q@*X*VOD~#7OU%4h7mMX z_&W?)pmaYVRKg^8ybQx}Xk*>B`aVuo^r?BzJLTt_nDmBAtmW6pXrQTht1`SN3(ZY9 zsGj)ccg&~I4%y@(t$LVQAp&Dh_ggA)AS7@3RMK7H1`%-Bt3l_2iA`+tvu#J=nK*XKjU*WccKum@>D(CFBdIS1Ym#MgXW% zTXRE3kXs!GJr?vsddlowpteJo8b6UkX=`II$SJBUH|XX;%sOA*Wsl&e>IoDt$nMxh z@7*N-`re!ohD~&DuY_f8*risbIp$ucNXp8y0mHs^pyE6uz#uovjapBSvT5A1&-&`F z_-!MelmHdAm>g7}%PTNlPtYyQKObO_{rLZXDw*O{qX3k47GWH9h3OqjqvSOEUub>Y zfj8ixSz{`3^eAlfNYcp-srzPD)6+A);55lOrhwV}1ke5m1YgtQyP{#i2oE{0xu2z9*X9FRAiJMN57p4)j&YkD{$$hkQ4HIbnKH^XjxxgIEGVw10y4v?S$efLQPKttP)ukIyPLhOj@|25Vu!T@;>cik5m zXljD*m#vp?;T;>73BHO`@Bs37wbrr{JZ~>Gcw#-Rux>&Q~C*?V(D~__pGJ1+`vnjF62opi}=Ua?Zaf3#)Oj& zXeqNnBQ%5AR`7B7%g_O0YL})!_GFlB*d>0OsEfi~?eVG1qx_rP+gMupzhaQcGY1O8 zk&Wfu=dZ&YA@MDsr?)UL6#X)vB>um4uKTO0?AxQDj5^o=8F2t{KujVaO**lmCP0D- z0g*P~(0iB8fLLG@2)%=(kOYWQB{V@n1r!Y>w1CJUBy>y&1_JLg>-&9A-+%Dl`ko(h zvvP0FI=g-LK6~$TE!xwLrl4ZR1g{m(&b$kge0Il>x?Vd_7@EM6fB7wu!LrOK!Kzpc z4sVQe)Bu~i0oa@lyJsHRGj9Q#kY`CL2(;CHifu#D<*tY4QkSH+=qa{*t)Jn*4{xz?RuY2LpP%qoR=_`KN)lcX3eqo3vSlzDgxgieBlv_ zTAtbJlSG`+ZWMB2-G}x3thJYiZszOxD&$wMewCRcO9M&ze~{@;Eiwgl`R-aCV`pYmk2t)*<)IOKa#e zdSp+rWyDsW9)DW2x#j*c-@z;}&<5#!pM4vRNCqTnbB)JF;TRFV?bE(AR zs>j~eW;PmA@s@F8Hd$2(u*R{`7;6XWC8T26 zM?=yjGlA!feA!|&Y(VejenBa+WV)?H$1JxsGxr5dwjGLR-`X_bG>$GG_Q}b1DlZJE z5G%UtY$zc?Ig#N9Bafo*Ko@=K=V}SiFHfVtwX6i?TsjG23{+i``}*p9vr`Ihf+*Fa zwyf>}xj#j4+(=S>56kg5SM%&mOl7*95(_tA<*-r-eE472xV5vh_Q(OU&o~#jw%F_6 z_RbN&H@U5nil1=uAN0E7@ncd8aA)#G(ze<1JC5M`ir$0Q!%)r~#C~Zyv?KK71IFh| z!6^`XSAUz8@HNKPiLr&T6J@h^3%n-AWQ3k-XAjRP2y$@_HVzKkQrKuX9SP@8xGeng zxHcI^yFyoV33&#c{H1v&%5@abFUZo>V!k^$` zG(BJYS$SROQ?c*0t6TFMHH6k4xA3_|oS2%HmKG#kpvXkhqw=5=Ab01&!rk|8#7W5C zm_$;Z8f(0fgZ%#L&s%c+6>$d~hpQ^=B`bfDym8Fhy-(PT$;Zc;5SFQl=SyHi@HV59yVSko~q4@6s&#Fa)(kA9M)P^?h5BSj0&ZS<{I=!K#U#{>eD)P z|1y?cEY%Tn-Y1j5@F>!L6!tsVGAft67h^eB|Lpj9Qrl5qszn%zSyz7}0oKkl*SEVl z7BcK3%Wrstde1fLyx{uNSde7A1txjU-t#A1N9?;(kPi1{KEb3zd0Y0;Map@h>DThI zu27eiZ>L%vx;a33yd_{%5aq_L&1w#v8dfp{Lg0s0YZ+0XR!Kpek(uqjZ+CmUf`=3C z252bSt1uS*Y^OkG&)(7PpN~sc9yoNaw(m&h-j{m@#`4gP&r8CsHkELFZa+HDT z0#)ehwdR~e#8AV?sIbuD`MJ3{2z&4DXgKr23&R~_!a}q}^2_X>zOJBBp*QKmUlw08 z|CZL+m}}7gbHNjk+!6L(g|)a=wQ9=DqDUQ;%jL?Y))<9C7f%CGCeW}avKS3a%0uyZ z`9+x=w;Og5L;y?=C^nDxcrCvF)daXXhmHPYF?xQtRravbmqn2^0x$^%HbGcyB{3=6 zfxXLbpdsVBK>vB@JLbdE>Aabk8J~*2g1G2 z=rDx5>EU*2SP=nU?v zB4@2|Da)49EtJf68~&|%)aP#nYcJlab7M^Yax5iy3MBGm>&`kDqR}O_Xq;I=-b?O) zaDLL}LFK;g9Z=P>DR1`nGT6W=fruvQt1WNIjw)M&cYZp%H#YZzUGPH08!c0ZTZ;*P zVmN0;W^2}nC&_TudmT1qOipw}>9jVqsA37!htCCk`|x;dVeQf*i=g)RKyUbqx~DBI z(a2!oT~NG=P)93#)Ea0Z@d@6gL;#Bb9m#P3hnG?~7Qt;q(f4CAe?{5RMHQN_(M8|Q z*X3*o15f-KDC!W|E}X$R>nupGTFePxlQX>s2l7$kPs-X6D4A^cj+Cn>R7fY7;mo>) z5a!2lvx$)l&SA2bmF~M!Dt^XbzOq8yhPD452zPo8PLvFDdILecJPsC}2G2f0Is3eE zm31kDdS<&Q@4aX;-E>&mhR~g{Y77r&uqlojrI1L2>&@Oyz`@?M&wNIQ4myo$0!7kvwi~q8*Qlv>2t0#Z88ihFY26M8s zGT=8Epv4oD0DBi9+rC`fX`zK*`(}9&M`C-8e{qq{{CKRWgLhlEeu%ii^m|{st^`vb&X?`RTUDC_cyn{V2h2lz#*G- z8oMqzBd9ejqGs-h-)`VmogYBE0_>29uAv4o@@f}L7E310Z*pfFM6ct(HK|h8?tyBR zMrcfbYRysd=~_weu5dxAC;|7@JJWl816^{4+OB!a_0-9!QFmeUXL06T^ni~sgoh{7 zMVoLp4#T7g$T?v%4CaZt*~sDCmCuIwRdm@^&Ep}`k%q)g8yM|+H^-H-{jKX=#j!E> z^Mz4#(k((#Mh#VO>Dp05Qcj6qluvD!PLSmc2lvnuTDP<$<3sMKh>KU#ycyhLO%)59 z=3IsK{=wFpKMk;AUMFh(Z9FnrVv=}!l7clVZwXJ!@!n|20puK8-~(`>QA?yqR+&}Q zGg>OMbPOh!%5i0HMSs1ap|9ha{12}_eKJ9;E4gbJDib#~VM_c5RaPw^M`FuobKVn& z28kjTGzpYK61rBu{M1z6%yz^2gsFSHh1%@V%ZmOMk>p$b7Kt4b4hYU$$oUTU)d06L zG2Pk|o@wg%5hQsx8dJX^kS5&h8+`3~(^bQp08I}{J@!pNp*FEIA2v@&o`0|V%>p0! z3>Q^8r7n5a!&}SHHqguhJw~!tG`Usg+uB+@Vs39*lQE~|^@fVi7{i=`l+>}z9SdR) zjLHy}=i(3mbf{bgpyP3UOUu>*83JX-yx*F?pnaW&qGJS88Q4lKjVX`-~&ig z2Tv03!^45XGI^snKYL9K7E_`!1~8`G?8MiQeZYf5!v|Z|?}}$|ufUM$oKGb8dE0$| zzVf>v9tU3PU_3*ieg@Yrm{y37j)R3HDQe#$>ZL9u&TT}b?UELo#66GkZru#7W%}fS zcozvFd5&nzbaAvt8n$o~

    HYMmvI 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
    -
     
    +ematiq fugo -
     
    +budgetbakers
    \ No newline at end of file From b805e09b4d6bec46752034b2208156573564e2f8 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 3 Oct 2024 02:38:47 +0200 Subject: [PATCH 009/127] Update classgraph to 4.8.177 (#4078) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 260a941ab8..33bd8b9959 100644 --- a/build.sbt +++ b/build.sbt @@ -528,7 +528,7 @@ lazy val perfTests: ProjectMatrix = (projectMatrix in file("perf-tests")) "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.0", "nl.grons" %% "metrics4-scala" % Versions.metrics4Scala % Test, "com.lihaoyi" %% "scalatags" % Versions.scalaTags % Test, - "io.github.classgraph" % "classgraph" % "4.8.176", + "io.github.classgraph" % "classgraph" % "4.8.177", "org.http4s" %% "http4s-core" % Versions.http4s, "org.http4s" %% "http4s-dsl" % Versions.http4s, "org.http4s" %% "http4s-blaze-server" % Versions.http4sBlazeServer, From bfef1997b13076e453a1536fd5ccc0f734c1a78e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 3 Oct 2024 03:01:01 +0200 Subject: [PATCH 010/127] Update client3:akka-http-backend, ... to 3.10.0 (#4077) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index a771b6f8b1..8b8c168a29 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -8,7 +8,7 @@ object Versions { val circeGenericExtras = "0.14.3" val circeYaml = "0.15.2" val helidon = "4.0.10" - val sttp = "3.9.8" + val sttp = "3.10.0" val sttpModel = "1.7.11" val sttpShared = "1.3.22" val sttpApispec = "0.11.3" From ab1e43b15f91ad6a3770c971fbcf71c4fea3d6b5 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 4 Oct 2024 02:45:39 +0200 Subject: [PATCH 011/127] Update async-http-client-backend-cats, ... to 3.10.0 (#4080) --- .../scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala | 2 +- .../sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala | 2 +- .../sttp/tapir/examples/security/ServerSecurityLogicZio.scala | 2 +- .../sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index 10ac5e30e5..ea5c4caf81 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -5,7 +5,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.5 //> using dep org.http4s::http4s-blaze-server:0.23.16 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.9.8 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index f1df2f220f..8b51bbe371 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.9.8 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index f2ddef3e68..7ebe7a6005 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.9.8 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index 3bf2ae2bf4..5d5c717522 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -5,7 +5,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.9.8 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.websocket From 65ade9b01ccbcf35a7319c27c2a97c4ccee218e7 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 4 Oct 2024 02:47:29 +0200 Subject: [PATCH 012/127] Update client3:core, client3:fs2, ... to 3.9.8 (#4081) --- .../main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala | 2 +- .../scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala | 2 +- .../tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala | 2 +- .../tapir/examples/errors/IronRefinementErrorsNettyServer.scala | 2 +- .../errors/customErrorsOnDecodeFailurePekkoServer.scala | 2 +- .../sttp/tapir/examples/errors/errorOutputsPekkoServer.scala | 2 +- .../scala/sttp/tapir/examples/helloWorldArmeriaServer.scala | 2 +- .../scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala | 2 +- .../scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala | 2 +- .../main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala | 2 +- .../logging/ZioLoggingWithCorrelationIdNettyServer.scala | 2 +- .../examples/multipart/multipartFormUploadPekkoServer.scala | 2 +- .../examples/security/basicAuthenticationPekkoServer.scala | 2 +- .../tapir/examples/security/corsInterceptorPekkoServer.scala | 2 +- .../tapir/examples/security/externalSecurityInterceptor.scala | 2 +- .../sttp/tapir/examples/security/serverSecurityLogicPekko.scala | 2 +- .../security/serverSecurityLogicRefreshCookiesPekko.scala | 2 +- .../static_content/staticContentFromFilesPekkoServer.scala | 2 +- .../static_content/staticContentSecurePekkoServer.scala | 2 +- .../sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala | 2 +- .../tapir/examples/streaming/StreamingHttp4sFs2Server.scala | 2 +- .../sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala | 2 +- .../sttp/tapir/examples/streaming/StreamingNettyZioServer.scala | 2 +- .../sttp/tapir/examples/streaming/StreamingZioHttpServer.scala | 2 +- .../sttp/tapir/examples/streaming/streamingPekkoServer.scala | 2 +- .../sttp/tapir/examples/testing/CatsServerStubInterpreter.scala | 2 +- .../tapir/examples/testing/PekkoServerStubInterpreter.scala | 2 +- .../tapir/examples/testing/SttpMockServerClientExample.scala | 2 +- .../sttp/tapir/examples/websocket/webSocketPekkoServer.scala | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala index 3f477b7150..3cedab98c1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala index ed92cb1115..26b95dd582 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala index 0c65409406..4c42d4856d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 //> using dep org.http4s::http4s-blaze-server:0.23.16 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala index a788ba910c..4fe590bcb3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala index c16a97e403..d5f04fb54f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala index 86643f45f8..3a7a178d2b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala @@ -5,7 +5,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala index fb3d1de893..caae2ceb3b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala index 78654b193f..2e44fe191a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala index 8ccca12bdc..fc43b97c11 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala index 7be680c080..b8707c48f5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala index 5d5d60dd87..337d007655 100644 --- a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.5 -//> using dep com.softwaremill.sttp.client3::zio:3.9.7 +//> using dep com.softwaremill.sttp.client3::zio:3.9.8 package sttp.tapir.examples.logging diff --git a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala index 1fb8af8f5c..c9e112e0f1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.multipart diff --git a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala index 9832ed3f25..d33ead576b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala index e3682e3bb7..7507ee7a87 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala index 1bc84186fd..76643c6c11 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala index 439aabfe4e..6926316fe3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala index 1523d541ca..24f6dacce0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala index 7279919ef9..0a657aa526 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala index c569fd1a29..edc02338a9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala index 108385c9ec..a042368581 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::fs2:3.9.7 +//> using dep com.softwaremill.sttp.client3::fs2:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala index f67f35dc06..e8fe2b24d0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala index e19bb52d4a..2eafe2988b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala index ce0a57371e..5bbb407b03 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala index 4d25ccf7f0..39c37eb658 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala index 7905f08b48..fe295192ea 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala index 61cf0509eb..3ca814c7ef 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 package sttp.tapir.examples.testing diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala index 856208ca1e..3c586502e7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 package sttp.tapir.examples.testing diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala index 6a55da2551..439e648b24 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 //> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.5 -//> using dep com.softwaremill.sttp.client3::core:3.9.7 +//> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.mock-server:mockserver-netty:5.15.0 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala index adb1d15150..7e832fdc3b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala @@ -5,7 +5,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 -//> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.7 +//> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.8 package sttp.tapir.examples.websocket From 5be7814eba65652ec45ef83865c3990bf326fa6e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 5 Oct 2024 02:46:00 +0200 Subject: [PATCH 013/127] Update enumeratum, enumeratum-circe to 1.7.5 (#4082) --- build.sbt | 4 ++-- .../sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt | 4 ++-- .../oneOf-json-roundtrip_jsoniter/build.sbt | 2 +- .../oneOf-json-roundtrip_jsoniter_scala3/build.sbt | 2 +- project/Versions.scala | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build.sbt b/build.sbt index 33bd8b9959..5ef94a54fb 100644 --- a/build.sbt +++ b/build.sbt @@ -1986,8 +1986,8 @@ lazy val openapiCodegenCore: ProjectMatrix = (projectMatrix in file("openapi-cod "com.47deg" %% "scalacheck-toolbox-datetime" % "0.7.0" % Test, scalaOrganization.value % "scala-reflect" % scalaVersion.value, scalaOrganization.value % "scala-compiler" % scalaVersion.value % Test, - "com.beachape" %% "enumeratum" % "1.7.4" % Test, - "com.beachape" %% "enumeratum-circe" % "1.7.4" % Test, + "com.beachape" %% "enumeratum" % "1.7.5" % Test, + "com.beachape" %% "enumeratum-circe" % "1.7.5" % Test, "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.28.2" % Test, "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.28.2" % Provided ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt index dd790d804c..034a656e36 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt @@ -12,8 +12,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "io.circe" %% "circe-generic" % "0.14.9", - "com.beachape" %% "enumeratum" % "1.7.4", - "com.beachape" %% "enumeratum-circe" % "1.7.4", + "com.beachape" %% "enumeratum" % "1.7.5", + "com.beachape" %% "enumeratum-circe" % "1.7.5", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt index 0f9146c1b6..69be4170f3 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt @@ -10,7 +10,7 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.10.0", "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", - "com.beachape" %% "enumeratum" % "1.7.4", + "com.beachape" %% "enumeratum" % "1.7.5", "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.14", "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.14" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt index ea0dc7cfbb..5cc659b30f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt @@ -10,7 +10,7 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.10.0", "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", - "com.beachape" %% "enumeratum" % "1.7.4", + "com.beachape" %% "enumeratum" % "1.7.5", "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.14", "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.14" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, diff --git a/project/Versions.scala b/project/Versions.scala index 8b8c168a29..b12f83ef6c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -34,7 +34,7 @@ object Versions { val scalaTestPlusScalaCheck = "3.2.19.0" val refined = "0.11.2" val iron = "2.6.0" - val enumeratum = "1.7.4" + val enumeratum = "1.7.5" val zio = "2.1.9" val zioHttp = "3.0.1" val zioInteropCats = "23.1.0.3" From 6fb2860c15070ee914566d0a33049652919a960e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 7 Oct 2024 02:33:10 +0200 Subject: [PATCH 014/127] Update jsoniter-scala-core, ... to 2.30.15 (#4084) --- .../oneOf-json-roundtrip_jsoniter/build.sbt | 4 ++-- .../oneOf-json-roundtrip_jsoniter_scala3/build.sbt | 4 ++-- project/Versions.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt index 69be4170f3..35355e9aec 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.14", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.14" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.15", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.15" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt index 5cc659b30f..9ac845dc99 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.14", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.14" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.15", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.15" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/project/Versions.scala b/project/Versions.scala index b12f83ef6c..018567897b 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -66,5 +66,5 @@ object Versions { val nettyAll = "4.1.114.Final" val logback = "1.5.8" val slf4j = "2.0.16" - val jsoniter = "2.30.14" + val jsoniter = "2.30.15" } From 54c1d8a735025704fbc6643feec1fc1897917656 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 7 Oct 2024 02:35:00 +0200 Subject: [PATCH 015/127] Update sbt-assembly to 2.3.0 (#4083) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 9e191815ee..7ca1a55d8c 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -13,7 +13,7 @@ addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.10.0") addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.2.0") +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.0") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") From 18a63ed156622056fbe1af0710951320a37b79b7 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Mon, 7 Oct 2024 16:14:12 +0200 Subject: [PATCH 016/127] Add more detail to exceptions thrown in the client interpreter (#4085) --- .../client/sttp/SttpClientInterpreter.scala | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala b/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala index 651f208841..c110b10785 100644 --- a/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala +++ b/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala @@ -92,17 +92,16 @@ trait SttpClientInterpreter extends SttpClientInterpreterExtensions { def toRequestThrowErrors[I, E, O, R](e: PublicEndpoint[I, E, O, R], baseUri: Option[Uri])(implicit wsToPipe: WebSocketToPipe[R] ): I => Request[O, R] = - i => - new EndpointToSttpClient(sttpClientOptions, wsToPipe) - .toSttpRequest(e, baseUri) - .apply(()) - .apply(i) + i => { + val request = new EndpointToSttpClient(sttpClientOptions, wsToPipe).toSttpRequest(e, baseUri).apply(()).apply(i) + request .mapResponse(throwDecodeFailures) .mapResponse { - case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t.asInstanceOf[E]), t) - case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t)) + case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t.asInstanceOf[E], request), t) + case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t, request)) case Right(o) => o } + } // secure @@ -192,17 +191,16 @@ trait SttpClientInterpreter extends SttpClientInterpreterExtensions { wsToPipe: WebSocketToPipe[R] ): A => I => Request[O, R] = a => - i => - new EndpointToSttpClient(sttpClientOptions, wsToPipe) - .toSttpRequest(e, baseUri) - .apply(a) - .apply(i) + i => { + val request = new EndpointToSttpClient(sttpClientOptions, wsToPipe).toSttpRequest(e, baseUri).apply(a).apply(i) + request .mapResponse(throwDecodeFailures) .mapResponse { - case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t.asInstanceOf[E]), t) - case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t)) + case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t.asInstanceOf[E], request), t) + case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t, request)) case Right(o) => o } + } // @@ -213,11 +211,11 @@ trait SttpClientInterpreter extends SttpClientInterpreterExtensions { case f => throw new IllegalArgumentException(s"Cannot decode: $f") } - private def throwErrorExceptionMsg[I, E, O, R](endpoint: PublicEndpoint[I, E, O, R], i: I, e: E): String = - s"Endpoint ${endpoint.show} returned error: $e, inputs: $i." + private def throwErrorExceptionMsg[I, E, O, R](endpoint: PublicEndpoint[I, E, O, R], i: I, e: E, r: Request[_, _]): String = + s"Endpoint ${endpoint.show} returned error: $e, inputs: $i. Request: ${r.showBasic}." - private def throwErrorExceptionMsg[A, I, E, O, R](endpoint: Endpoint[A, I, E, O, R], a: A, i: I, e: E): String = - s"Endpoint ${endpoint.show} returned error: $e, for security inputs: $a, inputs: $i." + private def throwErrorExceptionMsg[A, I, E, O, R](endpoint: Endpoint[A, I, E, O, R], a: A, i: I, e: E, r: Request[_, _]): String = + s"Endpoint ${endpoint.show} returned error: $e, for security inputs: $a, inputs: $i. Request: ${r.showBasic}." } object SttpClientInterpreter { From 79b8961fba5bdde57992a183b851d7d33b96880d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 8 Oct 2024 03:03:27 +0200 Subject: [PATCH 017/127] Update gatling-sbt to 4.10.1 (#4088) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 7ca1a55d8c..62b829d7f8 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -14,7 +14,7 @@ addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") -addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.0") +addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.1") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") From 8cacc3f8cc07e5837952729527d94ca4f62b2a83 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Tue, 8 Oct 2024 13:22:37 +0200 Subject: [PATCH 018/127] Update to Ox 0.5.0 (#4086) --- .../WebSocketChatNettySyncServer.scala | 159 +++++++++--------- .../websocket/WebSocketNettySyncServer.scala | 109 ++++++------ project/Versions.scala | 2 +- .../server/netty/sync/NettyOxStreams.scala | 5 +- .../internal/NettySyncToResponseBody.scala | 1 - .../reactivestreams/OxProcessor.scala | 8 +- .../ws/OxSourceWebSocketProcessor.scala | 84 ++++----- .../netty/sync/NettySyncServerTest.scala | 44 +---- .../sync/perf/NettySyncServerRunner.scala | 13 +- 9 files changed, 188 insertions(+), 237 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index 8dd130a4b7..d98d3d1065 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -2,83 +2,82 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.ox::core:0.4.0 - -package sttp.tapir.examples.websocket - -import ox.channels.{Actor, ActorRef, Channel, ChannelClosed, Default, DefaultResult, selectOrClosed} -import ox.{ExitCode, Ox, OxApp, fork, never, releaseAfterScope} -import sttp.tapir.* -import sttp.tapir.CodecFormat.* -import sttp.tapir.server.netty.sync.{NettySyncServer, OxStreams} - -import java.util.UUID - -type ChatMemberId = UUID - -case class ChatMember(id: ChatMemberId, channel: Channel[Message]) -object ChatMember: - def create: ChatMember = ChatMember(UUID.randomUUID(), Channel.bufferedDefault[Message]) - -class ChatRoom: - private var members: Map[ChatMemberId, ChatMember] = Map() - - def connected(m: ChatMember): Unit = - members = members + (m.id -> m) - println(s"Connected: ${m.id}, number of members: ${members.size}") - - def disconnected(m: ChatMember): Unit = - members = members - m.id - println(s"Disconnected: ${m.id}, number of members: ${members.size}") - - def incoming(message: Message): Unit = - println(s"Broadcasting: ${message.v}") - members = members.flatMap { (id, member) => - selectOrClosed(member.channel.sendClause(message), Default(())) match - case member.channel.Sent() => Some((id, member)) - case _: ChannelClosed => - println(s"Channel of member $id closed, removing from members") - None - case DefaultResult(_) => - println(s"Buffer for member $id full, not sending message") - Some((id, member)) - } - -// - -case class Message(v: String) // could be more complex, e.g. JSON including nickname + message -given Codec[String, Message, TextPlain] = Codec.string.map(Message(_))(_.v) - -val chatEndpoint = endpoint.get - .in("chat") - .out(webSocketBody[Message, TextPlain, Message, TextPlain](OxStreams)) - -def chatProcessor(a: ActorRef[ChatRoom]): OxStreams.Pipe[Message, Message] = - incoming => { - val member = ChatMember.create - - a.tell(_.connected(member)) - - fork { - incoming.foreach { msg => - a.tell(_.incoming(msg)) - } - // all incoming messages are processed (= client closed), completing the outgoing channel as well - member.channel.done() - } - - // however the scope ends (client close or error), we need to notify the chat room - releaseAfterScope { - a.tell(_.disconnected(member)) - } - - member.channel - } - -object WebSocketChatNettySyncServer extends OxApp: - override def run(args: Vector[String])(using Ox): ExitCode = - val chatActor = Actor.create(new ChatRoom) - val chatServerEndpoint = chatEndpoint.handleSuccess(_ => chatProcessor(chatActor)) - val binding = NettySyncServer().addEndpoint(chatServerEndpoint).start() - releaseAfterScope(binding.stop()) - never + +// TODO: uncomment after tapir update +// package sttp.tapir.examples.websocket + +// import ox.channels.{Actor, ActorRef, Channel, ChannelClosed, Default, DefaultResult, selectOrClosed} +// import ox.{ExitCode, Ox, OxApp, fork, never, releaseAfterScope, supervised} +// import sttp.tapir.* +// import sttp.tapir.CodecFormat.* +// import sttp.tapir.server.netty.sync.{NettySyncServer, OxStreams} + +// import java.util.UUID +// import ox.flow.Flow +// import ox.flow.FlowEmit + +// type ChatMemberId = UUID + +// case class ChatMember(id: ChatMemberId, channel: Channel[Message]) +// object ChatMember: +// def create: ChatMember = ChatMember(UUID.randomUUID(), Channel.bufferedDefault[Message]) + +// class ChatRoom: +// private var members: Map[ChatMemberId, ChatMember] = Map() + +// def connected(m: ChatMember): Unit = +// members = members + (m.id -> m) +// println(s"Connected: ${m.id}, number of members: ${members.size}") + +// def disconnected(m: ChatMember): Unit = +// members = members - m.id +// println(s"Disconnected: ${m.id}, number of members: ${members.size}") + +// def incoming(message: Message): Unit = +// println(s"Broadcasting: ${message.v}") +// members = members.flatMap: (id, member) => +// selectOrClosed(member.channel.sendClause(message), Default(())) match +// case member.channel.Sent() => Some((id, member)) +// case _: ChannelClosed => +// println(s"Channel of member $id closed, removing from members") +// None +// case DefaultResult(_) => +// println(s"Buffer for member $id full, not sending message") +// Some((id, member)) + +// // + +// case class Message(v: String) // could be more complex, e.g. JSON including nickname + message +// given Codec[String, Message, TextPlain] = Codec.string.map(Message(_))(_.v) + +// val chatEndpoint = endpoint.get +// .in("chat") +// .out(webSocketBody[Message, TextPlain, Message, TextPlain](OxStreams)) + +// def chatProcessor(a: ActorRef[ChatRoom]): OxStreams.Pipe[Message, Message] = incoming => +// // returning a flow which, when run, creates a scope to handle the incoming & outgoing messages +// Flow.usingEmit: emit => +// supervised: +// val member = ChatMember.create + +// a.tell(_.connected(member)) + +// fork: +// incoming.runForeach: msg => +// a.tell(_.incoming(msg)) +// // all incoming messages are processed (= client closed), completing the outgoing channel as well +// member.channel.done() + +// // however the scope ends (client close or error), we need to notify the chat room +// releaseAfterScope: +// a.tell(_.disconnected(member)) + +// FlowEmit.channelToEmit(member.channel, emit) + +// object WebSocketChatNettySyncServer extends OxApp: +// override def run(args: Vector[String])(using Ox): ExitCode = +// val chatActor = Actor.create(new ChatRoom) +// val chatServerEndpoint = chatEndpoint.handleSuccess(_ => chatProcessor(chatActor)) +// val binding = NettySyncServer().addEndpoint(chatServerEndpoint).start() +// releaseAfterScope(binding.stop()) +// never diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index ba4386bffa..d1df7a2fc5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -3,63 +3,52 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -package sttp.tapir.examples.websocket - -import ox.* -import ox.channels.* -import sttp.capabilities.WebSockets -import sttp.tapir.* -import sttp.tapir.server.netty.sync.OxStreams -import sttp.tapir.server.netty.sync.OxStreams.Pipe -import sttp.tapir.server.netty.sync.NettySyncServer -import sttp.ws.WebSocketFrame - -import java.util.concurrent.atomic.AtomicBoolean -import scala.concurrent.duration.* - -object WebSocketNettySyncServer: - // Web socket endpoint - val wsEndpoint = - endpoint.get - .in("ws") - .out( - webSocketBody[String, CodecFormat.TextPlain, String, CodecFormat.TextPlain](OxStreams) - .concatenateFragmentedFrames(false) // All these options are supported by tapir-netty - .ignorePong(true) - .autoPongOnPing(true) - .decodeCloseRequests(false) - .decodeCloseResponses(false) - .autoPing(Some((10.seconds, WebSocketFrame.Ping("ping-content".getBytes)))) - ) - - // Your processor transforming a stream of requests into a stream of responses - val wsPipe: Pipe[String, String] = requestStream => requestStream.map(_.toUpperCase) - - // Alternative logic (not used here): requests and responses can be treated separately, for example to emit frames - // to the client from another source. - val wsPipe2: Pipe[String, String] = { in => - val running = new AtomicBoolean(true) // TODO use https://github.com/softwaremill/ox/issues/209 once available - fork { - in.drain() // read and ignore requests - running.set(false) // stopping the responses - } - // emit periodic responses - Source.tick(1.second).takeWhile(_ => running.get()).map(_ => System.currentTimeMillis()).map(_.toString) - } - - // The WebSocket endpoint, builds the pipeline in serverLogicSuccess - val wsServerEndpoint = wsEndpoint.handleSuccess(_ => wsPipe2) - - // A regular /GET endpoint - val helloWorldEndpoint = - endpoint.get.in("hello").in(query[String]("name")).out(stringBody) - - val helloWorldServerEndpoint = helloWorldEndpoint - .handleSuccess(name => s"Hello, $name!") - - def main(args: Array[String]): Unit = - NettySyncServer() - .host("0.0.0.0") - .port(8080) - .addEndpoints(List(wsServerEndpoint, helloWorldServerEndpoint)) - .startAndWait() +// TODO: uncomment after tapir update +// package sttp.tapir.examples.websocket + +// import ox.* +// import ox.channels.* +// import ox.flow.Flow +// import sttp.capabilities.WebSockets +// import sttp.tapir.* +// import sttp.tapir.server.netty.sync.OxStreams +// import sttp.tapir.server.netty.sync.OxStreams.Pipe +// import sttp.tapir.server.netty.sync.NettySyncServer + +// import scala.concurrent.duration.* + +// object WebSocketNettySyncServer: +// // Web socket endpoint +// val wsEndpoint = +// endpoint.get +// .in("ws") +// .out(webSocketBody[String, CodecFormat.TextPlain, String, CodecFormat.TextPlain](OxStreams)) + +// // Your processor transforming a stream of requests into a stream of responses +// val wsPipe: Pipe[String, String] = requestStream => requestStream.map(_.toUpperCase) + +// // Alternative logic (not used here): requests and responses can be treated separately, for example to emit frames +// // to the client from another source. +// val wsPipe2: Pipe[String, String] = in => +// // emit periodic responses +// val responseFlow: Flow[String] = Flow.tick(1.second).map(_ => System.currentTimeMillis()).map(_.toString) + +// // ignore whatever is sent by the client, but complete the stream once the client closes +// in.drain().merge(responseFlow, propagateDoneLeft = true) + +// // The WebSocket endpoint, builds the pipeline in serverLogicSuccess +// val wsServerEndpoint = wsEndpoint.handleSuccess(_ => wsPipe) + +// // A regular /GET endpoint +// val helloWorldEndpoint = +// endpoint.get.in("hello").in(query[String]("name")).out(stringBody) + +// val helloWorldServerEndpoint = helloWorldEndpoint +// .handleSuccess(name => s"Hello, $name!") + +// def main(args: Array[String]): Unit = +// NettySyncServer() +// .host("0.0.0.0") +// .port(8080) +// .addEndpoints(List(wsServerEndpoint, helloWorldServerEndpoint)) +// .startAndWait() diff --git a/project/Versions.scala b/project/Versions.scala index 018567897b..64c12fb561 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -25,7 +25,7 @@ object Versions { val json4s = "4.0.7" val metrics4Scala = "4.3.2" val nettyReactiveStreams = "3.0.2" - val ox = "0.4.0" + val ox = "0.5.1" val reactiveStreams = "1.0.4" val sprayJson = "1.3.6" val scalaCheck = "1.18.1" diff --git a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettyOxStreams.scala b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettyOxStreams.scala index 498dbf4b36..ef52aaddc1 100644 --- a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettyOxStreams.scala +++ b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettyOxStreams.scala @@ -1,11 +1,10 @@ package sttp.tapir.server.netty.sync -import ox.Ox -import ox.channels.Source +import ox.flow.Flow import sttp.capabilities.Streams trait OxStreams extends Streams[OxStreams]: override type BinaryStream = Nothing - override type Pipe[A, B] = Ox ?=> Source[A] => Source[B] + override type Pipe[A, B] = Flow[A] => Flow[B] object OxStreams extends OxStreams diff --git a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/NettySyncToResponseBody.scala b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/NettySyncToResponseBody.scala index 57bd6673a7..4b49c2ec4b 100644 --- a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/NettySyncToResponseBody.scala +++ b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/NettySyncToResponseBody.scala @@ -1,6 +1,5 @@ package sttp.tapir.server.netty.sync.internal -import _root_.ox.* import io.netty.channel.ChannelHandlerContext import sttp.capabilities import sttp.model.HasHeaders diff --git a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/reactivestreams/OxProcessor.scala b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/reactivestreams/OxProcessor.scala index c5a1ba09b5..e26cdecd31 100644 --- a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/reactivestreams/OxProcessor.scala +++ b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/reactivestreams/OxProcessor.scala @@ -10,6 +10,7 @@ import sttp.tapir.server.netty.sync.internal.ox.OxDispatcher import scala.concurrent.duration.* import scala.concurrent.{Await, Future} import scala.util.control.NonFatal +import ox.flow.Flow /** A reactive Processor, which is both a Publisher and a Subscriber * @@ -65,10 +66,7 @@ private[sync] class OxProcessor[A, B]( if subscriber == null then throw new NullPointerException("Subscriber cannot be null") val wrappedSubscriber = wrapSubscriber(subscriber) pipelineForkFuture = oxDispatcher.runAsync { - val outgoingResponses: Source[B] = pipeline((channel: Source[A]).mapAsView { e => - requestsSubscription.request(1) - e - }) + val outgoingResponses: Source[B] = pipeline(Flow.fromSource(channel).tap(_ => requestsSubscription.request(1))).runToChannel() val channelSubscription = new ChannelSubscription(wrappedSubscriber, outgoingResponses) subscriber.onSubscribe(channelSubscription) channelSubscription.runBlocking() // run the main loop which reads from the channel if there's demand @@ -81,7 +79,7 @@ private[sync] class OxProcessor[A, B]( if (pipelineForkFuture != null) try { val pipelineFork = Await.result(pipelineForkFuture, pipelineCancelationTimeout) oxDispatcher.runAsync { - race( + raceSuccess( { ox.sleep(pipelineCancelationTimeout) logger.error(s"Pipeline fork cancelation did not complete in time ($pipelineCancelationTimeout).") diff --git a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/ws/OxSourceWebSocketProcessor.scala b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/ws/OxSourceWebSocketProcessor.scala index b66eb99bd4..3be240d77d 100644 --- a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/ws/OxSourceWebSocketProcessor.scala +++ b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/internal/ws/OxSourceWebSocketProcessor.scala @@ -5,7 +5,7 @@ import io.netty.handler.codec.http.websocketx.{CloseWebSocketFrame, WebSocketClo import org.reactivestreams.{Processor, Subscriber, Subscription} import org.slf4j.LoggerFactory import ox.* -import ox.channels.{ChannelClosedException, Source} +import ox.channels.ChannelClosedException import sttp.tapir.model.WebSocketFrameDecodeFailure import sttp.tapir.server.netty.internal.ws.WebSocketFrameConverters.* import sttp.tapir.server.netty.sync.OxStreams @@ -18,6 +18,7 @@ import java.io.IOException import java.util.concurrent.Semaphore import scala.concurrent.duration.* +import ox.flow.Flow private[sync] object OxSourceWebSocketProcessor: private val logger = LoggerFactory.getLogger(getClass.getName) @@ -34,27 +35,20 @@ private[sync] object OxSourceWebSocketProcessor: case x: DecodeResult.Value[REQ] @unchecked => x.v } - val frame2FramePipe: OxStreams.Pipe[NettyWebSocketFrame, NettyWebSocketFrame] = ox ?=> + val frame2FramePipe: OxStreams.Pipe[NettyWebSocketFrame, NettyWebSocketFrame] = incoming => val closeSignal = new Semaphore(0) - (incoming: Source[NettyWebSocketFrame]) => - val outgoing = incoming - .mapAsView { f => - val sttpFrame = nettyFrameToFrame(f) - f.release() - sttpFrame - } - .pipe(takeUntilCloseFrame(passAlongCloseFrame = o.decodeCloseRequests, closeSignal)) - .pipe(optionallyConcatenateFrames(o.concatenateFragmentedFrames)) - .mapAsView(decodeFrame) - .pipe(processingPipe) - .mapAsView(r => frameToNettyFrame(o.responses.encode(r))) - - // when the client closes the connection, we need to close the outgoing channel as well - this needs to be - // done in the client's pipeline code; monitoring that this happens within a timeout after the close happens - monitorOutgoingClosedAfterClientClose(closeSignal, outgoing) - - outgoing - end frame2FramePipe + incoming + .map { f => + val sttpFrame = nettyFrameToFrame(f) + f.release() + sttpFrame + } + .pipe(takeUntilCloseFrame(passAlongCloseFrame = o.decodeCloseRequests, closeSignal)) + .pipe(optionallyConcatenateFrames(o.concatenateFragmentedFrames)) + .map(decodeFrame) + .pipe(processingPipe) + .pipe(monitorOutgoingClosedAfterClientClose(closeSignal)) + .map(r => frameToNettyFrame(o.responses.encode(r))) // We need this kind of interceptor to make Netty reply correctly to closed channel or error def wrapSubscriberWithNettyCallback[B](sub: Subscriber[? >: B]): Subscriber[? >: B] = new Subscriber[B] { @@ -76,31 +70,37 @@ private[sync] object OxSourceWebSocketProcessor: new OxProcessor(oxDispatcher, frame2FramePipe, wrapSubscriberWithNettyCallback) end apply - private def optionallyConcatenateFrames(doConcatenate: Boolean)(s: Source[WebSocketFrame])(using Ox): Source[WebSocketFrame] = - if doConcatenate then s.mapStateful(() => None: Accumulator)(accumulateFrameState).collectAsView { case Some(f: WebSocketFrame) => f } - else s + private def optionallyConcatenateFrames(doConcatenate: Boolean)(f: Flow[WebSocketFrame]): Flow[WebSocketFrame] = + if doConcatenate then f.mapStateful(() => None: Accumulator)(accumulateFrameState).collect { case Some(f: WebSocketFrame) => f } + else f - private def takeUntilCloseFrame(passAlongCloseFrame: Boolean, closeSignal: Semaphore)( - s: Source[WebSocketFrame] - )(using Ox): Source[WebSocketFrame] = - s.takeWhile( + private def takeUntilCloseFrame(passAlongCloseFrame: Boolean, closeSignal: Semaphore)(f: Flow[WebSocketFrame]): Flow[WebSocketFrame] = + f.takeWhile( { case _: WebSocketFrame.Close => closeSignal.release(); false - case _ => true + case f => true }, includeFirstFailing = passAlongCloseFrame ) - private def monitorOutgoingClosedAfterClientClose(closeSignal: Semaphore, outgoing: Source[_])(using Ox): Unit = - // will be interrupted when outgoing is completed - fork { - closeSignal.acquire() - sleep(outgoingCloseAfterCloseTimeout) - if !outgoing.isClosedForReceive then - logger.error( - s"WebSocket outgoing messages channel either not drained, or not closed, " + - s"$outgoingCloseAfterCloseTimeout after receiving a close frame from the client! " + - s"Make sure to complete the outgoing channel in your pipeline, once the incoming " + - s"channel is done!" - ) - }.discard + private def monitorOutgoingClosedAfterClientClose[T](closeSignal: Semaphore)(outgoing: Flow[T]): Flow[T] = + // when the client closes the connection, the outgoing flow has to be completed as well, in the client's pipeline + // code; monitoring that this happens within a timeout after the close happens + Flow.usingEmit { emit => + unsupervised { + forkUnsupervised { + // after the close frame is received from the client, waiting for the given grace period for the flow to + // complete. This will end this scope, and interrupt the `sleep`. If this doesn't happen, logging an error. + closeSignal.acquire() + sleep(outgoingCloseAfterCloseTimeout) + logger.error( + s"WebSocket outgoing messages flow either not drained, or not closed, " + + s"$outgoingCloseAfterCloseTimeout after receiving a close frame from the client! " + + s"Make sure to complete the outgoing flow in your pipeline, once the incoming " + + s"flow is done!" + ) + } + + outgoing.runToEmit(emit) + } + } diff --git a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala index d5aae0d4ad..ef3ff0295c 100644 --- a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala +++ b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala @@ -11,7 +11,6 @@ import org.scalatest.funsuite.AsyncFunSuite import org.scalatest.matchers.should.Matchers.* import org.slf4j.LoggerFactory import ox.* -import ox.channels.* import sttp.capabilities.WebSockets import sttp.capabilities.fs2.Fs2Streams import sttp.client3.* @@ -21,11 +20,11 @@ import sttp.tapir.* import sttp.tapir.server.ServerEndpoint import sttp.tapir.server.tests.* import sttp.tapir.tests.* -import sttp.ws.{WebSocket, WebSocketFrame} -import java.util.concurrent.{CompletableFuture, TimeUnit} import scala.concurrent.Future import scala.concurrent.duration.FiniteDuration +import ox.flow.Flow +import scala.annotation.nowarn class NettySyncServerTest extends AsyncFunSuite with BeforeAndAfterAll { @@ -43,46 +42,13 @@ class NettySyncServerTest extends AsyncFunSuite with BeforeAndAfterAll { .tests() ++ new ServerGracefulShutdownTests(createServerTest, sleeper).tests() ++ new ServerWebSocketTests(createServerTest, OxStreams, autoPing = true, failingPipe = true, handlePong = true) { - override def functionToPipe[A, B](f: A => B): OxStreams.Pipe[A, B] = ox ?=> in => in.map(f) - override def emptyPipe[A, B]: OxStreams.Pipe[A, B] = _ => Source.empty - - import createServerTest._ - override def tests(): List[Test] = super.tests() ++ List({ - val released: CompletableFuture[Boolean] = new CompletableFuture[Boolean]() - testServer( - endpoint.out(webSocketBody[String, CodecFormat.TextPlain, String, CodecFormat.TextPlain].apply(streams)), - "closes supervision scope when client closes Web Socket" - )((_: Unit) => - val pipe: OxStreams.Pipe[String, String] = in => { - releaseAfterScope { - released.complete(true).discard - } - in - } - Right(pipe) - ) { (backend, baseUri) => - basicRequest - .response(asWebSocket { (ws: WebSocket[IO]) => - for { - _ <- ws.sendText("test1") - _ <- ws.close() - _ <- ws.receiveText() - closeResponse <- ws.eitherClose(ws.receiveText()) - } yield closeResponse - }) - .get(baseUri.scheme("ws")) - .send(backend) - .map { r => - r.body.value shouldBe Left(WebSocketFrame.Close(1000, "normal closure")) - released.get(15, TimeUnit.SECONDS) shouldBe true - } - } - }) + override def functionToPipe[A, B](f: A => B): OxStreams.Pipe[A, B] = _.map(f) + override def emptyPipe[A, B]: OxStreams.Pipe[A, B] = _ => Flow.empty }.tests() tests.foreach { t => if (testNameFilter.forall(filter => t.name.contains(filter))) { - implicit val pos: Position = t.pos + @nowarn implicit val pos: Position = t.pos // used by test macro this.test(t.name)(t.f()) } diff --git a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/perf/NettySyncServerRunner.scala b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/perf/NettySyncServerRunner.scala index b020b85df1..b8b70c4939 100644 --- a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/perf/NettySyncServerRunner.scala +++ b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/perf/NettySyncServerRunner.scala @@ -2,6 +2,7 @@ package sttp.tapir.server.netty.sync.perf import ox.* import ox.channels.* +import ox.flow.Flow import sttp.shared.Identity import sttp.tapir.server.netty.sync.NettySyncServerOptions import sttp.tapir.server.netty.sync.NettySyncServerBinding @@ -57,12 +58,12 @@ object NettySyncServerRunner { val wsBaseEndpoint = endpoint.get.in("ws" / "ts") - val wsPipe: OxStreams.Pipe[Long, Long] = { in => - fork { - in.drain() - } - Source.tick(WebSocketSingleResponseLag).map(_ => System.currentTimeMillis()) - } + val wsPipe: OxStreams.Pipe[Long, Long] = in => + in.drain() + .merge( + Flow.tick(WebSocketSingleResponseLag).map(_ => System.currentTimeMillis()), + propagateDoneLeft = true + ) val wsEndpoint: Endpoint[Unit, Unit, Unit, OxStreams.Pipe[Long, Long], OxStreams with WebSockets] = wsBaseEndpoint .out( From 1fc76b3ce2ce376079567b76b436e3dade71e650 Mon Sep 17 00:00:00 2001 From: adamw Date: Tue, 8 Oct 2024 13:25:49 +0200 Subject: [PATCH 019/127] Release 1.11.6 --- README.md | 2 +- generated-doc/out/adopters/budgetbakers.svg | 46 ++++++++++++++++++ generated-doc/out/adopters/ematiq.png | Bin 0 -> 131646 bytes generated-doc/out/adopters/fugo.png | Bin 0 -> 23217 bytes generated-doc/out/client/http4s.md | 2 +- generated-doc/out/client/play.md | 4 +- generated-doc/out/client/sttp.md | 4 +- generated-doc/out/docs/asyncapi.md | 2 +- generated-doc/out/docs/json-schema.md | 2 +- generated-doc/out/docs/openapi.md | 12 ++--- generated-doc/out/endpoint/integrations.md | 18 +++---- generated-doc/out/endpoint/json.md | 18 +++---- generated-doc/out/endpoint/pickler.md | 2 +- generated-doc/out/endpoint/static.md | 2 +- .../out/generator/sbt-openapi-codegen.md | 2 +- generated-doc/out/quickstart.md | 2 +- generated-doc/out/server/akkahttp.md | 4 +- generated-doc/out/server/armeria.md | 6 +-- generated-doc/out/server/aws.md | 8 +-- generated-doc/out/server/finatra.md | 4 +- generated-doc/out/server/http4s.md | 2 +- generated-doc/out/server/jdkhttp.md | 2 +- generated-doc/out/server/netty.md | 8 +-- generated-doc/out/server/nima.md | 2 +- generated-doc/out/server/observability.md | 8 +-- generated-doc/out/server/pekkohttp.md | 4 +- generated-doc/out/server/play.md | 4 +- generated-doc/out/server/vertx.md | 6 +-- generated-doc/out/server/zio-http4s.md | 4 +- generated-doc/out/server/ziohttp.md | 12 ++++- generated-doc/out/testing.md | 10 ++-- generated-doc/out/tutorials/01_hello_world.md | 24 ++++----- .../out/tutorials/02_openapi_docs.md | 14 +++--- generated-doc/out/tutorials/03_json.md | 10 ++-- generated-doc/out/tutorials/04_errors.md | 20 ++++---- .../tutorials/05_multiple_inputs_outputs.md | 14 +++--- .../out/tutorials/06_error_variants.md | 14 +++--- generated-doc/out/tutorials/07_cats_effect.md | 20 ++++---- 38 files changed, 186 insertions(+), 132 deletions(-) create mode 100644 generated-doc/out/adopters/budgetbakers.svg create mode 100644 generated-doc/out/adopters/ematiq.png create mode 100644 generated-doc/out/adopters/fugo.png diff --git a/README.md b/README.md index 913a642bfd..a2df88f4ff 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] Add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.5" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.6" ``` Then, import: diff --git a/generated-doc/out/adopters/budgetbakers.svg b/generated-doc/out/adopters/budgetbakers.svg new file mode 100644 index 0000000000..809689faea --- /dev/null +++ b/generated-doc/out/adopters/budgetbakers.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated-doc/out/adopters/ematiq.png b/generated-doc/out/adopters/ematiq.png new file mode 100644 index 0000000000000000000000000000000000000000..b15347a9883991da307e232ac613b721e03d82d6 GIT binary patch literal 131646 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

      HYMmvI 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 using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 ``` ## Endpoint description @@ -43,8 +43,8 @@ Let's start by defining the method and path of our endpoint: {emphasize-lines="4-11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* @@ -72,8 +72,8 @@ of requiring it to be a fixed value (a constant): {emphasize-lines="10"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* @@ -97,8 +97,8 @@ Finally, let's add an output to the endpoint. We'll return the response as a str {emphasize-lines="11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* @@ -123,8 +123,8 @@ will be sent as a response: {emphasize-lines="12"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* @@ -152,8 +152,8 @@ example, we'll bind to `localhost` (which is the default), and to the port 8080: {emphasize-lines="5, 15-18"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/02_openapi_docs.md b/generated-doc/out/tutorials/02_openapi_docs.md index 508674dfc0..d281261a73 100644 --- a/generated-doc/out/tutorials/02_openapi_docs.md +++ b/generated-doc/out/tutorials/02_openapi_docs.md @@ -17,16 +17,16 @@ use a bundle, which first interprets the provided tapir endpoints into OpenAPI a endpoints, which expose the UI together with the generated specification. We'll need to add a dependency: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 ``` We'll also define and expose two endpoints as an HTTP server, as described in the previous tutorial. Hence, our starting setup of `docs.scala` is as follows: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -108,9 +108,9 @@ And that's almost all the code changes that we need to introduce! We only need t {emphasize-lines="3, 5, 8, 24-25, 29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 import sttp.shared.Identity import sttp.tapir.* diff --git a/generated-doc/out/tutorials/03_json.md b/generated-doc/out/tutorials/03_json.md index 4af212c163..8d8534cb0e 100644 --- a/generated-doc/out/tutorials/03_json.md +++ b/generated-doc/out/tutorials/03_json.md @@ -83,7 +83,7 @@ In our case, deriving the schemas will amount to adding a `... derives Schema` c {emphasize-lines="1, 7, 10, 12, 16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.core.* // needed for `writeToString` @@ -127,10 +127,10 @@ how the `jsonBody[T]` method is used in the endpoint definition. We'll also expo {emphasize-lines="2-4, 10-15, 23-39"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* // needed for ... derives diff --git a/generated-doc/out/tutorials/04_errors.md b/generated-doc/out/tutorials/04_errors.md index 5a875b9d35..6755993b50 100644 --- a/generated-doc/out/tutorials/04_errors.md +++ b/generated-doc/out/tutorials/04_errors.md @@ -40,8 +40,8 @@ schemas both for the `Result` and `Error` classes, to represent them properly in describing the endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -76,10 +76,10 @@ We'll also add code to expose the endpoint as a server, along with its OpenAPI d {emphasize-lines="2-3, 11-13, 24-28, 30-36"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -152,10 +152,10 @@ you'll also get `ERROR` logs when unhandled exceptions happen: {emphasize-lines="6, 26"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md index cf7fe95f8e..67ef233dcf 100644 --- a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md +++ b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md @@ -24,7 +24,7 @@ body, but additionally the hash of the result should be included in the `X-Resul Below is the endpoint description; we'll be editing the `multiple.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 import sttp.tapir.* @@ -61,8 +61,8 @@ The output tuple is then mapped to the response body & header: {emphasize-lines="5, 8-9, 18-29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -147,8 +147,8 @@ The mapping functions are simple, but quite boring to write: {emphasize-lines="8, 17-18, 23-27"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -197,8 +197,8 @@ Here's the modified code using `.mapInTo`, which additionally maps outputs to th {emphasize-lines="9, 11-13, 19, 22"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/06_error_variants.md b/generated-doc/out/tutorials/06_error_variants.md index 02baead739..67d6703579 100644 --- a/generated-doc/out/tutorials/06_error_variants.md +++ b/generated-doc/out/tutorials/06_error_variants.md @@ -83,7 +83,7 @@ request serializing `AvatarSuccess.Redirect` instances, as Tapir knows nothing a an `EndpointOutput[String]`: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -106,7 +106,7 @@ this output to the `AvatarSuccess.Redirect` type using `.mapTo`, which we've lea {emphasize-lines="12-13"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -138,7 +138,7 @@ each of which translates to a separate class. Our one-of successful output takes {emphasize-lines="13-16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -175,7 +175,7 @@ To fix this, we can use the `oneOfVariantSingletonMatcher` method. It takes a un value, to which the high-level output must be equal, for the variant to be chosen: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -197,9 +197,9 @@ val errorOutput: EndpointOutput[AvatarError] = oneOf( Equipped with `oneOf` outputs, we can now fully describe and test our endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* diff --git a/generated-doc/out/tutorials/07_cats_effect.md b/generated-doc/out/tutorials/07_cats_effect.md index 4b39bfe1fb..ad770fa409 100644 --- a/generated-doc/out/tutorials/07_cats_effect.md +++ b/generated-doc/out/tutorials/07_cats_effect.md @@ -21,7 +21,7 @@ use. Hence, we'll start with the same basic endpoint description. We'll be editing the `cats-effect.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 import sttp.tapir.* @@ -56,8 +56,8 @@ parameter explicitly, using `.serverLogic[IO]` in our case: {emphasize-lines="2, 4, 12-14"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.6 import cats.effect.IO import sttp.tapir.* @@ -102,8 +102,8 @@ The conversion process is an almost-one-liner (if it wasn't for line length limi {emphasize-lines="2, 5, 7, 18-19"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 import cats.effect.IO import org.http4s.HttpRoutes @@ -130,8 +130,8 @@ standard code to start a server and handle requests until the application is int {emphasize-lines="3, 5, 7, 8, 12, 24-30"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} @@ -192,9 +192,9 @@ the second step that we need to perform: {emphasize-lines="3, 7, 13, 27-32, 37"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} From f17ae223bde614c353306650283153ca8062ed26 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 8 Oct 2024 15:59:28 +0200 Subject: [PATCH 020/127] Update java-dogstatsd-client to 4.4.3 (#4089) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 64c12fb561..4cd59e3c9f 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -62,7 +62,7 @@ object Versions { val quicklens = "1.9.9" val openTelemetry = "1.42.1" val mockServer = "5.15.0" - val dogstatsdClient = "4.4.2" + val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" val logback = "1.5.8" val slf4j = "2.0.16" From ab03203eb21e2ec1cf57059e182251d939fb3147 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 8 Oct 2024 16:00:13 +0200 Subject: [PATCH 021/127] Update sttp-mock-server, ... to 1.11.6 (#4090) --- .../sttp/tapir/examples/HelloWorldHttp4sServer.scala | 4 ++-- .../tapir/examples/HelloWorldNettyCatsServer.scala | 4 ++-- .../sttp/tapir/examples/HelloWorldZioHttpServer.scala | 6 +++--- .../tapir/examples/ZioEnvExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleZioHttpServer.scala | 10 +++++----- .../tapir/examples/ZioPartialServerLogicHttp4s.scala | 6 +++--- .../main/scala/sttp/tapir/examples/booksExample.scala | 10 +++++----- .../sttp/tapir/examples/booksPicklerExample.scala | 10 +++++----- .../tapir/examples/client/Http4sClientExample.scala | 6 +++--- .../custom_types/EndpointWithCustomTypes.scala | 4 ++-- .../examples/custom_types/booksExampleSemiauto.scala | 10 +++++----- .../custom_types/commaSeparatedQueryParameter.scala | 6 +++--- .../custom_types/sealedTraitWithDiscriminator.scala | 8 ++++---- .../examples/errors/ErrorUnionTypesHttp4sServer.scala | 6 +++--- .../errors/IronRefinementErrorsNettyServer.scala | 8 ++++---- .../customErrorsOnDecodeFailurePekkoServer.scala | 4 ++-- .../examples/errors/errorOutputsPekkoServer.scala | 6 +++--- .../sttp/tapir/examples/helloWorldArmeriaServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldJdkHttpServer.scala | 4 ++-- .../tapir/examples/helloWorldNettyFutureServer.scala | 4 ++-- .../tapir/examples/helloWorldNettySyncServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldPekkoServer.scala | 4 ++-- .../json/circeAutoDerivationNettySyncServer.scala | 6 +++--- .../scala/sttp/tapir/examples/json/circeNullBody.scala | 6 +++--- .../tapir/examples/json/jsoniterNettySyncServer.scala | 6 +++--- .../ZioLoggingWithCorrelationIdNettyServer.scala | 4 ++-- .../multipart/multipartFormUploadPekkoServer.scala | 4 ++-- .../examples/observability/ZioMetricsExample.scala | 6 +++--- .../examples/observability/datadogMetricsExample.scala | 8 ++++---- .../observability/openTelemetryMetricsExample.scala | 8 ++++---- .../observability/prometheusMetricsExample.scala | 8 ++++---- .../MultipleEndpointsDocumentationHttp4sServer.scala | 8 ++++---- .../openapi/RedocContextPathHttp4sServer.scala | 6 +++--- .../tapir/examples/openapi/RedocZioHttpServer.scala | 8 ++++---- .../multipleEndpointsDocumentationPekkoServer.scala | 8 ++++---- .../tapir/examples/openapi/openapiExtensions.scala | 6 +++--- .../examples/openapi/swaggerUIOAuth2PekkoServer.scala | 6 +++--- .../tapir/examples/schema/customisingSchemas.scala | 8 ++++---- .../examples/security/OAuth2GithubHttp4sServer.scala | 6 +++--- .../examples/security/ServerSecurityLogicZio.scala | 4 ++-- .../security/basicAuthenticationPekkoServer.scala | 4 ++-- .../examples/security/corsInterceptorPekkoServer.scala | 4 ++-- .../security/externalSecurityInterceptor.scala | 4 ++-- .../examples/security/serverSecurityLogicPekko.scala | 4 ++-- .../serverSecurityLogicRefreshCookiesPekko.scala | 4 ++-- .../staticContentFromFilesNettyServer.scala | 6 +++--- .../staticContentFromFilesPekkoServer.scala | 6 +++--- .../staticContentFromResourcesPekkoServer.scala | 6 +++--- .../staticContentSecurePekkoServer.scala | 6 +++--- .../examples/status_code/statusCodeNettyServer.scala | 4 ++-- .../examples/streaming/ProxyHttp4sFs2Server.scala | 4 ++-- .../examples/streaming/StreamingHttp4sFs2Server.scala | 4 ++-- .../streaming/StreamingHttp4sFs2ServerOrError.scala | 4 ++-- .../examples/streaming/StreamingNettyFs2Server.scala | 4 ++-- .../examples/streaming/StreamingNettyZioServer.scala | 4 ++-- .../examples/streaming/StreamingZioHttpServer.scala | 4 ++-- .../examples/streaming/streamingPekkoServer.scala | 4 ++-- .../examples/testing/CatsServerStubInterpreter.scala | 6 +++--- .../examples/testing/PekkoServerStubInterpreter.scala | 6 +++--- .../examples/testing/SttpMockServerClientExample.scala | 6 +++--- .../websocket/WebSocketChatNettySyncServer.scala | 4 ++-- .../examples/websocket/WebSocketHttp4sServer.scala | 8 ++++---- .../examples/websocket/WebSocketNettySyncServer.scala | 4 ++-- .../examples/websocket/webSocketPekkoServer.scala | 8 ++++---- 65 files changed, 191 insertions(+), 191 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala index 3cedab98c1..5efaea1550 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=http4s}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala index 26b95dd582..5e49091d50 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=Netty}: Exposing an endpoint using the Netty server (cats-effect variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala index a6b71db7b6..6e179dd881 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala @@ -1,8 +1,8 @@ // {cat=Hello, World!; effects=ZIO; server=ZIO HTTP; json=ZIO JSON}: Exposing an endpoint using the ZIO HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala index deeacea67b..e91a555c57 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint, defined with ZIO and depending on services in the environment, using the http4s server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala index fc7d49f647..d8d453f9e1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala index 13ca989d99..3dc81040ad 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=zio-http; json=circe; docs=Swagger UI}: Exposing an endpoint using the ZIO HTTP server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index ea5c4caf81..c7b9b1a99b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -1,9 +1,9 @@ // {cat=Hello, World!; effects=ZIO; server=http4s}: Extending a base endpoint (which has the security logic provided), with server logic //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala index f35649bd99..c7b0d33c3e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.6 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala index 4db4c08e6c..14c0612e76 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Netty; client=sttp3; JSON=Pickler; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.6 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala index c3aa9a97c9..4b6a1ecd87 100644 --- a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala @@ -1,8 +1,8 @@ // {cat=Client interpreter; effects=cats-effect; JSON=circe}: Interpreting an endpoint as an http4s client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 //> using dep org.http4s::http4s-circe:0.23.27 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep org.http4s::http4s-dsl:0.23.27 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala index 6a8e8084e2..aaae01cc85 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala @@ -1,7 +1,7 @@ // {cat=Custom types; json=circe}: Supporting custom types, when used in query or path parameters, as well as part of JSON bodies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala index 2944dad24f..228877aa9f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala @@ -1,10 +1,10 @@ // {cat=Custom types; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities using semi-auto derivation -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.6 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala index 586b419473..22f6fbe656 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala @@ -1,8 +1,8 @@ // {cat=Custom types; effects=Direct; server=Netty; docs=Swagger UI}: Handling comma-separated query parameters -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala index fccefa5f80..b500b48601 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala @@ -1,9 +1,9 @@ // {cat=Custom types; effects=Direct; server=Netty; JSON=circe; docs=Swagger UI}: Mapping a sealed trait hierarchy to JSON using a discriminator -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala index 4c42d4856d..6ca1e60190 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=cats-effect; server=http4s; JSON=circe}: Extending a base secured endpoint with error variants, using union types -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala index 4fe590bcb3..db1d023753 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala @@ -1,9 +1,9 @@ // {cat=Error handling; effects=cats-effect; server=Netty; JSON=circe}: Error reporting provided by Iron type refinements -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala index d5f04fb54f..a30b7f7afe 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP}: Customising errors that are reported on decode failures (e.g. invalid or missing query parameter) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala index 3a7a178d2b..229aa7e254 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP; json=circe}: Error and successful outputs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala index caae2ceb3b..93e2f2cf98 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Armeria}: Exposing an endpoint using the Armeria server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala index 2e44fe191a..526ef13b75 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=JDK Http}: Exposing an endpoint using the built-in JDK HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala index fc43b97c11..c257b4bd8b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Netty}: Exposing an endpoint using the Netty server (Future variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala index 24c23613e8..9902d4e7cb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=Netty}: Exposing an endpoint using the Netty server (Direct-style variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala index b8707c48f5..da476c279a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP}: Exposing an endpoint using the Pekko HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala index fe2bfc4a70..091c76c7f4 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON response with Circe and auto-dervied codecs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala index 6f70571ccf..2495998f82 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON body which optionally serializes as `null` -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala index bbfd169b2d..deb189c0d2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=jsoniter}: Return a JSON response with Jsoniter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 //> using dep ch.qos.logback:logback-classic:1.5.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.11 diff --git a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala index 337d007655..3b6e5c408e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Logging; effects=ZIO; server=Netty}: Logging using a correlation id -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.6 //> using dep com.softwaremill.sttp.client3::zio:3.9.8 package sttp.tapir.examples.logging diff --git a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala index c9e112e0f1..b6d9ff8891 100644 --- a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Multipart; effects=Future; server=Pekko HTTP}: Uploading a multipart form, with text and file parts -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala index e5a632c6f7..b7246f90ad 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala @@ -1,8 +1,8 @@ // {cat=Observability; effects=ZIO; server=ZIO HTTP}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.6 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala index 3f38fe9eec..161687ab6e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting DataDog metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.6 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 54f72f20f1..dbea94d35a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting OpenTelemetry metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.6 //> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.42.1 //> using dep org.slf4j:slf4j-api:2.0.13 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala index 5de85da3d8..af8d657671 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.6 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala index 12aeb06979..55927e13ac 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala index 3e634d8af0..1965aca4ca 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala index 991879b291..8963ad2c11 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=ZIO; server=ZIO HTTP; json=circe; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala index a40e738984..d91bb7d418 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala index 3d078a491d..5a233a555d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; json=circe}: Adding OpenAPI documentation extensions -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.6 //> using dep com.softwaremill.sttp.apispec::openapi-circe-yaml:0.10.0 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala index 9f3f8172e4..c3b084274a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI}: Securing Swagger UI using OAuth 2 -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala index b8b5761748..fa7c1f51a8 100644 --- a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala +++ b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala @@ -1,9 +1,9 @@ // {cat=Schemas; effects=Future; server=Netty; json=circe; docs=Swagger UI}: Customising a derived schema, using annotations, and using implicits -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 package sttp.tapir.examples.schema diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index 8b51bbe371..b19547e4f7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Security; effects=cats-effect; server=http4s; json=circe}: Login using OAuth2, authorization code flow -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index 7ebe7a6005..5b6b9a4d45 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=ZIO; server=ZIO HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala index d33ead576b..da671090a9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: HTTP basic authentication -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala index 7507ee7a87..96f961f411 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: CORS interceptor -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala index 76643c6c11..3c5778c8f0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Netty}: Interceptor verifying externally added security credentials -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala index 6926316fe3..cfb0850ac7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala index 24f6dacce0..69ef927ea3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala index 38093b7bfe..da38e7e4b6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala index 0a657aa526..1e776f9289 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from a directory, with range requests -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala index 1d45df2634..c4f5413bd1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from resources -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala index edc02338a9..55acfbc7e8 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files secured with a bearer token -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala index 88d9e4dc78..185d570cd9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Status code; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 package sttp.tapir.examples.status_code diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala index a042368581..61f87c0d6e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Proxy requests, handling bodies as fs2 streams -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep com.softwaremill.sttp.client3::fs2:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala index e8fe2b24d0..8ac95aa86c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala index e3435d81f8..9394b902b3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Respond with an fs2 stream, or with an error, represented as a failed effect in the business logic -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala index 2eafe2988b..438ac9de19 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=Netty}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala index 5bbb407b03..649e51d911 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=Netty}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala index 39c37eb658..f0b9ed7fcc 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=ZIO HTTP}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala index fe295192ea..30c4af441c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=Future; server=Pekko HTTP}: Stream response as a Pekko stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala index 3ca814c7ef..9b34610516 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=cats-effect}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala index 3c586502e7..b71549beec 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=Future; server=Pekko HTTP}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala index 439e648b24..f61a0cb624 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala @@ -1,8 +1,8 @@ // {cat=Testing; json=circe}: Test endpoints using the MockServer client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 -//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.6 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.mock-server:mockserver-netty:5.15.0 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index d98d3d1065..2efea58f5a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: A WebSocket chat across multiple clients connected to the same server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 // TODO: uncomment after tapir update // package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index 5d5c717522..d4d853fd8d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=cats-effect; server=http4s; json=circe; docs=AsyncAPI}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index d1df7a2fc5..0ba19d9b5b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 // TODO: uncomment after tapir update // package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala index 7e832fdc3b..bc4d683d80 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=Future; server=Pekko HTTP}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.5 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.5 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.8 From 5f13313c9938b3cabe5fac81b1cd7ac0820ad9ed Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 9 Oct 2024 02:58:27 +0200 Subject: [PATCH 022/127] Update pekko-discovery, pekko-slf4j, ... to 1.1.2 (#4092) --- build.sbt | 2 +- project/Versions.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 5ef94a54fb..8abdc0fd6f 100644 --- a/build.sbt +++ b/build.sbt @@ -996,7 +996,7 @@ lazy val pekkoGrpcExamples: ProjectMatrix = (projectMatrix in file("grpc/pekko-e .settings( name := "tapir-pekko-grpc-examples", libraryDependencies ++= Seq( - "org.apache.pekko" %% "pekko-discovery" % "1.1.1", + "org.apache.pekko" %% "pekko-discovery" % "1.1.2", slf4j ), fork := true diff --git a/project/Versions.scala b/project/Versions.scala index 4cd59e3c9f..2673af355f 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -15,7 +15,7 @@ object Versions { val akkaHttp = "10.2.10" val akkaStreams = "2.6.20" val pekkoHttp = "1.1.0" - val pekkoStreams = "1.1.1" + val pekkoStreams = "1.1.2" val swaggerUi = "5.17.14" val upickle = "3.3.1" val playJson = "3.0.1" From f125022bcfc681954e4dc7f46440f07f124c70e1 Mon Sep 17 00:00:00 2001 From: adamw Date: Wed, 9 Oct 2024 08:53:34 +0200 Subject: [PATCH 023/127] Uncommenting examples --- .../WebSocketChatNettySyncServer.scala | 155 +++++++++--------- .../websocket/WebSocketNettySyncServer.scala | 97 ++++++----- 2 files changed, 125 insertions(+), 127 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index 2efea58f5a..51a6ca10f1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -3,81 +3,80 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -// TODO: uncomment after tapir update -// package sttp.tapir.examples.websocket - -// import ox.channels.{Actor, ActorRef, Channel, ChannelClosed, Default, DefaultResult, selectOrClosed} -// import ox.{ExitCode, Ox, OxApp, fork, never, releaseAfterScope, supervised} -// import sttp.tapir.* -// import sttp.tapir.CodecFormat.* -// import sttp.tapir.server.netty.sync.{NettySyncServer, OxStreams} - -// import java.util.UUID -// import ox.flow.Flow -// import ox.flow.FlowEmit - -// type ChatMemberId = UUID - -// case class ChatMember(id: ChatMemberId, channel: Channel[Message]) -// object ChatMember: -// def create: ChatMember = ChatMember(UUID.randomUUID(), Channel.bufferedDefault[Message]) - -// class ChatRoom: -// private var members: Map[ChatMemberId, ChatMember] = Map() - -// def connected(m: ChatMember): Unit = -// members = members + (m.id -> m) -// println(s"Connected: ${m.id}, number of members: ${members.size}") - -// def disconnected(m: ChatMember): Unit = -// members = members - m.id -// println(s"Disconnected: ${m.id}, number of members: ${members.size}") - -// def incoming(message: Message): Unit = -// println(s"Broadcasting: ${message.v}") -// members = members.flatMap: (id, member) => -// selectOrClosed(member.channel.sendClause(message), Default(())) match -// case member.channel.Sent() => Some((id, member)) -// case _: ChannelClosed => -// println(s"Channel of member $id closed, removing from members") -// None -// case DefaultResult(_) => -// println(s"Buffer for member $id full, not sending message") -// Some((id, member)) - -// // - -// case class Message(v: String) // could be more complex, e.g. JSON including nickname + message -// given Codec[String, Message, TextPlain] = Codec.string.map(Message(_))(_.v) - -// val chatEndpoint = endpoint.get -// .in("chat") -// .out(webSocketBody[Message, TextPlain, Message, TextPlain](OxStreams)) - -// def chatProcessor(a: ActorRef[ChatRoom]): OxStreams.Pipe[Message, Message] = incoming => -// // returning a flow which, when run, creates a scope to handle the incoming & outgoing messages -// Flow.usingEmit: emit => -// supervised: -// val member = ChatMember.create - -// a.tell(_.connected(member)) - -// fork: -// incoming.runForeach: msg => -// a.tell(_.incoming(msg)) -// // all incoming messages are processed (= client closed), completing the outgoing channel as well -// member.channel.done() - -// // however the scope ends (client close or error), we need to notify the chat room -// releaseAfterScope: -// a.tell(_.disconnected(member)) - -// FlowEmit.channelToEmit(member.channel, emit) - -// object WebSocketChatNettySyncServer extends OxApp: -// override def run(args: Vector[String])(using Ox): ExitCode = -// val chatActor = Actor.create(new ChatRoom) -// val chatServerEndpoint = chatEndpoint.handleSuccess(_ => chatProcessor(chatActor)) -// val binding = NettySyncServer().addEndpoint(chatServerEndpoint).start() -// releaseAfterScope(binding.stop()) -// never +package sttp.tapir.examples.websocket + +import ox.channels.{Actor, ActorRef, Channel, ChannelClosed, Default, DefaultResult, selectOrClosed} +import ox.{ExitCode, Ox, OxApp, fork, never, releaseAfterScope, supervised} +import sttp.tapir.* +import sttp.tapir.CodecFormat.* +import sttp.tapir.server.netty.sync.{NettySyncServer, OxStreams} + +import java.util.UUID +import ox.flow.Flow +import ox.flow.FlowEmit + +type ChatMemberId = UUID + +case class ChatMember(id: ChatMemberId, channel: Channel[Message]) +object ChatMember: + def create: ChatMember = ChatMember(UUID.randomUUID(), Channel.bufferedDefault[Message]) + +class ChatRoom: + private var members: Map[ChatMemberId, ChatMember] = Map() + + def connected(m: ChatMember): Unit = + members = members + (m.id -> m) + println(s"Connected: ${m.id}, number of members: ${members.size}") + + def disconnected(m: ChatMember): Unit = + members = members - m.id + println(s"Disconnected: ${m.id}, number of members: ${members.size}") + + def incoming(message: Message): Unit = + println(s"Broadcasting: ${message.v}") + members = members.flatMap: (id, member) => + selectOrClosed(member.channel.sendClause(message), Default(())) match + case member.channel.Sent() => Some((id, member)) + case _: ChannelClosed => + println(s"Channel of member $id closed, removing from members") + None + case DefaultResult(_) => + println(s"Buffer for member $id full, not sending message") + Some((id, member)) + +// + +case class Message(v: String) // could be more complex, e.g. JSON including nickname + message +given Codec[String, Message, TextPlain] = Codec.string.map(Message(_))(_.v) + +val chatEndpoint = endpoint.get + .in("chat") + .out(webSocketBody[Message, TextPlain, Message, TextPlain](OxStreams)) + +def chatProcessor(a: ActorRef[ChatRoom]): OxStreams.Pipe[Message, Message] = incoming => + // returning a flow which, when run, creates a scope to handle the incoming & outgoing messages + Flow.usingEmit: emit => + supervised: + val member = ChatMember.create + + a.tell(_.connected(member)) + + fork: + incoming.runForeach: msg => + a.tell(_.incoming(msg)) + // all incoming messages are processed (= client closed), completing the outgoing channel as well + member.channel.done() + + // however the scope ends (client close or error), we need to notify the chat room + releaseAfterScope: + a.tell(_.disconnected(member)) + + FlowEmit.channelToEmit(member.channel, emit) + +object WebSocketChatNettySyncServer extends OxApp: + override def run(args: Vector[String])(using Ox): ExitCode = + val chatActor = Actor.create(new ChatRoom) + val chatServerEndpoint = chatEndpoint.handleSuccess(_ => chatProcessor(chatActor)) + val binding = NettySyncServer().addEndpoint(chatServerEndpoint).start() + releaseAfterScope(binding.stop()) + never diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index 0ba19d9b5b..ebe6731617 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -3,52 +3,51 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -// TODO: uncomment after tapir update -// package sttp.tapir.examples.websocket - -// import ox.* -// import ox.channels.* -// import ox.flow.Flow -// import sttp.capabilities.WebSockets -// import sttp.tapir.* -// import sttp.tapir.server.netty.sync.OxStreams -// import sttp.tapir.server.netty.sync.OxStreams.Pipe -// import sttp.tapir.server.netty.sync.NettySyncServer - -// import scala.concurrent.duration.* - -// object WebSocketNettySyncServer: -// // Web socket endpoint -// val wsEndpoint = -// endpoint.get -// .in("ws") -// .out(webSocketBody[String, CodecFormat.TextPlain, String, CodecFormat.TextPlain](OxStreams)) - -// // Your processor transforming a stream of requests into a stream of responses -// val wsPipe: Pipe[String, String] = requestStream => requestStream.map(_.toUpperCase) - -// // Alternative logic (not used here): requests and responses can be treated separately, for example to emit frames -// // to the client from another source. -// val wsPipe2: Pipe[String, String] = in => -// // emit periodic responses -// val responseFlow: Flow[String] = Flow.tick(1.second).map(_ => System.currentTimeMillis()).map(_.toString) - -// // ignore whatever is sent by the client, but complete the stream once the client closes -// in.drain().merge(responseFlow, propagateDoneLeft = true) - -// // The WebSocket endpoint, builds the pipeline in serverLogicSuccess -// val wsServerEndpoint = wsEndpoint.handleSuccess(_ => wsPipe) - -// // A regular /GET endpoint -// val helloWorldEndpoint = -// endpoint.get.in("hello").in(query[String]("name")).out(stringBody) - -// val helloWorldServerEndpoint = helloWorldEndpoint -// .handleSuccess(name => s"Hello, $name!") - -// def main(args: Array[String]): Unit = -// NettySyncServer() -// .host("0.0.0.0") -// .port(8080) -// .addEndpoints(List(wsServerEndpoint, helloWorldServerEndpoint)) -// .startAndWait() +package sttp.tapir.examples.websocket + +import ox.* +import ox.channels.* +import ox.flow.Flow +import sttp.capabilities.WebSockets +import sttp.tapir.* +import sttp.tapir.server.netty.sync.OxStreams +import sttp.tapir.server.netty.sync.OxStreams.Pipe +import sttp.tapir.server.netty.sync.NettySyncServer + +import scala.concurrent.duration.* + +object WebSocketNettySyncServer: + // Web socket endpoint + val wsEndpoint = + endpoint.get + .in("ws") + .out(webSocketBody[String, CodecFormat.TextPlain, String, CodecFormat.TextPlain](OxStreams)) + + // Your processor transforming a stream of requests into a stream of responses + val wsPipe: Pipe[String, String] = requestStream => requestStream.map(_.toUpperCase) + + // Alternative logic (not used here): requests and responses can be treated separately, for example to emit frames + // to the client from another source. + val wsPipe2: Pipe[String, String] = in => + // emit periodic responses + val responseFlow: Flow[String] = Flow.tick(1.second).map(_ => System.currentTimeMillis()).map(_.toString) + + // ignore whatever is sent by the client, but complete the stream once the client closes + in.drain().merge(responseFlow, propagateDoneLeft = true) + + // The WebSocket endpoint, builds the pipeline in serverLogicSuccess + val wsServerEndpoint = wsEndpoint.handleSuccess(_ => wsPipe) + + // A regular /GET endpoint + val helloWorldEndpoint = + endpoint.get.in("hello").in(query[String]("name")).out(stringBody) + + val helloWorldServerEndpoint = helloWorldEndpoint + .handleSuccess(name => s"Hello, $name!") + + def main(args: Array[String]): Unit = + NettySyncServer() + .host("0.0.0.0") + .port(8080) + .addEndpoints(List(wsServerEndpoint, helloWorldServerEndpoint)) + .startAndWait() From 9f765c85a0a15ed68643155f9aafe632c83aa842 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Wed, 9 Oct 2024 16:09:25 +0200 Subject: [PATCH 024/127] Revert "Add more detail to exceptions thrown in the client interpreter" (#4094) --- .../client/sttp/SttpClientInterpreter.scala | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala b/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala index c110b10785..651f208841 100644 --- a/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala +++ b/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientInterpreter.scala @@ -92,16 +92,17 @@ trait SttpClientInterpreter extends SttpClientInterpreterExtensions { def toRequestThrowErrors[I, E, O, R](e: PublicEndpoint[I, E, O, R], baseUri: Option[Uri])(implicit wsToPipe: WebSocketToPipe[R] ): I => Request[O, R] = - i => { - val request = new EndpointToSttpClient(sttpClientOptions, wsToPipe).toSttpRequest(e, baseUri).apply(()).apply(i) - request + i => + new EndpointToSttpClient(sttpClientOptions, wsToPipe) + .toSttpRequest(e, baseUri) + .apply(()) + .apply(i) .mapResponse(throwDecodeFailures) .mapResponse { - case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t.asInstanceOf[E], request), t) - case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t, request)) + case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t.asInstanceOf[E]), t) + case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, i, t)) case Right(o) => o } - } // secure @@ -191,16 +192,17 @@ trait SttpClientInterpreter extends SttpClientInterpreterExtensions { wsToPipe: WebSocketToPipe[R] ): A => I => Request[O, R] = a => - i => { - val request = new EndpointToSttpClient(sttpClientOptions, wsToPipe).toSttpRequest(e, baseUri).apply(a).apply(i) - request + i => + new EndpointToSttpClient(sttpClientOptions, wsToPipe) + .toSttpRequest(e, baseUri) + .apply(a) + .apply(i) .mapResponse(throwDecodeFailures) .mapResponse { - case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t.asInstanceOf[E], request), t) - case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t, request)) + case Left(t: Throwable) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t.asInstanceOf[E]), t) + case Left(t) => throw new RuntimeException(throwErrorExceptionMsg(e, a, i, t)) case Right(o) => o } - } // @@ -211,11 +213,11 @@ trait SttpClientInterpreter extends SttpClientInterpreterExtensions { case f => throw new IllegalArgumentException(s"Cannot decode: $f") } - private def throwErrorExceptionMsg[I, E, O, R](endpoint: PublicEndpoint[I, E, O, R], i: I, e: E, r: Request[_, _]): String = - s"Endpoint ${endpoint.show} returned error: $e, inputs: $i. Request: ${r.showBasic}." + private def throwErrorExceptionMsg[I, E, O, R](endpoint: PublicEndpoint[I, E, O, R], i: I, e: E): String = + s"Endpoint ${endpoint.show} returned error: $e, inputs: $i." - private def throwErrorExceptionMsg[A, I, E, O, R](endpoint: Endpoint[A, I, E, O, R], a: A, i: I, e: E, r: Request[_, _]): String = - s"Endpoint ${endpoint.show} returned error: $e, for security inputs: $a, inputs: $i. Request: ${r.showBasic}." + private def throwErrorExceptionMsg[A, I, E, O, R](endpoint: Endpoint[A, I, E, O, R], a: A, i: I, e: E): String = + s"Endpoint ${endpoint.show} returned error: $e, for security inputs: $a, inputs: $i." } object SttpClientInterpreter { From 9fcc53bb8e7eaeca81e7aa1f9c37711961b86a23 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Wed, 9 Oct 2024 16:13:19 +0200 Subject: [PATCH 025/127] Fix pickler deserialization when enum cases are not alphabetically sorted (#4093) --- .../pickler/CreateDerivedEnumerationPickler.scala | 14 ++++++++------ .../scala/sttp/tapir/json/pickler/Fixtures.scala | 4 ++++ .../sttp/tapir/json/pickler/PicklerEnumTest.scala | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/json/pickler/src/main/scala/sttp/tapir/json/pickler/CreateDerivedEnumerationPickler.scala b/json/pickler/src/main/scala/sttp/tapir/json/pickler/CreateDerivedEnumerationPickler.scala index dd015f25ba..d1302c64aa 100644 --- a/json/pickler/src/main/scala/sttp/tapir/json/pickler/CreateDerivedEnumerationPickler.scala +++ b/json/pickler/src/main/scala/sttp/tapir/json/pickler/CreateDerivedEnumerationPickler.scala @@ -39,14 +39,14 @@ class CreateDerivedEnumerationPickler[T: ClassTag]( val tapirPickle = new TapirPickle[T] { override lazy val reader: Reader[T] = { val readersForPossibleValues: Seq[TaggedReader[T]] = - validator.possibleValues.zip(childReadWriters.map(_._1)).map { case (enumValue, reader) => - TaggedReader.Leaf[T](encode(enumValue).toString, reader.asInstanceOf[LeafWrapper[_]].r.asInstanceOf[Reader[T]]) + childReadWriters.map { case (enumValue, reader, _) => + TaggedReader.Leaf[T](encode(enumValue.asInstanceOf[T]).toString, reader.asInstanceOf[LeafWrapper[_]].r.asInstanceOf[Reader[T]]) } new TaggedReader.Node[T](readersForPossibleValues: _*) } override lazy val writer: Writer[T] = - new TaggedWriter.Node[T](childReadWriters.map(_._2.asInstanceOf[TaggedWriter[T]]): _*) { + new TaggedWriter.Node[T](childReadWriters.map(_._3.asInstanceOf[TaggedWriter[T]]): _*) { override def findWriterWithKey(v: Any): (String, String, ObjectWriter[T]) = val (tagKey, tagValue, writer) = super.findWriterWithKey(v) // Here our custom encoding transforms the value of a singleton object @@ -57,15 +57,17 @@ class CreateDerivedEnumerationPickler[T: ClassTag]( new Pickler[T](tapirPickle, schema) } - private inline def buildEnumerationReadWriters[T: ClassTag, Cases <: Tuple]: List[(Types#Reader[_], Types#Writer[_])] = + private inline def buildEnumerationReadWriters[T: ClassTag, Cases <: Tuple]: List[(Any, Types#Reader[_], Types#Writer[_])] = inline erasedValue[Cases] match { case _: (enumerationCase *: enumerationCasesTail) => - val processedHead = readWriterForEnumerationCase[enumerationCase] + val (reader, writer) = readWriterForEnumerationCase[enumerationCase] val processedTail = buildEnumerationReadWriters[T, enumerationCasesTail] - (processedHead +: processedTail) + ((productValue[enumerationCase], reader, writer) +: processedTail) case _: EmptyTuple.type => Nil } + private inline def productValue[E] = summonFrom { case m: Mirror.ProductOf[E] => m.fromProduct(EmptyTuple) } + /** Enumeration cases and case objects in an enumeration need special writers and readers, which are generated here, instead of being * taken from child picklers. For example, for enum Color and case values Red and Blue, a Writer should just use the object Red or Blue * and serialize it to "Red" or "Blue". If user needs to encode the singleton object using a custom function, this happens on a higher diff --git a/json/pickler/src/test/scala/sttp/tapir/json/pickler/Fixtures.scala b/json/pickler/src/test/scala/sttp/tapir/json/pickler/Fixtures.scala index 5878fe2622..167de23212 100644 --- a/json/pickler/src/test/scala/sttp/tapir/json/pickler/Fixtures.scala +++ b/json/pickler/src/test/scala/sttp/tapir/json/pickler/Fixtures.scala @@ -90,3 +90,7 @@ object Fixtures: sealed trait NotAllSealedVariant case object NotAllSealedVariantA extends NotAllSealedVariant case class NotAllSealedVariantB(innerField: Int) extends NotAllSealedVariant + + enum NotAlphabetical: + case Xyz + case Fgh diff --git a/json/pickler/src/test/scala/sttp/tapir/json/pickler/PicklerEnumTest.scala b/json/pickler/src/test/scala/sttp/tapir/json/pickler/PicklerEnumTest.scala index 0ebf26ce5d..ac3ef40c17 100644 --- a/json/pickler/src/test/scala/sttp/tapir/json/pickler/PicklerEnumTest.scala +++ b/json/pickler/src/test/scala/sttp/tapir/json/pickler/PicklerEnumTest.scala @@ -107,4 +107,18 @@ class PicklerEnumTest extends AnyFlatSpec with Matchers { 18 -> picklerMagenta )""") } + + it should "encode and decode an enum where the cases are not alphabetically sorted" in { + // given + import generic.auto.* // for Pickler auto-derivation + + // when + val testPickler = Pickler.derived[NotAlphabetical] + val codec = testPickler.toCodec + val encoded = codec.encode(NotAlphabetical.Xyz) + + // then + encoded shouldBe """"Xyz"""" + codec.decode(encoded) shouldBe Value(NotAlphabetical.Xyz) + } } From 518f00714a2da122f6adfcc5738ab5e75ae85597 Mon Sep 17 00:00:00 2001 From: adamw Date: Wed, 9 Oct 2024 16:16:33 +0200 Subject: [PATCH 026/127] Release 1.11.7 --- README.md | 2 +- generated-doc/out/client/http4s.md | 2 +- generated-doc/out/client/play.md | 4 ++-- generated-doc/out/client/sttp.md | 4 ++-- generated-doc/out/docs/asyncapi.md | 2 +- generated-doc/out/docs/json-schema.md | 2 +- generated-doc/out/docs/openapi.md | 12 +++++----- generated-doc/out/endpoint/integrations.md | 18 +++++++------- generated-doc/out/endpoint/json.md | 18 +++++++------- generated-doc/out/endpoint/pickler.md | 2 +- generated-doc/out/endpoint/static.md | 2 +- .../out/generator/sbt-openapi-codegen.md | 2 +- generated-doc/out/quickstart.md | 2 +- generated-doc/out/server/akkahttp.md | 4 ++-- generated-doc/out/server/armeria.md | 6 ++--- generated-doc/out/server/aws.md | 8 +++---- generated-doc/out/server/finatra.md | 4 ++-- generated-doc/out/server/http4s.md | 2 +- generated-doc/out/server/jdkhttp.md | 2 +- generated-doc/out/server/netty.md | 8 +++---- generated-doc/out/server/nima.md | 2 +- generated-doc/out/server/observability.md | 8 +++---- generated-doc/out/server/pekkohttp.md | 4 ++-- generated-doc/out/server/play.md | 4 ++-- generated-doc/out/server/vertx.md | 6 ++--- generated-doc/out/server/zio-http4s.md | 4 ++-- generated-doc/out/server/ziohttp.md | 4 ++-- generated-doc/out/testing.md | 10 ++++---- generated-doc/out/tutorials/01_hello_world.md | 24 +++++++++---------- .../out/tutorials/02_openapi_docs.md | 14 +++++------ generated-doc/out/tutorials/03_json.md | 10 ++++---- generated-doc/out/tutorials/04_errors.md | 20 ++++++++-------- .../tutorials/05_multiple_inputs_outputs.md | 14 +++++------ .../out/tutorials/06_error_variants.md | 14 +++++------ generated-doc/out/tutorials/07_cats_effect.md | 20 ++++++++-------- 35 files changed, 132 insertions(+), 132 deletions(-) diff --git a/README.md b/README.md index a2df88f4ff..7e8f3d63bb 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] Add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.7" ``` Then, import: diff --git a/generated-doc/out/client/http4s.md b/generated-doc/out/client/http4s.md index e5c99e7bfa..5a07431638 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.11.7" ``` 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 7903b38ae3..5a556a26d7 100644 --- a/generated-doc/out/client/play.md +++ b/generated-doc/out/client/play.md @@ -6,13 +6,13 @@ See the [Play framework documentation](https://www.playframework.com/documentati For **Play 3.0**, add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.7" ``` For **Play 2.9**, add ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.7" ``` instead. Furthermore, replace all uses of `sttp.capabilities.pekko.PekkoStreams` in the following code snippets with `sttp.capabilities.akka.AkkaStreams`. diff --git a/generated-doc/out/client/sttp.md b/generated-doc/out/client/sttp.md index d9f14e18f8..7b4dcc6a47 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.11.7" ``` To make requests using an endpoint definition using the [sttp client](https://github.com/softwaremill/sttp), import: @@ -101,7 +101,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.11.6" +"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.11.7" "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 730a2f20dc..f63f3853d9 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.11.7" "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 62b51fce4e..3b17eb63bd 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.11.7" ``` 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 ef93836c36..0ff7974f21 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.11.7" ``` 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.11.7" ``` 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.7" "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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.7" "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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.11.7" ``` or `tapir-redoc`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.7" ``` 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 6c1e5d8048..27c859f077 100644 --- a/generated-doc/out/endpoint/integrations.md +++ b/generated-doc/out/endpoint/integrations.md @@ -12,7 +12,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.11.7" ``` - `import sttp.tapir.integ.cats.codec.*` - brings schema, validator and codec instances @@ -22,7 +22,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.11.7" ``` ## Refined integration @@ -31,7 +31,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.11.7" ``` You'll need to extend the `sttp.tapir.codec.refined.TapirCodecRefined` @@ -52,7 +52,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.11.7" ``` The module is only available for Scala 3 since iron is not designed to work with Scala 2. @@ -145,7 +145,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.11.7" ``` Then, `import sttp.tapir.codec.enumeratum.*`, or extends the `sttp.tapir.codec.enumeratum.TapirCodecEnumeratum` trait. @@ -158,7 +158,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.11.7" ``` Then, `import sttp.tapir.codec.newtype.*`, or extend the `sttp.tapir.codec.newtype.TapirCodecNewType` trait to bring the implicit values into scope. @@ -169,7 +169,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.11.7" ``` Then, `import sttp.tapir.codec.monix.newtype.*`, or extend the `sttp.tapir.codec.monix.newtype.TapirCodecMonixNewType` trait to bring the implicit values into scope. @@ -180,7 +180,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.11.7" ``` Then, mix in `sttp.tapir.codec.zio.prelude.newtype.TapirNewtypeSupport` into your newtype to bring the implicit values into scope: @@ -219,7 +219,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.11.7" ``` 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 2d6139fc2f..51eb2fbb62 100644 --- a/generated-doc/out/endpoint/json.md +++ b/generated-doc/out/endpoint/json.md @@ -50,7 +50,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../other/mytapir.md)): @@ -122,7 +122,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`): @@ -156,13 +156,13 @@ For more examples, including making a custom encoder/decoder, see [TapirJsonuPic 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.11.7" ``` For **Play 2.9** use: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`): @@ -178,7 +178,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`): @@ -194,7 +194,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`): @@ -210,7 +210,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`): @@ -226,7 +226,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.11.7" ``` And one of the implementations: @@ -257,7 +257,7 @@ given Formats = org.json4s.jackson.Serialization.formats(NoTypeHints) 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.7" ``` Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../other/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 24e930e354..b40fa54658 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.11.7" ``` 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 6aa2b5b3e3..97c76fc2fc 100644 --- a/generated-doc/out/endpoint/static.md +++ b/generated-doc/out/endpoint/static.md @@ -11,7 +11,7 @@ the API documentation of the old static content API, switch documentation to an In order to use static content endpoints, add the module to your dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.7" ``` ## Files diff --git a/generated-doc/out/generator/sbt-openapi-codegen.md b/generated-doc/out/generator/sbt-openapi-codegen.md index 9190d0ff44..87d1708cc0 100644 --- a/generated-doc/out/generator/sbt-openapi-codegen.md +++ b/generated-doc/out/generator/sbt-openapi-codegen.md @@ -9,7 +9,7 @@ This is a really early alpha implementation. Add the sbt plugin to the `project/plugins.sbt`: ```scala -addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.6") +addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.7") ``` 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 4a583ae872..a1cc8396db 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.7" ``` 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 0a137b60ec..3733a30532 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.7" ``` 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.11.6" exclude("com.typesafe.akka", "akka-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.7" 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 1c904e8a68..a647872265 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.11.7" ``` and import the object: @@ -71,7 +71,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.11.7" ``` to use this interpreter with Cats Effect typeclasses. @@ -148,7 +148,7 @@ val tapirService = ArmeriaCatsServerInterpreter(dispatcher).toService(streamingR Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.7" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/aws.md b/generated-doc/out/server/aws.md index 83395bc73a..21ebaab182 100644 --- a/generated-doc/out/server/aws.md +++ b/generated-doc/out/server/aws.md @@ -30,7 +30,7 @@ These are corresponding classes for each of the supported runtime: To start using any of the above add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.7" ``` ## Deployment @@ -41,9 +41,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: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.6" -"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.6" -"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.7" ``` ### Examples diff --git a/generated-doc/out/server/finatra.md b/generated-doc/out/server/finatra.md index 41beb835b3..e87b4d744d 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.11.7" ``` 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.11.7" ``` and import the object: diff --git a/generated-doc/out/server/http4s.md b/generated-doc/out/server/http4s.md index a44fee1fa2..b2760a68ef 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.11.7" ``` and import the object: diff --git a/generated-doc/out/server/jdkhttp.md b/generated-doc/out/server/jdkhttp.md index 04756bde4e..c543237a4c 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.11.7" ``` Then, import the package: diff --git a/generated-doc/out/server/netty.md b/generated-doc/out/server/netty.md index b036edbaab..6964f3dbe9 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.11.7" // if you want to use Java 21 Loom virtual threads in direct style: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.7" // if you are using cats-effect: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.7" // if you are using zio: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.7" ``` Then, use: diff --git a/generated-doc/out/server/nima.md b/generated-doc/out/server/nima.md index 2b6a235c63..4d4f94ee44 100644 --- a/generated-doc/out/server/nima.md +++ b/generated-doc/out/server/nima.md @@ -8,7 +8,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-nima-server" % "1.11.7" ``` 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 ae202c36d9..caeb4b47c0 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.11.7" ``` `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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.11.7" ``` 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.11.7" ``` 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.11.7" ``` 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 3b803bab2d..8ec7eab010 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.7" ``` 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.11.6" exclude("org.apache.pekko", "pekko-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.7" 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 fa6625e0f3..6bfd948e7d 100644 --- a/generated-doc/out/server/play.md +++ b/generated-doc/out/server/play.md @@ -6,7 +6,7 @@ See the [Play framework documentation](https://www.playframework.com/documentati 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-play29-server" % "1.11.7" ``` and (if you don't already depend on Play) @@ -26,7 +26,7 @@ depending on whether you want to use netty or Akka based http-server under the h 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.11.7" ``` 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 780d125e59..553800cbea 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.11.7" ``` to use this interpreter with `Future`. @@ -60,7 +60,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.11.7" ``` to use this interpreter with Cats Effect typeclasses. @@ -140,7 +140,7 @@ val attach = VertxCatsServerInterpreter(dispatcher).route(streamedResponse.serve Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.7" ``` 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 e0d0182a31..33083c4b5c 100644 --- a/generated-doc/out/server/zio-http4s.md +++ b/generated-doc/out/server/zio-http4s.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.7" ``` or just add the zio-http4s integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.7" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/server/ziohttp.md b/generated-doc/out/server/ziohttp.md index 2c6ba995c0..2ea6063045 100644 --- a/generated-doc/out/server/ziohttp.md +++ b/generated-doc/out/server/ziohttp.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.7" ``` or just add the zio-http integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.7" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/testing.md b/generated-doc/out/testing.md index 65b32fffdf..e433506407 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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.7" ``` Let's assume you are using the [pekko http](server/pekkohttp.md) interpreter. Given the following server endpoint: @@ -139,7 +139,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.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.7" ``` And the following imports: @@ -194,7 +194,7 @@ with [mock-server](https://www.mock-server.com/) Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.7" ``` Imports: @@ -265,7 +265,7 @@ result == out To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.6" +"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.7" ``` ### Shadowed endpoints @@ -291,7 +291,7 @@ Results in: ```scala res.toString -// res2: String = "Set(GET /x/y/x, is shadowed by: GET /x/*, GET /x, is shadowed by: GET /x/*)" +// res2: String = "Set(GET /x, is shadowed by: GET /x/*, GET /x/y/x, is shadowed by: GET /x/*)" ``` Example 2: diff --git a/generated-doc/out/tutorials/01_hello_world.md b/generated-doc/out/tutorials/01_hello_world.md index b80786dd74..311fdb92ea 100644 --- a/generated-doc/out/tutorials/01_hello_world.md +++ b/generated-doc/out/tutorials/01_hello_world.md @@ -22,8 +22,8 @@ multiple servers, but we'll choose the simplest (and also one of the fastest!), available through the `tapir-netty-server-sync` module: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 ``` ## Endpoint description @@ -43,8 +43,8 @@ Let's start by defining the method and path of our endpoint: {emphasize-lines="4-11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* @@ -72,8 +72,8 @@ of requiring it to be a fixed value (a constant): {emphasize-lines="10"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* @@ -97,8 +97,8 @@ Finally, let's add an output to the endpoint. We'll return the response as a str {emphasize-lines="11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* @@ -123,8 +123,8 @@ will be sent as a response: {emphasize-lines="12"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* @@ -152,8 +152,8 @@ example, we'll bind to `localhost` (which is the default), and to the port 8080: {emphasize-lines="5, 15-18"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/02_openapi_docs.md b/generated-doc/out/tutorials/02_openapi_docs.md index d281261a73..2667bda176 100644 --- a/generated-doc/out/tutorials/02_openapi_docs.md +++ b/generated-doc/out/tutorials/02_openapi_docs.md @@ -17,16 +17,16 @@ use a bundle, which first interprets the provided tapir endpoints into OpenAPI a endpoints, which expose the UI together with the generated specification. We'll need to add a dependency: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 ``` We'll also define and expose two endpoints as an HTTP server, as described in the previous tutorial. Hence, our starting setup of `docs.scala` is as follows: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -108,9 +108,9 @@ And that's almost all the code changes that we need to introduce! We only need t {emphasize-lines="3, 5, 8, 24-25, 29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 import sttp.shared.Identity import sttp.tapir.* diff --git a/generated-doc/out/tutorials/03_json.md b/generated-doc/out/tutorials/03_json.md index 8d8534cb0e..bdc021807d 100644 --- a/generated-doc/out/tutorials/03_json.md +++ b/generated-doc/out/tutorials/03_json.md @@ -83,7 +83,7 @@ In our case, deriving the schemas will amount to adding a `... derives Schema` c {emphasize-lines="1, 7, 10, 12, 16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.core.* // needed for `writeToString` @@ -127,10 +127,10 @@ how the `jsonBody[T]` method is used in the endpoint definition. We'll also expo {emphasize-lines="2-4, 10-15, 23-39"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* // needed for ... derives diff --git a/generated-doc/out/tutorials/04_errors.md b/generated-doc/out/tutorials/04_errors.md index 6755993b50..136cf156d6 100644 --- a/generated-doc/out/tutorials/04_errors.md +++ b/generated-doc/out/tutorials/04_errors.md @@ -40,8 +40,8 @@ schemas both for the `Result` and `Error` classes, to represent them properly in describing the endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -76,10 +76,10 @@ We'll also add code to expose the endpoint as a server, along with its OpenAPI d {emphasize-lines="2-3, 11-13, 24-28, 30-36"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -152,10 +152,10 @@ you'll also get `ERROR` logs when unhandled exceptions happen: {emphasize-lines="6, 26"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md index 67ef233dcf..93afde3292 100644 --- a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md +++ b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md @@ -24,7 +24,7 @@ body, but additionally the hash of the result should be included in the `X-Resul Below is the endpoint description; we'll be editing the `multiple.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 import sttp.tapir.* @@ -61,8 +61,8 @@ The output tuple is then mapped to the response body & header: {emphasize-lines="5, 8-9, 18-29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -147,8 +147,8 @@ The mapping functions are simple, but quite boring to write: {emphasize-lines="8, 17-18, 23-27"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -197,8 +197,8 @@ Here's the modified code using `.mapInTo`, which additionally maps outputs to th {emphasize-lines="9, 11-13, 19, 22"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/06_error_variants.md b/generated-doc/out/tutorials/06_error_variants.md index 67d6703579..8255d1c251 100644 --- a/generated-doc/out/tutorials/06_error_variants.md +++ b/generated-doc/out/tutorials/06_error_variants.md @@ -83,7 +83,7 @@ request serializing `AvatarSuccess.Redirect` instances, as Tapir knows nothing a an `EndpointOutput[String]`: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -106,7 +106,7 @@ this output to the `AvatarSuccess.Redirect` type using `.mapTo`, which we've lea {emphasize-lines="12-13"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -138,7 +138,7 @@ each of which translates to a separate class. Our one-of successful output takes {emphasize-lines="13-16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -175,7 +175,7 @@ To fix this, we can use the `oneOfVariantSingletonMatcher` method. It takes a un value, to which the high-level output must be equal, for the variant to be chosen: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -197,9 +197,9 @@ val errorOutput: EndpointOutput[AvatarError] = oneOf( Equipped with `oneOf` outputs, we can now fully describe and test our endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* diff --git a/generated-doc/out/tutorials/07_cats_effect.md b/generated-doc/out/tutorials/07_cats_effect.md index ad770fa409..f342cbe2c7 100644 --- a/generated-doc/out/tutorials/07_cats_effect.md +++ b/generated-doc/out/tutorials/07_cats_effect.md @@ -21,7 +21,7 @@ use. Hence, we'll start with the same basic endpoint description. We'll be editing the `cats-effect.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 import sttp.tapir.* @@ -56,8 +56,8 @@ parameter explicitly, using `.serverLogic[IO]` in our case: {emphasize-lines="2, 4, 12-14"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.7 import cats.effect.IO import sttp.tapir.* @@ -102,8 +102,8 @@ The conversion process is an almost-one-liner (if it wasn't for line length limi {emphasize-lines="2, 5, 7, 18-19"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 import cats.effect.IO import org.http4s.HttpRoutes @@ -130,8 +130,8 @@ standard code to start a server and handle requests until the application is int {emphasize-lines="3, 5, 7, 8, 12, 24-30"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} @@ -192,9 +192,9 @@ the second step that we need to perform: {emphasize-lines="3, 7, 13, 27-32, 37"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} From c70249e28e6051d9efe450e854c23ae2cb3bb842 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 11 Oct 2024 02:20:39 +0200 Subject: [PATCH 027/127] Update zio, zio-streams, zio-test, ... to 2.1.11 (#4096) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 2673af355f..1c126e6dfc 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -35,7 +35,7 @@ object Versions { val refined = "0.11.2" val iron = "2.6.0" val enumeratum = "1.7.5" - val zio = "2.1.9" + val zio = "2.1.11" val zioHttp = "3.0.1" val zioInteropCats = "23.1.0.3" val zioInteropReactiveStreams = "2.0.2" From bc0e9743bcb6e294c47fcecdca615ad78fac8ca2 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 11 Oct 2024 02:50:29 +0200 Subject: [PATCH 028/127] Update pekko-grpc-runtime, ... to 1.1.0 (#4097) --- build.sbt | 2 +- project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 8abdc0fd6f..2506f0220e 100644 --- a/build.sbt +++ b/build.sbt @@ -1244,7 +1244,7 @@ lazy val pekkoGrpcServer: ProjectMatrix = (projectMatrix in file("server/pekko-g .settings( name := "tapir-pekko-grpc-server", libraryDependencies ++= Seq( - "org.apache.pekko" %% "pekko-grpc-runtime" % "1.0.2" + "org.apache.pekko" %% "pekko-grpc-runtime" % "1.1.0" ) ) .jvmPlatform(scalaVersions = scala2And3Versions, settings = commonJvmSettings) diff --git a/project/plugins.sbt b/project/plugins.sbt index 62b829d7f8..14b8d0e480 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,7 +18,7 @@ addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.1") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") -addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.0.2") +addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.0") // needed to override the Android flavor of Guava coming from pekko-grpc-sbt-plugin, which causes failures in Scala.JS builds dependencyOverrides += "com.google.guava" % "guava" % "32.1.2-jre" From d92fb69144d3e68bc8e7cc56cf5c3c15b952857a Mon Sep 17 00:00:00 2001 From: Mitch Ludington Date: Fri, 11 Oct 2024 03:08:46 -0500 Subject: [PATCH 029/127] Add docs for delimited path parameters (#4079) Co-authored-by: adamw --- doc/how-tos/delimited-path-parameters.md | 103 +++++++++++++++++++++++ doc/index.md | 1 + 2 files changed, 104 insertions(+) create mode 100644 doc/how-tos/delimited-path-parameters.md diff --git a/doc/how-tos/delimited-path-parameters.md b/doc/how-tos/delimited-path-parameters.md new file mode 100644 index 0000000000..9e975e2f8e --- /dev/null +++ b/doc/how-tos/delimited-path-parameters.md @@ -0,0 +1,103 @@ +# Handling Delimited Path Parameters + +Tapir allows you to handle complex path parameters, such as lists of custom types separated by delimiters (e.g., commas). +This can be achieved using `Codec.delimited`, which facilitates the serialization and deserialization of delimited lists +within path segments. + +## Use Case + +Suppose you want to define an endpoint that accepts a list of names as a comma-separated path parameter. Each name should +adhere to a specific pattern (e.g., only uppercase letters). + +## Implementation Steps: + +### 1. Define the Custom Type and Validator +Start by defining your custom type and the associated validator to enforce the desired pattern. + +```scala mdoc:compile-only +import sttp.tapir._ +import sttp.tapir.generic.auto._ +import sttp.tapir.Codec +import sttp.tapir.Validator +import sttp.tapir.CodecFormat.TextPlain +import sttp.tapir.model.Delimited + +case class Name(value: String) + +// Validator to ensure names consist of uppercase letters only +val nameValidator: Validator[String] = Validator.pattern("^[A-Z]+$") +``` + +### 2. Create Codecs for the Custom Type and Delimited List +Utilize `Codec.parsedString` for individual `Name` instances and `Codec.delimited` for handling the list. + +```scala +// Codec for single Name +given Codec[String, Name, TextPlain] = Codec.parsedString(Name.apply) + .validate(nameValidator.contramap(_.value)) + +// Codec for a list of Names, delimited by commas +given Codec[String, Delimited[",", Name], TextPlain] = Codec.delimited +``` + +### 3. Define the Endpoint with Delimited Path Parameter +Incorporate the delimited codec into your endpoint definition to handle the list of names in the path. + +```scala mdoc:compile-only +import sttp.tapir._ +import sttp.tapir.generic.auto._ +import sttp.tapir.Codec +import sttp.tapir.Validator +import sttp.tapir.CodecFormat.TextPlain +import sttp.tapir.model.Delimited + +case class Name(value: String) + +// Validator to ensure names consist of uppercase letters only +val nameValidator: Validator[String] = Validator.pattern("^[A-Z]+$") + +// Codec for single Name +given Codec[String, Name, TextPlain] = Codec.parsedString(Name.apply) + .validate(nameValidator.contramap(_.value)) + +// Codec for a list of Names, delimited by commas +given Codec[String, Delimited[",", Name], TextPlain] = Codec.delimited + +val getUserEndpoint = + endpoint.get + .in("user" / path[Delimited[",", Name]]("id")) + .out(stringBody) +``` + +### 4. Generated OpenAPI Schema +When you generate the OpenAPI documentation for this endpoint, the schema for the `id` path parameter will +correctly reflect it as an array with the specified pattern for each item. + +```yaml +paths: + /user/{id}: + get: + operationId: getUserId + parameters: + - name: id + in: path + required: true + schema: + type: array + items: + type: string + pattern: ^[A-Z]+$ +``` + +## Explanation +- `Codec.parsedString`: Transforms a `String` into a custom type (`Name`) and vice versa. It also applies validation to + ensure each `Name` adheres to the specified pattern. +- `Codec.delimited`: Handles the serialization and deserialization of a delimited list (e.g., comma-separated) of the + custom type. By specifying `Delimited[",", Name]`, Tapir knows how to split and join the list based on the delimiter. +- Endpoint Definition: The `path[List[Name]]("id")` indicates that the id path parameter should be treated as a list of + `Name` objects, utilizing the previously defined codecs. + +## Validation +Validators play a crucial role in ensuring that each element within the delimited list meets the required criteria. In +this example, `nameValidator` ensures that each `Name` consists solely of uppercase letters. Tapir applies this validation +to each element in the list, providing robust input validation. \ No newline at end of file diff --git a/doc/index.md b/doc/index.md index 9fe3f0bbe4..b57ef23384 100644 --- a/doc/index.md +++ b/doc/index.md @@ -156,6 +156,7 @@ sttp is a family of Scala HTTP-related projects, and currently includes: examples external + how-tos/delimited-path-parameters .. toctree:: :maxdepth: 2 From 5f03448cfa5c0563ede15cd4ef7ee2d3a5d1ce5c Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 11 Oct 2024 10:11:37 +0200 Subject: [PATCH 030/127] Update sttp-mock-server, ... to 1.11.7 (#4095) --- .../sttp/tapir/examples/HelloWorldHttp4sServer.scala | 4 ++-- .../tapir/examples/HelloWorldNettyCatsServer.scala | 4 ++-- .../sttp/tapir/examples/HelloWorldZioHttpServer.scala | 6 +++--- .../tapir/examples/ZioEnvExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleZioHttpServer.scala | 10 +++++----- .../tapir/examples/ZioPartialServerLogicHttp4s.scala | 6 +++--- .../main/scala/sttp/tapir/examples/booksExample.scala | 10 +++++----- .../sttp/tapir/examples/booksPicklerExample.scala | 10 +++++----- .../tapir/examples/client/Http4sClientExample.scala | 6 +++--- .../custom_types/EndpointWithCustomTypes.scala | 4 ++-- .../examples/custom_types/booksExampleSemiauto.scala | 10 +++++----- .../custom_types/commaSeparatedQueryParameter.scala | 6 +++--- .../custom_types/sealedTraitWithDiscriminator.scala | 8 ++++---- .../examples/errors/ErrorUnionTypesHttp4sServer.scala | 6 +++--- .../errors/IronRefinementErrorsNettyServer.scala | 8 ++++---- .../customErrorsOnDecodeFailurePekkoServer.scala | 4 ++-- .../examples/errors/errorOutputsPekkoServer.scala | 6 +++--- .../sttp/tapir/examples/helloWorldArmeriaServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldJdkHttpServer.scala | 4 ++-- .../tapir/examples/helloWorldNettyFutureServer.scala | 4 ++-- .../tapir/examples/helloWorldNettySyncServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldPekkoServer.scala | 4 ++-- .../json/circeAutoDerivationNettySyncServer.scala | 6 +++--- .../scala/sttp/tapir/examples/json/circeNullBody.scala | 6 +++--- .../tapir/examples/json/jsoniterNettySyncServer.scala | 6 +++--- .../ZioLoggingWithCorrelationIdNettyServer.scala | 4 ++-- .../multipart/multipartFormUploadPekkoServer.scala | 4 ++-- .../examples/observability/ZioMetricsExample.scala | 6 +++--- .../examples/observability/datadogMetricsExample.scala | 8 ++++---- .../observability/openTelemetryMetricsExample.scala | 8 ++++---- .../observability/prometheusMetricsExample.scala | 8 ++++---- .../MultipleEndpointsDocumentationHttp4sServer.scala | 8 ++++---- .../openapi/RedocContextPathHttp4sServer.scala | 6 +++--- .../tapir/examples/openapi/RedocZioHttpServer.scala | 8 ++++---- .../multipleEndpointsDocumentationPekkoServer.scala | 8 ++++---- .../tapir/examples/openapi/openapiExtensions.scala | 6 +++--- .../examples/openapi/swaggerUIOAuth2PekkoServer.scala | 6 +++--- .../tapir/examples/schema/customisingSchemas.scala | 8 ++++---- .../examples/security/OAuth2GithubHttp4sServer.scala | 6 +++--- .../examples/security/ServerSecurityLogicZio.scala | 4 ++-- .../security/basicAuthenticationPekkoServer.scala | 4 ++-- .../examples/security/corsInterceptorPekkoServer.scala | 4 ++-- .../security/externalSecurityInterceptor.scala | 4 ++-- .../examples/security/serverSecurityLogicPekko.scala | 4 ++-- .../serverSecurityLogicRefreshCookiesPekko.scala | 4 ++-- .../staticContentFromFilesNettyServer.scala | 6 +++--- .../staticContentFromFilesPekkoServer.scala | 6 +++--- .../staticContentFromResourcesPekkoServer.scala | 6 +++--- .../staticContentSecurePekkoServer.scala | 6 +++--- .../examples/status_code/statusCodeNettyServer.scala | 4 ++-- .../examples/streaming/ProxyHttp4sFs2Server.scala | 4 ++-- .../examples/streaming/StreamingHttp4sFs2Server.scala | 4 ++-- .../streaming/StreamingHttp4sFs2ServerOrError.scala | 4 ++-- .../examples/streaming/StreamingNettyFs2Server.scala | 4 ++-- .../examples/streaming/StreamingNettyZioServer.scala | 4 ++-- .../examples/streaming/StreamingZioHttpServer.scala | 4 ++-- .../examples/streaming/streamingPekkoServer.scala | 4 ++-- .../examples/testing/CatsServerStubInterpreter.scala | 6 +++--- .../examples/testing/PekkoServerStubInterpreter.scala | 6 +++--- .../examples/testing/SttpMockServerClientExample.scala | 6 +++--- .../websocket/WebSocketChatNettySyncServer.scala | 4 ++-- .../examples/websocket/WebSocketHttp4sServer.scala | 8 ++++---- .../examples/websocket/WebSocketNettySyncServer.scala | 4 ++-- .../examples/websocket/webSocketPekkoServer.scala | 8 ++++---- 65 files changed, 191 insertions(+), 191 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala index 5efaea1550..383ee05b64 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=http4s}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala index 5e49091d50..a6f413e7e1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=Netty}: Exposing an endpoint using the Netty server (cats-effect variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala index 6e179dd881..93a30fca24 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala @@ -1,8 +1,8 @@ // {cat=Hello, World!; effects=ZIO; server=ZIO HTTP; json=ZIO JSON}: Exposing an endpoint using the ZIO HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala index e91a555c57..0ca817835d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint, defined with ZIO and depending on services in the environment, using the http4s server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala index d8d453f9e1..a433f1daec 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala index 3dc81040ad..8857bd8148 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=zio-http; json=circe; docs=Swagger UI}: Exposing an endpoint using the ZIO HTTP server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index c7b9b1a99b..f4ab2823e7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -1,9 +1,9 @@ // {cat=Hello, World!; effects=ZIO; server=http4s}: Extending a base endpoint (which has the security logic provided), with server logic //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala index c7b0d33c3e..8a5f69e471 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.7 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala index 14c0612e76..a2614f2c98 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Netty; client=sttp3; JSON=Pickler; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.7 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala index 4b6a1ecd87..cd3620ab01 100644 --- a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala @@ -1,8 +1,8 @@ // {cat=Client interpreter; effects=cats-effect; JSON=circe}: Interpreting an endpoint as an http4s client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep org.http4s::http4s-circe:0.23.27 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep org.http4s::http4s-dsl:0.23.27 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala index aaae01cc85..cb0f413220 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala @@ -1,7 +1,7 @@ // {cat=Custom types; json=circe}: Supporting custom types, when used in query or path parameters, as well as part of JSON bodies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala index 228877aa9f..cf5da8c428 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala @@ -1,10 +1,10 @@ // {cat=Custom types; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities using semi-auto derivation -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.7 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala index 22f6fbe656..b6e78202c9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala @@ -1,8 +1,8 @@ // {cat=Custom types; effects=Direct; server=Netty; docs=Swagger UI}: Handling comma-separated query parameters -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala index b500b48601..d2e1ba1c35 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala @@ -1,9 +1,9 @@ // {cat=Custom types; effects=Direct; server=Netty; JSON=circe; docs=Swagger UI}: Mapping a sealed trait hierarchy to JSON using a discriminator -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala index 6ca1e60190..65c41fd821 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=cats-effect; server=http4s; JSON=circe}: Extending a base secured endpoint with error variants, using union types -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala index db1d023753..2701505a61 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala @@ -1,9 +1,9 @@ // {cat=Error handling; effects=cats-effect; server=Netty; JSON=circe}: Error reporting provided by Iron type refinements -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala index a30b7f7afe..5c960ff529 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP}: Customising errors that are reported on decode failures (e.g. invalid or missing query parameter) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala index 229aa7e254..8e1b8036ba 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP; json=circe}: Error and successful outputs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala index 93e2f2cf98..c3aefa92f2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Armeria}: Exposing an endpoint using the Armeria server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala index 526ef13b75..1383057a67 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=JDK Http}: Exposing an endpoint using the built-in JDK HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala index c257b4bd8b..a1752f7eb2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Netty}: Exposing an endpoint using the Netty server (Future variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala index 9902d4e7cb..4e097d951e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=Netty}: Exposing an endpoint using the Netty server (Direct-style variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala index da476c279a..733ab2a785 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP}: Exposing an endpoint using the Pekko HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala index 091c76c7f4..502b3297fb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON response with Circe and auto-dervied codecs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala index 2495998f82..834f82136d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON body which optionally serializes as `null` -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala index deb189c0d2..978a9f413d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=jsoniter}: Return a JSON response with Jsoniter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 //> using dep ch.qos.logback:logback-classic:1.5.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.11 diff --git a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala index 3b6e5c408e..772133d038 100644 --- a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Logging; effects=ZIO; server=Netty}: Logging using a correlation id -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.7 //> using dep com.softwaremill.sttp.client3::zio:3.9.8 package sttp.tapir.examples.logging diff --git a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala index b6d9ff8891..2a177a5b21 100644 --- a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Multipart; effects=Future; server=Pekko HTTP}: Uploading a multipart form, with text and file parts -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala index b7246f90ad..0968d27031 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala @@ -1,8 +1,8 @@ // {cat=Observability; effects=ZIO; server=ZIO HTTP}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.7 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala index 161687ab6e..6ac9cb326b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting DataDog metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.7 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index dbea94d35a..30e2d48fef 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting OpenTelemetry metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.7 //> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.42.1 //> using dep org.slf4j:slf4j-api:2.0.13 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala index af8d657671..c830379424 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.7 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala index 55927e13ac..c68277cd47 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala index 1965aca4ca..acdf864acb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala index 8963ad2c11..2a0ff00e8e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=ZIO; server=ZIO HTTP; json=circe; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala index d91bb7d418..f9991ad2dc 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala index 5a233a555d..cc6b60187c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; json=circe}: Adding OpenAPI documentation extensions -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.7 //> using dep com.softwaremill.sttp.apispec::openapi-circe-yaml:0.10.0 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala index c3b084274a..b3fd6267cf 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI}: Securing Swagger UI using OAuth 2 -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala index fa7c1f51a8..5ee6284e0d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala +++ b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala @@ -1,9 +1,9 @@ // {cat=Schemas; effects=Future; server=Netty; json=circe; docs=Swagger UI}: Customising a derived schema, using annotations, and using implicits -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 package sttp.tapir.examples.schema diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index b19547e4f7..fff54f2ba9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Security; effects=cats-effect; server=http4s; json=circe}: Login using OAuth2, authorization code flow -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index 5b6b9a4d45..918503dd0c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=ZIO; server=ZIO HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala index da671090a9..e96297c494 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: HTTP basic authentication -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala index 96f961f411..ae95d8ffd2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: CORS interceptor -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala index 3c5778c8f0..5508f8d981 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Netty}: Interceptor verifying externally added security credentials -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala index cfb0850ac7..985ab1ecc1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala index 69ef927ea3..159da50341 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala index da38e7e4b6..03c1e2777a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala index 1e776f9289..99d705b177 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from a directory, with range requests -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala index c4f5413bd1..534c7a22e8 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from resources -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala index 55acfbc7e8..bef418360f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files secured with a bearer token -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala index 185d570cd9..c9fe61b854 100644 --- a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Status code; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 package sttp.tapir.examples.status_code diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala index 61f87c0d6e..ed57e0f406 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Proxy requests, handling bodies as fs2 streams -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep com.softwaremill.sttp.client3::fs2:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala index 8ac95aa86c..4e68d0d13d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala index 9394b902b3..e264906758 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Respond with an fs2 stream, or with an error, represented as a failed effect in the business logic -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala index 438ac9de19..e8bc3a17e1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=Netty}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala index 649e51d911..f2cf663766 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=Netty}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala index f0b9ed7fcc..4c50f8b6f9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=ZIO HTTP}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala index 30c4af441c..e5d90d5950 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=Future; server=Pekko HTTP}: Stream response as a Pekko stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala index 9b34610516..726d7ba717 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=cats-effect}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala index b71549beec..19a89b627f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=Future; server=Pekko HTTP}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala index f61a0cb624..938b233745 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala @@ -1,8 +1,8 @@ // {cat=Testing; json=circe}: Test endpoints using the MockServer client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 -//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.7 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.mock-server:mockserver-netty:5.15.0 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index 51a6ca10f1..6551396a45 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: A WebSocket chat across multiple clients connected to the same server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index d4d853fd8d..29224f6dee 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=cats-effect; server=http4s; json=circe; docs=AsyncAPI}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index ebe6731617..5b28c5ee62 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala index bc4d683d80..0f78fba637 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=Future; server=Pekko HTTP}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.6 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.6 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.8 From e77bcaf1633902fbd9eb01110ba3735f05a3b789 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 12 Oct 2024 02:31:54 +0200 Subject: [PATCH 031/127] Update metrics4-scala to 4.3.3 (#4099) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 1c126e6dfc..ae9d97a7c7 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -23,7 +23,7 @@ object Versions { val finatra = "24.2.0" val catbird = "21.12.0" val json4s = "4.0.7" - val metrics4Scala = "4.3.2" + val metrics4Scala = "4.3.3" val nettyReactiveStreams = "3.0.2" val ox = "0.5.1" val reactiveStreams = "1.0.4" From f32014bef7b8a0165e6028044010f28aa63b6825 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 12 Oct 2024 02:39:56 +0200 Subject: [PATCH 032/127] Update opentelemetry-api, ... to 1.43.0 (#4098) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index ae9d97a7c7..08a00976f9 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -60,7 +60,7 @@ object Versions { val fs2 = "3.11.0" val decline = "2.4.1" val quicklens = "1.9.9" - val openTelemetry = "1.42.1" + val openTelemetry = "1.43.0" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" From aaa9d2beac9bab4ac93652764a7bc0cce0c944f4 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 13 Oct 2024 02:47:30 +0200 Subject: [PATCH 033/127] Update opentelemetry-exporter-otlp to 1.43.0 (#4101) --- .../examples/observability/openTelemetryMetricsExample.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 30e2d48fef..4b54ace1d8 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 //> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.7 -//> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.42.1 +//> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.43.0 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability From 53051fd564426f72cfd7be22c9738e54319e3642 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 13 Oct 2024 02:52:46 +0200 Subject: [PATCH 034/127] Update logback-classic to 1.5.10 (#4100) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 08a00976f9..1f8074946e 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -64,7 +64,7 @@ object Versions { val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" - val logback = "1.5.8" + val logback = "1.5.10" val slf4j = "2.0.16" val jsoniter = "2.30.15" } From cbd305476d13f2741a12815a23884ce6bef13d1d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 16 Oct 2024 02:33:26 +0200 Subject: [PATCH 035/127] Update logback-classic to 1.5.11 (#4102) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 1f8074946e..b4edc94306 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -64,7 +64,7 @@ object Versions { val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" - val logback = "1.5.10" + val logback = "1.5.11" val slf4j = "2.0.16" val jsoniter = "2.30.15" } From e3f7580edaa4b9deaa50f769f39317496e0bd743 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Wed, 16 Oct 2024 22:32:01 +0300 Subject: [PATCH 036/127] Update booksExample reference (#4104) Signed-off-by: Emmanuel Ferdman --- doc/client/sttp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/client/sttp.md b/doc/client/sttp.md index 7ebdc94967..8d99c78798 100644 --- a/doc/client/sttp.md +++ b/doc/client/sttp.md @@ -55,7 +55,7 @@ A => I => Request[DecodeResult[Either[E, O]], R] A => I => F[DecodeResult[Either[E, O]]] ``` -See the [runnable example](https://github.com/softwaremill/tapir/blob/master/examples/src/main/scala/sttp/tapir/examples/BooksExample.scala) +See the [runnable example](https://github.com/softwaremill/tapir/blob/master/examples/src/main/scala/sttp/tapir/examples/booksExample.scala) for example usage. ## Web sockets From 9be14706ced01b6ede4deb0f11d4e03b7708d5ad Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 17 Oct 2024 02:34:33 +0200 Subject: [PATCH 037/127] Update client3:akka-http-backend, ... to 3.10.1 (#4105) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index b4edc94306..5129923a4a 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -8,7 +8,7 @@ object Versions { val circeGenericExtras = "0.14.3" val circeYaml = "0.15.2" val helidon = "4.0.10" - val sttp = "3.10.0" + val sttp = "3.10.1" val sttpModel = "1.7.11" val sttpShared = "1.3.22" val sttpApispec = "0.11.3" From 0e96d687fad1901a3589b53c7745becae3ec6ef8 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 18 Oct 2024 09:11:10 +0200 Subject: [PATCH 038/127] Update sbt-softwaremill-browser-test-js, ... to 2.0.21 (#4108) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 14b8d0e480..9f64ce28da 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,7 +1,7 @@ // https://github.com/sbt/sbt/issues/6997 ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always -val sbtSoftwareMillVersion = "2.0.20" +val sbtSoftwareMillVersion = "2.0.21" addSbtPlugin("com.softwaremill.sbt-softwaremill" % "sbt-softwaremill-common" % sbtSoftwareMillVersion) addSbtPlugin("com.softwaremill.sbt-softwaremill" % "sbt-softwaremill-publish" % sbtSoftwareMillVersion) addSbtPlugin("com.softwaremill.sbt-softwaremill" % "sbt-softwaremill-browser-test-js" % sbtSoftwareMillVersion) From aea7ed17c8f9494b65d9b08af2fd8f8a9a92fc31 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 20 Oct 2024 02:41:11 +0200 Subject: [PATCH 039/127] Update prometheus-metrics-core, ... to 1.3.2 (#4109) --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 2506f0220e..92eebbd6ed 100644 --- a/build.sbt +++ b/build.sbt @@ -1016,8 +1016,8 @@ lazy val prometheusMetrics: ProjectMatrix = (projectMatrix in file("metrics/prom .settings( name := "tapir-prometheus-metrics", libraryDependencies ++= Seq( - "io.prometheus" % "prometheus-metrics-core" % "1.3.1", - "io.prometheus" % "prometheus-metrics-exposition-formats" % "1.3.1", + "io.prometheus" % "prometheus-metrics-core" % "1.3.2", + "io.prometheus" % "prometheus-metrics-exposition-formats" % "1.3.2", scalaTest.value % Test ) ) From 04b300fd78ee61aaf22bcea344caafc98bf33b67 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 21 Oct 2024 12:20:12 +0200 Subject: [PATCH 040/127] Update sbt, sbt-dependency-tree to 1.10.3 (#4110) Co-authored-by: scala-steward --- .../sbt-openapi-codegen/caching/project/build.properties | 2 +- .../sbt-openapi-codegen/minimal/project/build.properties | 2 +- .../oneOf-json-roundtrip/project/build.properties | 2 +- .../oneOf-json-roundtrip_jsoniter/project/build.properties | 2 +- .../project/build.properties | 2 +- .../oneOf-json-roundtrip_scala3/project/build.properties | 2 +- .../option-overrides/project/build.properties | 2 +- project/build.properties | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 diff --git a/project/build.properties b/project/build.properties index 0b699c3052..bc7390601f 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 From 16cd9d5f046a23f2f91e811bc2a6473545aa1eb6 Mon Sep 17 00:00:00 2001 From: adamw Date: Mon, 21 Oct 2024 12:25:14 +0200 Subject: [PATCH 041/127] Contributing --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7e8f3d63bb..e09052c4c4 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,8 @@ Fetch the tags from the upstream: git fetch --tags upstream ``` +When you have a PR ready, take a look at our ["How to prepare a good PR" guide](https://softwaremill.community/t/how-to-prepare-a-good-pr-to-a-library/448). Thanks! :) + ## Scoping which projects are included by `sbt` * when `STTP_NATIVE` is set, Scala native projects are included in the build (when running `sbt`) From f26767b278b84da93c055adfadd9f7e786ed524d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 22 Oct 2024 02:48:20 +0200 Subject: [PATCH 042/127] Update jsoniter-scala-core, ... to 2.31.1 (#4112) --- .../oneOf-json-roundtrip_jsoniter/build.sbt | 4 ++-- .../oneOf-json-roundtrip_jsoniter_scala3/build.sbt | 4 ++-- project/Versions.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt index 35355e9aec..6b8fc5bc6a 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.15", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.15" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.1", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.1" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt index 9ac845dc99..199b4caa1f 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.15", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.15" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.1", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.1" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/project/Versions.scala b/project/Versions.scala index 5129923a4a..cb49086e71 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -66,5 +66,5 @@ object Versions { val nettyAll = "4.1.114.Final" val logback = "1.5.11" val slf4j = "2.0.16" - val jsoniter = "2.30.15" + val jsoniter = "2.31.1" } From 4731c9a3e99111dd130e99baee7d40ea6185dc80 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 23 Oct 2024 02:40:26 +0200 Subject: [PATCH 043/127] Update jsoniter-scala-macros to 2.30.15 (#4113) --- .../sttp/tapir/examples/json/jsoniterNettySyncServer.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala index 978a9f413d..7dee90fe21 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 //> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 //> using dep ch.qos.logback:logback-classic:1.5.8 -//> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.11 +//> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.15 package sttp.tapir.examples.json From ba4f2abba669054233b756dc8178453de1dcbc68 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 24 Oct 2024 02:42:56 +0200 Subject: [PATCH 044/127] Update http4s-circe, http4s-core, ... to 0.23.29 (#4115) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index cb49086e71..5d23c22b95 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,5 +1,5 @@ object Versions { - val http4s = "0.23.28" + val http4s = "0.23.29" val http4sBlazeServer = "0.23.16" val http4sBlazeClient = "0.23.16" val catsCore = "2.12.0" From c77d5012150ba1a3f83266a83767d9286df37604 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 24 Oct 2024 03:01:04 +0200 Subject: [PATCH 045/127] Update tethys-core, tethys-derivation, ... to 0.29.2 (#4114) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 5d23c22b95..98a5aa59ac 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -44,7 +44,7 @@ object Versions { val playServer = "3.0.5" val play29Client = "2.2.9" val play29Server = "2.9.5" - val tethys = "0.29.1" + val tethys = "0.29.2" val vertx = "4.5.10" val jsScalaJavaTime = "2.6.0" val nativeScalaJavaTime = "2.6.0" From 9b98cb7c3247f8a736f5c4715b89ed4d489d0372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Youn=20M=C3=A9lois?= Date: Thu, 24 Oct 2024 18:25:53 +0200 Subject: [PATCH 046/127] Remove iron integration trait scope restriction (#4111) --- .../sttp/iron/codec/iron/TapirCodecIron.scala | 8 +++--- .../scala-3/com/example/RefinedString.scala | 25 +++++++++++++++++++ .../codec/iron/TapirCodecIronTestScala3.scala | 10 ++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 integrations/iron/src/test/scala-3/com/example/RefinedString.scala diff --git a/integrations/iron/src/main/scala/sttp/iron/codec/iron/TapirCodecIron.scala b/integrations/iron/src/main/scala/sttp/iron/codec/iron/TapirCodecIron.scala index b040b38d87..e1b1fec702 100644 --- a/integrations/iron/src/main/scala/sttp/iron/codec/iron/TapirCodecIron.scala +++ b/integrations/iron/src/main/scala/sttp/iron/codec/iron/TapirCodecIron.scala @@ -209,7 +209,7 @@ trait TapirCodecIron extends DescriptionWitness with LowPriorityValidatorForPred } -private[iron] trait ValidatorForPredicate[Value, Predicate] { +trait ValidatorForPredicate[Value, Predicate] { def validator: Validator[Value] def makeErrors(value: Value, errorMessage: String): List[ValidationError[_]] lazy val containsMinSizePositive: Boolean = validator.asPrimitiveValidators.exists { @@ -218,12 +218,12 @@ private[iron] trait ValidatorForPredicate[Value, Predicate] { } } -private[iron] trait PrimitiveValidatorForPredicate[Value, Predicate] extends ValidatorForPredicate[Value, Predicate] { +trait PrimitiveValidatorForPredicate[Value, Predicate] extends ValidatorForPredicate[Value, Predicate] { def validator: Validator.Primitive[Value] def makeErrors(value: Value, errorMessage: String): List[ValidationError[_]] } -private[iron] object ValidatorForPredicate { +object ValidatorForPredicate { def fromPrimitiveValidator[Value, Predicate]( primitiveValidator: Validator.Primitive[Value] ): PrimitiveValidatorForPredicate[Value, Predicate] = @@ -235,7 +235,7 @@ private[iron] object ValidatorForPredicate { } // #3938: the two-level low-priority validators are needed because of implicit resolution changes in Scala 3.6 -private[iron] trait LowPriorityValidatorForPredicate extends LowPriorityValidatorForPredicate2 { +trait LowPriorityValidatorForPredicate extends LowPriorityValidatorForPredicate2 { inline given validatorForDescribedAnd[N, P](using id: IsDescription[P], diff --git a/integrations/iron/src/test/scala-3/com/example/RefinedString.scala b/integrations/iron/src/test/scala-3/com/example/RefinedString.scala new file mode 100644 index 0000000000..b820e9f486 --- /dev/null +++ b/integrations/iron/src/test/scala-3/com/example/RefinedString.scala @@ -0,0 +1,25 @@ +package com.example + +import io.github.iltotore.iron.* +import sttp.tapir.Validator +import sttp.tapir.codec.iron.PrimitiveValidatorForPredicate +import sttp.tapir.codec.iron.ValidatorForPredicate + +final class RefinedStringConstraint + +object RefinedStringConstraint { + + given Constraint[String, RefinedStringConstraint] with { + + override inline def test(value: String): Boolean = value.nonEmpty + + override inline def message: String = "Should not be empty" + } + + given PrimitiveValidatorForPredicate[String, RefinedStringConstraint] = + ValidatorForPredicate.fromPrimitiveValidator(Validator.pattern[String]("^.+")) +} + +opaque type RefinedString = String :| RefinedStringConstraint + +object RefinedString extends RefinedTypeOps[String, RefinedStringConstraint, RefinedString] diff --git a/integrations/iron/src/test/scala-3/sttp/iron/codec/iron/TapirCodecIronTestScala3.scala b/integrations/iron/src/test/scala-3/sttp/iron/codec/iron/TapirCodecIronTestScala3.scala index 4a9d7b1159..6af7435fea 100644 --- a/integrations/iron/src/test/scala-3/sttp/iron/codec/iron/TapirCodecIronTestScala3.scala +++ b/integrations/iron/src/test/scala-3/sttp/iron/codec/iron/TapirCodecIronTestScala3.scala @@ -18,6 +18,9 @@ import io.github.iltotore.iron.constraint.all.* import sttp.tapir.Validator import sttp.tapir.ValidationError +import com.example.RefinedString +import com.example.RefinedStringConstraint + class TapirCodecIronTestScala3 extends AnyFlatSpec with Matchers { val schema: Schema[Double :| Positive] = summon[Schema[Double :| Positive]] @@ -321,4 +324,11 @@ class TapirCodecIronTestScala3 extends AnyFlatSpec with Matchers { summon[Schema[NewtypeInt]] summon[Codec[String, NewtypeInt, TextPlain]] + "Instances for opaque refined type defined outside of source" should "be correctly derived" in: + summon[Schema[RefinedString]] + summon[Codec[String, RefinedString, TextPlain]] + + "Instance of validator for constraint defined outside of source" should "be correctly derived" in: + summon[PrimitiveValidatorForPredicate[String, RefinedStringConstraint]] + } From db026855fafe662b67ac3a24be8783d0e082cac3 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 26 Oct 2024 02:32:38 +0200 Subject: [PATCH 047/127] Update logback-classic to 1.5.12 (#4118) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 98a5aa59ac..03873099e7 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -64,7 +64,7 @@ object Versions { val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" - val logback = "1.5.11" + val logback = "1.5.12" val slf4j = "2.0.16" val jsoniter = "2.31.1" } From 4f1c5d59fefd06327a110a0331218b5710b66721 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 28 Oct 2024 01:22:13 +0100 Subject: [PATCH 048/127] Update cats-effect to 3.5.5 (#4119) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 03873099e7..c5bd9d4c1c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -3,7 +3,7 @@ object Versions { val http4sBlazeServer = "0.23.16" val http4sBlazeClient = "0.23.16" val catsCore = "2.12.0" - val catsEffect = "3.5.4" + val catsEffect = "3.5.5" val circe = "0.14.9" val circeGenericExtras = "0.14.3" val circeYaml = "0.15.2" From 6b31453a178e855c7e90f261f7768a33a6637ce9 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 30 Oct 2024 01:37:38 +0100 Subject: [PATCH 049/127] Update jackson-module-scala to 2.18.1 (#4123) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 92eebbd6ed..30215bfcb6 100644 --- a/build.sbt +++ b/build.sbt @@ -525,7 +525,7 @@ lazy val perfTests: ProjectMatrix = (projectMatrix in file("perf-tests")) "jackson-databind" ), "io.gatling" % "gatling-test-framework" % "3.11.5" % "test" exclude ("com.fasterxml.jackson.core", "jackson-databind"), - "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.0", + "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.1", "nl.grons" %% "metrics4-scala" % Versions.metrics4Scala % Test, "com.lihaoyi" %% "scalatags" % Versions.scalaTags % Test, "io.github.classgraph" % "classgraph" % "4.8.177", From db523d8fa740dbab1713f7491b40e37bbb68f6a7 Mon Sep 17 00:00:00 2001 From: hughsimpson Date: Thu, 31 Oct 2024 11:13:53 +0000 Subject: [PATCH 050/127] codegen: better errors if schemas not found during schema construction (#4125) --- .../src/main/scala/sttp/tapir/codegen/SchemaGenerator.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/SchemaGenerator.scala b/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/SchemaGenerator.scala index 7d6bc95434..d245e88a2c 100644 --- a/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/SchemaGenerator.scala +++ b/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/SchemaGenerator.scala @@ -123,7 +123,9 @@ object SchemaGenerator { res ++= nextLayers.toSeq.sortBy(_.head._1) acquired ++= nextLayers.flatMap(_.map(_._1)).toSet if (initialSet.nonEmpty && nextLayers.isEmpty) - throw new IllegalStateException("Cannot order layers until mutually-recursive references have been resolved.") + throw new IllegalStateException( + s"Cannot order layers until mutually-recursive references have been resolved. Unable to find all dependencies for ${initialSet.flatMap(_.map(_._1))}" + ) } res.map(_.map { case (k, v, _) => k -> v }) From 0b265d383300143dab56b13c060a201061fe44f1 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 31 Oct 2024 12:14:08 +0100 Subject: [PATCH 051/127] Update sbt, sbt-dependency-tree to 1.10.4 (#4120) Co-authored-by: scala-steward --- .../sbt-openapi-codegen/caching/project/build.properties | 2 +- .../sbt-openapi-codegen/minimal/project/build.properties | 2 +- .../oneOf-json-roundtrip/project/build.properties | 2 +- .../oneOf-json-roundtrip_jsoniter/project/build.properties | 2 +- .../project/build.properties | 2 +- .../oneOf-json-roundtrip_scala3/project/build.properties | 2 +- .../option-overrides/project/build.properties | 2 +- project/build.properties | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 diff --git a/project/build.properties b/project/build.properties index bc7390601f..09feeeed5d 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.4 From 2402cab6c11f2536c1c120941095113b1880e6e5 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 4 Nov 2024 01:39:14 +0100 Subject: [PATCH 052/127] Update sbt-buildinfo to 0.13.0 (#4126) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 9f64ce28da..27cbe2b4b3 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -15,7 +15,7 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.1") -addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.0") From ec9d62c2486a447dbeb6e78ebda5e5cc61e0f875 Mon Sep 17 00:00:00 2001 From: Abdelfetah <62770167+abdelfetah18@users.noreply.github.com> Date: Mon, 4 Nov 2024 03:48:32 -0600 Subject: [PATCH 053/127] Implement multipart body support in sttp stub (#4117) Co-authored-by: adamw --- .../tapir/server/stub/SttpRequestBody.scala | 83 +++++++++-- .../stub/TapirStubInterpreterTest.scala | 134 ++++++++++++++++++ 2 files changed, 207 insertions(+), 10 deletions(-) diff --git a/server/sttp-stub-server/src/main/scala/sttp/tapir/server/stub/SttpRequestBody.scala b/server/sttp-stub-server/src/main/scala/sttp/tapir/server/stub/SttpRequestBody.scala index c8adc730d1..6276e503dd 100644 --- a/server/sttp-stub-server/src/main/scala/sttp/tapir/server/stub/SttpRequestBody.scala +++ b/server/sttp-stub-server/src/main/scala/sttp/tapir/server/stub/SttpRequestBody.scala @@ -10,6 +10,12 @@ import sttp.tapir.server.interpreter.{RawValue, RequestBody} import java.io.{ByteArrayInputStream, ByteArrayOutputStream, InputStream} import java.nio.ByteBuffer import scala.annotation.tailrec +import sttp.client3 +import sttp.model.Part +import sttp.model.MediaType +import sttp.tapir.FileRange +import java.nio.file.Files +import java.io.FileInputStream class SttpRequestBody[F[_]](implicit ME: MonadError[F]) extends RequestBody[F, AnyStreams] { override val streams: AnyStreams = AnyStreams @@ -26,27 +32,32 @@ class SttpRequestBody[F[_]](implicit ME: MonadError[F]) extends RequestBody[F, A case RawBodyType.InputStreamRangeBody => ME.unit(RawValue(InputStreamRange(() => new ByteArrayInputStream(bytes)))) case _: RawBodyType.MultipartBody => ME.error(new UnsupportedOperationException) } - case _ => throw new IllegalArgumentException("Stream body provided while endpoint accepts raw body type") + case Right(parts) => + bodyType match { + case mp: RawBodyType.MultipartBody => ME.unit(RawValue(extractMultipartParts(parts, mp))) + case _ => throw new IllegalArgumentException(s"Multipart body provided while endpoint accepts raw body type: ${bodyType}") + } } - override def toStream(serverRequest: ServerRequest, maxBytes: Option[Long]): streams.BinaryStream = body(serverRequest) match { - case Right(stream) => stream - case _ => throw new IllegalArgumentException("Raw body provided while endpoint accepts stream body") - } + override def toStream(serverRequest: ServerRequest, maxBytes: Option[Long]): streams.BinaryStream = + sttpRequest(serverRequest).body match { + case StreamBody(s) => s + case _ => throw new IllegalArgumentException("Raw body provided while endpoint accepts stream body") + } private def sttpRequest(serverRequest: ServerRequest) = serverRequest.underlying.asInstanceOf[Request[_, _]] - /** Either bytes or any stream */ - private def body(serverRequest: ServerRequest): Either[Array[Byte], Any] = sttpRequest(serverRequest).body match { + private def body(serverRequest: ServerRequest): Either[Array[Byte], Seq[Part[client3.RequestBody[_]]]] = sttpRequest( + serverRequest + ).body match { case NoBody => Left(Array.emptyByteArray) case StringBody(s, encoding, _) => Left(s.getBytes(encoding)) case ByteArrayBody(b, _) => Left(b) case ByteBufferBody(b, _) => Left(b.array()) case InputStreamBody(b, _) => Left(toByteArray(b)) case FileBody(f, _) => Left(f.readAsByteArray) - case StreamBody(s) => Right(s) - case MultipartBody(_) => - throw new IllegalArgumentException("Stub cannot handle multipart bodies") + case StreamBody(_) => throw new IllegalArgumentException("Stream body provided while endpoint accepts raw body type") + case MultipartBody(parts) => Right(parts) } private def toByteArray(is: InputStream): Array[Byte] = { @@ -66,4 +77,56 @@ class SttpRequestBody[F[_]](implicit ME: MonadError[F]) extends RequestBody[F, A transfer() os.toByteArray } + + private def extractMultipartParts(parts: Seq[Part[client3.RequestBody[_]]], bodyType: RawBodyType.MultipartBody): List[Part[Any]] = { + parts.flatMap { part => + bodyType.partType(part.name).flatMap { partType => + val body = extractPartBody(part, partType) + Some( + Part( + name = part.name, + body = body, + contentType = part.contentType.flatMap(ct => MediaType.parse(ct).toOption), + fileName = part.fileName + ) + ) + } + }.toList + } + + private def extractPartBody[B](part: Part[client3.RequestBody[_]], bodyType: RawBodyType[B]): Any = { + part.body match { + case ByteArrayBody(b, _) => + bodyType match { + case RawBodyType.StringBody(_) => b + case RawBodyType.ByteArrayBody => b + case RawBodyType.ByteBufferBody => ByteBuffer.wrap(b) + case RawBodyType.InputStreamBody => new ByteArrayInputStream(b) + case RawBodyType.InputStreamRangeBody => InputStreamRange(() => new ByteArrayInputStream(b)) + case RawBodyType.FileBody => throw new IllegalArgumentException("ByteArray part provided while expecting a File part") + case _: RawBodyType.MultipartBody => throw new IllegalArgumentException("Nested multipart bodies are not allowed") + } + case FileBody(f, _) => + bodyType match { + case RawBodyType.FileBody => FileRange(f.toFile) + case RawBodyType.ByteArrayBody => Files.readAllBytes(f.toPath) + case RawBodyType.ByteBufferBody => ByteBuffer.wrap(Files.readAllBytes(f.toPath)) + case RawBodyType.InputStreamBody => new FileInputStream(f.toFile) + case _ => throw new IllegalArgumentException(s"File part provided, while expecting $bodyType") + } + case StringBody(s, charset, _) => + bodyType match { + case RawBodyType.StringBody(_) => s + case RawBodyType.ByteArrayBody => s.getBytes(charset) + case RawBodyType.ByteBufferBody => ByteBuffer.wrap(s.getBytes(charset)) + case _ => throw new IllegalArgumentException(s"String part provided, while expecting $bodyType") + } + case InputStreamBody(is, _) => + bodyType match { + case RawBodyType.InputStreamBody => is + case _ => throw new IllegalArgumentException(s"InputStream part provided, while expecting $bodyType") + } + case _ => throw new IllegalArgumentException(s"Unsupported part body type provided: ${part.body}") + } + } } diff --git a/server/sttp-stub-server/src/test/scala/sttp/tapir/server/stub/TapirStubInterpreterTest.scala b/server/sttp-stub-server/src/test/scala/sttp/tapir/server/stub/TapirStubInterpreterTest.scala index 3fbc0050fd..ec96417127 100644 --- a/server/sttp-stub-server/src/test/scala/sttp/tapir/server/stub/TapirStubInterpreterTest.scala +++ b/server/sttp-stub-server/src/test/scala/sttp/tapir/server/stub/TapirStubInterpreterTest.scala @@ -14,6 +14,12 @@ import sttp.tapir.server.interceptor.exception.ExceptionHandler import sttp.tapir.server.interceptor.reject.RejectHandler import sttp.tapir.server.interceptor.{CustomiseInterceptors, Interceptor} import sttp.tapir.server.model.ValuedEndpointOutput +import sttp.tapir.generic.auto._ +import sttp.tapir.tests.TestUtil.{readFromFile, writeToFile} +import sttp.model.Part +import sttp.tapir.TapirFile +import scala.concurrent.Await +import scala.concurrent.duration.DurationInt class TapirStubInterpreterTest extends AnyFlatSpec with Matchers { @@ -204,8 +210,136 @@ class TapirStubInterpreterTest extends AnyFlatSpec with Matchers { response.body shouldBe Left("Internal server error") response.code shouldBe StatusCode.InternalServerError } + + it should "handle multipart body" in { + // given + val e = + endpoint.post + .in("api" / "multipart") + .in(multipartBody) + .out(stringBody) + + val server = TapirStubInterpreter(SttpBackendStub(IdMonad)) + .whenEndpoint(e) + .thenRespond("success") + .backend() + + // when + val response = sttp.client3.basicRequest + .post(uri"http://test.com/api/multipart") + .multipartBody( + multipart("name", "abc"), + multipartFile("file", writeToFile("file_content")) + ) + .send(server) + + // then + response.body shouldBe Right("success") + } + + it should "correctly process a multipart body" in { + // given + val e = + endpoint.post + .in("api" / "multipart") + .in(multipartBody) + .out(stringBody) + + val server = TapirStubInterpreter(SttpBackendStub.synchronous) + .whenServerEndpointRunLogic(e.serverLogic((multipartData) => { + val partOpt = multipartData.find(_.name == "name") + val fileOpt = multipartData.find(_.name == "file") + + (partOpt, fileOpt) match { + case (Some(part), Some(filePart)) => + val partData = new String(part.body) + val fileData = new String(filePart.body) + IdMonad.unit(Right("name: " + partData + " file: " + fileData)) + + case (Some(_), None) => + IdMonad.unit(Right("File part not found")) + + case (None, Some(_)) => + IdMonad.unit(Right("Part not found")) + + case (None, None) => + IdMonad.unit(Right("Both parts not found")) + } + })) + .backend() + + // when + val response = sttp.client3.basicRequest + .post(uri"http://test.com/api/multipart") + .multipartBody( + multipart("name", "abc"), + multipartFile("file", writeToFile("file_content")) + ) + .send(server) + + // then + response.body shouldBe Right("name: abc file: file_content") + } + + it should "correctly handle derived multipart body" in { + // given + val e = + endpoint.post + .in("api" / "multipart") + .in(multipartBody[MultipartData]) + .out(stringBody) + + val server = TapirStubInterpreter(SttpBackendStub(IdMonad)) + .whenServerEndpointRunLogic(e.serverLogic(multipartData => { + val fileContent = Await.result(readFromFile(multipartData.file.body), 3.seconds) + IdMonad.unit(Right("name: " + multipartData.name + " year: " + multipartData.year + " file: " + fileContent)) + })) + .backend() + + // when + val response = sttp.client3.basicRequest + .post(uri"http://test.com/api/multipart") + .multipartBody( + multipart("name", "abc"), + multipart("year", "2024"), + multipartFile("file", writeToFile("file_content")) + ) + .send(server) + + // then + response.body shouldBe Right("name: abc year: 2024 file: file_content") + } + + it should "throw exception when bytearray body provided while endpoint accepts fileBody" in { + // given + val e = + endpoint.post + .in("api" / "multipart") + .in(multipartBody[MultipartData]) + .out(stringBody) + + val server = TapirStubInterpreter(SttpBackendStub(IdMonad)) + .whenEndpoint(e) + .thenRespond("success") + .backend() + + // when + val response = the[IllegalArgumentException] thrownBy sttp.client3.basicRequest + .post(uri"http://test.com/api/multipart") + .multipartBody( + multipart("name", "abc"), + multipart("year", "2024"), + multipart("file", "file_content".getBytes()) + ) + .send(server) + + // then + response.getMessage shouldBe "ByteArray part provided while expecting a File part" + } } +case class MultipartData(name: String, year: Int, file: Part[TapirFile]) + object ProductsApi { val getProduct: Endpoint[Unit, Unit, String, String, Any] = endpoint.get From 724984dddfadfada43ff3a95e8aec8527de4240f Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 4 Nov 2024 10:54:31 +0100 Subject: [PATCH 054/127] Update sbt, sbt-dependency-tree to 1.10.5 (#4127) Co-authored-by: scala-steward --- .../sbt-openapi-codegen/caching/project/build.properties | 2 +- .../sbt-openapi-codegen/minimal/project/build.properties | 2 +- .../oneOf-json-roundtrip/project/build.properties | 2 +- .../oneOf-json-roundtrip_jsoniter/project/build.properties | 2 +- .../project/build.properties | 2 +- .../oneOf-json-roundtrip_scala3/project/build.properties | 2 +- .../option-overrides/project/build.properties | 2 +- project/build.properties | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 diff --git a/project/build.properties b/project/build.properties index 09feeeed5d..db1723b086 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.4 +sbt.version=1.10.5 From 437ca074f2b261a7cd1ff2986ff97d0bf9c0227a Mon Sep 17 00:00:00 2001 From: adamw Date: Mon, 4 Nov 2024 10:58:35 +0100 Subject: [PATCH 055/127] Release 1.11.8 --- README.md | 2 +- generated-doc/out/client/http4s.md | 2 +- generated-doc/out/client/play.md | 4 +- generated-doc/out/client/sttp.md | 6 +- generated-doc/out/docs/asyncapi.md | 2 +- generated-doc/out/docs/json-schema.md | 2 +- generated-doc/out/docs/openapi.md | 12 +- generated-doc/out/endpoint/integrations.md | 18 +-- generated-doc/out/endpoint/json.md | 18 +-- generated-doc/out/endpoint/pickler.md | 2 +- generated-doc/out/endpoint/static.md | 2 +- .../out/generator/sbt-openapi-codegen.md | 2 +- .../out/how-tos/delimited-path-parameters.md | 103 ++++++++++++++++++ generated-doc/out/index.md | 1 + generated-doc/out/quickstart.md | 2 +- generated-doc/out/server/akkahttp.md | 4 +- generated-doc/out/server/armeria.md | 6 +- generated-doc/out/server/aws.md | 8 +- generated-doc/out/server/finatra.md | 4 +- generated-doc/out/server/http4s.md | 2 +- generated-doc/out/server/jdkhttp.md | 2 +- generated-doc/out/server/netty.md | 8 +- generated-doc/out/server/nima.md | 2 +- generated-doc/out/server/observability.md | 8 +- generated-doc/out/server/pekkohttp.md | 4 +- generated-doc/out/server/play.md | 4 +- generated-doc/out/server/vertx.md | 6 +- generated-doc/out/server/zio-http4s.md | 4 +- generated-doc/out/server/ziohttp.md | 4 +- generated-doc/out/testing.md | 8 +- generated-doc/out/tutorials/01_hello_world.md | 24 ++-- .../out/tutorials/02_openapi_docs.md | 14 +-- generated-doc/out/tutorials/03_json.md | 10 +- generated-doc/out/tutorials/04_errors.md | 20 ++-- .../tutorials/05_multiple_inputs_outputs.md | 14 +-- .../out/tutorials/06_error_variants.md | 14 +-- generated-doc/out/tutorials/07_cats_effect.md | 20 ++-- 37 files changed, 236 insertions(+), 132 deletions(-) create mode 100644 generated-doc/out/how-tos/delimited-path-parameters.md diff --git a/README.md b/README.md index e09052c4c4..9cb9f588ed 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] Add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.8" ``` Then, import: diff --git a/generated-doc/out/client/http4s.md b/generated-doc/out/client/http4s.md index 5a07431638..034c0e562d 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.11.8" ``` 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 5a556a26d7..28819cb6e6 100644 --- a/generated-doc/out/client/play.md +++ b/generated-doc/out/client/play.md @@ -6,13 +6,13 @@ See the [Play framework documentation](https://www.playframework.com/documentati For **Play 3.0**, add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.8" ``` For **Play 2.9**, add ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.8" ``` instead. Furthermore, replace all uses of `sttp.capabilities.pekko.PekkoStreams` in the following code snippets with `sttp.capabilities.akka.AkkaStreams`. diff --git a/generated-doc/out/client/sttp.md b/generated-doc/out/client/sttp.md index 7b4dcc6a47..e9622961a2 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.11.8" ``` To make requests using an endpoint definition using the [sttp client](https://github.com/softwaremill/sttp), import: @@ -55,7 +55,7 @@ A => I => Request[DecodeResult[Either[E, O]], R] A => I => F[DecodeResult[Either[E, O]]] ``` -See the [runnable example](https://github.com/softwaremill/tapir/blob/master/examples/src/main/scala/sttp/tapir/examples/BooksExample.scala) +See the [runnable example](https://github.com/softwaremill/tapir/blob/master/examples/src/main/scala/sttp/tapir/examples/booksExample.scala) for example usage. ## Web sockets @@ -101,7 +101,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.11.7" +"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.11.8" "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 f63f3853d9..26bdaf5a2d 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.11.8" "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 3b17eb63bd..a80427af62 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.11.8" ``` 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 0ff7974f21..e1c4d19d57 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.11.8" ``` 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.11.8" ``` 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.8" "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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.8" "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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.11.8" ``` or `tapir-redoc`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.8" ``` 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 27c859f077..ab23133fa4 100644 --- a/generated-doc/out/endpoint/integrations.md +++ b/generated-doc/out/endpoint/integrations.md @@ -12,7 +12,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.11.8" ``` - `import sttp.tapir.integ.cats.codec.*` - brings schema, validator and codec instances @@ -22,7 +22,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.11.8" ``` ## Refined integration @@ -31,7 +31,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.11.8" ``` You'll need to extend the `sttp.tapir.codec.refined.TapirCodecRefined` @@ -52,7 +52,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.11.8" ``` The module is only available for Scala 3 since iron is not designed to work with Scala 2. @@ -145,7 +145,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.11.8" ``` Then, `import sttp.tapir.codec.enumeratum.*`, or extends the `sttp.tapir.codec.enumeratum.TapirCodecEnumeratum` trait. @@ -158,7 +158,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.11.8" ``` Then, `import sttp.tapir.codec.newtype.*`, or extend the `sttp.tapir.codec.newtype.TapirCodecNewType` trait to bring the implicit values into scope. @@ -169,7 +169,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.11.8" ``` Then, `import sttp.tapir.codec.monix.newtype.*`, or extend the `sttp.tapir.codec.monix.newtype.TapirCodecMonixNewType` trait to bring the implicit values into scope. @@ -180,7 +180,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.11.8" ``` Then, mix in `sttp.tapir.codec.zio.prelude.newtype.TapirNewtypeSupport` into your newtype to bring the implicit values into scope: @@ -219,7 +219,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.11.8" ``` 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 51eb2fbb62..6ed067d664 100644 --- a/generated-doc/out/endpoint/json.md +++ b/generated-doc/out/endpoint/json.md @@ -50,7 +50,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../other/mytapir.md)): @@ -122,7 +122,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`): @@ -156,13 +156,13 @@ For more examples, including making a custom encoder/decoder, see [TapirJsonuPic 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.11.8" ``` For **Play 2.9** use: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`): @@ -178,7 +178,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`): @@ -194,7 +194,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`): @@ -210,7 +210,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`): @@ -226,7 +226,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.11.8" ``` And one of the implementations: @@ -257,7 +257,7 @@ given Formats = org.json4s.jackson.Serialization.formats(NoTypeHints) 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.8" ``` Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../other/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 b40fa54658..4c082f2cc5 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.11.8" ``` 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 97c76fc2fc..f79f440a5d 100644 --- a/generated-doc/out/endpoint/static.md +++ b/generated-doc/out/endpoint/static.md @@ -11,7 +11,7 @@ the API documentation of the old static content API, switch documentation to an In order to use static content endpoints, add the module to your dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.8" ``` ## Files diff --git a/generated-doc/out/generator/sbt-openapi-codegen.md b/generated-doc/out/generator/sbt-openapi-codegen.md index 87d1708cc0..2257719423 100644 --- a/generated-doc/out/generator/sbt-openapi-codegen.md +++ b/generated-doc/out/generator/sbt-openapi-codegen.md @@ -9,7 +9,7 @@ This is a really early alpha implementation. Add the sbt plugin to the `project/plugins.sbt`: ```scala -addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.7") +addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.8") ``` Enable the plugin for your project in the `build.sbt`: diff --git a/generated-doc/out/how-tos/delimited-path-parameters.md b/generated-doc/out/how-tos/delimited-path-parameters.md new file mode 100644 index 0000000000..5feb23d73a --- /dev/null +++ b/generated-doc/out/how-tos/delimited-path-parameters.md @@ -0,0 +1,103 @@ +# Handling Delimited Path Parameters + +Tapir allows you to handle complex path parameters, such as lists of custom types separated by delimiters (e.g., commas). +This can be achieved using `Codec.delimited`, which facilitates the serialization and deserialization of delimited lists +within path segments. + +## Use Case + +Suppose you want to define an endpoint that accepts a list of names as a comma-separated path parameter. Each name should +adhere to a specific pattern (e.g., only uppercase letters). + +## Implementation Steps: + +### 1. Define the Custom Type and Validator +Start by defining your custom type and the associated validator to enforce the desired pattern. + +```scala +import sttp.tapir._ +import sttp.tapir.generic.auto._ +import sttp.tapir.Codec +import sttp.tapir.Validator +import sttp.tapir.CodecFormat.TextPlain +import sttp.tapir.model.Delimited + +case class Name(value: String) + +// Validator to ensure names consist of uppercase letters only +val nameValidator: Validator[String] = Validator.pattern("^[A-Z]+$") +``` + +### 2. Create Codecs for the Custom Type and Delimited List +Utilize `Codec.parsedString` for individual `Name` instances and `Codec.delimited` for handling the list. + +```scala +// Codec for single Name +given Codec[String, Name, TextPlain] = Codec.parsedString(Name.apply) + .validate(nameValidator.contramap(_.value)) + +// Codec for a list of Names, delimited by commas +given Codec[String, Delimited[",", Name], TextPlain] = Codec.delimited +``` + +### 3. Define the Endpoint with Delimited Path Parameter +Incorporate the delimited codec into your endpoint definition to handle the list of names in the path. + +```scala +import sttp.tapir._ +import sttp.tapir.generic.auto._ +import sttp.tapir.Codec +import sttp.tapir.Validator +import sttp.tapir.CodecFormat.TextPlain +import sttp.tapir.model.Delimited + +case class Name(value: String) + +// Validator to ensure names consist of uppercase letters only +val nameValidator: Validator[String] = Validator.pattern("^[A-Z]+$") + +// Codec for single Name +given Codec[String, Name, TextPlain] = Codec.parsedString(Name.apply) + .validate(nameValidator.contramap(_.value)) + +// Codec for a list of Names, delimited by commas +given Codec[String, Delimited[",", Name], TextPlain] = Codec.delimited + +val getUserEndpoint = + endpoint.get + .in("user" / path[Delimited[",", Name]]("id")) + .out(stringBody) +``` + +### 4. Generated OpenAPI Schema +When you generate the OpenAPI documentation for this endpoint, the schema for the `id` path parameter will +correctly reflect it as an array with the specified pattern for each item. + +```yaml +paths: + /user/{id}: + get: + operationId: getUserId + parameters: + - name: id + in: path + required: true + schema: + type: array + items: + type: string + pattern: ^[A-Z]+$ +``` + +## Explanation +- `Codec.parsedString`: Transforms a `String` into a custom type (`Name`) and vice versa. It also applies validation to + ensure each `Name` adheres to the specified pattern. +- `Codec.delimited`: Handles the serialization and deserialization of a delimited list (e.g., comma-separated) of the + custom type. By specifying `Delimited[",", Name]`, Tapir knows how to split and join the list based on the delimiter. +- Endpoint Definition: The `path[List[Name]]("id")` indicates that the id path parameter should be treated as a list of + `Name` objects, utilizing the previously defined codecs. + +## Validation +Validators play a crucial role in ensuring that each element within the delimited list meets the required criteria. In +this example, `nameValidator` ensures that each `Name` consists solely of uppercase letters. Tapir applies this validation +to each element in the list, providing robust input validation. \ No newline at end of file diff --git a/generated-doc/out/index.md b/generated-doc/out/index.md index 5c520c636c..3a1676bd97 100644 --- a/generated-doc/out/index.md +++ b/generated-doc/out/index.md @@ -156,6 +156,7 @@ sttp is a family of Scala HTTP-related projects, and currently includes: examples external + how-tos/delimited-path-parameters .. toctree:: :maxdepth: 2 diff --git a/generated-doc/out/quickstart.md b/generated-doc/out/quickstart.md index a1cc8396db..d97fdc92b2 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.8" ``` 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 3733a30532..74ed916e4d 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.8" ``` 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.11.7" exclude("com.typesafe.akka", "akka-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.8" 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 a647872265..ca570bf290 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.11.8" ``` and import the object: @@ -71,7 +71,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.11.8" ``` to use this interpreter with Cats Effect typeclasses. @@ -148,7 +148,7 @@ val tapirService = ArmeriaCatsServerInterpreter(dispatcher).toService(streamingR Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.8" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/aws.md b/generated-doc/out/server/aws.md index 21ebaab182..f543336d2b 100644 --- a/generated-doc/out/server/aws.md +++ b/generated-doc/out/server/aws.md @@ -30,7 +30,7 @@ These are corresponding classes for each of the supported runtime: To start using any of the above add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.8" ``` ## Deployment @@ -41,9 +41,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: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.7" -"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.7" -"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.8" ``` ### Examples diff --git a/generated-doc/out/server/finatra.md b/generated-doc/out/server/finatra.md index e87b4d744d..9878f9fb54 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.11.8" ``` 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.11.8" ``` and import the object: diff --git a/generated-doc/out/server/http4s.md b/generated-doc/out/server/http4s.md index b2760a68ef..c723151f91 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.11.8" ``` and import the object: diff --git a/generated-doc/out/server/jdkhttp.md b/generated-doc/out/server/jdkhttp.md index c543237a4c..f5297c6814 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.11.8" ``` Then, import the package: diff --git a/generated-doc/out/server/netty.md b/generated-doc/out/server/netty.md index 6964f3dbe9..612af7246d 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.11.8" // if you want to use Java 21 Loom virtual threads in direct style: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.8" // if you are using cats-effect: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.8" // if you are using zio: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.8" ``` Then, use: diff --git a/generated-doc/out/server/nima.md b/generated-doc/out/server/nima.md index 4d4f94ee44..f290ad1864 100644 --- a/generated-doc/out/server/nima.md +++ b/generated-doc/out/server/nima.md @@ -8,7 +8,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-nima-server" % "1.11.8" ``` 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 caeb4b47c0..92a31625f4 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.11.8" ``` `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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.11.8" ``` 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.11.8" ``` 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.11.8" ``` 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 8ec7eab010..e5158873a1 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.8" ``` 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.11.7" exclude("org.apache.pekko", "pekko-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.8" 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 6bfd948e7d..3d91f9bcd4 100644 --- a/generated-doc/out/server/play.md +++ b/generated-doc/out/server/play.md @@ -6,7 +6,7 @@ See the [Play framework documentation](https://www.playframework.com/documentati 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-play29-server" % "1.11.8" ``` and (if you don't already depend on Play) @@ -26,7 +26,7 @@ depending on whether you want to use netty or Akka based http-server under the h 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.11.8" ``` 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 553800cbea..7d64d8e620 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.11.8" ``` to use this interpreter with `Future`. @@ -60,7 +60,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.11.8" ``` to use this interpreter with Cats Effect typeclasses. @@ -140,7 +140,7 @@ val attach = VertxCatsServerInterpreter(dispatcher).route(streamedResponse.serve Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.8" ``` 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 33083c4b5c..e63fae17fd 100644 --- a/generated-doc/out/server/zio-http4s.md +++ b/generated-doc/out/server/zio-http4s.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.8" ``` or just add the zio-http4s integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.8" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/server/ziohttp.md b/generated-doc/out/server/ziohttp.md index 2ea6063045..946358d201 100644 --- a/generated-doc/out/server/ziohttp.md +++ b/generated-doc/out/server/ziohttp.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.8" ``` or just add the zio-http integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.8" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/testing.md b/generated-doc/out/testing.md index e433506407..5a9df699c1 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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.8" ``` Let's assume you are using the [pekko http](server/pekkohttp.md) interpreter. Given the following server endpoint: @@ -139,7 +139,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.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.8" ``` And the following imports: @@ -194,7 +194,7 @@ with [mock-server](https://www.mock-server.com/) Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.8" ``` Imports: @@ -265,7 +265,7 @@ result == out To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.7" +"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.8" ``` ### Shadowed endpoints diff --git a/generated-doc/out/tutorials/01_hello_world.md b/generated-doc/out/tutorials/01_hello_world.md index 311fdb92ea..0e9a7e8241 100644 --- a/generated-doc/out/tutorials/01_hello_world.md +++ b/generated-doc/out/tutorials/01_hello_world.md @@ -22,8 +22,8 @@ multiple servers, but we'll choose the simplest (and also one of the fastest!), available through the `tapir-netty-server-sync` module: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 ``` ## Endpoint description @@ -43,8 +43,8 @@ Let's start by defining the method and path of our endpoint: {emphasize-lines="4-11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* @@ -72,8 +72,8 @@ of requiring it to be a fixed value (a constant): {emphasize-lines="10"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* @@ -97,8 +97,8 @@ Finally, let's add an output to the endpoint. We'll return the response as a str {emphasize-lines="11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* @@ -123,8 +123,8 @@ will be sent as a response: {emphasize-lines="12"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* @@ -152,8 +152,8 @@ example, we'll bind to `localhost` (which is the default), and to the port 8080: {emphasize-lines="5, 15-18"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/02_openapi_docs.md b/generated-doc/out/tutorials/02_openapi_docs.md index 2667bda176..b03b4d86aa 100644 --- a/generated-doc/out/tutorials/02_openapi_docs.md +++ b/generated-doc/out/tutorials/02_openapi_docs.md @@ -17,16 +17,16 @@ use a bundle, which first interprets the provided tapir endpoints into OpenAPI a endpoints, which expose the UI together with the generated specification. We'll need to add a dependency: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 ``` We'll also define and expose two endpoints as an HTTP server, as described in the previous tutorial. Hence, our starting setup of `docs.scala` is as follows: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -108,9 +108,9 @@ And that's almost all the code changes that we need to introduce! We only need t {emphasize-lines="3, 5, 8, 24-25, 29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 import sttp.shared.Identity import sttp.tapir.* diff --git a/generated-doc/out/tutorials/03_json.md b/generated-doc/out/tutorials/03_json.md index bdc021807d..b8fd3ec971 100644 --- a/generated-doc/out/tutorials/03_json.md +++ b/generated-doc/out/tutorials/03_json.md @@ -83,7 +83,7 @@ In our case, deriving the schemas will amount to adding a `... derives Schema` c {emphasize-lines="1, 7, 10, 12, 16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.core.* // needed for `writeToString` @@ -127,10 +127,10 @@ how the `jsonBody[T]` method is used in the endpoint definition. We'll also expo {emphasize-lines="2-4, 10-15, 23-39"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* // needed for ... derives diff --git a/generated-doc/out/tutorials/04_errors.md b/generated-doc/out/tutorials/04_errors.md index 136cf156d6..005b5c9bcb 100644 --- a/generated-doc/out/tutorials/04_errors.md +++ b/generated-doc/out/tutorials/04_errors.md @@ -40,8 +40,8 @@ schemas both for the `Result` and `Error` classes, to represent them properly in describing the endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -76,10 +76,10 @@ We'll also add code to expose the endpoint as a server, along with its OpenAPI d {emphasize-lines="2-3, 11-13, 24-28, 30-36"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -152,10 +152,10 @@ you'll also get `ERROR` logs when unhandled exceptions happen: {emphasize-lines="6, 26"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md index 93afde3292..4fd27c18be 100644 --- a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md +++ b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md @@ -24,7 +24,7 @@ body, but additionally the hash of the result should be included in the `X-Resul Below is the endpoint description; we'll be editing the `multiple.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 import sttp.tapir.* @@ -61,8 +61,8 @@ The output tuple is then mapped to the response body & header: {emphasize-lines="5, 8-9, 18-29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -147,8 +147,8 @@ The mapping functions are simple, but quite boring to write: {emphasize-lines="8, 17-18, 23-27"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -197,8 +197,8 @@ Here's the modified code using `.mapInTo`, which additionally maps outputs to th {emphasize-lines="9, 11-13, 19, 22"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/06_error_variants.md b/generated-doc/out/tutorials/06_error_variants.md index 8255d1c251..afb92e9b80 100644 --- a/generated-doc/out/tutorials/06_error_variants.md +++ b/generated-doc/out/tutorials/06_error_variants.md @@ -83,7 +83,7 @@ request serializing `AvatarSuccess.Redirect` instances, as Tapir knows nothing a an `EndpointOutput[String]`: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -106,7 +106,7 @@ this output to the `AvatarSuccess.Redirect` type using `.mapTo`, which we've lea {emphasize-lines="12-13"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -138,7 +138,7 @@ each of which translates to a separate class. Our one-of successful output takes {emphasize-lines="13-16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -175,7 +175,7 @@ To fix this, we can use the `oneOfVariantSingletonMatcher` method. It takes a un value, to which the high-level output must be equal, for the variant to be chosen: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -197,9 +197,9 @@ val errorOutput: EndpointOutput[AvatarError] = oneOf( Equipped with `oneOf` outputs, we can now fully describe and test our endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* diff --git a/generated-doc/out/tutorials/07_cats_effect.md b/generated-doc/out/tutorials/07_cats_effect.md index f342cbe2c7..d02038e8b5 100644 --- a/generated-doc/out/tutorials/07_cats_effect.md +++ b/generated-doc/out/tutorials/07_cats_effect.md @@ -21,7 +21,7 @@ use. Hence, we'll start with the same basic endpoint description. We'll be editing the `cats-effect.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 import sttp.tapir.* @@ -56,8 +56,8 @@ parameter explicitly, using `.serverLogic[IO]` in our case: {emphasize-lines="2, 4, 12-14"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.8 import cats.effect.IO import sttp.tapir.* @@ -102,8 +102,8 @@ The conversion process is an almost-one-liner (if it wasn't for line length limi {emphasize-lines="2, 5, 7, 18-19"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 import cats.effect.IO import org.http4s.HttpRoutes @@ -130,8 +130,8 @@ standard code to start a server and handle requests until the application is int {emphasize-lines="3, 5, 7, 8, 12, 24-30"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} @@ -192,9 +192,9 @@ the second step that we need to perform: {emphasize-lines="3, 7, 13, 27-32, 37"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} From b9052e94ef82c90c7440d1e67f2e6c9ceeece6cf Mon Sep 17 00:00:00 2001 From: adamw Date: Mon, 4 Nov 2024 11:36:26 +0100 Subject: [PATCH 056/127] Document versioning --- doc/other/stability.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/other/stability.md b/doc/other/stability.md index 69a847375c..5e3f9f0038 100644 --- a/doc/other/stability.md +++ b/doc/other/stability.md @@ -6,6 +6,12 @@ The modules are categorised using the following levels: * **stabilising**: the API is mostly stable, with rare binary-incompatible changes possible in minor releases (only if necessary) * **experimental**: API can change significantly even in patch releases +The major version is increased when there are binary-incompatible changes in **stable** modules. + +The minor version is increased when there are significant new features in **stable** modules (keeping compatibility), or binary-incompatible changes in **stabilising** modules. + +The patch version is increased when there are binary-compatible changes in **stable** / **stabilising** modules, any changes in **exeperimental** modules, or when a new module is added (e.g. a new integration). + ## Main modules | Module | Level | From 46b5b3bcbad5e06b9bb745b25b9daec57e2114e3 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 5 Nov 2024 01:44:38 +0100 Subject: [PATCH 057/127] Update guava to 32.1.3-jre (#4128) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 27cbe2b4b3..1e5f696ab3 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -20,6 +20,6 @@ addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.0") // needed to override the Android flavor of Guava coming from pekko-grpc-sbt-plugin, which causes failures in Scala.JS builds -dependencyOverrides += "com.google.guava" % "guava" % "32.1.2-jre" +dependencyOverrides += "com.google.guava" % "guava" % "32.1.3-jre" addDependencyTreePlugin From f20e86fe2ec874d3f3c3c9e6f9cf858f3965836e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 5 Nov 2024 01:48:57 +0100 Subject: [PATCH 058/127] Update sttp-mock-server, ... to 1.11.8 (#4129) --- .../sttp/tapir/examples/HelloWorldHttp4sServer.scala | 4 ++-- .../tapir/examples/HelloWorldNettyCatsServer.scala | 4 ++-- .../sttp/tapir/examples/HelloWorldZioHttpServer.scala | 6 +++--- .../tapir/examples/ZioEnvExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleZioHttpServer.scala | 10 +++++----- .../tapir/examples/ZioPartialServerLogicHttp4s.scala | 6 +++--- .../main/scala/sttp/tapir/examples/booksExample.scala | 10 +++++----- .../sttp/tapir/examples/booksPicklerExample.scala | 10 +++++----- .../tapir/examples/client/Http4sClientExample.scala | 6 +++--- .../custom_types/EndpointWithCustomTypes.scala | 4 ++-- .../examples/custom_types/booksExampleSemiauto.scala | 10 +++++----- .../custom_types/commaSeparatedQueryParameter.scala | 6 +++--- .../custom_types/sealedTraitWithDiscriminator.scala | 8 ++++---- .../examples/errors/ErrorUnionTypesHttp4sServer.scala | 6 +++--- .../errors/IronRefinementErrorsNettyServer.scala | 8 ++++---- .../customErrorsOnDecodeFailurePekkoServer.scala | 4 ++-- .../examples/errors/errorOutputsPekkoServer.scala | 6 +++--- .../sttp/tapir/examples/helloWorldArmeriaServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldJdkHttpServer.scala | 4 ++-- .../tapir/examples/helloWorldNettyFutureServer.scala | 4 ++-- .../tapir/examples/helloWorldNettySyncServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldPekkoServer.scala | 4 ++-- .../json/circeAutoDerivationNettySyncServer.scala | 6 +++--- .../scala/sttp/tapir/examples/json/circeNullBody.scala | 6 +++--- .../tapir/examples/json/jsoniterNettySyncServer.scala | 6 +++--- .../ZioLoggingWithCorrelationIdNettyServer.scala | 4 ++-- .../multipart/multipartFormUploadPekkoServer.scala | 4 ++-- .../examples/observability/ZioMetricsExample.scala | 6 +++--- .../examples/observability/datadogMetricsExample.scala | 8 ++++---- .../observability/openTelemetryMetricsExample.scala | 8 ++++---- .../observability/prometheusMetricsExample.scala | 8 ++++---- .../MultipleEndpointsDocumentationHttp4sServer.scala | 8 ++++---- .../openapi/RedocContextPathHttp4sServer.scala | 6 +++--- .../tapir/examples/openapi/RedocZioHttpServer.scala | 8 ++++---- .../multipleEndpointsDocumentationPekkoServer.scala | 8 ++++---- .../tapir/examples/openapi/openapiExtensions.scala | 6 +++--- .../examples/openapi/swaggerUIOAuth2PekkoServer.scala | 6 +++--- .../tapir/examples/schema/customisingSchemas.scala | 8 ++++---- .../examples/security/OAuth2GithubHttp4sServer.scala | 6 +++--- .../examples/security/ServerSecurityLogicZio.scala | 4 ++-- .../security/basicAuthenticationPekkoServer.scala | 4 ++-- .../examples/security/corsInterceptorPekkoServer.scala | 4 ++-- .../security/externalSecurityInterceptor.scala | 4 ++-- .../examples/security/serverSecurityLogicPekko.scala | 4 ++-- .../serverSecurityLogicRefreshCookiesPekko.scala | 4 ++-- .../staticContentFromFilesNettyServer.scala | 6 +++--- .../staticContentFromFilesPekkoServer.scala | 6 +++--- .../staticContentFromResourcesPekkoServer.scala | 6 +++--- .../staticContentSecurePekkoServer.scala | 6 +++--- .../examples/status_code/statusCodeNettyServer.scala | 4 ++-- .../examples/streaming/ProxyHttp4sFs2Server.scala | 4 ++-- .../examples/streaming/StreamingHttp4sFs2Server.scala | 4 ++-- .../streaming/StreamingHttp4sFs2ServerOrError.scala | 4 ++-- .../examples/streaming/StreamingNettyFs2Server.scala | 4 ++-- .../examples/streaming/StreamingNettyZioServer.scala | 4 ++-- .../examples/streaming/StreamingZioHttpServer.scala | 4 ++-- .../examples/streaming/streamingPekkoServer.scala | 4 ++-- .../examples/testing/CatsServerStubInterpreter.scala | 6 +++--- .../examples/testing/PekkoServerStubInterpreter.scala | 6 +++--- .../examples/testing/SttpMockServerClientExample.scala | 6 +++--- .../websocket/WebSocketChatNettySyncServer.scala | 4 ++-- .../examples/websocket/WebSocketHttp4sServer.scala | 8 ++++---- .../examples/websocket/WebSocketNettySyncServer.scala | 4 ++-- .../examples/websocket/webSocketPekkoServer.scala | 8 ++++---- 65 files changed, 191 insertions(+), 191 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala index 383ee05b64..9843c91970 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=http4s}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala index a6f413e7e1..661aa7fb10 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=Netty}: Exposing an endpoint using the Netty server (cats-effect variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala index 93a30fca24..1783d7d4a1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala @@ -1,8 +1,8 @@ // {cat=Hello, World!; effects=ZIO; server=ZIO HTTP; json=ZIO JSON}: Exposing an endpoint using the ZIO HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala index 0ca817835d..6f24a8557c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint, defined with ZIO and depending on services in the environment, using the http4s server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala index a433f1daec..82276d4f75 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala index 8857bd8148..caad5c8a63 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=zio-http; json=circe; docs=Swagger UI}: Exposing an endpoint using the ZIO HTTP server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index f4ab2823e7..4aa1abb05a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -1,9 +1,9 @@ // {cat=Hello, World!; effects=ZIO; server=http4s}: Extending a base endpoint (which has the security logic provided), with server logic //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala index 8a5f69e471..d528def6e5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.8 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala index a2614f2c98..abb1dffcb3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Netty; client=sttp3; JSON=Pickler; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.8 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala index cd3620ab01..bc7f0492c9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala @@ -1,8 +1,8 @@ // {cat=Client interpreter; effects=cats-effect; JSON=circe}: Interpreting an endpoint as an http4s client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep org.http4s::http4s-circe:0.23.27 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep org.http4s::http4s-dsl:0.23.27 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala index cb0f413220..fad25b37ff 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala @@ -1,7 +1,7 @@ // {cat=Custom types; json=circe}: Supporting custom types, when used in query or path parameters, as well as part of JSON bodies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala index cf5da8c428..fd5cfb6b09 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala @@ -1,10 +1,10 @@ // {cat=Custom types; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities using semi-auto derivation -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.8 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala index b6e78202c9..a6714e4e25 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala @@ -1,8 +1,8 @@ // {cat=Custom types; effects=Direct; server=Netty; docs=Swagger UI}: Handling comma-separated query parameters -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala index d2e1ba1c35..eb3f81e454 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala @@ -1,9 +1,9 @@ // {cat=Custom types; effects=Direct; server=Netty; JSON=circe; docs=Swagger UI}: Mapping a sealed trait hierarchy to JSON using a discriminator -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala index 65c41fd821..9030657118 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=cats-effect; server=http4s; JSON=circe}: Extending a base secured endpoint with error variants, using union types -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala index 2701505a61..997f3e9ea7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala @@ -1,9 +1,9 @@ // {cat=Error handling; effects=cats-effect; server=Netty; JSON=circe}: Error reporting provided by Iron type refinements -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala index 5c960ff529..d39b1773e3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP}: Customising errors that are reported on decode failures (e.g. invalid or missing query parameter) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala index 8e1b8036ba..f5477df556 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP; json=circe}: Error and successful outputs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala index c3aefa92f2..e67f9efab3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Armeria}: Exposing an endpoint using the Armeria server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala index 1383057a67..83dd246c24 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=JDK Http}: Exposing an endpoint using the built-in JDK HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala index a1752f7eb2..c37d3784a5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Netty}: Exposing an endpoint using the Netty server (Future variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala index 4e097d951e..512f154043 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=Netty}: Exposing an endpoint using the Netty server (Direct-style variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala index 733ab2a785..da0d05ee42 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP}: Exposing an endpoint using the Pekko HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala index 502b3297fb..34597fa6ac 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON response with Circe and auto-dervied codecs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala index 834f82136d..7335295943 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON body which optionally serializes as `null` -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala index 7dee90fe21..95e26d7025 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=jsoniter}: Return a JSON response with Jsoniter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 //> using dep ch.qos.logback:logback-classic:1.5.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.15 diff --git a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala index 772133d038..2fc0f59b1d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Logging; effects=ZIO; server=Netty}: Logging using a correlation id -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.8 //> using dep com.softwaremill.sttp.client3::zio:3.9.8 package sttp.tapir.examples.logging diff --git a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala index 2a177a5b21..7129f9101c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Multipart; effects=Future; server=Pekko HTTP}: Uploading a multipart form, with text and file parts -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala index 0968d27031..912f4b2af0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala @@ -1,8 +1,8 @@ // {cat=Observability; effects=ZIO; server=ZIO HTTP}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.8 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala index 6ac9cb326b..8bf2ba01b6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting DataDog metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.8 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 4b54ace1d8..8c81ce56c4 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting OpenTelemetry metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.8 //> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.43.0 //> using dep org.slf4j:slf4j-api:2.0.13 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala index c830379424..ace204fdb6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.8 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala index c68277cd47..9668a0df76 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala index acdf864acb..8591f2523f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala index 2a0ff00e8e..203e766fb6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=ZIO; server=ZIO HTTP; json=circe; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala index f9991ad2dc..8003a4b312 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala index cc6b60187c..f5a916c690 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; json=circe}: Adding OpenAPI documentation extensions -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.8 //> using dep com.softwaremill.sttp.apispec::openapi-circe-yaml:0.10.0 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala index b3fd6267cf..26c07b5442 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI}: Securing Swagger UI using OAuth 2 -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala index 5ee6284e0d..c117e3bfcf 100644 --- a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala +++ b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala @@ -1,9 +1,9 @@ // {cat=Schemas; effects=Future; server=Netty; json=circe; docs=Swagger UI}: Customising a derived schema, using annotations, and using implicits -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 package sttp.tapir.examples.schema diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index fff54f2ba9..1b656b0b09 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Security; effects=cats-effect; server=http4s; json=circe}: Login using OAuth2, authorization code flow -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index 918503dd0c..c88ef4c974 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=ZIO; server=ZIO HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala index e96297c494..255a887a87 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: HTTP basic authentication -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala index ae95d8ffd2..09c828dc30 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: CORS interceptor -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala index 5508f8d981..09d0112f35 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Netty}: Interceptor verifying externally added security credentials -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala index 985ab1ecc1..ae3f890b54 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala index 159da50341..2005c61b6d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala index 03c1e2777a..e12308877e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala index 99d705b177..6dd4d0389a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from a directory, with range requests -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala index 534c7a22e8..5d60f489b7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from resources -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala index bef418360f..a24564cd72 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files secured with a bearer token -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala index c9fe61b854..0ad896eefe 100644 --- a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Status code; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 package sttp.tapir.examples.status_code diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala index ed57e0f406..140a645167 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Proxy requests, handling bodies as fs2 streams -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep com.softwaremill.sttp.client3::fs2:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala index 4e68d0d13d..7dadb69204 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala index e264906758..9fe0586041 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Respond with an fs2 stream, or with an error, represented as a failed effect in the business logic -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala index e8bc3a17e1..21e802b343 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=Netty}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala index f2cf663766..2e5e8654c5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=Netty}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala index 4c50f8b6f9..89ac473759 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=ZIO HTTP}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala index e5d90d5950..fca167f32b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=Future; server=Pekko HTTP}: Stream response as a Pekko stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala index 726d7ba717..c0439d0e23 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=cats-effect}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala index 19a89b627f..4c894567ad 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=Future; server=Pekko HTTP}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala index 938b233745..cc2a7edb02 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala @@ -1,8 +1,8 @@ // {cat=Testing; json=circe}: Test endpoints using the MockServer client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 -//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.8 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.mock-server:mockserver-netty:5.15.0 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index 6551396a45..6341f56b46 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: A WebSocket chat across multiple clients connected to the same server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index 29224f6dee..07637677d7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=cats-effect; server=http4s; json=circe; docs=AsyncAPI}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.0 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index 5b28c5ee62..405ad7144e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala index 0f78fba637..44515f9daa 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=Future; server=Pekko HTTP}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.7 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.7 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.8 From 2a7504d24e94aeb06e591906738d05936162a874 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 5 Nov 2024 02:22:00 +0100 Subject: [PATCH 059/127] Update http4s-blaze-client, ... to 0.23.17 (#4130) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index c5bd9d4c1c..6c2849954c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,6 +1,6 @@ object Versions { val http4s = "0.23.29" - val http4sBlazeServer = "0.23.16" + val http4sBlazeServer = "0.23.17" val http4sBlazeClient = "0.23.16" val catsCore = "2.12.0" val catsEffect = "3.5.5" From 546b52ee68f723934d831198a3834b7609b86763 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 6 Nov 2024 01:30:50 +0100 Subject: [PATCH 060/127] Update async-http-client-backend-cats, ... to 3.10.1 (#4107) --- .../scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala | 2 +- .../sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala | 2 +- .../sttp/tapir/examples/security/ServerSecurityLogicZio.scala | 2 +- .../sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index 4aa1abb05a..d45b53ebc4 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -5,7 +5,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.1 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index 1b656b0b09..e850de816c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -3,7 +3,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.0 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.1 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index c88ef4c974..91ed5b0f37 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -2,7 +2,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.0 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.1 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index 07637677d7..4026b2cf2c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -5,7 +5,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 -//> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.0 +//> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.1 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.websocket From fd47d76ce7b867df7804d5e6482ce63a399f76bf Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 6 Nov 2024 01:32:48 +0100 Subject: [PATCH 061/127] Update guava to 33.3.1-jre (#4133) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 1e5f696ab3..92e52dc3f2 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -20,6 +20,6 @@ addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.0") // needed to override the Android flavor of Guava coming from pekko-grpc-sbt-plugin, which causes failures in Scala.JS builds -dependencyOverrides += "com.google.guava" % "guava" % "32.1.3-jre" +dependencyOverrides += "com.google.guava" % "guava" % "33.3.1-jre" addDependencyTreePlugin From c613001046e76a15683e086aa41d58e11ac000a8 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 6 Nov 2024 01:49:15 +0100 Subject: [PATCH 062/127] Update swagger-ui to 5.18.0 (#4136) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 6c2849954c..f12422b027 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -16,7 +16,7 @@ object Versions { val akkaStreams = "2.6.20" val pekkoHttp = "1.1.0" val pekkoStreams = "1.1.2" - val swaggerUi = "5.17.14" + val swaggerUi = "5.18.0" val upickle = "3.3.1" val playJson = "3.0.1" val play29Json = "3.0.4" From f2162ef6e4115c1061fe220eb1fad4c79b01482c Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 6 Nov 2024 01:49:27 +0100 Subject: [PATCH 063/127] Update gatling-sbt to 4.10.2 (#4134) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 92e52dc3f2..c61cb85a24 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -14,7 +14,7 @@ addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") -addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.1") +addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.2") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") From 37d1fdc2f66e83aaba0bec33fd604c55d1d553a2 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 6 Nov 2024 02:12:05 +0100 Subject: [PATCH 064/127] Update http4s-blaze-client to 0.23.17 (#4135) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index f12422b027..d72e474378 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,7 +1,7 @@ object Versions { val http4s = "0.23.29" val http4sBlazeServer = "0.23.17" - val http4sBlazeClient = "0.23.16" + val http4sBlazeClient = "0.23.17" val catsCore = "2.12.0" val catsEffect = "3.5.5" val circe = "0.14.9" From 6d4c20a17efb5bf1ead33c3829fc5e2ea9a8b841 Mon Sep 17 00:00:00 2001 From: Krzysztof Ciesielski Date: Wed, 6 Nov 2024 12:33:41 +0100 Subject: [PATCH 065/127] [Snyk] Upgrade aws-cdk-lib from 2.80.0 to 2.162.1 (#4137) Co-authored-by: snyk-bot --- serverless/aws/cdk/src/main/resources/app-template/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serverless/aws/cdk/src/main/resources/app-template/package.json b/serverless/aws/cdk/src/main/resources/app-template/package.json index fab3667600..0336088658 100644 --- a/serverless/aws/cdk/src/main/resources/app-template/package.json +++ b/serverless/aws/cdk/src/main/resources/app-template/package.json @@ -21,7 +21,7 @@ "typescript": "~3.9.7" }, "dependencies": { - "aws-cdk-lib": "2.80.0", + "aws-cdk-lib": "2.162.1", "constructs": "^10.0.0" } } From c43c795ca8d4885d9ed072a25dfd3e94011c469d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 7 Nov 2024 01:41:27 +0100 Subject: [PATCH 066/127] Update swagger-ui to 5.18.1 (#4139) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index d72e474378..0aa1c6cd73 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -16,7 +16,7 @@ object Versions { val akkaStreams = "2.6.20" val pekkoHttp = "1.1.0" val pekkoStreams = "1.1.2" - val swaggerUi = "5.18.0" + val swaggerUi = "5.18.1" val upickle = "3.3.1" val playJson = "3.0.1" val play29Json = "3.0.4" From 21d2aeb9c1f6d1aaa417002eedce3d74226dbe0b Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 8 Nov 2024 01:31:56 +0100 Subject: [PATCH 067/127] Update zio, zio-streams, zio-test, ... to 2.1.12 (#4142) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 0aa1c6cd73..aa61c8f8bf 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -35,7 +35,7 @@ object Versions { val refined = "0.11.2" val iron = "2.6.0" val enumeratum = "1.7.5" - val zio = "2.1.11" + val zio = "2.1.12" val zioHttp = "3.0.1" val zioInteropCats = "23.1.0.3" val zioInteropReactiveStreams = "2.0.2" From fd55044be6e40251bdd1de1d5f9c9b252885c999 Mon Sep 17 00:00:00 2001 From: Mateusz Zakarczemny Date: Fri, 8 Nov 2024 20:56:44 +0100 Subject: [PATCH 068/127] Better handling of Empty entity in Akka an Pekko BodyListener. (#4140) Co-authored-by: Mateusz Zakarczemny --- .../server/akkahttp/AkkaBodyListener.scala | 2 +- .../server/akkahttp/AkkaHttpServerTest.scala | 56 ++++++++++++++++++ .../server/pekkohttp/PekkoBodyListener.scala | 2 +- .../pekkohttp/PekkoHttpServerTest.scala | 57 +++++++++++++++++++ 4 files changed, 115 insertions(+), 2 deletions(-) diff --git a/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaBodyListener.scala b/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaBodyListener.scala index 5d1a9e0a1d..3c428c6fa3 100644 --- a/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaBodyListener.scala +++ b/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaBodyListener.scala @@ -14,7 +14,7 @@ class AkkaBodyListener(implicit ec: ExecutionContext) extends BodyListener[Futur override def onComplete(body: AkkaResponseBody)(cb: Try[Unit] => Future[Unit]): Future[AkkaResponseBody] = { body match { case ws @ Left(_) => cb(Success(())).map(_ => ws) - case Right(e @ HttpEntity.Empty) => + case Right(e) if e.isKnownEmpty => Future.successful(Right(e)).andThen { case _ => cb(Success(())) } case Right(e: UniversalEntity) => Future.successful( diff --git a/server/akka-http-server/src/test/scala/sttp/tapir/server/akkahttp/AkkaHttpServerTest.scala b/server/akka-http-server/src/test/scala/sttp/tapir/server/akkahttp/AkkaHttpServerTest.scala index db589bce84..b603e61cb8 100644 --- a/server/akka-http-server/src/test/scala/sttp/tapir/server/akkahttp/AkkaHttpServerTest.scala +++ b/server/akka-http-server/src/test/scala/sttp/tapir/server/akkahttp/AkkaHttpServerTest.scala @@ -14,15 +14,19 @@ import sttp.capabilities.akka.AkkaStreams import sttp.client3._ import sttp.client3.akkahttp.AkkaHttpBackend import sttp.model.sse.ServerSentEvent +import sttp.model.Header +import sttp.model.MediaType import sttp.monad.FutureMonad import sttp.monad.syntax._ import sttp.tapir._ import sttp.tapir.server.interceptor._ import sttp.tapir.server.interceptor.metrics.MetricsRequestInterceptor +import sttp.tapir.server.metrics.{EndpointMetric, Metric} import sttp.tapir.server.tests._ import sttp.tapir.tests.{Test, TestSuite} import java.util.UUID +import java.util.concurrent.atomic.AtomicInteger import scala.concurrent.Future import scala.util.Random @@ -150,6 +154,58 @@ class AkkaHttpServerTest extends TestSuite with EitherValues { r.header("Content-Length") shouldBe Some("0") r.header("Transfer-Encoding") shouldBe None } + }, + Test("execute metrics interceptors for empty body and json content type") { + val e = endpoint.post.in(stringBody) + .out(stringBody) + .out(header(Header.contentType(MediaType.ApplicationJson))) + .serverLogicSuccess[Future](body => Future.successful(body)) + + class DummyMetric { + val onRequestCnt = new AtomicInteger(0) + val onEndpointRequestCnt = new AtomicInteger(0) + val onResponseHeadersCnt = new AtomicInteger(0) + val onResponseBodyCnt = new AtomicInteger(0) + } + val metric = new DummyMetric() + val customMetrics: Metric[Future, DummyMetric] = + Metric( + metric = metric, + onRequest = (_, metric, me) => + me.eval { + metric.onRequestCnt.incrementAndGet() + EndpointMetric( + onEndpointRequest = Some((_) => + me.eval(metric.onEndpointRequestCnt.incrementAndGet()), + ), + onResponseHeaders = Some((_, _) => + me.eval(metric.onResponseHeadersCnt.incrementAndGet()), + ), + onResponseBody = Some((_, _) => + me.eval(metric.onResponseBodyCnt.incrementAndGet()), + ), + onException = None, + ) + }, + ) + val route = AkkaHttpServerInterpreter( + AkkaHttpServerOptions.customiseInterceptors + .metricsInterceptor(new MetricsRequestInterceptor[Future](List(customMetrics), Seq.empty)) + .options + ).toRoute(e) + + interpreter + .server(NonEmptyList.of(route)) + .use { port => + basicRequest.post(uri"http://localhost:$port").body("").send(backend).map { response => + response.body shouldBe Right("") + metric.onRequestCnt.get() shouldBe 1 + metric.onEndpointRequestCnt.get() shouldBe 1 + metric.onResponseHeadersCnt.get() shouldBe 1 + metric.onResponseBodyCnt.get() shouldBe 1 + } + } + .unsafeToFuture() } ) def drainAkka(stream: AkkaStreams.BinaryStream): Future[Unit] = diff --git a/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoBodyListener.scala b/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoBodyListener.scala index 73b1606856..b5a9b78c4c 100644 --- a/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoBodyListener.scala +++ b/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoBodyListener.scala @@ -14,7 +14,7 @@ class PekkoBodyListener(implicit ec: ExecutionContext) extends BodyListener[Futu override def onComplete(body: PekkoResponseBody)(cb: Try[Unit] => Future[Unit]): Future[PekkoResponseBody] = { body match { case ws @ Left(_) => cb(Success(())).map(_ => ws) - case Right(e @ HttpEntity.Empty) => + case Right(e) if e.isKnownEmpty => Future.successful(Right(e)).andThen { case _ => cb(Success(())) } case Right(e: UniversalEntity) => Future.successful( diff --git a/server/pekko-http-server/src/test/scala/sttp/tapir/server/pekkohttp/PekkoHttpServerTest.scala b/server/pekko-http-server/src/test/scala/sttp/tapir/server/pekkohttp/PekkoHttpServerTest.scala index edf58cb4db..c3dfd25c28 100644 --- a/server/pekko-http-server/src/test/scala/sttp/tapir/server/pekkohttp/PekkoHttpServerTest.scala +++ b/server/pekko-http-server/src/test/scala/sttp/tapir/server/pekkohttp/PekkoHttpServerTest.scala @@ -14,14 +14,19 @@ import sttp.capabilities.pekko.PekkoStreams import sttp.client3._ import sttp.client3.pekkohttp.PekkoHttpBackend import sttp.model.sse.ServerSentEvent +import sttp.model.Header +import sttp.model.MediaType import sttp.monad.FutureMonad import sttp.monad.syntax._ import sttp.tapir._ import sttp.tapir.server.interceptor._ +import sttp.tapir.server.interceptor.metrics.MetricsRequestInterceptor +import sttp.tapir.server.metrics.{EndpointMetric, Metric} import sttp.tapir.server.tests._ import sttp.tapir.tests.{Test, TestSuite} import java.util.UUID +import java.util.concurrent.atomic.AtomicInteger import scala.concurrent.Future import scala.util.Random @@ -98,6 +103,58 @@ class PekkoHttpServerTest extends TestSuite with EitherValues { basicRequest.post(uri"http://localhost:$port").body("test123").send(backend).map(_.body shouldBe Right("replaced")) } .unsafeToFuture() + }, + Test("execute metrics interceptors for empty body and json content type") { + val e = endpoint.post.in(stringBody) + .out(stringBody) + .out(header(Header.contentType(MediaType.ApplicationJson))) + .serverLogicSuccess[Future](body => Future.successful(body)) + + class DummyMetric { + val onRequestCnt = new AtomicInteger(0) + val onEndpointRequestCnt = new AtomicInteger(0) + val onResponseHeadersCnt = new AtomicInteger(0) + val onResponseBodyCnt = new AtomicInteger(0) + } + val metric = new DummyMetric() + val customMetrics: Metric[Future, DummyMetric] = + Metric( + metric = metric, + onRequest = (_, metric, me) => + me.eval { + metric.onRequestCnt.incrementAndGet() + EndpointMetric( + onEndpointRequest = Some((_) => + me.eval(metric.onEndpointRequestCnt.incrementAndGet()), + ), + onResponseHeaders = Some((_, _) => + me.eval(metric.onResponseHeadersCnt.incrementAndGet()), + ), + onResponseBody = Some((_, _) => + me.eval(metric.onResponseBodyCnt.incrementAndGet()), + ), + onException = None, + ) + }, + ) + val route = PekkoHttpServerInterpreter( + PekkoHttpServerOptions.customiseInterceptors + .metricsInterceptor(new MetricsRequestInterceptor[Future](List(customMetrics), Seq.empty)) + .options + ).toRoute(e) + + interpreter + .server(NonEmptyList.of(route)) + .use { port => + basicRequest.post(uri"http://localhost:$port").body("").send(backend).map { response => + response.body shouldBe Right("") + metric.onRequestCnt.get() shouldBe 1 + metric.onEndpointRequestCnt.get() shouldBe 1 + metric.onResponseHeadersCnt.get() shouldBe 1 + metric.onResponseBodyCnt.get() shouldBe 1 + } + } + .unsafeToFuture() } ) def drainPekko(stream: PekkoStreams.BinaryStream): Future[Unit] = From b46533fce77e69cec5389e9e7fbc5952e0adc65e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 9 Nov 2024 01:33:34 +0100 Subject: [PATCH 069/127] Update opentelemetry-api, ... to 1.44.0 (#4145) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index aa61c8f8bf..a91da46eaf 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -60,7 +60,7 @@ object Versions { val fs2 = "3.11.0" val decline = "2.4.1" val quicklens = "1.9.9" - val openTelemetry = "1.43.0" + val openTelemetry = "1.44.0" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" From addc381724048ac28720312290650c95d909907f Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 10 Nov 2024 01:34:16 +0100 Subject: [PATCH 070/127] Update sbt-buildinfo to 0.13.1 (#4147) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index c61cb85a24..a23acc89f8 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -15,7 +15,7 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.2") -addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.0") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.0") From b1837448b00fb68fe9a0d801a958c2ec8e27d2b9 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 10 Nov 2024 01:38:28 +0100 Subject: [PATCH 071/127] Update opentelemetry-exporter-otlp to 1.44.0 (#4149) --- .../examples/observability/openTelemetryMetricsExample.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 8c81ce56c4..1ac7050645 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.8 -//> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.43.0 +//> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.44.0 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability From f3ea04a6d160fa9fa1e869703328957408be9ce5 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 10 Nov 2024 01:50:02 +0100 Subject: [PATCH 072/127] Update jsoniter-scala-core, ... to 2.31.3 (#4148) --- .../oneOf-json-roundtrip_jsoniter/build.sbt | 4 ++-- .../oneOf-json-roundtrip_jsoniter_scala3/build.sbt | 4 ++-- project/Versions.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt index 6b8fc5bc6a..81e895e2e9 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.1", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.1" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.3", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.3" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt index 199b4caa1f..82212cd835 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.1", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.1" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.3", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.3" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/project/Versions.scala b/project/Versions.scala index a91da46eaf..f012a870d8 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -66,5 +66,5 @@ object Versions { val nettyAll = "4.1.114.Final" val logback = "1.5.12" val slf4j = "2.0.16" - val jsoniter = "2.31.1" + val jsoniter = "2.31.3" } From 87c042102430dd06862a3f2b95e43acd156430c1 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 11 Nov 2024 01:31:15 +0100 Subject: [PATCH 073/127] Update opentelemetry-api, ... to 1.44.1 (#4151) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index f012a870d8..9f9e83c1dc 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -60,7 +60,7 @@ object Versions { val fs2 = "3.11.0" val decline = "2.4.1" val quicklens = "1.9.9" - val openTelemetry = "1.44.0" + val openTelemetry = "1.44.1" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" From a1c17879ba6fb4213ae7968f8b826caa5c8fee5c Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 11 Nov 2024 01:35:05 +0100 Subject: [PATCH 074/127] Update zio-prelude to 1.0.0-RC32 (#4150) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 9f9e83c1dc..7194d3f3c1 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -52,7 +52,7 @@ object Versions { val derevo = "0.13.0" val newtype = "0.4.4" val monixNewtype = "0.3.0" - val zioPrelude = "1.0.0-RC31" + val zioPrelude = "1.0.0-RC32" val awsLambdaInterface = "2.6.0" val armeria = "1.30.1" val scalaJava8Compat = "1.0.2" From 85424fe2f2a1ec2ddb8e1a9bfb758ccd001627ec Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 11 Nov 2024 01:39:09 +0100 Subject: [PATCH 075/127] Update swagger-ui to 5.18.2 (#4152) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 7194d3f3c1..204a8dbf52 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -16,7 +16,7 @@ object Versions { val akkaStreams = "2.6.20" val pekkoHttp = "1.1.0" val pekkoStreams = "1.1.2" - val swaggerUi = "5.18.1" + val swaggerUi = "5.18.2" val upickle = "3.3.1" val playJson = "3.0.1" val play29Json = "3.0.4" From 7aae5261e19a4509f04537aeac00d93978b64b1b Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 12 Nov 2024 01:37:23 +0100 Subject: [PATCH 076/127] Update zio-prelude to 1.0.0-RC33 (#4154) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 204a8dbf52..798f5bdd93 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -52,7 +52,7 @@ object Versions { val derevo = "0.13.0" val newtype = "0.4.4" val monixNewtype = "0.3.0" - val zioPrelude = "1.0.0-RC32" + val zioPrelude = "1.0.0-RC33" val awsLambdaInterface = "2.6.0" val armeria = "1.30.1" val scalaJava8Compat = "1.0.2" From bc8cde6f145a53b9859d68a56b9834e691c32d1f Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 12 Nov 2024 01:38:42 +0100 Subject: [PATCH 077/127] Update opentelemetry-exporter-otlp to 1.44.1 (#4155) --- .../examples/observability/openTelemetryMetricsExample.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 1ac7050645..5d01571573 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -4,7 +4,7 @@ //> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 //> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.8 -//> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.44.0 +//> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.44.1 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability From d7f84bd89b4abbdf38c9340c4568a53deeebad63 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 12 Nov 2024 01:43:23 +0100 Subject: [PATCH 078/127] Update tethys-core, tethys-derivation, ... to 0.29.3 (#4153) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 798f5bdd93..9f6ebd0ee7 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -44,7 +44,7 @@ object Versions { val playServer = "3.0.5" val play29Client = "2.2.9" val play29Server = "2.9.5" - val tethys = "0.29.2" + val tethys = "0.29.3" val vertx = "4.5.10" val jsScalaJavaTime = "2.6.0" val nativeScalaJavaTime = "2.6.0" From 99b88616036672fc645a7d2dfd06002d269d4cfd Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Tue, 12 Nov 2024 16:44:39 +0100 Subject: [PATCH 079/127] Fix cleanup in Netty handler after a request timeout (#4156) --- .scalafix.conf | 3 +- build.sbt | 2 + project/Versions.scala | 2 +- .../metrics/MetricsEndpointInterceptor.scala | 8 +- .../sttp/tapir/server/netty/NettyConfig.scala | 4 +- .../netty/internal/NettyServerHandler.scala | 100 +++++++++++++----- .../NettyFutureRequestTimeoutTests.scala | 81 ++++++++++++++ .../server/netty/NettyFutureServerTest.scala | 3 +- .../netty/sync/NettySyncServerOptions.scala | 7 +- .../sync/NettySyncRequestTimeoutTests.scala | 87 +++++++++++++++ .../netty/sync/NettySyncServerTest.scala | 4 +- 11 files changed, 265 insertions(+), 36 deletions(-) create mode 100644 server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureRequestTimeoutTests.scala create mode 100644 server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncRequestTimeoutTests.scala diff --git a/.scalafix.conf b/.scalafix.conf index 25e991dbe3..40c578c6f6 100644 --- a/.scalafix.conf +++ b/.scalafix.conf @@ -1,2 +1,3 @@ OrganizeImports.groupedImports = AggressiveMerge -OrganizeImports.targetDialect = Scala3 \ No newline at end of file +OrganizeImports.targetDialect = Scala3 +OrganizeImports.removeUnused = false \ No newline at end of file diff --git a/build.sbt b/build.sbt index 30215bfcb6..6c5c0eeb3f 100644 --- a/build.sbt +++ b/build.sbt @@ -85,6 +85,8 @@ val commonSettings = commonSmlBuildSettings ++ ossPublishSettings ++ Seq( case _ => Seq("-Xmax-inlines", "64") } }, + Test / scalacOptions += "-Wconf:msg=unused value of type org.scalatest.Assertion:s", + Test / scalacOptions += "-Wconf:msg=unused value of type org.scalatest.compatible.Assertion:s", evictionErrorLevel := Level.Info ) diff --git a/project/Versions.scala b/project/Versions.scala index 9f6ebd0ee7..d1a8e9e852 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -10,7 +10,7 @@ object Versions { val helidon = "4.0.10" val sttp = "3.10.1" val sttpModel = "1.7.11" - val sttpShared = "1.3.22" + val sttpShared = "1.4.0" val sttpApispec = "0.11.3" val akkaHttp = "10.2.10" val akkaStreams = "2.6.20" diff --git a/server/core/src/main/scala/sttp/tapir/server/interceptor/metrics/MetricsEndpointInterceptor.scala b/server/core/src/main/scala/sttp/tapir/server/interceptor/metrics/MetricsEndpointInterceptor.scala index 57f8fc047d..069232e153 100644 --- a/server/core/src/main/scala/sttp/tapir/server/interceptor/metrics/MetricsEndpointInterceptor.scala +++ b/server/core/src/main/scala/sttp/tapir/server/interceptor/metrics/MetricsEndpointInterceptor.scala @@ -47,7 +47,7 @@ private[metrics] class MetricsEndpointInterceptor[F[_]]( )(implicit monad: MonadError[F], bodyListener: BodyListener[F, B]): F[ServerResponse[B]] = { if (ignoreEndpoints.contains(ctx.endpoint)) endpointHandler.onDecodeSuccess(ctx) else { - val responseWithMetrics: F[ServerResponse[B]] = for { + def responseWithMetrics: F[ServerResponse[B]] = for { _ <- collectRequestMetrics(ctx.endpoint) response <- endpointHandler.onDecodeSuccess(ctx) _ <- collectResponseHeadersMetrics(ctx.endpoint, response) @@ -64,7 +64,7 @@ private[metrics] class MetricsEndpointInterceptor[F[_]]( )(implicit monad: MonadError[F], bodyListener: BodyListener[F, B]): F[ServerResponse[B]] = { if (ignoreEndpoints.contains(ctx.endpoint)) endpointHandler.onSecurityFailure(ctx) else { - val responseWithMetrics: F[ServerResponse[B]] = for { + def responseWithMetrics: F[ServerResponse[B]] = for { _ <- collectRequestMetrics(ctx.endpoint) response <- endpointHandler.onSecurityFailure(ctx) _ <- collectResponseHeadersMetrics(ctx.endpoint, response) @@ -83,7 +83,7 @@ private[metrics] class MetricsEndpointInterceptor[F[_]]( )(implicit monad: MonadError[F], bodyListener: BodyListener[F, B]): F[Option[ServerResponse[B]]] = { if (ignoreEndpoints.contains(ctx.endpoint)) endpointHandler.onDecodeFailure(ctx) else { - val responseWithMetrics: F[Option[ServerResponse[B]]] = for { + def responseWithMetrics: F[Option[ServerResponse[B]]] = for { response <- endpointHandler.onDecodeFailure(ctx) withMetrics <- response match { case Some(response) => @@ -129,7 +129,7 @@ private[metrics] class MetricsEndpointInterceptor[F[_]]( } } - private def handleResponseExceptions[T](r: F[T], e: AnyEndpoint)(implicit monad: MonadError[F]): F[T] = + private def handleResponseExceptions[T](r: => F[T], e: AnyEndpoint)(implicit monad: MonadError[F]): F[T] = r.handleError { case ex: Exception => collectExceptionMetrics(e, ex) } private def collectExceptionMetrics[T](e: AnyEndpoint, ex: Throwable)(implicit monad: MonadError[F]): F[T] = diff --git a/server/netty-server/src/main/scala/sttp/tapir/server/netty/NettyConfig.scala b/server/netty-server/src/main/scala/sttp/tapir/server/netty/NettyConfig.scala index dc799c362a..c8eee8395b 100644 --- a/server/netty-server/src/main/scala/sttp/tapir/server/netty/NettyConfig.scala +++ b/server/netty-server/src/main/scala/sttp/tapir/server/netty/NettyConfig.scala @@ -104,8 +104,8 @@ case class NettyConfig( def initPipeline(f: NettyConfig => (ChannelPipeline, ChannelHandler) => Unit): NettyConfig = copy(initPipeline = f) - def withGracefulShutdownTimeout(t: FiniteDuration) = copy(gracefulShutdownTimeout = Some(t)) - def noGracefulShutdown = copy(gracefulShutdownTimeout = None) + def withGracefulShutdownTimeout(t: FiniteDuration): NettyConfig = copy(gracefulShutdownTimeout = Some(t)) + def noGracefulShutdown: NettyConfig = copy(gracefulShutdownTimeout = None) def serverHeader(h: String): NettyConfig = copy(serverHeader = Some(h)) diff --git a/server/netty-server/src/main/scala/sttp/tapir/server/netty/internal/NettyServerHandler.scala b/server/netty-server/src/main/scala/sttp/tapir/server/netty/internal/NettyServerHandler.scala index 6183072e0f..40ffe282dc 100644 --- a/server/netty-server/src/main/scala/sttp/tapir/server/netty/internal/NettyServerHandler.scala +++ b/server/netty-server/src/main/scala/sttp/tapir/server/netty/internal/NettyServerHandler.scala @@ -30,6 +30,9 @@ import scala.collection.mutable.{Queue => MutableQueue} import scala.concurrent.{ExecutionContext, Future} import scala.util.control.NonFatal import scala.util.{Failure, Success} +import java.util.concurrent.TimeoutException +import org.reactivestreams.Subscriber +import org.reactivestreams.Subscription /** @param unsafeRunAsync * Function which dispatches given effect to run asynchronously, returning its result as a Future, and function of type `() => @@ -109,11 +112,13 @@ class NettyServerHandler[F[_]]( evt match { case e: IdleStateEvent => if (e.state() == IdleState.WRITER_IDLE) { - logger.error(s"Closing connection due to exceeded response timeout of ${config.requestTimeout}") + logger.error( + s"Closing connection due to exceeded response timeout of ${config.requestTimeout.map(_.toString).getOrElse("(not set)")}" + ) writeError503ThenClose(ctx) } if (e.state() == IdleState.ALL_IDLE) { - logger.debug(s"Closing connection due to exceeded idle timeout of ${config.idleTimeout}") + logger.debug(s"Closing connection due to exceeded idle timeout of ${config.idleTimeout.map(_.toString).getOrElse("(not set)")}") val _ = ctx.close() } case other => @@ -147,30 +152,42 @@ class NettyServerHandler[F[_]]( pendingResponses.enqueue(cancellationSwitch) lastResponseSent = lastResponseSent.flatMap { _ => runningFuture - .andThen { case _ => - requestTimeoutHandler.foreach(ctx.pipeline().remove) - }(eventLoopContext) - .transform { - case Success(serverResponse) => - pendingResponses.dequeue() - try { - handleResponse(ctx, req, serverResponse) - Success(()) - } catch { - case NonFatal(ex) => - writeError500(req, ex) - Failure(ex) - } finally { - val _ = releaseReq() - } - case Failure(NonFatal(ex)) => - try { - writeError500(req, ex) - Failure(ex) - } finally { - val _ = releaseReq() + .transform { result => + try { + // #4131: the channel might be closed if the request timed out + // both timeout & response-ready events (i.e., comleting this future) are handled on the event loop's executor, + // so they won't be handled concurrently + if (ctx.channel().isOpen()) { + requestTimeoutHandler.foreach(ctx.pipeline().remove) + result match { + case Success(serverResponse) => + pendingResponses.dequeue() + try { + handleResponse(ctx, req, serverResponse) + Success(()) + } catch { + case NonFatal(ex) => + writeError500(req, ex) + Failure(ex) + } + case Failure(NonFatal(ex)) => + writeError500(req, ex) + Failure(ex) + case Failure(fatalException) => Failure(fatalException) + } + } else { + // pendingResponses is already dequeued because the channel is closed + result match { + case Success(serverResponse) => + val e = new TimeoutException("Request timed out") + handleResponseAfterTimeout(ctx, serverResponse, e) + Failure(e) + case Failure(e) => Failure(e) + } } - case Failure(fatalException) => Failure(fatalException) + } finally { + val _ = releaseReq() + } }(eventLoopContext) }(eventLoopContext) } @@ -270,6 +287,39 @@ class NettyServerHandler[F[_]]( } ) + private def handleResponseAfterTimeout( + ctx: ChannelHandlerContext, + serverResponse: ServerResponse[NettyResponse], + timeoutException: Exception + ): Unit = + serverResponse.handle( + ctx = ctx, + byteBufHandler = (channelPromise, byteBuf) => { val _ = channelPromise.setFailure(timeoutException) }, + chunkedStreamHandler = (channelPromise, chunkedStream) => { + chunkedStream.close() + val _ = channelPromise.setFailure(timeoutException) + }, + chunkedFileHandler = (channelPromise, chunkedFile) => { + chunkedFile.close() + val _ = channelPromise.setFailure(timeoutException) + }, + reactiveStreamHandler = (channelPromise, publisher) => { + publisher.subscribe(new Subscriber[HttpContent] { + override def onSubscribe(s: Subscription): Unit = { + s.cancel() + val _ = channelPromise.setFailure(timeoutException) + } + override def onNext(t: HttpContent): Unit = () + override def onError(t: Throwable): Unit = () + override def onComplete(): Unit = () + }) + }, + wsHandler = (responseContent) => { + val _ = responseContent.channelPromise.setFailure(timeoutException) + }, + noBodyHandler = () => () + ) + private def initWsPipeline( ctx: ChannelHandlerContext, r: ReactiveWebSocketProcessorNettyResponseContent, diff --git a/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureRequestTimeoutTests.scala b/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureRequestTimeoutTests.scala new file mode 100644 index 0000000000..d65308176c --- /dev/null +++ b/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureRequestTimeoutTests.scala @@ -0,0 +1,81 @@ +package sttp.tapir.server.netty + +import sttp.tapir._ +import sttp.tapir.tests.Test +import scala.concurrent.Future +import java.util.concurrent.atomic.AtomicInteger +import scala.concurrent.duration.DurationInt +import sttp.tapir.server.interceptor.metrics.MetricsRequestInterceptor +import sttp.tapir.server.metrics.Metric +import sttp.tapir.server.metrics.EndpointMetric +import io.netty.channel.EventLoopGroup +import cats.effect.IO +import cats.effect.kernel.Resource +import scala.concurrent.ExecutionContext +import sttp.client3._ +import sttp.capabilities.fs2.Fs2Streams +import sttp.capabilities.WebSockets +import org.scalatest.matchers.should.Matchers._ +import cats.effect.unsafe.implicits.global +import sttp.model.StatusCode + +class NettyFutureRequestTimeoutTests(eventLoopGroup: EventLoopGroup, backend: SttpBackend[IO, Fs2Streams[IO] with WebSockets])(implicit + ec: ExecutionContext +) { + def tests(): List[Test] = List( + Test("properly update metrics when a request times out") { + val e = endpoint.post + .in(stringBody) + .out(stringBody) + .serverLogicSuccess[Future] { body => + Thread.sleep(2000); Future.successful(body) + } + + val activeRequests = new AtomicInteger() + val totalRequests = new AtomicInteger() + val customMetrics: List[Metric[Future, AtomicInteger]] = List( + Metric( + metric = activeRequests, + onRequest = (_, metric, me) => + me.eval { + EndpointMetric() + .onEndpointRequest { _ => me.eval { val _ = metric.incrementAndGet(); } } + .onResponseBody { (_, _) => me.eval { val _ = metric.decrementAndGet(); } } + .onException { (_, _) => me.eval { val _ = metric.decrementAndGet(); } } + } + ), + Metric( + metric = totalRequests, + onRequest = (_, metric, me) => me.eval(EndpointMetric().onEndpointRequest { _ => me.eval { val _ = metric.incrementAndGet(); } }) + ) + ) + + val config = + NettyConfig.default + .eventLoopGroup(eventLoopGroup) + .randomPort + .withDontShutdownEventLoopGroupOnClose + .noGracefulShutdown + .requestTimeout(1.second) + val options = NettyFutureServerOptions.customiseInterceptors + .metricsInterceptor(new MetricsRequestInterceptor[Future](customMetrics, Seq.empty)) + .options + val bind = IO.fromFuture(IO.delay(NettyFutureServer(options, config).addEndpoints(List(e)).start())) + + Resource + .make(bind)(server => IO.fromFuture(IO.delay(server.stop()))) + .map(_.port) + .use { port => + basicRequest.post(uri"http://localhost:$port").body("test").send(backend).map { response => + response.body should matchPattern { case Left(_) => } + response.code shouldBe StatusCode.ServiceUnavailable + // the metrics will only be updated when the endpoint's logic completes, which is 1 second after receiving the timeout response + Thread.sleep(1100) + activeRequests.get() shouldBe 0 + totalRequests.get() shouldBe 1 + } + } + .unsafeToFuture() + } + ) +} diff --git a/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureServerTest.scala b/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureServerTest.scala index f8f263706e..401940ff69 100644 --- a/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureServerTest.scala +++ b/server/netty-server/src/test/scala/sttp/tapir/server/netty/NettyFutureServerTest.scala @@ -23,7 +23,8 @@ class NettyFutureServerTest extends TestSuite with EitherValues { val tests = new AllServerTests(createServerTest, interpreter, backend, multipart = false).tests() ++ - new ServerGracefulShutdownTests(createServerTest, Sleeper.futureSleeper).tests() + new ServerGracefulShutdownTests(createServerTest, Sleeper.futureSleeper).tests() ++ + new NettyFutureRequestTimeoutTests(eventLoopGroup, backend).tests() (tests, eventLoopGroup) }) { case (_, eventLoopGroup) => diff --git a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServerOptions.scala b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServerOptions.scala index 097c20b24e..1d69fa3e11 100644 --- a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServerOptions.scala +++ b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServerOptions.scala @@ -47,7 +47,12 @@ object NettySyncServerOptions: doLogWhenReceived = debugLog(_, None), doLogWhenHandled = debugLog, doLogAllDecodeFailures = debugLog, - doLogExceptions = (msg: String, ex: Throwable) => log.error(msg, ex), + doLogExceptions = (msg: String, e: Throwable) => + e match + // if server logic is interrupted (e.g. due to timeout), this isn't an error, but might still be useful for debugging, + // to know how far processing got + case _: InterruptedException => log.debug(msg, e) + case _ => log.error(msg, e), noLog = () ) diff --git a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncRequestTimeoutTests.scala b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncRequestTimeoutTests.scala new file mode 100644 index 0000000000..65769d9ba6 --- /dev/null +++ b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncRequestTimeoutTests.scala @@ -0,0 +1,87 @@ +package sttp.tapir.server.netty + +import cats.effect.IO +import cats.effect.unsafe.implicits.global +import io.netty.channel.EventLoopGroup +import org.scalatest.matchers.should.Matchers.* +import ox.* +import sttp.capabilities.WebSockets +import sttp.capabilities.fs2.Fs2Streams +import sttp.client3.* +import sttp.model.StatusCode +import sttp.tapir.* +import sttp.tapir.server.interceptor.metrics.MetricsRequestInterceptor +import sttp.tapir.server.metrics.{EndpointMetric, Metric} +import sttp.tapir.server.netty.sync.{NettySyncServer, NettySyncServerOptions} +import sttp.tapir.tests.Test + +import java.util.concurrent.atomic.AtomicInteger +import scala.concurrent.Future +import scala.concurrent.duration.DurationInt +import org.slf4j.LoggerFactory + +class NettySyncRequestTimeoutTests(eventLoopGroup: EventLoopGroup, backend: SttpBackend[IO, Fs2Streams[IO] with WebSockets]): + val logger = LoggerFactory.getLogger(getClass.getName) + + def tests(): List[Test] = List( + Test("properly update metrics when a request times out") { + val e = endpoint.post + .in(stringBody) + .out(stringBody) + .serverLogicSuccess[Identity]: body => + Thread.sleep(2000) + body + + val activeRequests = new AtomicInteger() + val totalRequests = new AtomicInteger() + val customMetrics: List[Metric[Identity, AtomicInteger]] = List( + Metric( + metric = activeRequests, + onRequest = (_, metric, me) => + me.eval: + EndpointMetric() + .onEndpointRequest: _ => + val _ = metric.incrementAndGet(); + (): Identity[Unit] + .onResponseBody: (_, _) => + val _ = metric.decrementAndGet(); + .onException: (_, _) => + val _ = metric.decrementAndGet(); + ), + Metric( + metric = totalRequests, + onRequest = (_, metric, me) => + me.eval(EndpointMetric().onEndpointRequest: _ => + val _ = metric.incrementAndGet(); + ) + ) + ) + + val config = + NettyConfig.default + .eventLoopGroup(eventLoopGroup) + .randomPort + .withDontShutdownEventLoopGroupOnClose + .noGracefulShutdown + .requestTimeout(1.second) + val options = NettySyncServerOptions.customiseInterceptors + .metricsInterceptor(new MetricsRequestInterceptor[Identity](customMetrics, Seq.empty)) + .options + + Future.successful: + supervised: + val port = useInScope(NettySyncServer(options, config).addEndpoint(e).start())(_.stop()).port + basicRequest + .post(uri"http://localhost:$port") + .body("test") + .send(backend) + .map: response => + response.body should matchPattern { case Left(_) => } + response.code shouldBe StatusCode.ServiceUnavailable + // unlike in NettyFutureRequestTimeoutTest, here interruption works properly, and the metrics should be updated quickly + Thread.sleep(100) + activeRequests.get() shouldBe 0 + totalRequests.get() shouldBe 1 + .unsafeRunSync() + } + ) diff --git a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala index ef3ff0295c..19ded1bbe7 100644 --- a/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala +++ b/server/netty-server/sync/src/test/scala/sttp/tapir/server/netty/sync/NettySyncServerTest.scala @@ -25,6 +25,7 @@ import scala.concurrent.Future import scala.concurrent.duration.FiniteDuration import ox.flow.Flow import scala.annotation.nowarn +import sttp.tapir.server.netty.NettySyncRequestTimeoutTests class NettySyncServerTest extends AsyncFunSuite with BeforeAndAfterAll { @@ -44,7 +45,8 @@ class NettySyncServerTest extends AsyncFunSuite with BeforeAndAfterAll { new ServerWebSocketTests(createServerTest, OxStreams, autoPing = true, failingPipe = true, handlePong = true) { override def functionToPipe[A, B](f: A => B): OxStreams.Pipe[A, B] = _.map(f) override def emptyPipe[A, B]: OxStreams.Pipe[A, B] = _ => Flow.empty - }.tests() + }.tests() ++ + NettySyncRequestTimeoutTests(eventLoopGroup, backend).tests() tests.foreach { t => if (testNameFilter.forall(filter => t.name.contains(filter))) { From 388829db24d3a889fbcd8c27d48d6cb26ef24eaf Mon Sep 17 00:00:00 2001 From: adamw Date: Tue, 12 Nov 2024 16:47:14 +0100 Subject: [PATCH 080/127] Release 1.11.9 --- README.md | 2 +- generated-doc/out/client/http4s.md | 2 +- generated-doc/out/client/play.md | 4 ++-- generated-doc/out/client/sttp.md | 4 ++-- generated-doc/out/docs/asyncapi.md | 2 +- generated-doc/out/docs/json-schema.md | 2 +- generated-doc/out/docs/openapi.md | 12 +++++----- generated-doc/out/endpoint/integrations.md | 18 +++++++------- generated-doc/out/endpoint/json.md | 18 +++++++------- generated-doc/out/endpoint/pickler.md | 2 +- generated-doc/out/endpoint/static.md | 2 +- .../out/generator/sbt-openapi-codegen.md | 2 +- generated-doc/out/other/stability.md | 6 +++++ generated-doc/out/quickstart.md | 2 +- generated-doc/out/server/akkahttp.md | 4 ++-- generated-doc/out/server/armeria.md | 6 ++--- generated-doc/out/server/aws.md | 8 +++---- generated-doc/out/server/finatra.md | 4 ++-- generated-doc/out/server/http4s.md | 2 +- generated-doc/out/server/jdkhttp.md | 2 +- generated-doc/out/server/netty.md | 8 +++---- generated-doc/out/server/nima.md | 2 +- generated-doc/out/server/observability.md | 8 +++---- generated-doc/out/server/pekkohttp.md | 4 ++-- generated-doc/out/server/play.md | 4 ++-- generated-doc/out/server/vertx.md | 6 ++--- generated-doc/out/server/zio-http4s.md | 4 ++-- generated-doc/out/server/ziohttp.md | 4 ++-- generated-doc/out/testing.md | 8 +++---- generated-doc/out/tutorials/01_hello_world.md | 24 +++++++++---------- .../out/tutorials/02_openapi_docs.md | 14 +++++------ generated-doc/out/tutorials/03_json.md | 10 ++++---- generated-doc/out/tutorials/04_errors.md | 20 ++++++++-------- .../tutorials/05_multiple_inputs_outputs.md | 14 +++++------ .../out/tutorials/06_error_variants.md | 14 +++++------ generated-doc/out/tutorials/07_cats_effect.md | 20 ++++++++-------- 36 files changed, 137 insertions(+), 131 deletions(-) diff --git a/README.md b/README.md index 9cb9f588ed..c9fe2b5e5e 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] Add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.9" ``` Then, import: diff --git a/generated-doc/out/client/http4s.md b/generated-doc/out/client/http4s.md index 034c0e562d..db35cd51c6 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.11.9" ``` 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 28819cb6e6..bd121b1296 100644 --- a/generated-doc/out/client/play.md +++ b/generated-doc/out/client/play.md @@ -6,13 +6,13 @@ See the [Play framework documentation](https://www.playframework.com/documentati For **Play 3.0**, add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.9" ``` For **Play 2.9**, add ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.9" ``` instead. Furthermore, replace all uses of `sttp.capabilities.pekko.PekkoStreams` in the following code snippets with `sttp.capabilities.akka.AkkaStreams`. diff --git a/generated-doc/out/client/sttp.md b/generated-doc/out/client/sttp.md index e9622961a2..7f736a7a6f 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.11.9" ``` To make requests using an endpoint definition using the [sttp client](https://github.com/softwaremill/sttp), import: @@ -101,7 +101,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.11.8" +"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.11.9" "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 26bdaf5a2d..62aebb2c1c 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.11.9" "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 a80427af62..8cf5a33c30 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.11.9" ``` 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 e1c4d19d57..62d7ff5032 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.11.9" ``` 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.11.9" ``` 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.9" "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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.9" "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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.11.9" ``` or `tapir-redoc`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.9" ``` 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 ab23133fa4..cecceb4e08 100644 --- a/generated-doc/out/endpoint/integrations.md +++ b/generated-doc/out/endpoint/integrations.md @@ -12,7 +12,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.11.9" ``` - `import sttp.tapir.integ.cats.codec.*` - brings schema, validator and codec instances @@ -22,7 +22,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.11.9" ``` ## Refined integration @@ -31,7 +31,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.11.9" ``` You'll need to extend the `sttp.tapir.codec.refined.TapirCodecRefined` @@ -52,7 +52,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.11.9" ``` The module is only available for Scala 3 since iron is not designed to work with Scala 2. @@ -145,7 +145,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.11.9" ``` Then, `import sttp.tapir.codec.enumeratum.*`, or extends the `sttp.tapir.codec.enumeratum.TapirCodecEnumeratum` trait. @@ -158,7 +158,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.11.9" ``` Then, `import sttp.tapir.codec.newtype.*`, or extend the `sttp.tapir.codec.newtype.TapirCodecNewType` trait to bring the implicit values into scope. @@ -169,7 +169,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.11.9" ``` Then, `import sttp.tapir.codec.monix.newtype.*`, or extend the `sttp.tapir.codec.monix.newtype.TapirCodecMonixNewType` trait to bring the implicit values into scope. @@ -180,7 +180,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.11.9" ``` Then, mix in `sttp.tapir.codec.zio.prelude.newtype.TapirNewtypeSupport` into your newtype to bring the implicit values into scope: @@ -219,7 +219,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.11.9" ``` 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 6ed067d664..513a2d9ca3 100644 --- a/generated-doc/out/endpoint/json.md +++ b/generated-doc/out/endpoint/json.md @@ -50,7 +50,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../other/mytapir.md)): @@ -122,7 +122,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`): @@ -156,13 +156,13 @@ For more examples, including making a custom encoder/decoder, see [TapirJsonuPic 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.11.9" ``` For **Play 2.9** use: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`): @@ -178,7 +178,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`): @@ -194,7 +194,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`): @@ -210,7 +210,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`): @@ -226,7 +226,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.11.9" ``` And one of the implementations: @@ -257,7 +257,7 @@ given Formats = org.json4s.jackson.Serialization.formats(NoTypeHints) 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.9" ``` Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../other/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 4c082f2cc5..373c53e353 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.11.9" ``` 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 f79f440a5d..8a17d38bca 100644 --- a/generated-doc/out/endpoint/static.md +++ b/generated-doc/out/endpoint/static.md @@ -11,7 +11,7 @@ the API documentation of the old static content API, switch documentation to an In order to use static content endpoints, add the module to your dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.9" ``` ## Files diff --git a/generated-doc/out/generator/sbt-openapi-codegen.md b/generated-doc/out/generator/sbt-openapi-codegen.md index 2257719423..47dcc79897 100644 --- a/generated-doc/out/generator/sbt-openapi-codegen.md +++ b/generated-doc/out/generator/sbt-openapi-codegen.md @@ -9,7 +9,7 @@ This is a really early alpha implementation. Add the sbt plugin to the `project/plugins.sbt`: ```scala -addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.8") +addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.9") ``` Enable the plugin for your project in the `build.sbt`: diff --git a/generated-doc/out/other/stability.md b/generated-doc/out/other/stability.md index 69a847375c..5e3f9f0038 100644 --- a/generated-doc/out/other/stability.md +++ b/generated-doc/out/other/stability.md @@ -6,6 +6,12 @@ The modules are categorised using the following levels: * **stabilising**: the API is mostly stable, with rare binary-incompatible changes possible in minor releases (only if necessary) * **experimental**: API can change significantly even in patch releases +The major version is increased when there are binary-incompatible changes in **stable** modules. + +The minor version is increased when there are significant new features in **stable** modules (keeping compatibility), or binary-incompatible changes in **stabilising** modules. + +The patch version is increased when there are binary-compatible changes in **stable** / **stabilising** modules, any changes in **exeperimental** modules, or when a new module is added (e.g. a new integration). + ## Main modules | Module | Level | diff --git a/generated-doc/out/quickstart.md b/generated-doc/out/quickstart.md index d97fdc92b2..1f5e749eb7 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.9" ``` 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 74ed916e4d..1e96b8963e 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.9" ``` 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.11.8" exclude("com.typesafe.akka", "akka-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.9" 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 ca570bf290..ba474800e0 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.11.9" ``` and import the object: @@ -71,7 +71,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.11.9" ``` to use this interpreter with Cats Effect typeclasses. @@ -148,7 +148,7 @@ val tapirService = ArmeriaCatsServerInterpreter(dispatcher).toService(streamingR Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.9" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/aws.md b/generated-doc/out/server/aws.md index f543336d2b..a4eb54da5d 100644 --- a/generated-doc/out/server/aws.md +++ b/generated-doc/out/server/aws.md @@ -30,7 +30,7 @@ These are corresponding classes for each of the supported runtime: To start using any of the above add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.9" ``` ## Deployment @@ -41,9 +41,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: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.8" -"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.8" -"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.9" ``` ### Examples diff --git a/generated-doc/out/server/finatra.md b/generated-doc/out/server/finatra.md index 9878f9fb54..8009f1786d 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.11.9" ``` 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.11.9" ``` and import the object: diff --git a/generated-doc/out/server/http4s.md b/generated-doc/out/server/http4s.md index c723151f91..b6693d1f4c 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.11.9" ``` and import the object: diff --git a/generated-doc/out/server/jdkhttp.md b/generated-doc/out/server/jdkhttp.md index f5297c6814..e4029117c7 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.11.9" ``` Then, import the package: diff --git a/generated-doc/out/server/netty.md b/generated-doc/out/server/netty.md index 612af7246d..051c862057 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.11.9" // if you want to use Java 21 Loom virtual threads in direct style: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.9" // if you are using cats-effect: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.9" // if you are using zio: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.9" ``` Then, use: diff --git a/generated-doc/out/server/nima.md b/generated-doc/out/server/nima.md index f290ad1864..4bec651228 100644 --- a/generated-doc/out/server/nima.md +++ b/generated-doc/out/server/nima.md @@ -8,7 +8,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-nima-server" % "1.11.9" ``` 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 92a31625f4..e9a4ba0467 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.11.9" ``` `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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.11.9" ``` 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.11.9" ``` 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.11.9" ``` 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 e5158873a1..23ac7f61ed 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.9" ``` 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.11.8" exclude("org.apache.pekko", "pekko-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.9" 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 3d91f9bcd4..2d0191642f 100644 --- a/generated-doc/out/server/play.md +++ b/generated-doc/out/server/play.md @@ -6,7 +6,7 @@ See the [Play framework documentation](https://www.playframework.com/documentati 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-play29-server" % "1.11.9" ``` and (if you don't already depend on Play) @@ -26,7 +26,7 @@ depending on whether you want to use netty or Akka based http-server under the h 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.11.9" ``` 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 7d64d8e620..eb6fa87df5 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.11.9" ``` to use this interpreter with `Future`. @@ -60,7 +60,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.11.9" ``` to use this interpreter with Cats Effect typeclasses. @@ -140,7 +140,7 @@ val attach = VertxCatsServerInterpreter(dispatcher).route(streamedResponse.serve Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.9" ``` 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 e63fae17fd..e7539cbfba 100644 --- a/generated-doc/out/server/zio-http4s.md +++ b/generated-doc/out/server/zio-http4s.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.9" ``` or just add the zio-http4s integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.9" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/server/ziohttp.md b/generated-doc/out/server/ziohttp.md index 946358d201..33436245eb 100644 --- a/generated-doc/out/server/ziohttp.md +++ b/generated-doc/out/server/ziohttp.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.9" ``` or just add the zio-http integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.9" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/testing.md b/generated-doc/out/testing.md index 5a9df699c1..79a8cff01b 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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.9" ``` Let's assume you are using the [pekko http](server/pekkohttp.md) interpreter. Given the following server endpoint: @@ -139,7 +139,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.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.9" ``` And the following imports: @@ -194,7 +194,7 @@ with [mock-server](https://www.mock-server.com/) Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.9" ``` Imports: @@ -265,7 +265,7 @@ result == out To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.8" +"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.9" ``` ### Shadowed endpoints diff --git a/generated-doc/out/tutorials/01_hello_world.md b/generated-doc/out/tutorials/01_hello_world.md index 0e9a7e8241..8ed82f94bf 100644 --- a/generated-doc/out/tutorials/01_hello_world.md +++ b/generated-doc/out/tutorials/01_hello_world.md @@ -22,8 +22,8 @@ multiple servers, but we'll choose the simplest (and also one of the fastest!), available through the `tapir-netty-server-sync` module: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 ``` ## Endpoint description @@ -43,8 +43,8 @@ Let's start by defining the method and path of our endpoint: {emphasize-lines="4-11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* @@ -72,8 +72,8 @@ of requiring it to be a fixed value (a constant): {emphasize-lines="10"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* @@ -97,8 +97,8 @@ Finally, let's add an output to the endpoint. We'll return the response as a str {emphasize-lines="11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* @@ -123,8 +123,8 @@ will be sent as a response: {emphasize-lines="12"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* @@ -152,8 +152,8 @@ example, we'll bind to `localhost` (which is the default), and to the port 8080: {emphasize-lines="5, 15-18"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/02_openapi_docs.md b/generated-doc/out/tutorials/02_openapi_docs.md index b03b4d86aa..e3454528be 100644 --- a/generated-doc/out/tutorials/02_openapi_docs.md +++ b/generated-doc/out/tutorials/02_openapi_docs.md @@ -17,16 +17,16 @@ use a bundle, which first interprets the provided tapir endpoints into OpenAPI a endpoints, which expose the UI together with the generated specification. We'll need to add a dependency: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 ``` We'll also define and expose two endpoints as an HTTP server, as described in the previous tutorial. Hence, our starting setup of `docs.scala` is as follows: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -108,9 +108,9 @@ And that's almost all the code changes that we need to introduce! We only need t {emphasize-lines="3, 5, 8, 24-25, 29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 import sttp.shared.Identity import sttp.tapir.* diff --git a/generated-doc/out/tutorials/03_json.md b/generated-doc/out/tutorials/03_json.md index b8fd3ec971..f5b17fb3b5 100644 --- a/generated-doc/out/tutorials/03_json.md +++ b/generated-doc/out/tutorials/03_json.md @@ -83,7 +83,7 @@ In our case, deriving the schemas will amount to adding a `... derives Schema` c {emphasize-lines="1, 7, 10, 12, 16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.core.* // needed for `writeToString` @@ -127,10 +127,10 @@ how the `jsonBody[T]` method is used in the endpoint definition. We'll also expo {emphasize-lines="2-4, 10-15, 23-39"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* // needed for ... derives diff --git a/generated-doc/out/tutorials/04_errors.md b/generated-doc/out/tutorials/04_errors.md index 005b5c9bcb..6b5482d52a 100644 --- a/generated-doc/out/tutorials/04_errors.md +++ b/generated-doc/out/tutorials/04_errors.md @@ -40,8 +40,8 @@ schemas both for the `Result` and `Error` classes, to represent them properly in describing the endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -76,10 +76,10 @@ We'll also add code to expose the endpoint as a server, along with its OpenAPI d {emphasize-lines="2-3, 11-13, 24-28, 30-36"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -152,10 +152,10 @@ you'll also get `ERROR` logs when unhandled exceptions happen: {emphasize-lines="6, 26"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md index 4fd27c18be..0463cef25d 100644 --- a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md +++ b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md @@ -24,7 +24,7 @@ body, but additionally the hash of the result should be included in the `X-Resul Below is the endpoint description; we'll be editing the `multiple.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 import sttp.tapir.* @@ -61,8 +61,8 @@ The output tuple is then mapped to the response body & header: {emphasize-lines="5, 8-9, 18-29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -147,8 +147,8 @@ The mapping functions are simple, but quite boring to write: {emphasize-lines="8, 17-18, 23-27"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -197,8 +197,8 @@ Here's the modified code using `.mapInTo`, which additionally maps outputs to th {emphasize-lines="9, 11-13, 19, 22"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/06_error_variants.md b/generated-doc/out/tutorials/06_error_variants.md index afb92e9b80..0eed6e3c13 100644 --- a/generated-doc/out/tutorials/06_error_variants.md +++ b/generated-doc/out/tutorials/06_error_variants.md @@ -83,7 +83,7 @@ request serializing `AvatarSuccess.Redirect` instances, as Tapir knows nothing a an `EndpointOutput[String]`: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -106,7 +106,7 @@ this output to the `AvatarSuccess.Redirect` type using `.mapTo`, which we've lea {emphasize-lines="12-13"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -138,7 +138,7 @@ each of which translates to a separate class. Our one-of successful output takes {emphasize-lines="13-16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -175,7 +175,7 @@ To fix this, we can use the `oneOfVariantSingletonMatcher` method. It takes a un value, to which the high-level output must be equal, for the variant to be chosen: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -197,9 +197,9 @@ val errorOutput: EndpointOutput[AvatarError] = oneOf( Equipped with `oneOf` outputs, we can now fully describe and test our endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* diff --git a/generated-doc/out/tutorials/07_cats_effect.md b/generated-doc/out/tutorials/07_cats_effect.md index d02038e8b5..b6e8ea4b70 100644 --- a/generated-doc/out/tutorials/07_cats_effect.md +++ b/generated-doc/out/tutorials/07_cats_effect.md @@ -21,7 +21,7 @@ use. Hence, we'll start with the same basic endpoint description. We'll be editing the `cats-effect.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 import sttp.tapir.* @@ -56,8 +56,8 @@ parameter explicitly, using `.serverLogic[IO]` in our case: {emphasize-lines="2, 4, 12-14"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.9 import cats.effect.IO import sttp.tapir.* @@ -102,8 +102,8 @@ The conversion process is an almost-one-liner (if it wasn't for line length limi {emphasize-lines="2, 5, 7, 18-19"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 import cats.effect.IO import org.http4s.HttpRoutes @@ -130,8 +130,8 @@ standard code to start a server and handle requests until the application is int {emphasize-lines="3, 5, 7, 8, 12, 24-30"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} @@ -192,9 +192,9 @@ the second step that we need to perform: {emphasize-lines="3, 7, 13, 27-32, 37"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} From c11b86746c14e9c7b8783fdc6bcb70d13302e914 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 13 Nov 2024 01:31:56 +0100 Subject: [PATCH 081/127] Update magnolia to 1.3.8 (#4157) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 6c5c0eeb3f..1f1b772b41 100644 --- a/build.sbt +++ b/build.sbt @@ -424,7 +424,7 @@ lazy val core: ProjectMatrix = (projectMatrix in file("core")) libraryDependencies ++= { CrossVersion.partialVersion(scalaVersion.value) match { case Some((3, _)) => - Seq("com.softwaremill.magnolia1_3" %%% "magnolia" % "1.3.7") + Seq("com.softwaremill.magnolia1_3" %%% "magnolia" % "1.3.8") case _ => Seq( "com.softwaremill.magnolia1_2" %%% "magnolia" % "1.1.10", From 2c4a1523720bdda0dba800c75beea04a7fcd2b7b Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 13 Nov 2024 01:50:07 +0100 Subject: [PATCH 082/127] Update vertx-codegen, vertx-web to 4.5.11 (#4161) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index d1a8e9e852..75845c8815 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -45,7 +45,7 @@ object Versions { val play29Client = "2.2.9" val play29Server = "2.9.5" val tethys = "0.29.3" - val vertx = "4.5.10" + val vertx = "4.5.11" val jsScalaJavaTime = "2.6.0" val nativeScalaJavaTime = "2.6.0" val jwtScala = "10.0.1" From 3e50de2af92b82743ae74706cd029b46614d88c5 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 13 Nov 2024 01:55:31 +0100 Subject: [PATCH 083/127] Update classgraph to 4.8.179 (#4159) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 1f1b772b41..532de392cf 100644 --- a/build.sbt +++ b/build.sbt @@ -530,7 +530,7 @@ lazy val perfTests: ProjectMatrix = (projectMatrix in file("perf-tests")) "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.1", "nl.grons" %% "metrics4-scala" % Versions.metrics4Scala % Test, "com.lihaoyi" %% "scalatags" % Versions.scalaTags % Test, - "io.github.classgraph" % "classgraph" % "4.8.177", + "io.github.classgraph" % "classgraph" % "4.8.179", "org.http4s" %% "http4s-core" % Versions.http4s, "org.http4s" %% "http4s-dsl" % Versions.http4s, "org.http4s" %% "http4s-blaze-server" % Versions.http4sBlazeServer, From f964d0379b4d04fbc805b5f2edc4744d17dcea98 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 13 Nov 2024 02:03:57 +0100 Subject: [PATCH 084/127] Update sttp-mock-server, ... to 1.11.9 (#4158) --- .../sttp/tapir/examples/HelloWorldHttp4sServer.scala | 4 ++-- .../tapir/examples/HelloWorldNettyCatsServer.scala | 4 ++-- .../sttp/tapir/examples/HelloWorldZioHttpServer.scala | 6 +++--- .../tapir/examples/ZioEnvExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleZioHttpServer.scala | 10 +++++----- .../tapir/examples/ZioPartialServerLogicHttp4s.scala | 6 +++--- .../main/scala/sttp/tapir/examples/booksExample.scala | 10 +++++----- .../sttp/tapir/examples/booksPicklerExample.scala | 10 +++++----- .../tapir/examples/client/Http4sClientExample.scala | 6 +++--- .../custom_types/EndpointWithCustomTypes.scala | 4 ++-- .../examples/custom_types/booksExampleSemiauto.scala | 10 +++++----- .../custom_types/commaSeparatedQueryParameter.scala | 6 +++--- .../custom_types/sealedTraitWithDiscriminator.scala | 8 ++++---- .../examples/errors/ErrorUnionTypesHttp4sServer.scala | 6 +++--- .../errors/IronRefinementErrorsNettyServer.scala | 8 ++++---- .../customErrorsOnDecodeFailurePekkoServer.scala | 4 ++-- .../examples/errors/errorOutputsPekkoServer.scala | 6 +++--- .../sttp/tapir/examples/helloWorldArmeriaServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldJdkHttpServer.scala | 4 ++-- .../tapir/examples/helloWorldNettyFutureServer.scala | 4 ++-- .../tapir/examples/helloWorldNettySyncServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldPekkoServer.scala | 4 ++-- .../json/circeAutoDerivationNettySyncServer.scala | 6 +++--- .../scala/sttp/tapir/examples/json/circeNullBody.scala | 6 +++--- .../tapir/examples/json/jsoniterNettySyncServer.scala | 6 +++--- .../ZioLoggingWithCorrelationIdNettyServer.scala | 4 ++-- .../multipart/multipartFormUploadPekkoServer.scala | 4 ++-- .../examples/observability/ZioMetricsExample.scala | 6 +++--- .../examples/observability/datadogMetricsExample.scala | 8 ++++---- .../observability/openTelemetryMetricsExample.scala | 8 ++++---- .../observability/prometheusMetricsExample.scala | 8 ++++---- .../MultipleEndpointsDocumentationHttp4sServer.scala | 8 ++++---- .../openapi/RedocContextPathHttp4sServer.scala | 6 +++--- .../tapir/examples/openapi/RedocZioHttpServer.scala | 8 ++++---- .../multipleEndpointsDocumentationPekkoServer.scala | 8 ++++---- .../tapir/examples/openapi/openapiExtensions.scala | 6 +++--- .../examples/openapi/swaggerUIOAuth2PekkoServer.scala | 6 +++--- .../tapir/examples/schema/customisingSchemas.scala | 8 ++++---- .../examples/security/OAuth2GithubHttp4sServer.scala | 6 +++--- .../examples/security/ServerSecurityLogicZio.scala | 4 ++-- .../security/basicAuthenticationPekkoServer.scala | 4 ++-- .../examples/security/corsInterceptorPekkoServer.scala | 4 ++-- .../security/externalSecurityInterceptor.scala | 4 ++-- .../examples/security/serverSecurityLogicPekko.scala | 4 ++-- .../serverSecurityLogicRefreshCookiesPekko.scala | 4 ++-- .../staticContentFromFilesNettyServer.scala | 6 +++--- .../staticContentFromFilesPekkoServer.scala | 6 +++--- .../staticContentFromResourcesPekkoServer.scala | 6 +++--- .../staticContentSecurePekkoServer.scala | 6 +++--- .../examples/status_code/statusCodeNettyServer.scala | 4 ++-- .../examples/streaming/ProxyHttp4sFs2Server.scala | 4 ++-- .../examples/streaming/StreamingHttp4sFs2Server.scala | 4 ++-- .../streaming/StreamingHttp4sFs2ServerOrError.scala | 4 ++-- .../examples/streaming/StreamingNettyFs2Server.scala | 4 ++-- .../examples/streaming/StreamingNettyZioServer.scala | 4 ++-- .../examples/streaming/StreamingZioHttpServer.scala | 4 ++-- .../examples/streaming/streamingPekkoServer.scala | 4 ++-- .../examples/testing/CatsServerStubInterpreter.scala | 6 +++--- .../examples/testing/PekkoServerStubInterpreter.scala | 6 +++--- .../examples/testing/SttpMockServerClientExample.scala | 6 +++--- .../websocket/WebSocketChatNettySyncServer.scala | 4 ++-- .../examples/websocket/WebSocketHttp4sServer.scala | 8 ++++---- .../examples/websocket/WebSocketNettySyncServer.scala | 4 ++-- .../examples/websocket/webSocketPekkoServer.scala | 8 ++++---- 65 files changed, 191 insertions(+), 191 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala index 9843c91970..a27248580e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=http4s}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala index 661aa7fb10..56b14fa967 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=Netty}: Exposing an endpoint using the Netty server (cats-effect variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala index 1783d7d4a1..7d7f4c37b0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala @@ -1,8 +1,8 @@ // {cat=Hello, World!; effects=ZIO; server=ZIO HTTP; json=ZIO JSON}: Exposing an endpoint using the ZIO HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala index 6f24a8557c..70606a24d2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint, defined with ZIO and depending on services in the environment, using the http4s server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala index 82276d4f75..ce4c544917 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala index caad5c8a63..ec8ec7f1d9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=zio-http; json=circe; docs=Swagger UI}: Exposing an endpoint using the ZIO HTTP server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index d45b53ebc4..a44eb1217e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -1,9 +1,9 @@ // {cat=Hello, World!; effects=ZIO; server=http4s}: Extending a base endpoint (which has the security logic provided), with server logic //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala index d528def6e5..ba639cf9df 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.9 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala index abb1dffcb3..a8ea2c343e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Netty; client=sttp3; JSON=Pickler; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.9 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala index bc7f0492c9..7a3d6e2fda 100644 --- a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala @@ -1,8 +1,8 @@ // {cat=Client interpreter; effects=cats-effect; JSON=circe}: Interpreting an endpoint as an http4s client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 //> using dep org.http4s::http4s-circe:0.23.27 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep org.http4s::http4s-dsl:0.23.27 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala index fad25b37ff..e8dac0dc2e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala @@ -1,7 +1,7 @@ // {cat=Custom types; json=circe}: Supporting custom types, when used in query or path parameters, as well as part of JSON bodies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala index fd5cfb6b09..9a225f990b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala @@ -1,10 +1,10 @@ // {cat=Custom types; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities using semi-auto derivation -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.9 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala index a6714e4e25..7db68f5869 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala @@ -1,8 +1,8 @@ // {cat=Custom types; effects=Direct; server=Netty; docs=Swagger UI}: Handling comma-separated query parameters -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala index eb3f81e454..36e7e13252 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala @@ -1,9 +1,9 @@ // {cat=Custom types; effects=Direct; server=Netty; JSON=circe; docs=Swagger UI}: Mapping a sealed trait hierarchy to JSON using a discriminator -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala index 9030657118..2b0f9db1f6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=cats-effect; server=http4s; JSON=circe}: Extending a base secured endpoint with error variants, using union types -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala index 997f3e9ea7..c510b9cf0c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala @@ -1,9 +1,9 @@ // {cat=Error handling; effects=cats-effect; server=Netty; JSON=circe}: Error reporting provided by Iron type refinements -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala index d39b1773e3..4766f9001e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP}: Customising errors that are reported on decode failures (e.g. invalid or missing query parameter) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala index f5477df556..02050fb861 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP; json=circe}: Error and successful outputs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala index e67f9efab3..c7289ef0c4 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Armeria}: Exposing an endpoint using the Armeria server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala index 83dd246c24..1584cb888c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=JDK Http}: Exposing an endpoint using the built-in JDK HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala index c37d3784a5..4eac4ca8b2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Netty}: Exposing an endpoint using the Netty server (Future variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala index 512f154043..bad68acc45 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=Netty}: Exposing an endpoint using the Netty server (Direct-style variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala index da0d05ee42..460118848a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP}: Exposing an endpoint using the Pekko HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala index 34597fa6ac..7dfcfa5f2a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON response with Circe and auto-dervied codecs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala index 7335295943..128e9fce1e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON body which optionally serializes as `null` -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala index 95e26d7025..893e097df6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=jsoniter}: Return a JSON response with Jsoniter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 //> using dep ch.qos.logback:logback-classic:1.5.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.15 diff --git a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala index 2fc0f59b1d..bb6dc1cddb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Logging; effects=ZIO; server=Netty}: Logging using a correlation id -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.9 //> using dep com.softwaremill.sttp.client3::zio:3.9.8 package sttp.tapir.examples.logging diff --git a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala index 7129f9101c..0dc839fb9f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Multipart; effects=Future; server=Pekko HTTP}: Uploading a multipart form, with text and file parts -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala index 912f4b2af0..dfe4c18c71 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala @@ -1,8 +1,8 @@ // {cat=Observability; effects=ZIO; server=ZIO HTTP}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.9 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala index 8bf2ba01b6..77a74fe016 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting DataDog metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.9 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 5d01571573..6520da7036 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting OpenTelemetry metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.9 //> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.44.1 //> using dep org.slf4j:slf4j-api:2.0.13 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala index ace204fdb6..f69c8369cd 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.9 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala index 9668a0df76..67860ab416 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala index 8591f2523f..9e187081c0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala index 203e766fb6..45b671db50 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=ZIO; server=ZIO HTTP; json=circe; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala index 8003a4b312..1097b31dd9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala index f5a916c690..e487a24d42 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; json=circe}: Adding OpenAPI documentation extensions -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.9 //> using dep com.softwaremill.sttp.apispec::openapi-circe-yaml:0.10.0 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala index 26c07b5442..57be14a4c7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI}: Securing Swagger UI using OAuth 2 -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala index c117e3bfcf..d4df2b7805 100644 --- a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala +++ b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala @@ -1,9 +1,9 @@ // {cat=Schemas; effects=Future; server=Netty; json=circe; docs=Swagger UI}: Customising a derived schema, using annotations, and using implicits -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 package sttp.tapir.examples.schema diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index e850de816c..efdae4774a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Security; effects=cats-effect; server=http4s; json=circe}: Login using OAuth2, authorization code flow -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.1 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index 91ed5b0f37..f211d5a93a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=ZIO; server=ZIO HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.1 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala index 255a887a87..421b54565f 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: HTTP basic authentication -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala index 09c828dc30..e4b415f218 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: CORS interceptor -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala index 09d0112f35..81db88217e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Netty}: Interceptor verifying externally added security credentials -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala index ae3f890b54..7e1819b4ef 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala index 2005c61b6d..2822202c36 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala index e12308877e..e57ab1986d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala index 6dd4d0389a..068397abdb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from a directory, with range requests -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala index 5d60f489b7..e6aaa906b3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from resources -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala index a24564cd72..041f6e7e6d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files secured with a bearer token -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala index 0ad896eefe..33374b354d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Status code; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 package sttp.tapir.examples.status_code diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala index 140a645167..34cd49b4ec 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Proxy requests, handling bodies as fs2 streams -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep com.softwaremill.sttp.client3::fs2:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala index 7dadb69204..66daa59f75 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala index 9fe0586041..3356488f78 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Respond with an fs2 stream, or with an error, represented as a failed effect in the business logic -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala index 21e802b343..d504a533f2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=Netty}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala index 2e5e8654c5..9726ed1e22 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=Netty}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala index 89ac473759..99b85b0014 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=ZIO HTTP}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala index fca167f32b..927edf8d11 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=Future; server=Pekko HTTP}: Stream response as a Pekko stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala index c0439d0e23..7f17c9fec0 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=cats-effect}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala index 4c894567ad..afcdd2823c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=Future; server=Pekko HTTP}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala index cc2a7edb02..0f05aa37f3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala @@ -1,8 +1,8 @@ // {cat=Testing; json=circe}: Test endpoints using the MockServer client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 -//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.9 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.mock-server:mockserver-netty:5.15.0 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index 6341f56b46..6c40d04dab 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: A WebSocket chat across multiple clients connected to the same server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index 4026b2cf2c..5e931c52ff 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=cats-effect; server=http4s; json=circe; docs=AsyncAPI}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.1 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index 405ad7144e..3671703ceb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala index 44515f9daa..72ca0300b3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=Future; server=Pekko HTTP}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.8 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.8 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.8 From 0a0d9f299b97dac1a36824f01cfe642009b799ec Mon Sep 17 00:00:00 2001 From: Yuriy Tymchuk Date: Wed, 13 Nov 2024 17:19:26 +0100 Subject: [PATCH 085/127] Use URI to retrieve decoded path segments in ArmeriaServerRequest (#4163) --- .../sttp/tapir/server/armeria/ArmeriaServerRequest.scala | 8 ++------ .../scala/sttp/tapir/server/tests/ServerBasicTests.scala | 6 ++++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/server/armeria-server/src/main/scala/sttp/tapir/server/armeria/ArmeriaServerRequest.scala b/server/armeria-server/src/main/scala/sttp/tapir/server/armeria/ArmeriaServerRequest.scala index ec2190ebfa..bb95fd9e66 100644 --- a/server/armeria-server/src/main/scala/sttp/tapir/server/armeria/ArmeriaServerRequest.scala +++ b/server/armeria-server/src/main/scala/sttp/tapir/server/armeria/ArmeriaServerRequest.scala @@ -38,12 +38,8 @@ private[armeria] final case class ArmeriaServerRequest(ctx: ServiceRequestContex override def underlying: Any = ctx override val pathSegments: List[String] = { - // ctx.path() always starts with '/'. - if (ctx.path() == "/") { - Nil - } else { - ctx.path().substring(1).split("/").toList - } + val segments = uri.pathSegments.segments.map(_.v).filter(_.nonEmpty).toList + if (segments == List("")) Nil else segments // representing the root path as an empty list } override val queryParameters: QueryParams = { diff --git a/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala b/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala index 544c8d4773..b457ca3e64 100644 --- a/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala +++ b/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala @@ -461,6 +461,12 @@ class ServerBasicTests[F[_], OPTIONS, ROUTE]( (backend, baseUri) => basicRequest.get(uri"$baseUri/api").send(backend).map(_.code shouldBe StatusCode.Ok) }, + testServer(in_path_paths_out_header_body, "Encoded path should be decoded") { case (i, paths) => + pureResult(Right((i, paths.last))) + }{ + (backend, baseUri) => + basicRequest.get(uri"$baseUri/api/15/and/MIN%2FMAX").send(backend).map(_.body shouldBe Right("MIN/MAX")) + }, testServer(in_single_path, "single path should match single/ path")((_: Unit) => pureResult(Either.right[Unit, Unit](()))) { (backend, baseUri) => basicRequest.get(uri"$baseUri/api/").send(backend).map(_.code shouldBe StatusCode.Ok) From f38197e1a55e45460f24fcbf283e702ffbc6c319 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 14 Nov 2024 01:28:54 +0100 Subject: [PATCH 086/127] Update zio-prelude to 1.0.0-RC34 (#4164) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 75845c8815..6b99720da3 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -52,7 +52,7 @@ object Versions { val derevo = "0.13.0" val newtype = "0.4.4" val monixNewtype = "0.3.0" - val zioPrelude = "1.0.0-RC33" + val zioPrelude = "1.0.0-RC34" val awsLambdaInterface = "2.6.0" val armeria = "1.30.1" val scalaJava8Compat = "1.0.2" From 010a20cb0270790f1dad921939de3eddd908b85d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 14 Nov 2024 01:54:02 +0100 Subject: [PATCH 087/127] Update netty-reactive-streams-http to 3.0.3 (#4168) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 6b99720da3..9908d525b1 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -24,7 +24,7 @@ object Versions { val catbird = "21.12.0" val json4s = "4.0.7" val metrics4Scala = "4.3.3" - val nettyReactiveStreams = "3.0.2" + val nettyReactiveStreams = "3.0.3" val ox = "0.5.1" val reactiveStreams = "1.0.4" val sprayJson = "1.3.6" From 411836185ae8b54582140e4ac4cc6b03cb9425e8 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 14 Nov 2024 02:18:32 +0100 Subject: [PATCH 088/127] Update pekko-grpc-runtime, ... to 1.1.1 (#4167) --- build.sbt | 2 +- project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 532de392cf..cec990efc8 100644 --- a/build.sbt +++ b/build.sbt @@ -1246,7 +1246,7 @@ lazy val pekkoGrpcServer: ProjectMatrix = (projectMatrix in file("server/pekko-g .settings( name := "tapir-pekko-grpc-server", libraryDependencies ++= Seq( - "org.apache.pekko" %% "pekko-grpc-runtime" % "1.1.0" + "org.apache.pekko" %% "pekko-grpc-runtime" % "1.1.1" ) ) .jvmPlatform(scalaVersions = scala2And3Versions, settings = commonJvmSettings) diff --git a/project/plugins.sbt b/project/plugins.sbt index a23acc89f8..9e6572aca8 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,7 +18,7 @@ addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.2") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") -addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.0") +addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.1") // needed to override the Android flavor of Guava coming from pekko-grpc-sbt-plugin, which causes failures in Scala.JS builds dependencyOverrides += "com.google.guava" % "guava" % "33.3.1-jre" From 80f212d565cdb58e2352811e8c8413b2051b3d4c Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 15 Nov 2024 01:32:25 +0100 Subject: [PATCH 089/127] Update play-ahc-ws-standalone to 2.2.10 (#4171) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 9908d525b1..4ab1396007 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -42,7 +42,7 @@ object Versions { val zioJson = "0.7.3" val playClient = "3.0.5" val playServer = "3.0.5" - val play29Client = "2.2.9" + val play29Client = "2.2.10" val play29Server = "2.9.5" val tethys = "0.29.3" val vertx = "4.5.11" From 69a0327aa01ff147ea07e0e5f98bb8c7fcf5de9a Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 15 Nov 2024 01:42:01 +0100 Subject: [PATCH 090/127] Update sbt-scala-native to 0.5.6 (#4173) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 9e6572aca8..bc42909df0 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -16,7 +16,7 @@ addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.2") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") -addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.5") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.6") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.1") // needed to override the Android flavor of Guava coming from pekko-grpc-sbt-plugin, which causes failures in Scala.JS builds From 51e6df4789823a0e1a7689dffab17da6738806a1 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 15 Nov 2024 01:45:05 +0100 Subject: [PATCH 091/127] Update play-ahc-ws-standalone to 3.0.6 (#4172) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 4ab1396007..d59deb2f21 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -40,7 +40,7 @@ object Versions { val zioInteropCats = "23.1.0.3" val zioInteropReactiveStreams = "2.0.2" val zioJson = "0.7.3" - val playClient = "3.0.5" + val playClient = "3.0.6" val playServer = "3.0.5" val play29Client = "2.2.10" val play29Server = "2.9.5" From 796e32841b15b594835c5ba231fa87fcebf9a371 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Mon, 18 Nov 2024 17:28:20 +0100 Subject: [PATCH 092/127] Use correct validator when creating an enum codec so that error messages are rendered correctly (#4175) --- .../CreateDerivedEnumerationCodec.scala | 2 +- .../custom_types/enumQueryParameter.scala | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala diff --git a/core/src/main/scala/sttp/tapir/macros/CreateDerivedEnumerationCodec.scala b/core/src/main/scala/sttp/tapir/macros/CreateDerivedEnumerationCodec.scala index dfb618307e..fa9a726a6c 100644 --- a/core/src/main/scala/sttp/tapir/macros/CreateDerivedEnumerationCodec.scala +++ b/core/src/main/scala/sttp/tapir/macros/CreateDerivedEnumerationCodec.scala @@ -30,7 +30,7 @@ class CreateDerivedEnumerationCodec[L, T](validator: Validator.Enumeration[T], s .mapDecode(s => decode(s) match { case Some(value) => DecodeResult.Value(value) - case None => DecodeResult.InvalidValue(List(ValidationError(validator, s))) + case None => DecodeResult.InvalidValue(List(ValidationError(v, s))) } )(encode) .schema(schemaAnnotations.enrich(s)) diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala new file mode 100644 index 0000000000..cc96921063 --- /dev/null +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala @@ -0,0 +1,27 @@ +// {cat=Custom types; effects=Direct; server=Netty}: A query parameter which maps to a Scala 3 enum (enumeration) + +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep ch.qos.logback:logback-classic:1.5.8 + +package sttp.tapir.examples.custom_types + +import sttp.tapir.* +import sttp.tapir.server.netty.sync.NettySyncServer + +enum PieType(val index: Int, val name: String): + case Apple extends PieType(1, "apple") + case Orange extends PieType(2, "orange") + case BananaCustard extends PieType(3, "banana-custard") + +@main def enumQueryParameter(): Unit = + given Codec[String, PieType, CodecFormat.TextPlain] = + Codec.derivedEnumeration[String, PieType](decode = s => PieType.values.find(_.name == s), encode = _.name) + + val bake = endpoint.get + .in("bake") + .in(query[PieType]("pie")) + .out(stringBody) + .handleSuccess(pie => s"Baking: $pie!") + + NettySyncServer().addEndpoint(bake).startAndWait() From fdfbc682282a3f9bbf3ce4c841ef291f4e2b2a72 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Mon, 18 Nov 2024 19:00:06 +0100 Subject: [PATCH 093/127] Log a message when tapir-netty-sync starts (#4176) --- .../sttp/tapir/examples/helloWorldNettySyncServer.scala | 2 +- .../scala/sttp/tapir/server/netty/sync/NettySyncServer.scala | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala index bad68acc45..d6bfdb2a5d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala @@ -30,6 +30,6 @@ import sttp.tapir.server.netty.sync.NettySyncServer supervised { val serverBinding = useInScope(NettySyncServer().addEndpoint(helloWorld).start())(_.stop()) - println(s"Tapir is running on port ${serverBinding.port}") + println(s"You can now make requests to http://${serverBinding.hostName}:${serverBinding.port}/hello?name=...!") never } diff --git a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServer.scala b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServer.scala index 70ae9f9f41..aef603848d 100644 --- a/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServer.scala +++ b/server/netty-server/sync/src/main/scala/sttp/tapir/server/netty/sync/NettySyncServer.scala @@ -20,6 +20,7 @@ import java.util.concurrent.{Executors, Future => JFuture} import scala.concurrent.duration.FiniteDuration import scala.concurrent.{Future, Promise} import scala.util.control.NonFatal +import org.slf4j.LoggerFactory /** Unlike with most typical Tapir backends, adding endpoints doesn't immediatly convert them to a Route, because creating a Route requires * providing an Ox concurrency scope. Instead, it stores Endpoints and defers route creation until server.start() is called. This internal @@ -38,6 +39,7 @@ case class NettySyncServer( config: NettyConfig ): private val executor = Executors.newVirtualThreadPerTaskExecutor() + private val logger = LoggerFactory.getLogger(getClass.getName) def addEndpoint(se: ServerEndpoint[OxStreams & WebSockets, Identity]): NettySyncServer = addEndpoints(List(se)) def addEndpoint(se: ServerEndpoint[OxStreams & WebSockets, Identity], overrideOptions: NettySyncServerOptions): NettySyncServer = @@ -71,7 +73,8 @@ case class NettySyncServer( def start()(using Ox): NettySyncServerBinding = startUsingSocketOverride[InetSocketAddress](None, OxDispatcher.create) match case (socket, stop) => - NettySyncServerBinding(socket, stop) + NettySyncServerBinding(socket, stop).tap: binding => + logger.info(s"Tapir Netty server started on ${binding.hostName}:${binding.port}") /** Starts the server and blocks current virtual thread. Ensures graceful shutdown if the running server gets interrupted. Use [[start]] * if you need to manually control concurrency scope or server lifecycle. From 6fe9cb055733929cd7e7ecdaf505590569a29755 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 20 Nov 2024 01:29:19 +0100 Subject: [PATCH 094/127] Update cats-effect to 3.5.6 (#4177) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index d59deb2f21..55b84339e0 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -3,7 +3,7 @@ object Versions { val http4sBlazeServer = "0.23.17" val http4sBlazeClient = "0.23.17" val catsCore = "2.12.0" - val catsEffect = "3.5.5" + val catsEffect = "3.5.6" val circe = "0.14.9" val circeGenericExtras = "0.14.3" val circeYaml = "0.15.2" From 3258abff270c6e4d6f109b345130907e39c53611 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 21 Nov 2024 01:31:15 +0100 Subject: [PATCH 095/127] Update zio, zio-streams, zio-test, ... to 2.1.13 (#4178) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 55b84339e0..3e78b61fea 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -35,7 +35,7 @@ object Versions { val refined = "0.11.2" val iron = "2.6.0" val enumeratum = "1.7.5" - val zio = "2.1.12" + val zio = "2.1.13" val zioHttp = "3.0.1" val zioInteropCats = "23.1.0.3" val zioInteropReactiveStreams = "2.0.2" From 9adf813f837872d9426859fca06e1afc91710363 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 21 Nov 2024 01:53:34 +0100 Subject: [PATCH 096/127] Update zio-prelude to 1.0.0-RC35 (#4179) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 3e78b61fea..23908a9c84 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -52,7 +52,7 @@ object Versions { val derevo = "0.13.0" val newtype = "0.4.4" val monixNewtype = "0.3.0" - val zioPrelude = "1.0.0-RC34" + val zioPrelude = "1.0.0-RC35" val awsLambdaInterface = "2.6.0" val armeria = "1.30.1" val scalaJava8Compat = "1.0.2" From 9d97fc76693ffe98de50b2d9e703e61ce5e2db4a Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 23 Nov 2024 01:37:32 +0100 Subject: [PATCH 097/127] Update armeria to 1.30.2 (#4181) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 23908a9c84..aa7049e5df 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -54,7 +54,7 @@ object Versions { val monixNewtype = "0.3.0" val zioPrelude = "1.0.0-RC35" val awsLambdaInterface = "2.6.0" - val armeria = "1.30.1" + val armeria = "1.30.2" val scalaJava8Compat = "1.0.2" val scalaCollectionCompat = "2.12.0" val fs2 = "3.11.0" From cdc5bcadaca5f3957feaca756ecded918d65a423 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sun, 24 Nov 2024 01:53:25 +0100 Subject: [PATCH 098/127] Update armeria to 1.31.1 (#4183) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index aa7049e5df..9fb730b1ac 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -54,7 +54,7 @@ object Versions { val monixNewtype = "0.3.0" val zioPrelude = "1.0.0-RC35" val awsLambdaInterface = "2.6.0" - val armeria = "1.30.2" + val armeria = "1.31.1" val scalaJava8Compat = "1.0.2" val scalaCollectionCompat = "2.12.0" val fs2 = "3.11.0" From 4f3fffd18501d488fa4249682ba559badb9e3a57 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Mon, 25 Nov 2024 01:45:32 +0100 Subject: [PATCH 099/127] Update sbt-projectmatrix to 0.10.1 (#4184) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index bc42909df0..a78436cd31 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -9,7 +9,7 @@ addSbtPlugin("com.softwaremill.sbt-softwaremill" % "sbt-softwaremill-browser-tes addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.1.4") addSbtPlugin("org.playframework.twirl" % "sbt-twirl" % "2.0.7") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.6.1") -addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.10.0") +addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.10.1") addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") From 9c974259983b69004e61c286aa35c9114aa02253 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 26 Nov 2024 01:30:26 +0100 Subject: [PATCH 100/127] Update prometheus-metrics-core, ... to 1.3.4 (#4186) --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index cec990efc8..ce3b15eb2f 100644 --- a/build.sbt +++ b/build.sbt @@ -1018,8 +1018,8 @@ lazy val prometheusMetrics: ProjectMatrix = (projectMatrix in file("metrics/prom .settings( name := "tapir-prometheus-metrics", libraryDependencies ++= Seq( - "io.prometheus" % "prometheus-metrics-core" % "1.3.2", - "io.prometheus" % "prometheus-metrics-exposition-formats" % "1.3.2", + "io.prometheus" % "prometheus-metrics-core" % "1.3.4", + "io.prometheus" % "prometheus-metrics-exposition-formats" % "1.3.4", scalaTest.value % Test ) ) From 3a9c49aa2e400adddece9c43c9881683d8a94c1f Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 27 Nov 2024 01:32:57 +0100 Subject: [PATCH 101/127] Update cats-effect to 3.5.7 (#4187) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 9fb730b1ac..8d379ded62 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -3,7 +3,7 @@ object Versions { val http4sBlazeServer = "0.23.17" val http4sBlazeClient = "0.23.17" val catsCore = "2.12.0" - val catsEffect = "3.5.6" + val catsEffect = "3.5.7" val circe = "0.14.9" val circeGenericExtras = "0.14.3" val circeYaml = "0.15.2" From 3ad1ece1f52b88bc71779fec1f153a84b960648a Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 29 Nov 2024 01:21:53 +0100 Subject: [PATCH 102/127] Update jackson-module-scala to 2.18.2 (#4189) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index ce3b15eb2f..9a972b02e9 100644 --- a/build.sbt +++ b/build.sbt @@ -527,7 +527,7 @@ lazy val perfTests: ProjectMatrix = (projectMatrix in file("perf-tests")) "jackson-databind" ), "io.gatling" % "gatling-test-framework" % "3.11.5" % "test" exclude ("com.fasterxml.jackson.core", "jackson-databind"), - "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.1", + "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.2", "nl.grons" %% "metrics4-scala" % Versions.metrics4Scala % Test, "com.lihaoyi" %% "scalatags" % Versions.scalaTags % Test, "io.github.classgraph" % "classgraph" % "4.8.179", From bb69545dce8290fa8969cace29b1b55e9f199704 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 29 Nov 2024 01:37:08 +0100 Subject: [PATCH 103/127] Update play, play-akka-http-server, ... to 2.9.6 (#4190) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 8d379ded62..20c25cfc46 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -43,7 +43,7 @@ object Versions { val playClient = "3.0.6" val playServer = "3.0.5" val play29Client = "2.2.10" - val play29Server = "2.9.5" + val play29Server = "2.9.6" val tethys = "0.29.3" val vertx = "4.5.11" val jsScalaJavaTime = "2.6.0" From eb121c0e37c98371d5c95f69aac4ab4e6a92f4e3 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 30 Nov 2024 01:31:19 +0100 Subject: [PATCH 104/127] Update quicklens to 1.9.10 (#4192) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 20c25cfc46..3d12170341 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -59,7 +59,7 @@ object Versions { val scalaCollectionCompat = "2.12.0" val fs2 = "3.11.0" val decline = "2.4.1" - val quicklens = "1.9.9" + val quicklens = "1.9.10" val openTelemetry = "1.44.1" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" From 38d0339d757c2e90b1b6d54a111694506371ac2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Brunk?= Date: Tue, 3 Dec 2024 14:51:03 +0100 Subject: [PATCH 105/127] Copy HttpContent into array to avoid buffer being released too early (#4194) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sören Brunk Co-authored-by: Saskia Gennrich Co-authored-by: adamw --- build.sbt | 1 + perf-tests/src/main/resources/64KB.json | 1381 +++++++++++++++++ .../sttp/tapir/perf/apis/Endpoints.scala | 14 +- .../scala/sttp/tapir/perf/Simulations.scala | 26 + .../cats/internal/Fs2StreamCompatible.scala | 11 +- .../tapir/server/tests/ServerBasicTests.scala | 37 +- 6 files changed, 1463 insertions(+), 7 deletions(-) create mode 100644 perf-tests/src/main/resources/64KB.json diff --git a/build.sbt b/build.sbt index 9a972b02e9..073b5e1a18 100644 --- a/build.sbt +++ b/build.sbt @@ -549,6 +549,7 @@ lazy val perfTests: ProjectMatrix = (projectMatrix in file("perf-tests")) .jvmPlatform(scalaVersions = List(scala2_13), settings = commonJvmSettings) .dependsOn( core, + circeJson, pekkoHttpServer, http4sServer, nettyServer, diff --git a/perf-tests/src/main/resources/64KB.json b/perf-tests/src/main/resources/64KB.json new file mode 100644 index 0000000000..c2a33dc044 --- /dev/null +++ b/perf-tests/src/main/resources/64KB.json @@ -0,0 +1,1381 @@ +[ + { + "name": "Adeel Solangi", + "language": "Sindhi", + "id": "V59OF92YF627HFY0", + "bio": "Donec lobortis eleifend condimentum. Cras dictum dolor lacinia lectus vehicula rutrum. Maecenas quis nisi nunc. Nam tristique feugiat est vitae mollis. Maecenas quis nisi nunc.", + "version": 6.1 + }, + { + "name": "Afzal Ghaffar", + "language": "Sindhi", + "id": "ENTOCR13RSCLZ6KU", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Etiam congue dignissim volutpat. Vestibulum pharetra libero et velit gravida euismod.", + "version": 1.88 + }, + { + "name": "Aamir Solangi", + "language": "Sindhi", + "id": "IAKPO3R4761JDRVG", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Fusce eu ultrices elit, vel posuere neque.", + "version": 7.27 + }, + { + "name": "Abla Dilmurat", + "language": "Uyghur", + "id": "5ZVOEPMJUI4MB4EN", + "bio": "Donec lobortis eleifend condimentum. Morbi ac tellus erat.", + "version": 2.53 + }, + { + "name": "Adil Eli", + "language": "Uyghur", + "id": "6VTI8X6LL0MMPJCC", + "bio": "Vivamus id faucibus velit, id posuere leo. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Suspendisse potenti.", + "version": 6.49 + }, + { + "name": "Adile Qadir", + "language": "Uyghur", + "id": "F2KEU5L7EHYSYFTT", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Morbi ultricies consequat ligula posuere eleifend. Aenean finibus in tortor vel aliquet. Fusce eu ultrices elit, vel posuere neque.", + "version": 1.9 + }, + { + "name": "Abdukerim Ibrahim", + "language": "Uyghur", + "id": "LO6DVTZLRK68528I", + "bio": "Vivamus id faucibus velit, id posuere leo. Nunc aliquet sodales nunc a pulvinar. Nunc aliquet sodales nunc a pulvinar. Ut viverra quis eros eu tincidunt.", + "version": 5.9 + }, + { + "name": "Adil Abro", + "language": "Sindhi", + "id": "LJRIULRNJFCNZJAJ", + "bio": "Etiam malesuada blandit erat, nec ultricies leo maximus sed. Fusce congue aliquam elit ut luctus. Etiam malesuada blandit erat, nec ultricies leo maximus sed. Cras dictum dolor lacinia lectus vehicula rutrum. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero.", + "version": 9.32 + }, + { + "name": "Afonso Vilarchán", + "language": "Galician", + "id": "JMCL0CXNXHPL1GBC", + "bio": "Fusce eu ultrices elit, vel posuere neque. Morbi ac tellus erat. Nunc tincidunt laoreet laoreet.", + "version": 5.21 + }, + { + "name": "Mark Schembri", + "language": "Maltese", + "id": "KU4T500C830697CW", + "bio": "Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. Morbi ultricies consequat ligula posuere eleifend. Vivamus id faucibus velit, id posuere leo. Sed laoreet posuere sapien, ut feugiat nibh gravida at. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros.", + "version": 3.17 + }, + { + "name": "Antía Sixirei", + "language": "Galician", + "id": "XOF91ZR7MHV1TXRS", + "bio": "Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Morbi finibus dui sed est fringilla ornare. Duis pellentesque ultrices convallis. Morbi ultricies consequat ligula posuere eleifend.", + "version": 6.44 + }, + { + "name": "Aygul Mutellip", + "language": "Uyghur", + "id": "FTSNV411G5MKLPDT", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Nam semper gravida nunc, sit amet elementum ipsum. Donec pellentesque ultrices mi, non consectetur eros luctus non. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna.", + "version": 9.1 + }, + { + "name": "Awais Shaikh", + "language": "Sindhi", + "id": "OJMWMEEQWMLDU29P", + "bio": "Nunc aliquet sodales nunc a pulvinar. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Donec pellentesque ultrices mi, non consectetur eros luctus non. Nulla finibus massa at viverra facilisis. Nunc tincidunt laoreet laoreet.", + "version": 1.59 + }, + { + "name": "Ambreen Ahmed", + "language": "Sindhi", + "id": "5G646V7E6TJW8X2M", + "bio": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros.", + "version": 2.35 + }, + { + "name": "Celtia Anes", + "language": "Galician", + "id": "Z53AJY7WUYPLAWC9", + "bio": "Nullam ac sodales dolor, eu facilisis dui. Maecenas non arcu nulla. Ut viverra quis eros eu tincidunt. Curabitur quis commodo quam.", + "version": 8.34 + }, + { + "name": "George Mifsud", + "language": "Maltese", + "id": "N1AS6UFULO6WGTLB", + "bio": "Phasellus tincidunt sollicitudin posuere. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Donec congue sapien vel euismod interdum. Cras dictum dolor lacinia lectus vehicula rutrum. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula.", + "version": 7.47 + }, + { + "name": "Aytürk Qasim", + "language": "Uyghur", + "id": "70RODUVRD95CLOJL", + "bio": "Curabitur ultricies id urna nec ultrices. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Duis commodo orci ut dolor iaculis facilisis.", + "version": 1.32 + }, + { + "name": "Dialè Meso", + "language": "Sesotho sa Leboa", + "id": "VBLI24FKF7VV6BWE", + "bio": "Maecenas non arcu nulla. Vivamus id faucibus velit, id posuere leo. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet.", + "version": 6.29 + }, + { + "name": "Breixo Galáns", + "language": "Galician", + "id": "4VRLON0GPEZYFCVL", + "bio": "Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Morbi ac tellus erat. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Vestibulum pharetra libero et velit gravida euismod. Cras dictum dolor lacinia lectus vehicula rutrum.", + "version": 1.62 + }, + { + "name": "Bieito Lorme", + "language": "Galician", + "id": "5DRDI1QLRGLP29RC", + "bio": "Ut viverra quis eros eu tincidunt. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Curabitur quis commodo quam. Morbi ac tellus erat.", + "version": 4.45 + }, + { + "name": "Azrugul Osman", + "language": "Uyghur", + "id": "5RCTVD3C5QGVAKTQ", + "bio": "Maecenas tempus neque ut porttitor malesuada. Donec lobortis eleifend condimentum.", + "version": 3.18 + }, + { + "name": "Brais Verdiñas", + "language": "Galician", + "id": "BT407GHCC0IHXCD3", + "bio": "Quisque maximus sodales mauris ut elementum. Ut viverra quis eros eu tincidunt. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Curabitur quis commodo quam.", + "version": 5.01 + }, + { + "name": "Ekber Sadir", + "language": "Uyghur", + "id": "AGZDAP8D8OVRRLTY", + "bio": "Quisque efficitur vel sapien ut imperdiet. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Sed nec suscipit ligula. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero.", + "version": 2.04 + }, + { + "name": "Doreen Bartolo", + "language": "Maltese", + "id": "59QSX02O2XOZGRLH", + "bio": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Nam semper gravida nunc, sit amet elementum ipsum. Ut viverra quis eros eu tincidunt. Curabitur sed condimentum felis, ut luctus eros.", + "version": 9.31 + }, + { + "name": "Ali Ayaz", + "language": "Sindhi", + "id": "3WNLUZ5LT2F7MYVU", + "bio": "Cras dictum dolor lacinia lectus vehicula rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Etiam malesuada blandit erat, nec ultricies leo maximus sed.", + "version": 7.8 + }, + { + "name": "Guzelnur Polat", + "language": "Uyghur", + "id": "I6QQHAEGV4CYDXLP", + "bio": "Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Nulla finibus massa at viverra facilisis.", + "version": 8.56 + }, + { + "name": "John Falzon", + "language": "Maltese", + "id": "U3AWXHDTSU0H82SL", + "bio": "Sed nec suscipit ligula. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet.", + "version": 9.96 + }, + { + "name": "Erkin Qadir", + "language": "Uyghur", + "id": "GV6TA1AATZYBJ3VR", + "bio": "Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. .", + "version": 3.53 + }, + { + "name": "Anita Rajput", + "language": "Sindhi", + "id": "XLLVD0NO2ZFEP4AK", + "bio": "Nam semper gravida nunc, sit amet elementum ipsum. Etiam congue dignissim volutpat.", + "version": 5.16 + }, + { + "name": "Ayesha Khalique", + "language": "Sindhi", + "id": "Q9A5QNGA0OSU8P6Y", + "bio": "Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien.", + "version": 3.9 + }, + { + "name": "Pheladi Rammala", + "language": "Sesotho sa Leboa", + "id": "EELSIRT2T4Q0M3M4", + "bio": "Quisque efficitur vel sapien ut imperdiet. Morbi ac tellus erat. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros.", + "version": 1.88 + }, + { + "name": "Antón Caneiro", + "language": "Galician", + "id": "ENTAPNU3MMFUGM1W", + "bio": "Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Vestibulum pharetra libero et velit gravida euismod.", + "version": 4.84 + }, + { + "name": "Qahar Abdulla", + "language": "Uyghur", + "id": "OGLODUPEHKEW0K83", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Fusce congue aliquam elit ut luctus. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Quisque maximus sodales mauris ut elementum.", + "version": 3.65 + }, + { + "name": "Reyhan Murat", + "language": "Uyghur", + "id": "Y91F4D54794E9ANT", + "bio": "Suspendisse sit amet ullamcorper sem. Curabitur sed condimentum felis, ut luctus eros.", + "version": 2.69 + }, + { + "name": "Tatapi Phogole", + "language": "Sesotho sa Leboa", + "id": "7JA42P5CMCWDVPNR", + "bio": "Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna. Nullam ac sodales dolor, eu facilisis dui. Ut viverra quis eros eu tincidunt.", + "version": 3.78 + }, + { + "name": "Marcos Amboade", + "language": "Galician", + "id": "WPX7H97C7D70CZJR", + "bio": "Nulla finibus massa at viverra facilisis. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Curabitur ultricies id urna nec ultrices. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Nunc aliquet sodales nunc a pulvinar.", + "version": 7.37 + }, + { + "name": "Grace Tabone", + "language": "Maltese", + "id": "K4XO8G8DMRNSHF2B", + "bio": "Curabitur sed condimentum felis, ut luctus eros. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna.", + "version": 5.36 + }, + { + "name": "Shafqat Memon", + "language": "Sindhi", + "id": "D8VFLVRXBXMVBRVI", + "bio": "Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. . Curabitur quis commodo quam. Quisque maximus sodales mauris ut elementum. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex.", + "version": 8.95 + }, + { + "name": "Zeynep Semet", + "language": "Uyghur", + "id": "Z324TZV8S0FGDSAO", + "bio": "Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Fusce eu ultrices elit, vel posuere neque. Nulla finibus massa at viverra facilisis.", + "version": 1.03 + }, + { + "name": "Meladi Papo", + "language": "Sesotho sa Leboa", + "id": "RJAZQ6BBLRT72CD9", + "bio": "Quisque efficitur vel sapien ut imperdiet. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Etiam congue dignissim volutpat. Donec congue sapien vel euismod interdum.", + "version": 7.22 + }, + { + "name": "Semet Alim", + "language": "Uyghur", + "id": "HI7L2SR4RCS8C8CS", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Ut viverra quis eros eu tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 1.01 + }, + { + "name": "Sabela Veloso", + "language": "Galician", + "id": "QA55WXDLC7SRH97X", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Suspendisse potenti. Cras dictum dolor lacinia lectus vehicula rutrum.", + "version": 7.32 + }, + { + "name": "Madule Ledimo", + "language": "Sesotho sa Leboa", + "id": "IHJN2DGJB5O1Y00D", + "bio": "Maecenas non arcu nulla. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id.", + "version": 7.47 + }, + { + "name": "Michelle Caruana", + "language": "Maltese", + "id": "EG1I21R75IV9Q0Q8", + "bio": "Nam tristique feugiat est vitae mollis. Morbi ultricies consequat ligula posuere eleifend. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna.", + "version": 4.95 + }, + { + "name": "Philip Camilleri", + "language": "Maltese", + "id": "FCO0URUHARX5FDFW", + "bio": "Quisque efficitur vel sapien ut imperdiet. Suspendisse sit amet ullamcorper sem. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. . Aenean finibus in tortor vel aliquet.", + "version": 9.97 + }, + { + "name": "Olalla Romeu", + "language": "Galician", + "id": "WOCMVO6CYPG01ZHY", + "bio": "Maecenas tempus neque ut porttitor malesuada. Sed nec suscipit ligula. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet.", + "version": 1.98 + }, + { + "name": "Gulnur Perhat", + "language": "Uyghur", + "id": "VO3M22TTQMBA2XEM", + "bio": "Nullam ac sodales dolor, eu facilisis dui. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Maecenas quis nisi nunc. Duis pellentesque ultrices convallis.", + "version": 5.03 + }, + { + "name": "Hunadi Makgatho", + "language": "Sesotho sa Leboa", + "id": "MRJDOV2MU7PTCDXE", + "bio": "Phasellus tincidunt sollicitudin posuere. Maecenas quis nisi nunc. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna.", + "version": 8.18 + }, + { + "name": "Charmaine Abela", + "language": "Maltese", + "id": "F6FJP1QDJL944X4Z", + "bio": "Nam rutrum sollicitudin ante tempus consequat. Suspendisse sit amet ullamcorper sem. Morbi ac tellus erat. Sed nec suscipit ligula.", + "version": 6.95 + }, + { + "name": "Tumelò Letamo", + "language": "Sesotho sa Leboa", + "id": "F8BL9NPIKV0OWO1X", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Etiam congue dignissim volutpat. Sed nec suscipit ligula. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet.", + "version": 7.17 + }, + { + "name": "Aneela Mohan", + "language": "Sindhi", + "id": "CRYN52CXKNJU0YXU", + "bio": "Sed nec suscipit ligula. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Maecenas tempus neque ut porttitor malesuada.", + "version": 4.45 + }, + { + "name": "KoketÅ¡o Montjane", + "language": "Sesotho sa Leboa", + "id": "0TTAMXC9TENQCA2O", + "bio": "Curabitur sed condimentum felis, ut luctus eros. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros.", + "version": 3.61 + }, + { + "name": "Tegra Núnez", + "language": "Galician", + "id": "NC1ZUV6B853BZZCW", + "bio": "Maecenas tempus neque ut porttitor malesuada. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna.", + "version": 6.68 + }, + { + "name": "Dilnur Qeyser", + "language": "Uyghur", + "id": "JVQ8RQ4YRPGLFMR8", + "bio": "Maecenas non arcu nulla. Nulla finibus massa at viverra facilisis. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros.", + "version": 7.93 + }, + { + "name": "Tania Agius", + "language": "Maltese", + "id": "WTDGKLDWJLR1BJKR", + "bio": "Etiam congue dignissim volutpat. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna.", + "version": 4.78 + }, + { + "name": "Iago Peirallo", + "language": "Galician", + "id": "D51G7XQTX2SPHR52", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Donec congue sapien vel euismod interdum. Suspendisse potenti. Quisque maximus sodales mauris ut elementum. Quisque maximus sodales mauris ut elementum.", + "version": 6.3 + }, + { + "name": "Mpho Lamola", + "language": "Sesotho sa Leboa", + "id": "UGL8EOTXYBW1ILLW", + "bio": "In id elit malesuada, pulvinar mi eu, imperdiet nulla. Curabitur ultricies id urna nec ultrices. Maecenas tempus neque ut porttitor malesuada. In sed ultricies lorem. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet.", + "version": 2.05 + }, + { + "name": "Josephine Balzan", + "language": "Maltese", + "id": "4OLTG6QD0A2VB432", + "bio": "Maecenas tempus neque ut porttitor malesuada. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Maecenas non arcu nulla. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Curabitur quis commodo quam.", + "version": 7.64 + }, + { + "name": "Thabò Motongwane", + "language": "Sesotho sa Leboa", + "id": "NROE4ZZVGKZGDFNO", + "bio": "Donec pellentesque ultrices mi, non consectetur eros luctus non. Suspendisse potenti. Suspendisse potenti.", + "version": 2.07 + }, + { + "name": "Mmathabò Mojapelo", + "language": "Sesotho sa Leboa", + "id": "VXJDXYPV5L300IFW", + "bio": "Sed laoreet posuere sapien, ut feugiat nibh gravida at. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna. Nunc tincidunt laoreet laoreet. .", + "version": 9.36 + }, + { + "name": "Kgabo Lerumo", + "language": "Sesotho sa Leboa", + "id": "D63WWKQE2R4TFDIL", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Maecenas tempus neque ut porttitor malesuada. Morbi ultricies consequat ligula posuere eleifend. Quisque efficitur vel sapien ut imperdiet. Nam rutrum sollicitudin ante tempus consequat.", + "version": 6.69 + }, + { + "name": "Lawrence Scicluna", + "language": "Maltese", + "id": "0KDA7XKZNNZWL2SR", + "bio": "Donec pellentesque ultrices mi, non consectetur eros luctus non. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et.", + "version": 6.53 + }, + { + "name": "Iria Xamardo", + "language": "Galician", + "id": "ULUDKBP9PHBGHX2J", + "bio": "Vivamus id faucibus velit, id posuere leo. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam malesuada blandit erat, nec ultricies leo maximus sed. Ut viverra quis eros eu tincidunt.", + "version": 3.42 + }, + { + "name": "Joseph Grech", + "language": "Maltese", + "id": "T4P1164RJBJ8S6XD", + "bio": "Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Donec lobortis eleifend condimentum.", + "version": 7.68 + }, + { + "name": "Napogadi Selepe", + "language": "Sesotho sa Leboa", + "id": "AJK91MKRFIHAQHHG", + "bio": "Quisque maximus sodales mauris ut elementum. Maecenas quis nisi nunc.", + "version": 4.95 + }, + { + "name": "Lesetja Theko", + "language": "Sesotho sa Leboa", + "id": "AATM20BURO1DHDAE", + "bio": "Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Nulla finibus massa at viverra facilisis. Morbi finibus dui sed est fringilla ornare.", + "version": 6.81 + }, + { + "name": "Martiño Arxíz", + "language": "Galician", + "id": "CQ56N9MH3WK7H5YQ", + "bio": "Proin tempus eu risus nec mattis. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Nam rutrum sollicitudin ante tempus consequat. .", + "version": 7.13 + }, + { + "name": "Malehumò Ledwaba", + "language": "Sesotho sa Leboa", + "id": "E4F3HGRTKQKCT1SE", + "bio": "Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Curabitur quis commodo quam. Quisque maximus sodales mauris ut elementum. Curabitur sed condimentum felis, ut luctus eros. Curabitur ultricies id urna nec ultrices.", + "version": 6.52 + }, + { + "name": "Musa Yasin", + "language": "Uyghur", + "id": "1AF8GIQZ1LF8QW0U", + "bio": "Phasellus tincidunt sollicitudin posuere. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor.", + "version": 1.54 + }, + { + "name": "Lajwanti Kumari", + "language": "Sindhi", + "id": "INRW3R54RAY7J9IS", + "bio": "In sed ultricies lorem. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 9.34 + }, + { + "name": "Maria Sammut", + "language": "Maltese", + "id": "BJRF0BWIHJ0Q12A1", + "bio": "Maecenas tempus neque ut porttitor malesuada. Curabitur ultricies id urna nec ultrices.", + "version": 6.83 + }, + { + "name": "Rita Busuttil", + "language": "Maltese", + "id": "1QLMU6QZ7EYUNNZV", + "bio": "Phasellus tincidunt sollicitudin posuere. Quisque efficitur vel sapien ut imperdiet. Vestibulum pharetra libero et velit gravida euismod. Maecenas tempus neque ut porttitor malesuada.", + "version": 2.09 + }, + { + "name": "Roi Fraguela", + "language": "Galician", + "id": "UAT0M2O42E9M4SFT", + "bio": "Donec congue sapien vel euismod interdum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce congue aliquam elit ut luctus. Morbi ac tellus erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 1.08 + }, + { + "name": "Matome Molamo", + "language": "Sesotho sa Leboa", + "id": "7HI0UZZLRB9N5CBI", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Fusce eu ultrices elit, vel posuere neque. Duis pellentesque ultrices convallis.", + "version": 9.55 + }, + { + "name": "Mapula Selokela", + "language": "Sesotho sa Leboa", + "id": "6ZQTOKQI6K82EE9Q", + "bio": "Duis pellentesque ultrices convallis. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. Ut viverra quis eros eu tincidunt. Proin tempus eu risus nec mattis.", + "version": 5.27 + }, + { + "name": "Noa Ervello", + "language": "Galician", + "id": "W9FR842CI16V8NU3", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Suspendisse sit amet ullamcorper sem. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex.", + "version": 9.33 + }, + { + "name": "Naseem Kakepoto", + "language": "Sindhi", + "id": "6C7HZV4WPV9C9KS6", + "bio": "Morbi ultricies consequat ligula posuere eleifend. Fusce congue aliquam elit ut luctus. . Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula.", + "version": 1.4 + }, + { + "name": "sayama Amir", + "language": "Sindhi", + "id": "7K4IJT1X7G0EK9WC", + "bio": "Morbi ac tellus erat. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Maecenas quis nisi nunc. Etiam congue dignissim volutpat. Sed nec suscipit ligula.", + "version": 9.48 + }, + { + "name": "Mariña Quintá", + "language": "Galician", + "id": "7GXC4OQYXX5JJY9F", + "bio": "Phasellus tincidunt sollicitudin posuere. Morbi ac tellus erat. Nullam ac sodales dolor, eu facilisis dui.", + "version": 8.81 + }, + { + "name": "Memet Tursun", + "language": "Uyghur", + "id": "KSFMV2JK2D553083", + "bio": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Morbi finibus dui sed est fringilla ornare. Suspendisse sit amet ullamcorper sem.", + "version": 7.56 + }, + { + "name": "Carmen Vella", + "language": "Maltese", + "id": "WUALBIMS4E8JS4L2", + "bio": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc aliquet sodales nunc a pulvinar. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Vestibulum pharetra libero et velit gravida euismod.", + "version": 4.55 + }, + { + "name": "Sobia Khanam", + "language": "Sindhi", + "id": "YG1ERFWBJ7TIW35D", + "bio": "Phasellus tincidunt sollicitudin posuere. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Morbi ultricies consequat ligula posuere eleifend. Curabitur sed condimentum felis, ut luctus eros.", + "version": 4.59 + }, + { + "name": "Raheela Ali", + "language": "Sindhi", + "id": "7JGX9SMLD5DE2IMG", + "bio": "Morbi finibus dui sed est fringilla ornare. Maecenas quis nisi nunc. Maecenas tempus neque ut porttitor malesuada. Curabitur ultricies id urna nec ultrices.", + "version": 4.75 + }, + { + "name": "Rashid Rajput", + "language": "Sindhi", + "id": "UNBGUGDUATATCLS4", + "bio": "Donec congue sapien vel euismod interdum. Maecenas quis nisi nunc.", + "version": 8.51 + }, + { + "name": "Uxía Feal", + "language": "Galician", + "id": "35ZPXUNH1M6W3ZJP", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Vivamus id faucibus velit, id posuere leo.", + "version": 1.31 + }, + { + "name": "Andrew Fenech", + "language": "Maltese", + "id": "VEYKDKL8L0R0C7GQ", + "bio": "In sed ultricies lorem. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Sed laoreet posuere sapien, ut feugiat nibh gravida at.", + "version": 2.5 + }, + { + "name": "Nicholas Micallef", + "language": "Maltese", + "id": "ZYCAI905154LSICR", + "bio": "Nam tristique feugiat est vitae mollis. Curabitur ultricies id urna nec ultrices. Morbi finibus dui sed est fringilla ornare.", + "version": 6.47 + }, + { + "name": "Paul Borg", + "language": "Maltese", + "id": "8AD5MMJ0TD0NJ6H2", + "bio": "Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien.", + "version": 3.77 + }, + { + "name": "Sara Saleem", + "language": "Sindhi", + "id": "5LPKMTZI7OPSJRBA", + "bio": "Maecenas tempus neque ut porttitor malesuada. Etiam congue dignissim volutpat. Proin tempus eu risus nec mattis. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Duis commodo orci ut dolor iaculis facilisis.", + "version": 5.31 + }, + { + "name": "Xurxo Golán", + "language": "Galician", + "id": "526ZUSGXEETODHJK", + "bio": "Ut viverra quis eros eu tincidunt. Morbi finibus dui sed est fringilla ornare. Sed laoreet posuere sapien, ut feugiat nibh gravida at. Duis commodo orci ut dolor iaculis facilisis. In sed ultricies lorem.", + "version": 1.75 + }, + { + "name": "Peter Zammit", + "language": "Maltese", + "id": "NNRT5QWNWO2WLS5V", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Maecenas quis nisi nunc.", + "version": 8.23 + }, + { + "name": "Maname Mohlare", + "language": "Sesotho sa Leboa", + "id": "KZJZ9SD0DIWTIBUC", + "bio": "Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Vestibulum pharetra libero et velit gravida euismod. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi.", + "version": 8.95 + }, + { + "name": "Tshepè Mobu", + "language": "Sesotho sa Leboa", + "id": "8CH586LQR7ZCP73P", + "bio": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus massa at viverra facilisis.", + "version": 7.82 + }, + { + "name": "Monica Lohana", + "language": "Sindhi", + "id": "KP1C2WN3DN1R3Y52", + "bio": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Aenean finibus in tortor vel aliquet. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci.", + "version": 7.95 + }, + { + "name": "Patigul Rahman", + "language": "Uyghur", + "id": "NXMNLB0SOYET1VMN", + "bio": "In sed ultricies lorem. Proin tempus eu risus nec mattis. Nam rutrum sollicitudin ante tempus consequat. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id.", + "version": 2.98 + }, + { + "name": "Joanne Scerri", + "language": "Maltese", + "id": "H8FJ2WKLGGF3K26U", + "bio": "Fusce eu ultrices elit, vel posuere neque. Nulla finibus massa at viverra facilisis. Duis commodo orci ut dolor iaculis facilisis. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula.", + "version": 8.4 + }, + { + "name": "Ratanang Maphutha", + "language": "Sesotho sa Leboa", + "id": "EZXJTQQ2JWPB5DI3", + "bio": "Vivamus id faucibus velit, id posuere leo. Phasellus tincidunt sollicitudin posuere. Duis pellentesque ultrices convallis.", + "version": 9.17 + }, + { + "name": "Kamil Mehmud", + "language": "Uyghur", + "id": "M24A9OMYPSX7FD16", + "bio": "Donec congue sapien vel euismod interdum. Suspendisse potenti. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Nunc aliquet sodales nunc a pulvinar. Ut viverra quis eros eu tincidunt.", + "version": 4.66 + }, + { + "name": "Thobile Mbele", + "language": "isiZulu", + "id": "631M00M8YFFBC5NC", + "bio": "Nunc aliquet sodales nunc a pulvinar. Proin tempus eu risus nec mattis. Proin tempus eu risus nec mattis. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus.", + "version": 8.96 + }, + { + "name": "Kristján Kristjánsson", + "language": "Icelandic", + "id": "0WT0ZW50DNSTCHKW", + "bio": "Quisque maximus sodales mauris ut elementum. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Donec congue sapien vel euismod interdum. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Donec lobortis eleifend condimentum.", + "version": 8.82 + }, + { + "name": "Stefán Stefánsson", + "language": "Icelandic", + "id": "1UOL8UK8BWAOSYTC", + "bio": "Suspendisse potenti. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna. Morbi ultricies consequat ligula posuere eleifend.", + "version": 7.87 + }, + { + "name": "Preeti Rajdan", + "language": "Hindi", + "id": "3UN0X88Y4WYH3X8X", + "bio": "In sed ultricies lorem. Vivamus id faucibus velit, id posuere leo. Duis commodo orci ut dolor iaculis facilisis. Nam rutrum sollicitudin ante tempus consequat.", + "version": 9.17 + }, + { + "name": "Sanjay Trivedi", + "language": "Hindi", + "id": "CPHR246457BD01KY", + "bio": "Quisque maximus sodales mauris ut elementum. Morbi ac tellus erat. Maecenas tempus neque ut porttitor malesuada. Cras dictum dolor lacinia lectus vehicula rutrum.", + "version": 8.3 + }, + { + "name": "Smiriti Sisodiya", + "language": "Hindi", + "id": "X3KWIL5KEHTMCKOM", + "bio": "Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Morbi finibus dui sed est fringilla ornare.", + "version": 3.27 + }, + { + "name": "Sandeep Benarjee", + "language": "Hindi", + "id": "9TS6CIE3UAIFG2IB", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Sed nec suscipit ligula. Quisque efficitur vel sapien ut imperdiet. Suspendisse sit amet ullamcorper sem.", + "version": 3.86 + }, + { + "name": "Damir Benic", + "language": "Bosnian", + "id": "QUNL9VBRHUGNOFMJ", + "bio": ". Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo.", + "version": 9.56 + }, + { + "name": "Sigrún Kristjánsdóttir", + "language": "Icelandic", + "id": "BT1Q0NUPKHDVCFLE", + "bio": "Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Nulla finibus massa at viverra facilisis.", + "version": 6.78 + }, + { + "name": "Basetsana Thage", + "language": "Setswana", + "id": "R9P3P2IAN7NY2X2Y", + "bio": "Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Nulla finibus massa at viverra facilisis. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula.", + "version": 3.97 + }, + { + "name": "Rajesh Santoshi", + "language": "Hindi", + "id": "OXQTFZHZW8SVE3SY", + "bio": "Donec lobortis eleifend condimentum. Nam rutrum sollicitudin ante tempus consequat. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet.", + "version": 8.35 + }, + { + "name": "Margrét Magnúsdóttir", + "language": "Icelandic", + "id": "1P6VZEDGK2XUU97L", + "bio": "Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Duis pellentesque ultrices convallis. Donec lobortis eleifend condimentum.", + "version": 3.76 + }, + { + "name": "Makhosi Ngiba", + "language": "isiZulu", + "id": "CTM3Y3TZOLC7TPDU", + "bio": "Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Suspendisse sit amet ullamcorper sem. Donec lobortis eleifend condimentum. Aenean finibus in tortor vel aliquet. Proin tempus eu risus nec mattis.", + "version": 1.18 + }, + { + "name": "Lorato Bogosi", + "language": "Setswana", + "id": "EEZ0KS5E0RXACAIA", + "bio": "Morbi ultricies consequat ligula posuere eleifend. Nam rutrum sollicitudin ante tempus consequat. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Curabitur ultricies id urna nec ultrices.", + "version": 5.48 + }, + { + "name": "Modisaotsile Bolokwe", + "language": "Setswana", + "id": "DN068KNEOAQ8LM19", + "bio": "Nullam ac sodales dolor, eu facilisis dui. Duis commodo orci ut dolor iaculis facilisis. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Donec congue sapien vel euismod interdum. Sed nec suscipit ligula.", + "version": 4.23 + }, + { + "name": "Mxolisi Mhlongo", + "language": "isiZulu", + "id": "Q2HFB19RPLHIZXKH", + "bio": "Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Maecenas tempus neque ut porttitor malesuada. . Duis commodo orci ut dolor iaculis facilisis.", + "version": 7.49 + }, + { + "name": "Moni Sisodiya", + "language": "Hindi", + "id": "3CR7CN74GCKXWUQF", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Donec congue sapien vel euismod interdum. Fusce congue aliquam elit ut luctus. Ut viverra quis eros eu tincidunt. Phasellus tincidunt sollicitudin posuere.", + "version": 4.58 + }, + { + "name": "Anna Jónsdóttir", + "language": "Icelandic", + "id": "CKJW1XVW90VWO4Y1", + "bio": "Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Donec lobortis eleifend condimentum. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien.", + "version": 5.78 + }, + { + "name": "Darko Basic", + "language": "Bosnian", + "id": "FWT1CZQOIVRJTXRD", + "bio": "Donec congue sapien vel euismod interdum. Fusce eu ultrices elit, vel posuere neque. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna.", + "version": 2.27 + }, + { + "name": "Kedibonye Magogwe", + "language": "Setswana", + "id": "PCT0HLRPZLDSSDU1", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Quisque maximus sodales mauris ut elementum.", + "version": 5.57 + }, + { + "name": "Nobuhle Xaba", + "language": "isiZulu", + "id": "5K1K8V1OUUFKQ2UV", + "bio": "Maecenas non arcu nulla. Morbi ac tellus erat.", + "version": 1.18 + }, + { + "name": "Monty Dubey", + "language": "Hindi", + "id": "B7SF955NFGAEBRXU", + "bio": "Maecenas quis nisi nunc. Maecenas tempus neque ut porttitor malesuada. Morbi ultricies consequat ligula posuere eleifend. Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor.", + "version": 6.69 + }, + { + "name": "Richa Choukse", + "language": "Hindi", + "id": "BADWLBP8CNJNBEC8", + "bio": "Nunc tincidunt laoreet laoreet. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Curabitur quis commodo quam. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci.", + "version": 7.8 + }, + { + "name": "Dzenan Imamovic", + "language": "Bosnian", + "id": "FVAHD0OY99X9DIRW", + "bio": "Nam tristique feugiat est vitae mollis. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Nullam ac sodales dolor, eu facilisis dui. Morbi finibus dui sed est fringilla ornare. Quisque efficitur vel sapien ut imperdiet.", + "version": 1.64 + }, + { + "name": "Amol Bhatnagar", + "language": "Hindi", + "id": "3HPSETKL9VOW2WTL", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Nam semper gravida nunc, sit amet elementum ipsum.", + "version": 3.28 + }, + { + "name": "Ingibjörg Ólafsdóttir", + "language": "Icelandic", + "id": "9BXLMMM1PQOZRHCR", + "bio": "Maecenas non arcu nulla. Sed nec suscipit ligula. Fusce congue aliquam elit ut luctus.", + "version": 9.59 + }, + { + "name": "Shweta Chourasia", + "language": "Hindi", + "id": "9GAO62FXPQMUTTLJ", + "bio": "Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Quisque maximus sodales mauris ut elementum. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi.", + "version": 5.84 + }, + { + "name": "Ayanda Ndimande", + "language": "isiZulu", + "id": "VPK9MQRKX2L847HQ", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus.", + "version": 2.89 + }, + { + "name": "Sigurjón Guðmundsson", + "language": "Icelandic", + "id": "IAYT285H2U8JU94F", + "bio": "Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Ut viverra quis eros eu tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et.", + "version": 4.85 + }, + { + "name": "Jóhannes Jóhannsson", + "language": "Icelandic", + "id": "J2RAROEJGKMR72I8", + "bio": "Duis pellentesque ultrices convallis. Nulla finibus massa at viverra facilisis. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo.", + "version": 4.83 + }, + { + "name": "Neo Dikgaka", + "language": "Setswana", + "id": "OQRF6Y37N20JILOC", + "bio": "Nam tristique feugiat est vitae mollis. Sed nec suscipit ligula. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. Duis pellentesque ultrices convallis. Maecenas quis nisi nunc.", + "version": 1.07 + }, + { + "name": "Sanja Jankovic", + "language": "Bosnian", + "id": "HD94EKIPA6WAL05C", + "bio": "Phasellus tincidunt sollicitudin posuere. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Donec congue sapien vel euismod interdum. Nullam ac sodales dolor, eu facilisis dui.", + "version": 1.06 + }, + { + "name": "Mogorosi Bakwena", + "language": "Setswana", + "id": "FTZM8YDJJUH1OEM7", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Suspendisse sit amet ullamcorper sem.", + "version": 6.03 + }, + { + "name": "Ronak Gupta", + "language": "Hindi", + "id": "ZYPDGK8UDYJPTRKN", + "bio": "Sed laoreet posuere sapien, ut feugiat nibh gravida at. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. In sed ultricies lorem. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna.", + "version": 7.18 + }, + { + "name": "Ditiro Kgosi", + "language": "Setswana", + "id": "67C5ET66U59WYJ6K", + "bio": "Fusce congue aliquam elit ut luctus. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Cras dictum dolor lacinia lectus vehicula rutrum. Etiam congue dignissim volutpat.", + "version": 4.56 + }, + { + "name": "Jelena Maric", + "language": "Bosnian", + "id": "JTW9DH3B9QGB39JY", + "bio": "Vestibulum pharetra libero et velit gravida euismod. Etiam malesuada blandit erat, nec ultricies leo maximus sed.", + "version": 3.39 + }, + { + "name": "Esha Sastry", + "language": "Hindi", + "id": "4OJULHY03Z6XTRMW", + "bio": "Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Nullam ac sodales dolor, eu facilisis dui.", + "version": 5.1 + }, + { + "name": "Chetana Hegde", + "language": "Hindi", + "id": "J9GS1RODDZL325LK", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Nulla finibus massa at viverra facilisis. Nam tristique feugiat est vitae mollis. Phasellus tincidunt sollicitudin posuere.", + "version": 9.99 + }, + { + "name": "Rahul Shukla", + "language": "Hindi", + "id": "2ANVMAVG6YX2VT6N", + "bio": "Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula.", + "version": 1.72 + }, + { + "name": "Samra Delic", + "language": "Bosnian", + "id": "BXJWNTJ2TDID61PJ", + "bio": "Donec pellentesque ultrices mi, non consectetur eros luctus non. Sed nec suscipit ligula.", + "version": 2.5 + }, + { + "name": "Mohan Pandey", + "language": "Hindi", + "id": "XAHKVLM3I1WSPNIW", + "bio": "Maecenas quis nisi nunc. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Morbi ac tellus erat.", + "version": 8.1 + }, + { + "name": "Haris Osmanovic", + "language": "Bosnian", + "id": "ZDXF5KESMW9XF2TJ", + "bio": "Nam rutrum sollicitudin ante tempus consequat. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien.", + "version": 9.41 + }, + { + "name": "Kenosi Kwenaemang", + "language": "Setswana", + "id": "DX2IYTQ9IMY75W08", + "bio": "Sed laoreet posuere sapien, ut feugiat nibh gravida at. Donec lobortis eleifend condimentum.", + "version": 9.01 + }, + { + "name": "Nontobeko Nzimande", + "language": "isiZulu", + "id": "Y9C4HQHTOP74DFZT", + "bio": "Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Nam laoreet, nunc non suscipit interdum, justo turpis vestibulum massa, non vulputate ex urna at purus.", + "version": 4.77 + }, + { + "name": "Sanjay Puranik", + "language": "Hindi", + "id": "WF2WP6S0HX8GR8GZ", + "bio": "Ut viverra quis eros eu tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Nam semper gravida nunc, sit amet elementum ipsum.", + "version": 3.37 + }, + { + "name": "Sethunya MpÅ¡we", + "language": "Setswana", + "id": "85MVUXVQ5H5HPA4F", + "bio": "Quisque maximus sodales mauris ut elementum. Duis commodo orci ut dolor iaculis facilisis. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi.", + "version": 1.75 + }, + { + "name": "Dileep Chaturvedi", + "language": "Hindi", + "id": "O95BY1KDMCEYQRFH", + "bio": "Phasellus tincidunt sollicitudin posuere. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Vivamus id faucibus velit, id posuere leo. Nullam ac sodales dolor, eu facilisis dui. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo.", + "version": 4.94 + }, + { + "name": "Adnan Spahic", + "language": "Bosnian", + "id": "97IIDMHAJMBPI4ON", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Vivamus id faucibus velit, id posuere leo.", + "version": 9.1 + }, + { + "name": "Madhur Jain", + "language": "Hindi", + "id": "FM300CZ0VU9LTNTE", + "bio": "Fusce eu ultrices elit, vel posuere neque. Donec congue sapien vel euismod interdum. Vivamus id faucibus velit, id posuere leo. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et.", + "version": 4.99 + }, + { + "name": "Nayan Mittal", + "language": "Hindi", + "id": "S879KFFIHDNK8GSE", + "bio": "Suspendisse sit amet ullamcorper sem. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Duis commodo orci ut dolor iaculis facilisis.", + "version": 3.99 + }, + { + "name": "Kabelo Morwe", + "language": "Setswana", + "id": "JJDPB2983QRVATD3", + "bio": "Nullam ac sodales dolor, eu facilisis dui. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. . Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Curabitur ultricies id urna nec ultrices.", + "version": 8.86 + }, + { + "name": "Einar Einarsson", + "language": "Icelandic", + "id": "ZWMFEUEBNYTW2WPB", + "bio": "Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Duis pellentesque ultrices convallis. Nullam sodales convallis mauris, sit amet lobortis magna auctor sit amet. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Donec congue sapien vel euismod interdum.", + "version": 9.05 + }, + { + "name": "Luka Lovren", + "language": "Bosnian", + "id": "9S4SGEQWBKMRISYZ", + "bio": "Maecenas tempus neque ut porttitor malesuada. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur quis commodo quam. Nam rutrum sollicitudin ante tempus consequat.", + "version": 5.22 + }, + { + "name": "Sigríður Einarsdóttir", + "language": "Icelandic", + "id": "4IJVD6OE3C7IX3ZG", + "bio": "Aenean finibus in tortor vel aliquet. Nam tristique feugiat est vitae mollis.", + "version": 6.63 + }, + { + "name": "Sonu Jain", + "language": "Hindi", + "id": "0OIB5SU9JB2PBJDV", + "bio": "Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Curabitur ultricies id urna nec ultrices.", + "version": 9.66 + }, + { + "name": "Boitumelo Ngwako", + "language": "Setswana", + "id": "INZITSS95L9V52JE", + "bio": "Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Nam tristique feugiat est vitae mollis. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. In sed ultricies lorem.", + "version": 9.07 + }, + { + "name": "Shilpa Bhatia", + "language": "Hindi", + "id": "SU0W3T6TF8G3JY5M", + "bio": "Morbi ultricies consequat ligula posuere eleifend. Donec pellentesque ultrices mi, non consectetur eros luctus non. Quisque efficitur vel sapien ut imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 4.43 + }, + { + "name": "Modise Tau", + "language": "Setswana", + "id": "U6SF3N4JXJEQSC1P", + "bio": "Vivamus id faucibus velit, id posuere leo. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Fusce eu ultrices elit, vel posuere neque. Nunc tincidunt laoreet laoreet.", + "version": 6.23 + }, + { + "name": "Reena Shrivastav", + "language": "Hindi", + "id": "Y57EEOVURYX1OA1P", + "bio": "Donec lobortis eleifend condimentum. Curabitur ultricies id urna nec ultrices. Maecenas non arcu nulla.", + "version": 3.07 + }, + { + "name": "Thabani Ngubani", + "language": "isiZulu", + "id": "LR7FI8WEE3SLTW02", + "bio": "Cras dictum dolor lacinia lectus vehicula rutrum. Nulla finibus massa at viverra facilisis.", + "version": 5.99 + }, + { + "name": "Gunnar Gunnarsson", + "language": "Icelandic", + "id": "UVI6EKJNMC3VE3WU", + "bio": "In sed ultricies lorem. Donec congue sapien vel euismod interdum. Duis commodo orci ut dolor iaculis facilisis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et.", + "version": 8.7 + }, + { + "name": "Lejla Selimagic", + "language": "Bosnian", + "id": "ESBBT644VZ64SSEN", + "bio": "Vivamus id faucibus velit, id posuere leo. Etiam congue dignissim volutpat. Donec lobortis eleifend condimentum. Fusce eu ultrices elit, vel posuere neque.", + "version": 5.59 + }, + { + "name": "Kgosietsile Bogatsu", + "language": "Setswana", + "id": "0B8IOVL2NSVJVV6T", + "bio": "Curabitur quis commodo quam. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Nullam ac sodales dolor, eu facilisis dui. Duis commodo orci ut dolor iaculis facilisis.", + "version": 6.78 + }, + { + "name": "Sushant Bhargav", + "language": "Hindi", + "id": "PRWA7HE1GJ7OCYQM", + "bio": "Proin tempus eu risus nec mattis. Maecenas tempus neque ut porttitor malesuada. Quisque efficitur vel sapien ut imperdiet. Quisque efficitur vel sapien ut imperdiet.", + "version": 5.36 + }, + { + "name": "Monika Nayak", + "language": "Hindi", + "id": "RO0ZCWFTY6MJ66AZ", + "bio": "Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Quisque efficitur vel sapien ut imperdiet. Nam rutrum sollicitudin ante tempus consequat. Curabitur ultricies id urna nec ultrices. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula.", + "version": 7.58 + }, + { + "name": "Guðrún Guðmundsdóttir", + "language": "Icelandic", + "id": "R1TRJT5TWANYO88D", + "bio": "Maecenas non arcu nulla. In sed ultricies lorem.", + "version": 4.65 + }, + { + "name": "Shakti Menon", + "language": "Hindi", + "id": "J1NSHQXRWA7CY0AZ", + "bio": "Vivamus id faucibus velit, id posuere leo. Etiam malesuada blandit erat, nec ultricies leo maximus sed. Nam semper gravida nunc, sit amet elementum ipsum.", + "version": 5.16 + }, + { + "name": "Ndumiso Hlatshwayo", + "language": "isiZulu", + "id": "533XA8H67VO8CSGQ", + "bio": "Quisque efficitur vel sapien ut imperdiet. Nam semper gravida nunc, sit amet elementum ipsum. Donec pellentesque ultrices mi, non consectetur eros luctus non. Vestibulum pharetra libero et velit gravida euismod. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 5.24 + }, + { + "name": "Lucky Shastry", + "language": "Hindi", + "id": "3OBF3U08WI1QF63N", + "bio": "Morbi ultricies consequat ligula posuere eleifend. Suspendisse sit amet ullamcorper sem.", + "version": 7.86 + }, + { + "name": "Pule Matlhaku", + "language": "Setswana", + "id": "UPATVXM44DAFUDI7", + "bio": "Maecenas tempus neque ut porttitor malesuada. Vivamus id faucibus velit, id posuere leo. Morbi finibus dui sed est fringilla ornare.", + "version": 4.12 + }, + { + "name": "Raju Rathore", + "language": "Hindi", + "id": "QQMNYP788DEFG4IS", + "bio": "Nam rutrum sollicitudin ante tempus consequat. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero.", + "version": 9.86 + }, + { + "name": "Xolani Ngcobo", + "language": "isiZulu", + "id": "SXWZ4IYT5VZA6WEE", + "bio": "Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Fusce eu ultrices elit, vel posuere neque. Curabitur quis commodo quam.", + "version": 4.77 + }, + { + "name": "Meenakshi Benjaree", + "language": "Hindi", + "id": "933PPBA946YX1K4X", + "bio": "Maecenas tempus neque ut porttitor malesuada. Duis pellentesque ultrices convallis.", + "version": 7.9 + }, + { + "name": "Ólafur Magnússon", + "language": "Icelandic", + "id": "NWY9HV455M3W8QKY", + "bio": "Morbi ultricies consequat ligula posuere eleifend. Duis pellentesque ultrices convallis. Vestibulum pharetra libero et velit gravida euismod. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et.", + "version": 2.09 + }, + { + "name": "Samir Simic", + "language": "Bosnian", + "id": "6H2IO7A62ZVUXGKZ", + "bio": "Etiam malesuada blandit erat, nec ultricies leo maximus sed. Quisque maximus sodales mauris ut elementum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 6.93 + }, + { + "name": "Swarnika Soni", + "language": "Hindi", + "id": "4GJF8C6P1Y5RFPMC", + "bio": "Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Nunc tincidunt laoreet laoreet.", + "version": 4.82 + }, + { + "name": "Lavanya Mittal", + "language": "Hindi", + "id": "4Z09CO5IJH7CEUD2", + "bio": "Suspendisse sit amet ullamcorper sem. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo.", + "version": 1.08 + }, + { + "name": "Bontle Mokgatle", + "language": "Setswana", + "id": "4Y497GAOTAFUJDIC", + "bio": "Maecenas non arcu nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "version": 1.92 + }, + { + "name": "Prashant Chourey", + "language": "Hindi", + "id": "J4NMMNAALGOIZY8V", + "bio": "Etiam malesuada blandit erat, nec ultricies leo maximus sed. Suspendisse potenti. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Ut viverra quis eros eu tincidunt.", + "version": 8.59 + }, + { + "name": "Prakash Malviya", + "language": "Hindi", + "id": "P442H9CEHIU6HAFV", + "bio": "Proin tempus eu risus nec mattis. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Vivamus id faucibus velit, id posuere leo. In id elit malesuada, pulvinar mi eu, imperdiet nulla. Donec pellentesque ultrices mi, non consectetur eros luctus non.", + "version": 8.21 + }, + { + "name": "Ivana Kalic", + "language": "Bosnian", + "id": "31VIE8WWDJWKE5YL", + "bio": "Quisque efficitur vel sapien ut imperdiet. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna.", + "version": 6.99 + }, + { + "name": "Ajeet Vasav", + "language": "Hindi", + "id": "ODNPTWVSRBPII0BH", + "bio": "Aenean finibus in tortor vel aliquet. Integer vehicula, arcu sit amet egestas efficitur, orci justo interdum massa, eget ullamcorper risus ligula tristique libero. Morbi finibus dui sed est fringilla ornare. Morbi finibus dui sed est fringilla ornare. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros.", + "version": 3.6 + }, + { + "name": "Jóhanna Jóhannsdóttir", + "language": "Icelandic", + "id": "ZI21GM8B08FVLMF0", + "bio": "In sed ultricies lorem. Etiam malesuada blandit erat, nec ultricies leo maximus sed.", + "version": 4.93 + }, + { + "name": "Seema Thapar", + "language": "Hindi", + "id": "IZSO10C5ZHVYQ5O2", + "bio": "Duis commodo orci ut dolor iaculis facilisis. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien. Maecenas tempus neque ut porttitor malesuada. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et.", + "version": 1.79 + }, + { + "name": "María Stefánsdóttir", + "language": "Icelandic", + "id": "KWH2RVHSB25MYGL9", + "bio": "In id elit malesuada, pulvinar mi eu, imperdiet nulla. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi. Ut viverra quis eros eu tincidunt. Nam rutrum sollicitudin ante tempus consequat.", + "version": 5.21 + }, + { + "name": "Denis Terzic", + "language": "Bosnian", + "id": "1WQO4VGBS2U7DOSL", + "bio": "Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Curabitur quis commodo quam. Curabitur ultricies id urna nec ultrices. Nam rutrum sollicitudin ante tempus consequat. Morbi finibus dui sed est fringilla ornare.", + "version": 6.32 + }, + { + "name": "Ana Livic", + "language": "Bosnian", + "id": "8JYVK7SM07YQOVQ3", + "bio": "Nam tristique feugiat est vitae mollis. Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Proin tempus eu risus nec mattis. Sed eu libero maximus nunc lacinia lobortis et sit amet nisi.", + "version": 5.93 + }, + { + "name": "Bukhosi Bhengu", + "language": "isiZulu", + "id": "AFYXL0UNGMU0B1H2", + "bio": "Curabitur quis commodo quam. Curabitur sed condimentum felis, ut luctus eros. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Sed nec suscipit ligula.", + "version": 9.37 + }, + { + "name": "Siyabonga Sithole", + "language": "isiZulu", + "id": "NJDX77JXV51CNGF5", + "bio": "Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Sed laoreet posuere sapien, ut feugiat nibh gravida at.", + "version": 8.22 + }, + { + "name": "Meena Dubey", + "language": "Hindi", + "id": "GCJGYXSPDEFF9BTN", + "bio": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam consequat enim lorem, at tincidunt velit ultricies et. Donec lobortis eleifend condimentum. Morbi ac tellus erat. Maecenas quis nisi nunc.", + "version": 2.95 + }, + { + "name": "Chandrika Gupta", + "language": "Hindi", + "id": "7KFJHS86WKTL6Q12", + "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Suspendisse sit amet ullamcorper sem. Etiam mauris magna, fermentum vitae aliquet eu, cursus vitae sapien.", + "version": 5.35 + }, + { + "name": "Akhilesh Khare", + "language": "Hindi", + "id": "ATINHMT01VNMMDCP", + "bio": "Donec congue sapien vel euismod interdum. Suspendisse potenti. Nullam ac sodales dolor, eu facilisis dui. Nam tristique feugiat est vitae mollis. Curabitur ultricies id urna nec ultrices.", + "version": 3.68 + }, + { + "name": "Motsumi Basiang", + "language": "Setswana", + "id": "MUELSFQENUOHGBZ3", + "bio": "Cras dictum dolor lacinia lectus vehicula rutrum. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Donec congue sapien vel euismod interdum.", + "version": 5.23 + }, + { + "name": "Neha Benjaree", + "language": "Hindi", + "id": "5VTSZUD0SA9JVL40", + "bio": "Morbi ultricies consequat ligula posuere eleifend. Nulla finibus massa at viverra facilisis. Nam tristique feugiat est vitae mollis.", + "version": 5.73 + }, + { + "name": "Kristín Sigurðardóttir", + "language": "Icelandic", + "id": "ZP5TBBYX6RI2UJ31", + "bio": "Cras dictum dolor lacinia lectus vehicula rutrum. Cras dictum dolor lacinia lectus vehicula rutrum. Duis luctus, lacus eu aliquet convallis, purus elit malesuada ex, vitae rutrum ipsum dui ut magna. Fusce congue aliquam elit ut luctus. Duis commodo orci ut dolor iaculis facilisis.", + "version": 2.8 + }, + { + "name": "Rohini Vasav", + "language": "Hindi", + "id": "UEFML43TCGS04KWM", + "bio": "Ut accumsan, est vel fringilla varius, purus augue blandit nisl, eu rhoncus ligula purus vel dolor. Ut maximus, libero nec facilisis fringilla, ex sem sollicitudin leo, non congue tortor ligula in eros. Nam rutrum sollicitudin ante tempus consequat. Aliquam scelerisque pretium tellus, sed accumsan est ultrices id. Suspendisse sit amet ullamcorper sem.", + "version": 9.3 + }, + { + "name": "Sunil Kapoor", + "language": "Hindi", + "id": "VY2A0APGVHK5NAW2", + "bio": "Proin tempus eu risus nec mattis. Ut dictum, ligula eget sagittis maximus, tellus mi varius ex, a accumsan justo tellus vitae leo. In id elit malesuada, pulvinar mi eu, imperdiet nulla.", + "version": 8.04 + }, + { + "name": "Zamokuhle Zulu", + "language": "isiZulu", + "id": "XU7BX2F8M5PVZ1EF", + "bio": "Etiam congue dignissim volutpat. Phasellus tincidunt sollicitudin posuere. Phasellus tincidunt sollicitudin posuere. Nam tristique feugiat est vitae mollis.", + "version": 8.39 + }, + { + "name": "Bhupesh Menon", + "language": "Hindi", + "id": "0CEPNRDV98KT3ORP", + "bio": "Maecenas tempus neque ut porttitor malesuada. Phasellus massa ligula, hendrerit eget efficitur eget, tincidunt in ligula. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Maecenas quis nisi nunc.", + "version": 2.69 + } +] \ No newline at end of file diff --git a/perf-tests/src/main/scala/sttp/tapir/perf/apis/Endpoints.scala b/perf-tests/src/main/scala/sttp/tapir/perf/apis/Endpoints.scala index 9359682160..70e25e52b9 100644 --- a/perf-tests/src/main/scala/sttp/tapir/perf/apis/Endpoints.scala +++ b/perf-tests/src/main/scala/sttp/tapir/perf/apis/Endpoints.scala @@ -5,7 +5,8 @@ import sttp.tapir._ import sttp.tapir.perf.Common._ import sttp.tapir.server.ServerEndpoint import sttp.tapir.server.model.EndpointExtensions._ - +import io.circe.Json +import sttp.tapir.json.circe._ import java.io.File import scala.concurrent.Future @@ -55,6 +56,17 @@ trait Endpoints { body: File => reply(s"Ok [$n], file saved to ${body.toPath}") } + }, + { (n: Int) => + endpoint.post + .in("pathJson" + n.toString) + .in(jsonBody[Json]) + .maxRequestBodyLength(LargeInputSize + 1024L) + .out(stringBody) + .serverLogicSuccess { + body: Json => + reply(s"Ok [$n], file saved to ${body}") + } } ) } diff --git a/perf-tests/src/test/scala/sttp/tapir/perf/Simulations.scala b/perf-tests/src/test/scala/sttp/tapir/perf/Simulations.scala index 77e4a32912..f6b9c63164 100644 --- a/perf-tests/src/test/scala/sttp/tapir/perf/Simulations.scala +++ b/perf-tests/src/test/scala/sttp/tapir/perf/Simulations.scala @@ -9,6 +9,7 @@ import sttp.tapir.perf.Common._ import scala.concurrent.duration._ import scala.util.Random +import scala.io.Source object CommonSimulations { private val baseUrl = "127.0.0.1:8080" @@ -26,6 +27,8 @@ object CommonSimulations { def randomAlphanumByteArray(size: Int): Array[Byte] = Random.alphanumeric.take(size).map(_.toByte).toArray + def randomJson: Array[Byte] = Source.fromResource("64KB.json").getLines().mkString("\n").getBytes() + lazy val constRandomLongBytes = randomByteArray(LargeInputSize) lazy val constRandomLongAlphanumBytes = randomAlphanumByteArray(LargeInputSize) @@ -130,6 +133,23 @@ object CommonSimulations { .protocols(httpProtocol) } + def scenario_post_long_json(routeNumber: Int, histogram: Histogram, warmup: Boolean = false): PopulationBuilder = { + val execHttpPost = + exec( + http(s"${namePrefix(warmup)}HTTP POST /pathJson$routeNumber") + .post(s"/pathJson$routeNumber") + .body(ByteArrayBody(randomJson)) + .header("Content-Type", "application/json") + .check(sessionSaveResponseTime) + ) + .exec(handleLatencyHistogram(histogram, warmup)) + + scenario(s"${namePrefix(warmup)} Repeatedly invoke POST with json body") + .during(duration(warmup))(execHttpPost) + .inject(atOnceUsers(userCount)) + .protocols(httpProtocol) + } + } import CommonSimulations._ @@ -183,6 +203,12 @@ class PostLongStringSimulation extends PerfTestSuiteRunnerSimulation { setUp(warmup.andThen(measurements)): Unit } +class PostLongJsonSimulation extends PerfTestSuiteRunnerSimulation { + val warmup = scenario_post_long_json(0, histogram, warmup = true) + val small = scenario_post_long_json(0, histogram) + setUp(warmup.andThen(small)): Unit +} + /** Based on https://github.com/kamilkloch/websocket-benchmark/ Can't be executed using PerfTestSuiteRunner, see perfTests/README.md */ class WebSocketsSimulation extends Simulation { diff --git a/server/netty-server/cats/src/main/scala/sttp/tapir/server/netty/cats/internal/Fs2StreamCompatible.scala b/server/netty-server/cats/src/main/scala/sttp/tapir/server/netty/cats/internal/Fs2StreamCompatible.scala index 8f257f3559..cd870ece82 100644 --- a/server/netty-server/cats/src/main/scala/sttp/tapir/server/netty/cats/internal/Fs2StreamCompatible.scala +++ b/server/netty-server/cats/src/main/scala/sttp/tapir/server/netty/cats/internal/Fs2StreamCompatible.scala @@ -52,9 +52,14 @@ object Fs2StreamCompatible { .flatMap(s => s.sub.stream(Sync[F].delay(publisher.subscribe(s)))) .flatMap(httpContent => fs2.Stream.chunk { - val fs2Chunk = Chunk.byteBuffer(httpContent.content.nioBuffer()) - httpContent.release() // https://netty.io/wiki/reference-counted-objects.html - fs2Chunk + // #4194: we need to copy the data here as we don't know when the data will be ultimately read, and hence + // when we'll be able to release the Netty buffer + val buf = httpContent.content.nioBuffer() + try { + val content = new Array[Byte](buf.remaining()) + buf.get(content) + Chunk.array(content) + } finally { val _ = httpContent.release() } // https://netty.io/wiki/reference-counted-objects.html } ) maxBytes.map(Fs2Streams.limitBytes(stream, _)).getOrElse(stream) diff --git a/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala b/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala index b457ca3e64..ec84e2d528 100644 --- a/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala +++ b/server/tests/src/main/scala/sttp/tapir/server/tests/ServerBasicTests.scala @@ -416,6 +416,38 @@ class ServerBasicTests[F[_], OPTIONS, ROUTE]( pureResult(s"fruit: $fruit".asRight[Unit]) ) { (backend, baseUri) => basicRequest.get(uri"$baseUri?fruit=orange").send(backend).map(_.contentLength shouldBe Some(13)) + }, + // #4194: large payloads where released too soon in the netty server interpreters, corrupting the json and resulting in parse errors + { + val largePayloadSize = 1024 * 1024 * 5 + testServer( + endpoint.post.in("api" / "echo").in(stringBody).out(stringBody).maxRequestBodyLength(largePayloadSize + 100), + "multiple large requests parsing & serialising JSON" + )((s: String) => pureResult(s.asRight[Unit])) { (backend, baseUri) => + val largePayload = Iterator.continually('A' to 'Z').flatten.take(largePayloadSize).mkString + (1 to 100).toList + .traverse { i => + basicRequest + .post(uri"$baseUri/api/echo") + .body(largePayload) + .send(backend) + .map { response => + if (response.code != StatusCode.Ok || response.body != Right(largePayload)) { + val detail = response.body match { + case Left(e) => fail(s"error response: $e") + case Right(b) if b.length != largePayload.length => s"body length: ${b.length}, expected: ${largePayload.length}" + case Right(b) => + val original = largePayload.getBytes() + val received = b.getBytes() + val firstDifference = original.zip(received).indexWhere { case (a, b) => a != b } + s"first difference on byte $firstDifference, expected: ${original(firstDifference)}, received: ${received(firstDifference)}" + } + fail(s"Failed on iteration $i, got response code: ${response.code}; $detail") + } + } + } + .map(_ => succeed) + } } ) @@ -463,9 +495,8 @@ class ServerBasicTests[F[_], OPTIONS, ROUTE]( }, testServer(in_path_paths_out_header_body, "Encoded path should be decoded") { case (i, paths) => pureResult(Right((i, paths.last))) - }{ - (backend, baseUri) => - basicRequest.get(uri"$baseUri/api/15/and/MIN%2FMAX").send(backend).map(_.body shouldBe Right("MIN/MAX")) + } { (backend, baseUri) => + basicRequest.get(uri"$baseUri/api/15/and/MIN%2FMAX").send(backend).map(_.body shouldBe Right("MIN/MAX")) }, testServer(in_single_path, "single path should match single/ path")((_: Unit) => pureResult(Either.right[Unit, Unit](()))) { (backend, baseUri) => From 67f8fccc771131abb0cb654f3c75f4f7d1b0afdd Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 3 Dec 2024 14:52:12 +0100 Subject: [PATCH 106/127] Update sbt, sbt-dependency-tree, ... to 1.10.6 (#4193) Co-authored-by: scala-steward --- .../sbt-openapi-codegen/caching/project/build.properties | 2 +- .../sbt-openapi-codegen/minimal/project/build.properties | 2 +- .../oneOf-json-roundtrip/project/build.properties | 2 +- .../oneOf-json-roundtrip_jsoniter/project/build.properties | 2 +- .../project/build.properties | 2 +- .../oneOf-json-roundtrip_scala3/project/build.properties | 2 +- .../option-overrides/project/build.properties | 2 +- project/build.properties | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties index db1723b086..e88a0d817d 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 diff --git a/project/build.properties b/project/build.properties index db1723b086..e88a0d817d 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.5 +sbt.version=1.10.6 From ef88bd30700a57c66321a1a4fd5600689249c186 Mon Sep 17 00:00:00 2001 From: adamw Date: Tue, 3 Dec 2024 14:56:07 +0100 Subject: [PATCH 107/127] Release 1.11.10 --- README.md | 2 +- generated-doc/out/client/http4s.md | 2 +- generated-doc/out/client/play.md | 4 ++-- generated-doc/out/client/sttp.md | 4 ++-- generated-doc/out/docs/asyncapi.md | 2 +- generated-doc/out/docs/json-schema.md | 2 +- generated-doc/out/docs/openapi.md | 12 +++++----- generated-doc/out/endpoint/integrations.md | 18 +++++++------- generated-doc/out/endpoint/json.md | 18 +++++++------- generated-doc/out/endpoint/pickler.md | 2 +- generated-doc/out/endpoint/static.md | 2 +- .../out/generator/sbt-openapi-codegen.md | 2 +- generated-doc/out/includes/examples_list.md | 1 + generated-doc/out/quickstart.md | 2 +- generated-doc/out/server/akkahttp.md | 4 ++-- generated-doc/out/server/armeria.md | 6 ++--- generated-doc/out/server/aws.md | 8 +++---- generated-doc/out/server/finatra.md | 4 ++-- generated-doc/out/server/http4s.md | 2 +- generated-doc/out/server/jdkhttp.md | 2 +- generated-doc/out/server/netty.md | 8 +++---- generated-doc/out/server/nima.md | 2 +- generated-doc/out/server/observability.md | 8 +++---- generated-doc/out/server/pekkohttp.md | 4 ++-- generated-doc/out/server/play.md | 8 +++---- generated-doc/out/server/vertx.md | 6 ++--- generated-doc/out/server/zio-http4s.md | 4 ++-- generated-doc/out/server/ziohttp.md | 4 ++-- generated-doc/out/testing.md | 10 ++++---- generated-doc/out/tutorials/01_hello_world.md | 24 +++++++++---------- .../out/tutorials/02_openapi_docs.md | 14 +++++------ generated-doc/out/tutorials/03_json.md | 10 ++++---- generated-doc/out/tutorials/04_errors.md | 20 ++++++++-------- .../tutorials/05_multiple_inputs_outputs.md | 14 +++++------ .../out/tutorials/06_error_variants.md | 14 +++++------ generated-doc/out/tutorials/07_cats_effect.md | 20 ++++++++-------- 36 files changed, 135 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index c9fe2b5e5e..7d4376a7f9 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] Add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.10" ``` Then, import: diff --git a/generated-doc/out/client/http4s.md b/generated-doc/out/client/http4s.md index db35cd51c6..039ee2e7bb 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.11.10" ``` 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 bd121b1296..727776f2ea 100644 --- a/generated-doc/out/client/play.md +++ b/generated-doc/out/client/play.md @@ -6,13 +6,13 @@ See the [Play framework documentation](https://www.playframework.com/documentati For **Play 3.0**, add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.11.10" ``` For **Play 2.9**, add ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.11.10" ``` instead. Furthermore, replace all uses of `sttp.capabilities.pekko.PekkoStreams` in the following code snippets with `sttp.capabilities.akka.AkkaStreams`. diff --git a/generated-doc/out/client/sttp.md b/generated-doc/out/client/sttp.md index 7f736a7a6f..41d7ade2be 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.11.10" ``` To make requests using an endpoint definition using the [sttp client](https://github.com/softwaremill/sttp), import: @@ -101,7 +101,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.11.9" +"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.11.10" "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 62aebb2c1c..f4cbbf511c 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.11.10" "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 8cf5a33c30..9b40e9541c 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.11.10" ``` 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 62d7ff5032..f3f40ecd56 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.11.10" ``` 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.11.10" ``` 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.10" "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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.11.10" "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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.11.10" ``` or `tapir-redoc`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.11.10" ``` 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 cecceb4e08..f43d6ceaa9 100644 --- a/generated-doc/out/endpoint/integrations.md +++ b/generated-doc/out/endpoint/integrations.md @@ -12,7 +12,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.11.10" ``` - `import sttp.tapir.integ.cats.codec.*` - brings schema, validator and codec instances @@ -22,7 +22,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.11.10" ``` ## Refined integration @@ -31,7 +31,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.11.10" ``` You'll need to extend the `sttp.tapir.codec.refined.TapirCodecRefined` @@ -52,7 +52,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.11.10" ``` The module is only available for Scala 3 since iron is not designed to work with Scala 2. @@ -145,7 +145,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.11.10" ``` Then, `import sttp.tapir.codec.enumeratum.*`, or extends the `sttp.tapir.codec.enumeratum.TapirCodecEnumeratum` trait. @@ -158,7 +158,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.11.10" ``` Then, `import sttp.tapir.codec.newtype.*`, or extend the `sttp.tapir.codec.newtype.TapirCodecNewType` trait to bring the implicit values into scope. @@ -169,7 +169,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.11.10" ``` Then, `import sttp.tapir.codec.monix.newtype.*`, or extend the `sttp.tapir.codec.monix.newtype.TapirCodecMonixNewType` trait to bring the implicit values into scope. @@ -180,7 +180,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.11.10" ``` Then, mix in `sttp.tapir.codec.zio.prelude.newtype.TapirNewtypeSupport` into your newtype to bring the implicit values into scope: @@ -219,7 +219,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.11.10" ``` 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 513a2d9ca3..0bc9a65835 100644 --- a/generated-doc/out/endpoint/json.md +++ b/generated-doc/out/endpoint/json.md @@ -50,7 +50,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../other/mytapir.md)): @@ -122,7 +122,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`): @@ -156,13 +156,13 @@ For more examples, including making a custom encoder/decoder, see [TapirJsonuPic 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.11.10" ``` For **Play 2.9** use: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`): @@ -178,7 +178,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`): @@ -194,7 +194,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`): @@ -210,7 +210,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../other/mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`): @@ -226,7 +226,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.11.10" ``` And one of the implementations: @@ -257,7 +257,7 @@ given Formats = org.json4s.jackson.Serialization.formats(NoTypeHints) 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.10" ``` Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../other/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 373c53e353..66e9959b77 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.11.10" ``` 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 8a17d38bca..046e727ae9 100644 --- a/generated-doc/out/endpoint/static.md +++ b/generated-doc/out/endpoint/static.md @@ -11,7 +11,7 @@ the API documentation of the old static content API, switch documentation to an In order to use static content endpoints, add the module to your dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.11.10" ``` ## Files diff --git a/generated-doc/out/generator/sbt-openapi-codegen.md b/generated-doc/out/generator/sbt-openapi-codegen.md index 47dcc79897..622db4eab1 100644 --- a/generated-doc/out/generator/sbt-openapi-codegen.md +++ b/generated-doc/out/generator/sbt-openapi-codegen.md @@ -9,7 +9,7 @@ This is a really early alpha implementation. Add the sbt plugin to the `project/plugins.sbt`: ```scala -addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.9") +addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.11.10") ``` Enable the plugin for your project in the `build.sbt`: diff --git a/generated-doc/out/includes/examples_list.md b/generated-doc/out/includes/examples_list.md index cba3d66c36..3a4cc518ca 100644 --- a/generated-doc/out/includes/examples_list.md +++ b/generated-doc/out/includes/examples_list.md @@ -22,6 +22,7 @@ ## Custom types * [A demo of Tapir's capabilities using semi-auto derivation](https://github.com/softwaremill/tapir/tree/master//examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala) circe sttp3 Swagger UI Future Pekko HTTP +* [A query parameter which maps to a Scala 3 enum (enumeration)](https://github.com/softwaremill/tapir/tree/master//examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala) Direct Netty * [Handling comma-separated query parameters](https://github.com/softwaremill/tapir/tree/master//examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala) Swagger UI Direct Netty * [Mapping a sealed trait hierarchy to JSON using a discriminator](https://github.com/softwaremill/tapir/tree/master//examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala) circe Swagger UI Direct Netty * [Supporting custom types, when used in query or path parameters, as well as part of JSON bodies](https://github.com/softwaremill/tapir/tree/master//examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala) circe diff --git a/generated-doc/out/quickstart.md b/generated-doc/out/quickstart.md index 1f5e749eb7..9a35d76dde 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.10" ``` 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 1e96b8963e..857ee483dd 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.10" ``` 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.11.9" exclude("com.typesafe.akka", "akka-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.11.10" 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 ba474800e0..347b266a14 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.11.10" ``` and import the object: @@ -71,7 +71,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.11.10" ``` to use this interpreter with Cats Effect typeclasses. @@ -148,7 +148,7 @@ val tapirService = ArmeriaCatsServerInterpreter(dispatcher).toService(streamingR Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.11.10" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/aws.md b/generated-doc/out/server/aws.md index a4eb54da5d..7fd0f0739c 100644 --- a/generated-doc/out/server/aws.md +++ b/generated-doc/out/server/aws.md @@ -30,7 +30,7 @@ These are corresponding classes for each of the supported runtime: To start using any of the above add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.11.10" ``` ## Deployment @@ -41,9 +41,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: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.9" -"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.9" -"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.11.10" +"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.11.10" +"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.11.10" ``` ### Examples diff --git a/generated-doc/out/server/finatra.md b/generated-doc/out/server/finatra.md index 8009f1786d..a6442a24f8 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.11.10" ``` 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.11.10" ``` and import the object: diff --git a/generated-doc/out/server/http4s.md b/generated-doc/out/server/http4s.md index b6693d1f4c..cd1d2a5208 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.11.10" ``` and import the object: diff --git a/generated-doc/out/server/jdkhttp.md b/generated-doc/out/server/jdkhttp.md index e4029117c7..9cc0bb2ce2 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.11.10" ``` Then, import the package: diff --git a/generated-doc/out/server/netty.md b/generated-doc/out/server/netty.md index 051c862057..51fcf0fa89 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.11.10" // if you want to use Java 21 Loom virtual threads in direct style: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-sync" % "1.11.10" // if you are using cats-effect: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.11.10" // if you are using zio: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.11.10" ``` Then, use: diff --git a/generated-doc/out/server/nima.md b/generated-doc/out/server/nima.md index 4bec651228..84fb481625 100644 --- a/generated-doc/out/server/nima.md +++ b/generated-doc/out/server/nima.md @@ -8,7 +8,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-nima-server" % "1.11.10" ``` 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 e9a4ba0467..c366dbe13d 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.11.10" ``` `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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.11.10" ``` 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.11.10" ``` 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.11.10" ``` 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 23ac7f61ed..1fd8c1857f 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.10" ``` 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.11.9" exclude("org.apache.pekko", "pekko-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.11.10" 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 2d0191642f..42cafb5cef 100644 --- a/generated-doc/out/server/play.md +++ b/generated-doc/out/server/play.md @@ -6,19 +6,19 @@ See the [Play framework documentation](https://www.playframework.com/documentati 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-play29-server" % "1.11.10" ``` and (if you don't already depend on Play) ```scala -"org.playframework" %% "play-akka-http-server" % "2.9.5" +"org.playframework" %% "play-akka-http-server" % "2.9.6" ``` or ```scala -"org.playframework" %% "play-netty-server" % "2.9.5" +"org.playframework" %% "play-netty-server" % "2.9.6" ``` 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. @@ -26,7 +26,7 @@ depending on whether you want to use netty or Akka based http-server under the h 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.11.10" ``` 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 eb6fa87df5..18622d24d0 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.11.10" ``` to use this interpreter with `Future`. @@ -60,7 +60,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.11.10" ``` to use this interpreter with Cats Effect typeclasses. @@ -140,7 +140,7 @@ val attach = VertxCatsServerInterpreter(dispatcher).route(streamedResponse.serve Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.11.10" ``` 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 e7539cbfba..63f712042f 100644 --- a/generated-doc/out/server/zio-http4s.md +++ b/generated-doc/out/server/zio-http4s.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.10" ``` or just add the zio-http4s integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.11.10" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/server/ziohttp.md b/generated-doc/out/server/ziohttp.md index 33436245eb..2166ffedb6 100644 --- a/generated-doc/out/server/ziohttp.md +++ b/generated-doc/out/server/ziohttp.md @@ -8,13 +8,13 @@ The `*-zio` modules depend on ZIO 2.x. You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.11.10" ``` or just add the zio-http integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.11.10" ``` Next, instead of the usual `import sttp.tapir.*`, you should import (or extend the `ZTapir` trait, see [MyTapir](../other/mytapir.md)): diff --git a/generated-doc/out/testing.md b/generated-doc/out/testing.md index 79a8cff01b..d929b3394f 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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.10" ``` Let's assume you are using the [pekko http](server/pekkohttp.md) interpreter. Given the following server endpoint: @@ -139,7 +139,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.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.11.10" ``` And the following imports: @@ -194,7 +194,7 @@ with [mock-server](https://www.mock-server.com/) Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.11.10" ``` Imports: @@ -265,7 +265,7 @@ result == out To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.9" +"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.11.10" ``` ### Shadowed endpoints @@ -291,7 +291,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: diff --git a/generated-doc/out/tutorials/01_hello_world.md b/generated-doc/out/tutorials/01_hello_world.md index 8ed82f94bf..3697396735 100644 --- a/generated-doc/out/tutorials/01_hello_world.md +++ b/generated-doc/out/tutorials/01_hello_world.md @@ -22,8 +22,8 @@ multiple servers, but we'll choose the simplest (and also one of the fastest!), available through the `tapir-netty-server-sync` module: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 ``` ## Endpoint description @@ -43,8 +43,8 @@ Let's start by defining the method and path of our endpoint: {emphasize-lines="4-11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* @@ -72,8 +72,8 @@ of requiring it to be a fixed value (a constant): {emphasize-lines="10"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* @@ -97,8 +97,8 @@ Finally, let's add an output to the endpoint. We'll return the response as a str {emphasize-lines="11"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* @@ -123,8 +123,8 @@ will be sent as a response: {emphasize-lines="12"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* @@ -152,8 +152,8 @@ example, we'll bind to `localhost` (which is the default), and to the port 8080: {emphasize-lines="5, 15-18"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/02_openapi_docs.md b/generated-doc/out/tutorials/02_openapi_docs.md index e3454528be..5bf7b31ab3 100644 --- a/generated-doc/out/tutorials/02_openapi_docs.md +++ b/generated-doc/out/tutorials/02_openapi_docs.md @@ -17,16 +17,16 @@ use a bundle, which first interprets the provided tapir endpoints into OpenAPI a endpoints, which expose the UI together with the generated specification. We'll need to add a dependency: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 ``` We'll also define and expose two endpoints as an HTTP server, as described in the previous tutorial. Hence, our starting setup of `docs.scala` is as follows: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -108,9 +108,9 @@ And that's almost all the code changes that we need to introduce! We only need t {emphasize-lines="3, 5, 8, 24-25, 29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 import sttp.shared.Identity import sttp.tapir.* diff --git a/generated-doc/out/tutorials/03_json.md b/generated-doc/out/tutorials/03_json.md index f5b17fb3b5..707c521c37 100644 --- a/generated-doc/out/tutorials/03_json.md +++ b/generated-doc/out/tutorials/03_json.md @@ -83,7 +83,7 @@ In our case, deriving the schemas will amount to adding a `... derives Schema` c {emphasize-lines="1, 7, 10, 12, 16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.core.* // needed for `writeToString` @@ -127,10 +127,10 @@ how the `jsonBody[T]` method is used in the endpoint definition. We'll also expo {emphasize-lines="2-4, 10-15, 23-39"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.10 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* // needed for ... derives diff --git a/generated-doc/out/tutorials/04_errors.md b/generated-doc/out/tutorials/04_errors.md index 6b5482d52a..1ff3121aa0 100644 --- a/generated-doc/out/tutorials/04_errors.md +++ b/generated-doc/out/tutorials/04_errors.md @@ -40,8 +40,8 @@ schemas both for the `Result` and `Error` classes, to represent them properly in describing the endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.10 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -76,10 +76,10 @@ We'll also add code to expose the endpoint as a server, along with its OpenAPI d {emphasize-lines="2-3, 11-13, 24-28, 30-36"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.10 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 import com.github.plokhotnyuk.jsoniter_scala.macros.* @@ -152,10 +152,10 @@ you'll also get `ERROR` logs when unhandled exceptions happen: {emphasize-lines="6, 26"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.10 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.1 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md index 0463cef25d..a170f77d8c 100644 --- a/generated-doc/out/tutorials/05_multiple_inputs_outputs.md +++ b/generated-doc/out/tutorials/05_multiple_inputs_outputs.md @@ -24,7 +24,7 @@ body, but additionally the hash of the result should be included in the `X-Resul Below is the endpoint description; we'll be editing the `multiple.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 import sttp.tapir.* @@ -61,8 +61,8 @@ The output tuple is then mapped to the response body & header: {emphasize-lines="5, 8-9, 18-29"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -147,8 +147,8 @@ The mapping functions are simple, but quite boring to write: {emphasize-lines="8, 17-18, 23-27"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer @@ -197,8 +197,8 @@ Here's the modified code using `.mapInTo`, which additionally maps outputs to th {emphasize-lines="9, 11-13, 19, 22"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 import sttp.tapir.* import sttp.tapir.server.netty.sync.NettySyncServer diff --git a/generated-doc/out/tutorials/06_error_variants.md b/generated-doc/out/tutorials/06_error_variants.md index 0eed6e3c13..a7ff6f517f 100644 --- a/generated-doc/out/tutorials/06_error_variants.md +++ b/generated-doc/out/tutorials/06_error_variants.md @@ -83,7 +83,7 @@ request serializing `AvatarSuccess.Redirect` instances, as Tapir knows nothing a an `EndpointOutput[String]`: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -106,7 +106,7 @@ this output to the `AvatarSuccess.Redirect` type using `.mapTo`, which we've lea {emphasize-lines="12-13"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -138,7 +138,7 @@ each of which translates to a separate class. Our one-of successful output takes {emphasize-lines="13-16"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -175,7 +175,7 @@ To fix this, we can use the `oneOfVariantSingletonMatcher` method. It takes a un value, to which the high-level output must be equal, for the variant to be chosen: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* @@ -197,9 +197,9 @@ val errorOutput: EndpointOutput[AvatarError] = oneOf( Equipped with `oneOf` outputs, we can now fully describe and test our endpoint: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 import sttp.model.{HeaderNames, StatusCode} import sttp.tapir.* diff --git a/generated-doc/out/tutorials/07_cats_effect.md b/generated-doc/out/tutorials/07_cats_effect.md index b6e8ea4b70..87838ff513 100644 --- a/generated-doc/out/tutorials/07_cats_effect.md +++ b/generated-doc/out/tutorials/07_cats_effect.md @@ -21,7 +21,7 @@ use. Hence, we'll start with the same basic endpoint description. We'll be editing the `cats-effect.scala` file: ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 import sttp.tapir.* @@ -56,8 +56,8 @@ parameter explicitly, using `.serverLogic[IO]` in our case: {emphasize-lines="2, 4, 12-14"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.10 import cats.effect.IO import sttp.tapir.* @@ -102,8 +102,8 @@ The conversion process is an almost-one-liner (if it wasn't for line length limi {emphasize-lines="2, 5, 7, 18-19"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 import cats.effect.IO import org.http4s.HttpRoutes @@ -130,8 +130,8 @@ standard code to start a server and handle requests until the application is int {emphasize-lines="3, 5, 7, 8, 12, 24-30"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} @@ -192,9 +192,9 @@ the second step that we need to perform: {emphasize-lines="3, 7, 13, 27-32, 37"} ```scala -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 import cats.effect.{ExitCode, IO, IOApp} From 6c401b979e918f5ea891c7509b0964bc298846ac Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 4 Dec 2024 01:33:39 +0100 Subject: [PATCH 108/127] Update armeria to 1.31.2 (#4195) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 3d12170341..665f2d9606 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -54,7 +54,7 @@ object Versions { val monixNewtype = "0.3.0" val zioPrelude = "1.0.0-RC35" val awsLambdaInterface = "2.6.0" - val armeria = "1.31.1" + val armeria = "1.31.2" val scalaJava8Compat = "1.0.2" val scalaCollectionCompat = "2.12.0" val fs2 = "3.11.0" From e86b55ba93f9b2630e50f4475b7673945ba08407 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 4 Dec 2024 01:35:53 +0100 Subject: [PATCH 109/127] Update sttp-mock-server, ... to 1.11.10 (#4196) --- .../sttp/tapir/examples/HelloWorldHttp4sServer.scala | 4 ++-- .../tapir/examples/HelloWorldNettyCatsServer.scala | 4 ++-- .../sttp/tapir/examples/HelloWorldZioHttpServer.scala | 6 +++--- .../tapir/examples/ZioEnvExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleHttp4sServer.scala | 10 +++++----- .../sttp/tapir/examples/ZioExampleZioHttpServer.scala | 10 +++++----- .../tapir/examples/ZioPartialServerLogicHttp4s.scala | 6 +++--- .../main/scala/sttp/tapir/examples/booksExample.scala | 10 +++++----- .../sttp/tapir/examples/booksPicklerExample.scala | 10 +++++----- .../tapir/examples/client/Http4sClientExample.scala | 6 +++--- .../custom_types/EndpointWithCustomTypes.scala | 4 ++-- .../examples/custom_types/booksExampleSemiauto.scala | 10 +++++----- .../custom_types/commaSeparatedQueryParameter.scala | 6 +++--- .../examples/custom_types/enumQueryParameter.scala | 4 ++-- .../custom_types/sealedTraitWithDiscriminator.scala | 8 ++++---- .../examples/errors/ErrorUnionTypesHttp4sServer.scala | 6 +++--- .../errors/IronRefinementErrorsNettyServer.scala | 8 ++++---- .../customErrorsOnDecodeFailurePekkoServer.scala | 4 ++-- .../examples/errors/errorOutputsPekkoServer.scala | 6 +++--- .../sttp/tapir/examples/helloWorldArmeriaServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldJdkHttpServer.scala | 4 ++-- .../tapir/examples/helloWorldNettyFutureServer.scala | 4 ++-- .../tapir/examples/helloWorldNettySyncServer.scala | 4 ++-- .../sttp/tapir/examples/helloWorldPekkoServer.scala | 4 ++-- .../json/circeAutoDerivationNettySyncServer.scala | 6 +++--- .../scala/sttp/tapir/examples/json/circeNullBody.scala | 6 +++--- .../tapir/examples/json/jsoniterNettySyncServer.scala | 6 +++--- .../ZioLoggingWithCorrelationIdNettyServer.scala | 4 ++-- .../multipart/multipartFormUploadPekkoServer.scala | 4 ++-- .../examples/observability/ZioMetricsExample.scala | 6 +++--- .../examples/observability/datadogMetricsExample.scala | 8 ++++---- .../observability/openTelemetryMetricsExample.scala | 8 ++++---- .../observability/prometheusMetricsExample.scala | 8 ++++---- .../MultipleEndpointsDocumentationHttp4sServer.scala | 8 ++++---- .../openapi/RedocContextPathHttp4sServer.scala | 6 +++--- .../tapir/examples/openapi/RedocZioHttpServer.scala | 8 ++++---- .../multipleEndpointsDocumentationPekkoServer.scala | 8 ++++---- .../tapir/examples/openapi/openapiExtensions.scala | 6 +++--- .../examples/openapi/swaggerUIOAuth2PekkoServer.scala | 6 +++--- .../tapir/examples/schema/customisingSchemas.scala | 8 ++++---- .../examples/security/OAuth2GithubHttp4sServer.scala | 6 +++--- .../examples/security/ServerSecurityLogicZio.scala | 4 ++-- .../security/basicAuthenticationPekkoServer.scala | 4 ++-- .../examples/security/corsInterceptorPekkoServer.scala | 4 ++-- .../security/externalSecurityInterceptor.scala | 4 ++-- .../examples/security/serverSecurityLogicPekko.scala | 4 ++-- .../serverSecurityLogicRefreshCookiesPekko.scala | 4 ++-- .../staticContentFromFilesNettyServer.scala | 6 +++--- .../staticContentFromFilesPekkoServer.scala | 6 +++--- .../staticContentFromResourcesPekkoServer.scala | 6 +++--- .../staticContentSecurePekkoServer.scala | 6 +++--- .../examples/status_code/statusCodeNettyServer.scala | 4 ++-- .../examples/streaming/ProxyHttp4sFs2Server.scala | 4 ++-- .../examples/streaming/StreamingHttp4sFs2Server.scala | 4 ++-- .../streaming/StreamingHttp4sFs2ServerOrError.scala | 4 ++-- .../examples/streaming/StreamingNettyFs2Server.scala | 4 ++-- .../examples/streaming/StreamingNettyZioServer.scala | 4 ++-- .../examples/streaming/StreamingZioHttpServer.scala | 4 ++-- .../examples/streaming/streamingPekkoServer.scala | 4 ++-- .../examples/testing/CatsServerStubInterpreter.scala | 6 +++--- .../examples/testing/PekkoServerStubInterpreter.scala | 6 +++--- .../examples/testing/SttpMockServerClientExample.scala | 6 +++--- .../websocket/WebSocketChatNettySyncServer.scala | 4 ++-- .../examples/websocket/WebSocketHttp4sServer.scala | 8 ++++---- .../examples/websocket/WebSocketNettySyncServer.scala | 4 ++-- .../examples/websocket/webSocketPekkoServer.scala | 8 ++++---- 66 files changed, 193 insertions(+), 193 deletions(-) diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala index a27248580e..892a7d4d22 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldHttp4sServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=http4s}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala index 56b14fa967..99422815f6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldNettyCatsServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=cats-effect; server=Netty}: Exposing an endpoint using the Netty server (cats-effect variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala index 7d7f4c37b0..3bd90af868 100644 --- a/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/HelloWorldZioHttpServer.scala @@ -1,8 +1,8 @@ // {cat=Hello, World!; effects=ZIO; server=ZIO HTTP; json=ZIO JSON}: Exposing an endpoint using the ZIO HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-zio:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.10 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala index 70606a24d2..410c91b98b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioEnvExampleHttp4sServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint, defined with ZIO and depending on services in the environment, using the http4s server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala index ce4c544917..5c26d28f34 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleHttp4sServer.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=ZIO; server=http4s; json=circe; docs=Swagger UI}: Exposing an endpoint using the http4s server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep dev.zio::zio-interop-cats:23.1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala index ec8ec7f1d9..c634e54f87 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioExampleZioHttpServer.scala @@ -1,11 +1,11 @@ // {cat=Hello, World!; effects=ZIO; server=zio-http; json=circe; docs=Swagger UI}: Exposing an endpoint using the ZIO HTTP server //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.10 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala index a44eb1217e..0031aaadf4 100644 --- a/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala +++ b/examples/src/main/scala/sttp/tapir/examples/ZioPartialServerLogicHttp4s.scala @@ -1,9 +1,9 @@ // {cat=Hello, World!; effects=ZIO; server=http4s}: Extending a base endpoint (which has the security logic provided), with server logic //> using option -Ykind-projector -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server-zio:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala index ba639cf9df..fb6ef509d1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.10 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala index a8ea2c343e..634211c84b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/booksPicklerExample.scala @@ -1,10 +1,10 @@ // {cat=Hello, World!; effects=Future; server=Netty; client=sttp3; JSON=Pickler; docs=Swagger UI}: A demo of Tapir's capabilities -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-pickler:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.10 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep ch.qos.logback:logback-classic:1.5.6 diff --git a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala index 7a3d6e2fda..d82f7f91a1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/client/Http4sClientExample.scala @@ -1,8 +1,8 @@ // {cat=Client interpreter; effects=cats-effect; JSON=circe}: Interpreting an endpoint as an http4s client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-client:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 //> using dep org.http4s::http4s-circe:0.23.27 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep org.http4s::http4s-dsl:0.23.27 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala index e8dac0dc2e..874d65e12e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/EndpointWithCustomTypes.scala @@ -1,7 +1,7 @@ // {cat=Custom types; json=circe}: Supporting custom types, when used in query or path parameters, as well as part of JSON bodies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala index 9a225f990b..943bf6bb70 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/booksExampleSemiauto.scala @@ -1,10 +1,10 @@ // {cat=Custom types; effects=Future; server=Pekko HTTP; client=sttp3; JSON=circe; docs=Swagger UI}: A demo of Tapir's capabilities using semi-auto derivation -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-client:1.11.10 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala index 7db68f5869..86d0b4df9d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/commaSeparatedQueryParameter.scala @@ -1,8 +1,8 @@ // {cat=Custom types; effects=Direct; server=Netty; docs=Swagger UI}: Handling comma-separated query parameters -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala index cc96921063..1842d937d8 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/enumQueryParameter.scala @@ -1,7 +1,7 @@ // {cat=Custom types; effects=Direct; server=Netty}: A query parameter which maps to a Scala 3 enum (enumeration) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala index 36e7e13252..4269760b7d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala +++ b/examples/src/main/scala/sttp/tapir/examples/custom_types/sealedTraitWithDiscriminator.scala @@ -1,9 +1,9 @@ // {cat=Custom types; effects=Direct; server=Netty; JSON=circe; docs=Swagger UI}: Mapping a sealed trait hierarchy to JSON using a discriminator -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 package sttp.tapir.examples.custom_types diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala index 2b0f9db1f6..026dda492b 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/ErrorUnionTypesHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=cats-effect; server=http4s; JSON=circe}: Extending a base secured endpoint with error variants, using union types -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala index c510b9cf0c..6650b966af 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/IronRefinementErrorsNettyServer.scala @@ -1,9 +1,9 @@ // {cat=Error handling; effects=cats-effect; server=Netty; JSON=circe}: Error reporting provided by Iron type refinements -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-iron:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.errors diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala index 4766f9001e..cd41e5f437 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/customErrorsOnDecodeFailurePekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP}: Customising errors that are reported on decode failures (e.g. invalid or missing query parameter) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala index 02050fb861..0ef5e71c7a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/errors/errorOutputsPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Error handling; effects=Future; server=Pekko HTTP; json=circe}: Error and successful outputs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala index c7289ef0c4..52cc77b496 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldArmeriaServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Armeria}: Exposing an endpoint using the Armeria server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-armeria-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala index 1584cb888c..8a708e30b7 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldJdkHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=JDK Http}: Exposing an endpoint using the built-in JDK HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-jdkhttp-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala index 4eac4ca8b2..7a7a47f222 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettyFutureServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Netty}: Exposing an endpoint using the Netty server (Future variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep ch.qos.logback:logback-classic:1.5.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala index d6bfdb2a5d..79d9e1d190 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Direct; server=Netty}: Exposing an endpoint using the Netty server (Direct-style variant) -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala index 460118848a..2e58a5ca8e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/helloWorldPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Hello, World!; effects=Future; server=Pekko HTTP}: Exposing an endpoint using the Pekko HTTP server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala index 7dfcfa5f2a..20496ab25e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeAutoDerivationNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON response with Circe and auto-dervied codecs -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala index 128e9fce1e..2937f3431d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/circeNullBody.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=circe}: Return a JSON body which optionally serializes as `null` -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 //> using dep ch.qos.logback:logback-classic:1.5.8 package sttp.tapir.examples.json diff --git a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala index 893e097df6..d9249a77bc 100644 --- a/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/json/jsoniterNettySyncServer.scala @@ -1,8 +1,8 @@ // {cat=JSON; effects=Direct; server=Netty; JSON=jsoniter}: Return a JSON response with Jsoniter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 //> using dep ch.qos.logback:logback-classic:1.5.8 //> using dep com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:2.30.15 diff --git a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala index bb6dc1cddb..0128aced93 100644 --- a/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/logging/ZioLoggingWithCorrelationIdNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Logging; effects=ZIO; server=Netty}: Logging using a correlation id -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.10 //> using dep com.softwaremill.sttp.client3::zio:3.9.8 package sttp.tapir.examples.logging diff --git a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala index 0dc839fb9f..4d06c907b6 100644 --- a/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/multipart/multipartFormUploadPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Multipart; effects=Future; server=Pekko HTTP}: Uploading a multipart form, with text and file parts -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep org.apache.pekko::pekko-http:1.0.1 //> using dep org.apache.pekko::pekko-stream:1.0.3 //> using dep com.softwaremill.sttp.client3::core:3.9.8 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala index dfe4c18c71..9d6d6a4daf 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/ZioMetricsExample.scala @@ -1,8 +1,8 @@ // {cat=Observability; effects=ZIO; server=ZIO HTTP}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-metrics:1.11.10 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala index 77a74fe016..2f98a46d73 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/datadogMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting DataDog metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-datadog-metrics:1.11.10 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala index 6520da7036..3676507687 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/openTelemetryMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting OpenTelemetry metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-opentelemetry-metrics:1.11.10 //> using dep io.opentelemetry:opentelemetry-exporter-otlp:1.44.1 //> using dep org.slf4j:slf4j-api:2.0.13 diff --git a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala index f69c8369cd..4c159fcf2c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/observability/prometheusMetricsExample.scala @@ -1,9 +1,9 @@ // {cat=Observability; effects=Future; server=Netty; json=circe}: Reporting Prometheus metrics -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-prometheus-metrics:1.11.10 //> using dep org.slf4j:slf4j-api:2.0.13 package sttp.tapir.examples.observability diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala index 67860ab416..052ecda0bf 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/MultipleEndpointsDocumentationHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala index 9e187081c0..19bdcc881e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocContextPathHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=cats-effect; server=http4s; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala index 45b671db50..60a77740b3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/RedocZioHttpServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=ZIO; server=ZIO HTTP; json=circe; docs=ReDoc}: Exposing documentation using ReDoc -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-redoc-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.10 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala index 1097b31dd9..56dce43e13 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/multipleEndpointsDocumentationPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI; json=circe}: Documenting multiple endpoints -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala index e487a24d42..5cfd9043a1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/openapiExtensions.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; json=circe}: Adding OpenAPI documentation extensions -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-openapi-docs:1.11.10 //> using dep com.softwaremill.sttp.apispec::openapi-circe-yaml:0.10.0 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala index 57be14a4c7..c4c8d645f4 100644 --- a/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/openapi/swaggerUIOAuth2PekkoServer.scala @@ -1,8 +1,8 @@ // {cat=OpenAPI documentation; effects=Future; server=Pekko HTTP; docs=Swagger UI}: Securing Swagger UI using OAuth 2 -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 package sttp.tapir.examples.openapi diff --git a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala index d4df2b7805..72227d46da 100644 --- a/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala +++ b/examples/src/main/scala/sttp/tapir/examples/schema/customisingSchemas.scala @@ -1,9 +1,9 @@ // {cat=Schemas; effects=Future; server=Netty; json=circe; docs=Swagger UI}: Customising a derived schema, using annotations, and using implicits -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-swagger-ui-bundle:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 package sttp.tapir.examples.schema diff --git a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala index efdae4774a..7d119d9928 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/OAuth2GithubHttp4sServer.scala @@ -1,8 +1,8 @@ // {cat=Security; effects=cats-effect; server=http4s; json=circe}: Login using OAuth2, authorization code flow -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-cats:3.10.1 //> using dep org.http4s::http4s-blaze-server:0.23.16 //> using dep com.github.jwt-scala::jwt-circe:10.0.1 diff --git a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala index f211d5a93a..7b0e4de9d5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/ServerSecurityLogicZio.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=ZIO; server=ZIO HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-zio:3.10.1 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala index 421b54565f..3dda89a7c9 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/basicAuthenticationPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: HTTP basic authentication -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala index e4b415f218..8fe721f98c 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/corsInterceptorPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: CORS interceptor -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala index 81db88217e..2485c5a97a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/externalSecurityInterceptor.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Netty}: Interceptor verifying externally added security credentials -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala index 7e1819b4ef..c0e2e5f4f2 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala index 2822202c36..3cd93bd9ff 100644 --- a/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala +++ b/examples/src/main/scala/sttp/tapir/examples/security/serverSecurityLogicRefreshCookiesPekko.scala @@ -1,7 +1,7 @@ // {cat=Security; effects=Future; server=Pekko HTTP}: Separating security and server logic, with a reusable base endpoint, accepting & refreshing credentials via cookies -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.security diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala index e57ab1986d..f9ff3d79e1 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesNettyServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala index 068397abdb..0c08a2be40 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromFilesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from a directory, with range requests -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala index e6aaa906b3..74a5c61539 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentFromResourcesPekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files from resources -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala index 041f6e7e6d..6a30f396db 100644 --- a/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/static_content/staticContentSecurePekkoServer.scala @@ -1,8 +1,8 @@ // {cat=Static content; effects=Future; server=Pekko HTTP}: Serving static files secured with a bearer token -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-files:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.static_content diff --git a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala index 33374b354d..3b18ef31b3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/status_code/statusCodeNettyServer.scala @@ -1,7 +1,7 @@ // {cat=Status code; effects=Direct; server=Netty}: Serving static files from a directory -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 package sttp.tapir.examples.status_code diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala index 34cd49b4ec..4257115330 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/ProxyHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Proxy requests, handling bodies as fs2 streams -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep com.softwaremill.sttp.client3::fs2:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala index 66daa59f75..834434b584 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala index 3356488f78..9f3c26e7ca 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingHttp4sFs2ServerOrError.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=http4s}: Respond with an fs2 stream, or with an error, represented as a failed effect in the business logic -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 //> using dep org.http4s::http4s-blaze-server:0.23.16 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala index d504a533f2..836760a7f5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyFs2Server.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=cats-effect; server=Netty}: Stream response as an fs2 stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-cats:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala index 9726ed1e22..c4847df25d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingNettyZioServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=Netty}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-zio:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala index 99b85b0014..e2d6cd8d28 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/StreamingZioHttpServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=ZIO; server=ZIO HTTP}: Stream response as a ZIO stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-zio-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala index 927edf8d11..28817a4c2a 100644 --- a/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/streaming/streamingPekkoServer.scala @@ -1,7 +1,7 @@ // {cat=Streaming; effects=Future; server=Pekko HTTP}: Stream response as a Pekko stream -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 package sttp.tapir.examples.streaming diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala index 7f17c9fec0..cb047a497e 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/CatsServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=cats-effect}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-cats-effect:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-cats:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala index afcdd2823c..000415aea3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/PekkoServerStubInterpreter.scala @@ -1,8 +1,8 @@ // {cat=Testing; effects=Future; server=Pekko HTTP}: Test endpoints using the TapirStubInterpreter -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-sttp-stub-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala index 0f05aa37f3..4846a922a3 100644 --- a/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala +++ b/examples/src/main/scala/sttp/tapir/examples/testing/SttpMockServerClientExample.scala @@ -1,8 +1,8 @@ // {cat=Testing; json=circe}: Test endpoints using the MockServer client -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 -//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 +//> using dep com.softwaremill.sttp.tapir::sttp-mock-server:1.11.10 //> using dep com.softwaremill.sttp.client3::core:3.9.8 //> using dep org.mock-server:mockserver-netty:5.15.0 //> using dep org.scalatest::scalatest:3.2.19 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala index 6c40d04dab..ead02cfedb 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketChatNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: A WebSocket chat across multiple clients connected to the same server -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala index 5e931c52ff..fcaa1fa5a5 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketHttp4sServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=cats-effect; server=http4s; json=circe; docs=AsyncAPI}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-http4s-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::async-http-client-backend-fs2:3.10.1 //> using dep org.http4s::http4s-blaze-server:0.23.16 diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala index 3671703ceb..4170a3920d 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/WebSocketNettySyncServer.scala @@ -1,7 +1,7 @@ // {cat=WebSocket; effects=Direct; server=Netty}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.11.10 package sttp.tapir.examples.websocket diff --git a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala index 72ca0300b3..12a73edede 100644 --- a/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala +++ b/examples/src/main/scala/sttp/tapir/examples/websocket/webSocketPekkoServer.scala @@ -1,9 +1,9 @@ // {cat=WebSocket; effects=Future; server=Pekko HTTP}: Describe and implement a WebSocket endpoint -//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.9 -//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.9 +//> using dep com.softwaremill.sttp.tapir::tapir-core:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-pekko-http-server:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-asyncapi-docs:1.11.10 +//> using dep com.softwaremill.sttp.tapir::tapir-json-circe:1.11.10 //> using dep com.softwaremill.sttp.apispec::asyncapi-circe-yaml:0.10.0 //> using dep com.softwaremill.sttp.client3::pekko-http-backend:3.9.8 From daca16fac2401a6838bc5ac1d95bd49a81646b37 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 5 Dec 2024 01:32:59 +0100 Subject: [PATCH 110/127] Update http4s-circe, http4s-core, ... to 0.23.30 (#4197) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 665f2d9606..4fb958c39c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,5 +1,5 @@ object Versions { - val http4s = "0.23.29" + val http4s = "0.23.30" val http4sBlazeServer = "0.23.17" val http4sBlazeClient = "0.23.17" val catsCore = "2.12.0" From 0cfee765e0a71629d1b984b3bcc7bc862a9d76ad Mon Sep 17 00:00:00 2001 From: adamw Date: Thu, 5 Dec 2024 11:30:24 +0100 Subject: [PATCH 111/127] Add adopter --- README.md | 1 + doc/adopters.md | 5 +++++ doc/adopters/flo.svg | 4 ++++ generated-doc/out/adopters.md | 5 +++++ 4 files changed, 15 insertions(+) create mode 100644 doc/adopters/flo.svg diff --git a/README.md b/README.md index 7d4376a7f9..dd8b2f16a1 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Please email us at [tapir@softwaremill.com](mailto:tapir@softwaremill.com) from | iceo | dpg | hunters | | moia | pits | hootsuite | | ematiq | fugo | budgetbakers | +| &nsbp; | flo |   | ## Teaser diff --git a/doc/adopters.md b/doc/adopters.md index d9919c9f60..c35a9403f2 100644 --- a/doc/adopters.md +++ b/doc/adopters.md @@ -45,4 +45,9 @@ Thank you! ematiq fugo budgetbakers + +
      +  +flo
      \ No newline at end of file diff --git a/doc/adopters/flo.svg b/doc/adopters/flo.svg new file mode 100644 index 0000000000..c9a763252c --- /dev/null +++ b/doc/adopters/flo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/generated-doc/out/adopters.md b/generated-doc/out/adopters.md index d9919c9f60..c35a9403f2 100644 --- a/generated-doc/out/adopters.md +++ b/generated-doc/out/adopters.md @@ -45,4 +45,9 @@ Thank you! ematiq fugo budgetbakers + +
      +  +flo
      \ No newline at end of file From 5cd98a0e9773e1a3c55f81fe8f5e07fa9654fb10 Mon Sep 17 00:00:00 2001 From: adamw Date: Thu, 5 Dec 2024 11:30:53 +0100 Subject: [PATCH 112/127] Add adopter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd8b2f16a1..2d1a7f68b4 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Please email us at [tapir@softwaremill.com](mailto:tapir@softwaremill.com) from | iceo | dpg | hunters | | moia | pits | hootsuite | | ematiq | fugo | budgetbakers | -| &nsbp; | flo |   | +| | flo | | ## Teaser From 884a00502e6d9244b30b1b62219332b4c3ae13c6 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 7 Dec 2024 01:24:28 +0100 Subject: [PATCH 113/127] Update opentelemetry-api, ... to 1.45.0 (#4198) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 4fb958c39c..8c750e3083 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -60,7 +60,7 @@ object Versions { val fs2 = "3.11.0" val decline = "2.4.1" val quicklens = "1.9.10" - val openTelemetry = "1.44.1" + val openTelemetry = "1.45.0" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.114.Final" From 0b81ab4fc7f59bfdde58b3d46bab23bb33f1b1a2 Mon Sep 17 00:00:00 2001 From: adamw Date: Tue, 10 Dec 2024 12:45:00 +0100 Subject: [PATCH 114/127] Add TODO --- core/src/main/scala/sttp/tapir/attribute.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/scala/sttp/tapir/attribute.scala b/core/src/main/scala/sttp/tapir/attribute.scala index 2295bd0a04..b5bd627003 100644 --- a/core/src/main/scala/sttp/tapir/attribute.scala +++ b/core/src/main/scala/sttp/tapir/attribute.scala @@ -2,6 +2,8 @@ package sttp.tapir import sttp.tapir.macros.AttributeKeyMacros +// TODO: use AttributeKey & AttributeMap from sttp-shared in Tapir2 + /** @param typeName * The fully qualified name of `T`. * @tparam T From fd0499b59e94e8acc8703e073a72f0c684260260 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 11 Dec 2024 01:37:57 +0100 Subject: [PATCH 115/127] Update shared:akka, shared:armeria, ... to 1.4.2 (#4200) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 8c750e3083..6602234a5e 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -10,7 +10,7 @@ object Versions { val helidon = "4.0.10" val sttp = "3.10.1" val sttpModel = "1.7.11" - val sttpShared = "1.4.0" + val sttpShared = "1.4.2" val sttpApispec = "0.11.3" val akkaHttp = "10.2.10" val akkaStreams = "2.6.20" From 811a4aa129c6a86356f6041d05b936b1b8790f7f Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 12 Dec 2024 01:31:34 +0100 Subject: [PATCH 116/127] Update armeria to 1.31.3 (#4201) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 6602234a5e..da5cbbfba8 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -54,7 +54,7 @@ object Versions { val monixNewtype = "0.3.0" val zioPrelude = "1.0.0-RC35" val awsLambdaInterface = "2.6.0" - val armeria = "1.31.2" + val armeria = "1.31.3" val scalaJava8Compat = "1.0.2" val scalaCollectionCompat = "2.12.0" val fs2 = "3.11.0" From 8024ac9822a7ba829911e02369f58df5da4f3d6e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Fri, 13 Dec 2024 01:40:12 +0100 Subject: [PATCH 117/127] Update jsoniter-scala-core, ... to 2.32.0 (#4204) --- .../oneOf-json-roundtrip_jsoniter/build.sbt | 4 ++-- .../oneOf-json-roundtrip_jsoniter_scala3/build.sbt | 4 ++-- project/Versions.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt index 81e895e2e9..1a50a301df 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.3", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.3" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.32.0", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.32.0" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt index 82212cd835..cb914321ab 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/build.sbt @@ -11,8 +11,8 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.10.0", "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "0.8.0", "com.beachape" %% "enumeratum" % "1.7.5", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.31.3", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.31.3" % "compile-internal", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.32.0", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.32.0" % "compile-internal", "org.scalatest" %% "scalatest" % "3.2.19" % Test, "com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.10.0" % Test ) diff --git a/project/Versions.scala b/project/Versions.scala index da5cbbfba8..161daa5530 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -66,5 +66,5 @@ object Versions { val nettyAll = "4.1.114.Final" val logback = "1.5.12" val slf4j = "2.0.16" - val jsoniter = "2.31.3" + val jsoniter = "2.32.0" } From 237cd204105c6f7f1c3de9aa30fe43bf15e13474 Mon Sep 17 00:00:00 2001 From: Vamshi Maskuri <117595548+varshith257@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:26:06 +0530 Subject: [PATCH 118/127] refactor: prometheus attributes format to otel attributes (#4188) --- .../opentelemetry/OpenTelemetryMetrics.scala | 52 +++++++++++++---- .../OpenTelemetryMetricsTest.scala | 58 +++++++++++++------ .../tapir/server/metrics/zio/ZioMetrics.scala | 9 ++- .../sttp/tapir/server/metrics/Metric.scala | 12 ++-- 4 files changed, 93 insertions(+), 38 deletions(-) diff --git a/metrics/opentelemetry-metrics/src/main/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetrics.scala b/metrics/opentelemetry-metrics/src/main/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetrics.scala index 9389c4c121..bea61f1e8d 100644 --- a/metrics/opentelemetry-metrics/src/main/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetrics.scala +++ b/metrics/opentelemetry-metrics/src/main/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetrics.scala @@ -15,15 +15,15 @@ import java.time.{Duration, Instant} case class OpenTelemetryMetrics[F[_]](meter: Meter, metrics: List[Metric[F, _]]) { /** Registers a `request_active{path, method}` up-down-counter (assuming default labels). */ - def addRequestsActive(labels: MetricLabels = MetricLabels.Default): OpenTelemetryMetrics[F] = + def addRequestsActive(labels: MetricLabels = OpenTelemetryAttributes): OpenTelemetryMetrics[F] = copy(metrics = metrics :+ requestActive(meter, labels)) /** Registers a `request_total{path, method, status}` counter (assuming default labels). */ - def addRequestsTotal(labels: MetricLabels = MetricLabels.Default): OpenTelemetryMetrics[F] = + def addRequestsTotal(labels: MetricLabels = OpenTelemetryAttributes): OpenTelemetryMetrics[F] = copy(metrics = metrics :+ requestTotal(meter, labels)) /** Registers a `request_duration_seconds{path, method, status, phase}` histogram (assuming default labels). */ - def addRequestsDuration(labels: MetricLabels = MetricLabels.Default): OpenTelemetryMetrics[F] = + def addRequestsDuration(labels: MetricLabels = OpenTelemetryAttributes): OpenTelemetryMetrics[F] = copy(metrics = metrics :+ requestDuration(meter, labels)) /** Registers a custom metric. */ @@ -36,6 +36,32 @@ case class OpenTelemetryMetrics[F[_]](meter: Meter, metrics: List[Metric[F, _]]) object OpenTelemetryMetrics { + /** Default labels for OpenTelemetry-compliant metrics, as recommended here: + * https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#http-server + * + * - `http.request.method` - HTTP request method (e.g., GET, POST). + * - `path` - The request path or route template. + * - `http.response.status_code` - HTTP response status code (200, 404, etc.). + */ + lazy val OpenTelemetryAttributes: MetricLabels = MetricLabels( + forRequest = List( + "http.request.method" -> { case (_, req) => req.method.method }, + "url.scheme" -> { case (_, req) => req.uri.scheme.getOrElse("unknown") }, + "path" -> { case (ep, _) => ep.showPathTemplate(showQueryParam = None) } + ), + forResponse = List( + "http.response.status_code" -> { + case Right(r) => Some(r.code.code.toString) + // Default to 500 for exceptions + case Left(_) => Some("500") + }, + "error.type" -> { + case Left(ex) => Some(ex.getClass.getName) // Exception class name for errors + case Right(_) => None + } + ) + ) + def apply[F[_]](meter: Meter): OpenTelemetryMetrics[F] = apply(meter, Nil) def apply[F[_]](otel: OpenTelemetry): OpenTelemetryMetrics[F] = apply(defaultMeter(otel), Nil) def apply[F[_]](otel: OpenTelemetry, metrics: List[Metric[F, _]]): OpenTelemetryMetrics[F] = apply(defaultMeter(otel), metrics) @@ -50,7 +76,7 @@ object OpenTelemetryMetrics { * measured separately up to the point where the headers are determined, and then once again when the whole response body is complete. */ def default[F[_]](otel: OpenTelemetry): OpenTelemetryMetrics[F] = - default(defaultMeter(otel), MetricLabels.Default) + default(defaultMeter(otel), OpenTelemetryAttributes) /** Registers default metrics (see other variants) using custom labels. */ def default[F[_]](otel: OpenTelemetry, labels: MetricLabels): OpenTelemetryMetrics[F] = default(defaultMeter(otel), labels) @@ -64,10 +90,10 @@ object OpenTelemetryMetrics { * Status is by default the status code class (1xx, 2xx, etc.), and phase can be either `headers` or `body` - request duration is * measured separately up to the point where the headers are determined, and then once again when the whole response body is complete. */ - def default[F[_]](meter: Meter): OpenTelemetryMetrics[F] = default(meter, MetricLabels.Default) + def default[F[_]](meter: Meter): OpenTelemetryMetrics[F] = default(meter, OpenTelemetryAttributes) /** Registers default metrics (see other variants) using custom labels. */ - def default[F[_]](meter: Meter, labels: MetricLabels = MetricLabels.Default): OpenTelemetryMetrics[F] = + def default[F[_]](meter: Meter, labels: MetricLabels = OpenTelemetryAttributes): OpenTelemetryMetrics[F] = OpenTelemetryMetrics( meter, List[Metric[F, _]]( @@ -80,7 +106,7 @@ object OpenTelemetryMetrics { def requestActive[F[_]](meter: Meter, labels: MetricLabels): Metric[F, LongUpDownCounter] = Metric[F, LongUpDownCounter]( meter - .upDownCounterBuilder("request_active") + .upDownCounterBuilder("http.server.active_requests") .setDescription("Active HTTP requests") .setUnit("1") .build(), @@ -97,7 +123,7 @@ object OpenTelemetryMetrics { def requestTotal[F[_]](meter: Meter, labels: MetricLabels): Metric[F, LongCounter] = Metric[F, LongCounter]( meter - .counterBuilder("request_total") + .counterBuilder("http.server.request.total") .setDescription("Total HTTP requests") .setUnit("1") .build(), @@ -108,6 +134,7 @@ object OpenTelemetryMetrics { m.eval { val otLabels = merge(asOpenTelemetryAttributes(labels, ep, req), asOpenTelemetryAttributes(labels, Right(res), None)) + counter.add(1, otLabels) } } @@ -125,9 +152,9 @@ object OpenTelemetryMetrics { def requestDuration[F[_]](meter: Meter, labels: MetricLabels): Metric[F, DoubleHistogram] = Metric[F, DoubleHistogram]( meter - .histogramBuilder("request_duration") + .histogramBuilder("http.server.request.duration") .setDescription("Duration of HTTP requests") - .setUnit("ms") + .setUnit("s") .build(), onRequest = (req, recorder, m) => m.eval { @@ -170,7 +197,10 @@ object OpenTelemetryMetrics { l.forRequest.foldLeft(Attributes.builder())((b, label) => { b.put(label._1, label._2(ep, req)) }).build() private def asOpenTelemetryAttributes(l: MetricLabels, res: Either[Throwable, ServerResponse[_]], phase: Option[String]): Attributes = { - val builder = l.forResponse.foldLeft(Attributes.builder())((b, label) => { b.put(label._1, label._2(res)) }) + val builder = Attributes.builder() + l.forResponse.foreach { case (key, valueFn) => + valueFn(res).foreach(value => builder.put(key, value)) + } phase.foreach(v => builder.put(l.forResponsePhase.name, v)) builder.build() } diff --git a/metrics/opentelemetry-metrics/src/test/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetricsTest.scala b/metrics/opentelemetry-metrics/src/test/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetricsTest.scala index fcc096a963..f0533fda8f 100644 --- a/metrics/opentelemetry-metrics/src/test/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetricsTest.scala +++ b/metrics/opentelemetry-metrics/src/test/scala/sttp/tapir/server/metrics/opentelemetry/OpenTelemetryMetricsTest.scala @@ -25,7 +25,7 @@ import scala.concurrent.Future class OpenTelemetryMetricsTest extends AnyFlatSpec with Matchers { - "default metrics" should "collect requests active" in { + "default metrics" should "collect http.server.active_requests" in { // given val reader = InMemoryMetricReader.create() val provider = SdkMeterProvider.builder().registerMetricReader(reader).build() @@ -51,17 +51,31 @@ class OpenTelemetryMetricsTest extends AnyFlatSpec with Matchers { // then val point = longSumData(reader).head - point.getAttributes shouldBe Attributes.of(AttributeKey.stringKey("method"), "GET", AttributeKey.stringKey("path"), "/person") + point.getAttributes shouldBe Attributes.of( + AttributeKey.stringKey("http.request.method"), + "GET", + AttributeKey.stringKey("path"), + "/person", + AttributeKey.stringKey("url.scheme"), + "http" + ) point.getValue shouldBe 1 ScalaFutures.whenReady(response, Timeout(Span(3, Seconds))) { _ => val point = longSumData(reader).head - point.getAttributes shouldBe Attributes.of(AttributeKey.stringKey("method"), "GET", AttributeKey.stringKey("path"), "/person") + point.getAttributes shouldBe Attributes.of( + AttributeKey.stringKey("http.request.method"), + "GET", + AttributeKey.stringKey("path"), + "/person", + AttributeKey.stringKey("url.scheme"), + "http" + ) point.getValue shouldBe 0 } } - "default metrics" should "collect requests total" in { + "default metrics" should "collect http.server.request.total" in { // given val reader = InMemoryMetricReader.create() val provider = SdkMeterProvider.builder().registerMetricReader(reader).build() @@ -87,29 +101,33 @@ class OpenTelemetryMetricsTest extends AnyFlatSpec with Matchers { .count { case dp if dp.getAttributes == Attributes.of( - AttributeKey.stringKey("method"), + AttributeKey.stringKey("http.request.method"), "GET", AttributeKey.stringKey("path"), "/person", - AttributeKey.stringKey("status"), - "2xx" + AttributeKey.stringKey("url.scheme"), + "http", + AttributeKey.stringKey("http.response.status_code"), + "200", ) && dp.getValue == 2 => true case dp if dp.getAttributes == Attributes.of( - AttributeKey.stringKey("method"), + AttributeKey.stringKey("http.request.method"), "GET", AttributeKey.stringKey("path"), "/person", - AttributeKey.stringKey("status"), - "4xx" + AttributeKey.stringKey("url.scheme"), + "http", + AttributeKey.stringKey("http.response.status_code"), + "400", ) && dp.getValue == 2 => true case _ => false } shouldBe 2 } - "default metrics" should "collect requests duration" in { + "default metrics" should "collect http.server.request.duration" in { // given val reader = InMemoryMetricReader.create() val provider = SdkMeterProvider.builder().registerMetricReader(reader).build() @@ -140,14 +158,16 @@ class OpenTelemetryMetricsTest extends AnyFlatSpec with Matchers { val point = reader.collectAllMetrics().asScala.head.getHistogramData.getPoints.asScala point.map(_.getAttributes) should contain( Attributes.of( - AttributeKey.stringKey("method"), + AttributeKey.stringKey("http.request.method"), "GET", AttributeKey.stringKey("path"), "/person", - AttributeKey.stringKey("status"), - "2xx", + AttributeKey.stringKey("http.response.status_code"), + "200", AttributeKey.stringKey("phase"), - "body" + "body", + AttributeKey.stringKey("url.scheme"), + "http", ) ) } @@ -197,12 +217,14 @@ class OpenTelemetryMetricsTest extends AnyFlatSpec with Matchers { // then val point = longSumData(reader).head point.getAttributes shouldBe Attributes.of( - AttributeKey.stringKey("method"), + AttributeKey.stringKey("http.request.method"), "GET", AttributeKey.stringKey("path"), "/person", - AttributeKey.stringKey("status"), - "5xx" + AttributeKey.stringKey("url.scheme"), + "http", + AttributeKey.stringKey("http.response.status_code"), + "500" ) point.getValue shouldBe 1 } diff --git a/metrics/zio-metrics/src/main/scala/sttp/tapir/server/metrics/zio/ZioMetrics.scala b/metrics/zio-metrics/src/main/scala/sttp/tapir/server/metrics/zio/ZioMetrics.scala index ff96d2c4ae..29d555440c 100644 --- a/metrics/zio-metrics/src/main/scala/sttp/tapir/server/metrics/zio/ZioMetrics.scala +++ b/metrics/zio-metrics/src/main/scala/sttp/tapir/server/metrics/zio/ZioMetrics.scala @@ -87,9 +87,12 @@ object ZioMetrics { /** Convert into zio metric labels */ private def asZioLabel(l: MetricLabels, res: Either[Throwable, ServerResponse[_]], phase: Option[String]): Set[MetricLabel] = { - l.forResponse.map(label => zio.metrics.MetricLabel(label._1, label._2(res))) ++ - phase.map(v => MetricLabel(l.forResponsePhase.name, v)) - }.toSet + val responseLabels = l.forResponse.map { case (key, valueFn) => + MetricLabel(key, valueFn(res).getOrElse("unknown")) + } + val phaseLabel = phase.map(v => MetricLabel(l.forResponsePhase.name, v)) + (responseLabels ++ phaseLabel).toSet + } /** Requests active metric collector. */ def requestActive[F[_]](namespace: String, labels: MetricLabels): Metric[F, Gauge[Long]] = { diff --git a/server/core/src/main/scala/sttp/tapir/server/metrics/Metric.scala b/server/core/src/main/scala/sttp/tapir/server/metrics/Metric.scala index 8c90e9fb3b..82c32bff01 100644 --- a/server/core/src/main/scala/sttp/tapir/server/metrics/Metric.scala +++ b/server/core/src/main/scala/sttp/tapir/server/metrics/Metric.scala @@ -29,15 +29,15 @@ case class EndpointMetric[F[_]]( case class ResponsePhaseLabel(name: String, headersValue: String, bodyValue: String) case class MetricLabels( forRequest: List[(String, (AnyEndpoint, ServerRequest) => String)], - forResponse: List[(String, Either[Throwable, ServerResponse[_]] => String)], + forResponse: List[(String, Either[Throwable, ServerResponse[_]] => Option[String])], forResponsePhase: ResponsePhaseLabel = ResponsePhaseLabel("phase", "headers", "body") ) { def namesForRequest: List[String] = forRequest.map { case (name, _) => name } def namesForResponse: List[String] = forResponse.map { case (name, _) => name } def valuesForRequest(ep: AnyEndpoint, req: ServerRequest): List[String] = forRequest.map { case (_, f) => f(ep, req) } - def valuesForResponse(res: ServerResponse[_]): List[String] = forResponse.map { case (_, f) => f(Right(res)) } - def valuesForResponse(ex: Throwable): List[String] = forResponse.map { case (_, f) => f(Left(ex)) } + def valuesForResponse(res: ServerResponse[_]): List[String] = forResponse.flatMap { case (_, f) => f(Right(res)).toList } + def valuesForResponse(ex: Throwable): List[String] = forResponse.flatMap { case (_, f) => f(Left(ex)).toList } } object MetricLabels { @@ -51,15 +51,15 @@ object MetricLabels { forResponse = List( "status" -> { case Right(r) => - r.code match { + Some(r.code match { case c if c.isInformational => "1xx" case c if c.isSuccess => "2xx" case c if c.isRedirect => "3xx" case c if c.isClientError => "4xx" case c if c.isServerError => "5xx" case _ => "" - } - case Left(_) => "5xx" + }) + case Left(_) => Some("5xx") } ) ) From 42acc173d4c7bae55520ea7e079d3c9e5d020d06 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Sat, 14 Dec 2024 01:32:48 +0100 Subject: [PATCH 119/127] Update prometheus-metrics-core, ... to 1.3.5 (#4205) --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 073b5e1a18..b3c1267b04 100644 --- a/build.sbt +++ b/build.sbt @@ -1019,8 +1019,8 @@ lazy val prometheusMetrics: ProjectMatrix = (projectMatrix in file("metrics/prom .settings( name := "tapir-prometheus-metrics", libraryDependencies ++= Seq( - "io.prometheus" % "prometheus-metrics-core" % "1.3.4", - "io.prometheus" % "prometheus-metrics-exposition-formats" % "1.3.4", + "io.prometheus" % "prometheus-metrics-core" % "1.3.5", + "io.prometheus" % "prometheus-metrics-exposition-formats" % "1.3.5", scalaTest.value % Test ) ) From 1dab4dd6b74e518215a245535d57e0c947cc691e Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Tue, 17 Dec 2024 01:35:35 +0100 Subject: [PATCH 120/127] Update guava to 33.4.0-jre (#4206) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index a78436cd31..265d4cf8df 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -20,6 +20,6 @@ addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.6") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") addSbtPlugin("org.apache.pekko" % "pekko-grpc-sbt-plugin" % "1.1.1") // needed to override the Android flavor of Guava coming from pekko-grpc-sbt-plugin, which causes failures in Scala.JS builds -dependencyOverrides += "com.google.guava" % "guava" % "33.3.1-jre" +dependencyOverrides += "com.google.guava" % "guava" % "33.4.0-jre" addDependencyTreePlugin From 4db8d57e4d4eaf3c881f6bbd8cbeb79c3c893c1d Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 18 Dec 2024 01:36:50 +0100 Subject: [PATCH 121/127] Update netty-all to 4.1.116.Final (#4209) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 161daa5530..9894752f0d 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -63,7 +63,7 @@ object Versions { val openTelemetry = "1.45.0" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" - val nettyAll = "4.1.114.Final" + val nettyAll = "4.1.116.Final" val logback = "1.5.12" val slf4j = "2.0.16" val jsoniter = "2.32.0" From b2654a293f39b91aa9244c93aaa1256ba40cebf0 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Wed, 18 Dec 2024 02:06:14 +0100 Subject: [PATCH 122/127] Update quicklens to 1.9.11 (#4208) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 9894752f0d..144feff511 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -59,7 +59,7 @@ object Versions { val scalaCollectionCompat = "2.12.0" val fs2 = "3.11.0" val decline = "2.4.1" - val quicklens = "1.9.10" + val quicklens = "1.9.11" val openTelemetry = "1.45.0" val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" From 9beab8f0ec159127fbbde34a2f71dc9b04c72bd8 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 19 Dec 2024 01:35:26 +0100 Subject: [PATCH 123/127] Update asyncapi-circe-yaml, ... to 0.11.4 (#4211) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 144feff511..949fc7abd1 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -11,7 +11,7 @@ object Versions { val sttp = "3.10.1" val sttpModel = "1.7.11" val sttpShared = "1.4.2" - val sttpApispec = "0.11.3" + val sttpApispec = "0.11.4" val akkaHttp = "10.2.10" val akkaStreams = "2.6.20" val pekkoHttp = "1.1.0" From 998038a63ee88740a87263638844c0a869e4989a Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 19 Dec 2024 01:45:17 +0100 Subject: [PATCH 124/127] Update logback-classic to 1.5.13 (#4210) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 949fc7abd1..a07ffd1f59 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -64,7 +64,7 @@ object Versions { val mockServer = "5.15.0" val dogstatsdClient = "4.4.3" val nettyAll = "4.1.116.Final" - val logback = "1.5.12" + val logback = "1.5.13" val slf4j = "2.0.16" val jsoniter = "2.32.0" } From c862bd8a4570036b4de3959969e6abde6bf8c674 Mon Sep 17 00:00:00 2001 From: softwaremill-ci Date: Thu, 19 Dec 2024 01:58:16 +0100 Subject: [PATCH 125/127] Update gatling-sbt to 4.11.1 (#4212) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 265d4cf8df..12c258f014 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -14,7 +14,7 @@ addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") -addSbtPlugin("io.gatling" % "gatling-sbt" % "4.10.2") +addSbtPlugin("io.gatling" % "gatling-sbt" % "4.11.1") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.6") addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "2.1.4") From c15fb3db9a52e312c92b0f7d5a5fff1fd0645eee Mon Sep 17 00:00:00 2001 From: adamw Date: Thu, 19 Dec 2024 16:05:36 +0100 Subject: [PATCH 126/127] Fix links in examples --- project/GenerateListOfExamples.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/GenerateListOfExamples.scala b/project/GenerateListOfExamples.scala index da3f8b47fb..e2a6526163 100644 --- a/project/GenerateListOfExamples.scala +++ b/project/GenerateListOfExamples.scala @@ -56,7 +56,7 @@ object GenerateListOfExamples { } .mkString(" ") - s"""* [${example.description}]($LinkBase/$relativeLink) $tags""" + s"""* [${example.description}]($LinkBase$relativeLink) $tags""" } // combining all examples in category .mkString("\n") From 7f079cf7afe8b35bb06195ffbc068ccf69a9ce4c Mon Sep 17 00:00:00 2001 From: hughsimpson Date: Thu, 19 Dec 2024 16:34:57 +0000 Subject: [PATCH 127/127] codegen: Permit autogenerating types aliases for endpoints (#4213) --- .../scala/sttp/tapir/codegen/GenScala.scala | 12 +- .../sttp/tapir/codegen/BasicGenerator.scala | 16 +- .../tapir/codegen/EndpointGenerator.scala | 253 ++++++++++++------ .../tapir/codegen/BasicGeneratorSpec.scala | 3 +- .../ClassDefinitionGeneratorSpec.scala | 3 +- .../tapir/codegen/EndpointGeneratorSpec.scala | 15 +- .../sttp/tapir/sbt/OpenapiCodegenKeys.scala | 2 + .../sttp/tapir/sbt/OpenapiCodegenPlugin.scala | 3 + .../sttp/tapir/sbt/OpenapiCodegenTask.scala | 4 +- .../oneOf-json-roundtrip/Expected.scala.txt | 32 ++- .../ExpectedJsonSerdes.scala.txt | 4 + .../ExpectedSchemas.scala.txt | 3 + .../oneOf-json-roundtrip/build.sbt | 3 +- .../oneOf-json-roundtrip/swagger.yaml | 42 ++- 14 files changed, 293 insertions(+), 102 deletions(-) diff --git a/openapi-codegen/cli/src/main/scala/sttp/tapir/codegen/GenScala.scala b/openapi-codegen/cli/src/main/scala/sttp/tapir/codegen/GenScala.scala index 361167d58e..8de7b9cbd1 100644 --- a/openapi-codegen/cli/src/main/scala/sttp/tapir/codegen/GenScala.scala +++ b/openapi-codegen/cli/src/main/scala/sttp/tapir/codegen/GenScala.scala @@ -65,6 +65,9 @@ object GenScala { private val streamingImplementationOpt: Opts[Option[String]] = Opts.option[String]("streamingImplementation", "Capability to use for binary streams", "s").orNone + private val generateEndpointTypesOpt: Opts[Boolean] = + Opts.flag("generateEndpointTypes", "Whether to emit explicit type aliases for endpoint declarations", "e").orFalse + private val destDirOpt: Opts[File] = Opts .option[String]("destdir", "Destination directory", "d") @@ -88,7 +91,8 @@ object GenScala { jsonLibOpt, validateNonDiscriminatedOneOfsOpt, maxSchemasPerFileOpt, - streamingImplementationOpt + streamingImplementationOpt, + generateEndpointTypesOpt ) .mapN { case ( @@ -101,7 +105,8 @@ object GenScala { jsonLib, validateNonDiscriminatedOneOfs, maxSchemasPerFile, - streamingImplementation + streamingImplementation, + generateEndpointTypes ) => val objectName = maybeObjectName.getOrElse(DefaultObjectName) @@ -116,7 +121,8 @@ object GenScala { jsonLib.getOrElse("circe"), streamingImplementation.getOrElse("fs2"), validateNonDiscriminatedOneOfs, - maxSchemasPerFile.getOrElse(400) + maxSchemasPerFile.getOrElse(400), + generateEndpointTypes ) ) destFiles <- contents.toVector.traverse { case (fileName, content) => writeGeneratedFile(destDir, fileName, content) } diff --git a/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/BasicGenerator.scala b/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/BasicGenerator.scala index b7d21b9cdd..571fcc236b 100644 --- a/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/BasicGenerator.scala +++ b/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/BasicGenerator.scala @@ -25,6 +25,10 @@ object StreamingImplementation extends Enumeration { val Akka, FS2, Pekko, Zio = Value type StreamingImplementation = Value } +object EndpointCapabilites extends Enumeration { + val Akka, FS2, Nothing, Pekko, Zio = Value + type EndpointCapabilites = Value +} object BasicGenerator { @@ -40,7 +44,8 @@ object BasicGenerator { jsonSerdeLib: String, streamingImplementation: String, validateNonDiscriminatedOneOfs: Boolean, - maxSchemasPerFile: Int + maxSchemasPerFile: Int, + generateEndpointTypes: Boolean ): Map[String, String] = { val normalisedJsonLib = jsonSerdeLib.toLowerCase match { case "circe" => JsonSerdeLib.Circe @@ -65,7 +70,14 @@ object BasicGenerator { } val EndpointDefs(endpointsByTag, queryOrPathParamRefs, jsonParamRefs, enumsDefinedOnEndpointParams) = - endpointGenerator.endpointDefs(doc, useHeadTagForObjectNames, targetScala3, normalisedJsonLib, normalisedStreamingImplementation) + endpointGenerator.endpointDefs( + doc, + useHeadTagForObjectNames, + targetScala3, + normalisedJsonLib, + normalisedStreamingImplementation, + generateEndpointTypes + ) val GeneratedClassDefinitions(classDefns, jsonSerdes, schemas) = classGenerator .classDefs( diff --git a/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/EndpointGenerator.scala b/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/EndpointGenerator.scala index 7b388ffc93..a30d874efd 100644 --- a/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/EndpointGenerator.scala +++ b/openapi-codegen/core/src/main/scala/sttp/tapir/codegen/EndpointGenerator.scala @@ -2,6 +2,8 @@ package sttp.tapir.codegen import io.circe.Json import sttp.tapir.codegen.BasicGenerator.{indent, mapSchemaSimpleTypeToType, strippedToCamelCase} import sttp.tapir.codegen.JsonSerdeLib.JsonSerdeLib +import sttp.tapir.codegen.EndpointCapabilites +import sttp.tapir.codegen.EndpointCapabilites.EndpointCapabilites import sttp.tapir.codegen.StreamingImplementation import sttp.tapir.codegen.StreamingImplementation.StreamingImplementation import sttp.tapir.codegen.openapi.models.OpenapiModels.{OpenapiDocument, OpenapiParameter, OpenapiPath, OpenapiRequestBody, OpenapiResponse} @@ -11,6 +13,7 @@ import sttp.tapir.codegen.openapi.models.OpenapiSchemaType.{ OpenapiSchemaBinary, OpenapiSchemaEnum, OpenapiSchemaMap, + OpenapiSchemaOneOf, OpenapiSchemaRef, OpenapiSchemaSimpleType, OpenapiSchemaString @@ -22,7 +25,18 @@ case class Location(path: String, method: String) { override def toString: String = s"${method.toUpperCase} ${path}" } -case class GeneratedEndpoint(name: String, definition: String, maybeLocalEnums: Option[String]) +case class EndpointTypes(security: Seq[String], in: Seq[String], err: Seq[String], out: Seq[String]) { + private def toType(types: Seq[String]) = types match { + case Nil => "Unit" + case t +: Nil => t + case seq => seq.mkString("(", ", ", ")") + } + def securityTypes = toType(security) + def inTypes = toType(in) + def errTypes = toType(err) + def outTypes = toType(out) +} +case class GeneratedEndpoint(name: String, definition: String, maybeLocalEnums: Option[String], types: EndpointTypes) case class GeneratedEndpointsForFile(maybeFileName: Option[String], generatedEndpoints: Seq[GeneratedEndpoint]) case class GeneratedEndpoints( @@ -54,22 +68,38 @@ class EndpointGenerator { private[codegen] def allEndpoints: String = "generatedEndpoints" + private def capabilityImpl(streamingImplementation: StreamingImplementation): String = streamingImplementation match { + case StreamingImplementation.Akka => "sttp.capabilities.akka.AkkaStreams" + case StreamingImplementation.FS2 => "sttp.capabilities.fs2.Fs2Streams[cats.effect.IO]" + case StreamingImplementation.Pekko => "sttp.capabilities.pekko.PekkoStreams" + case StreamingImplementation.Zio => "sttp.capabilities.zio.ZioStreams" + } + def endpointDefs( doc: OpenapiDocument, useHeadTagForObjectNames: Boolean, targetScala3: Boolean, jsonSerdeLib: JsonSerdeLib, - streamingImplementation: StreamingImplementation + streamingImplementation: StreamingImplementation, + generateEndpointTypes: Boolean ): EndpointDefs = { + val capabilities = capabilityImpl(streamingImplementation) val components = Option(doc.components).flatten val GeneratedEndpoints(endpointsByFile, queryOrPathParamRefs, jsonParamRefs, definesEnumQueryParam) = doc.paths - .map(generatedEndpoints(components, useHeadTagForObjectNames, targetScala3, jsonSerdeLib, streamingImplementation)) + .map(generatedEndpoints(components, useHeadTagForObjectNames, targetScala3, jsonSerdeLib, streamingImplementation, doc)) .foldLeft(GeneratedEndpoints(Nil, Set.empty, Set.empty, false))(_ merge _) val endpointDecls = endpointsByFile.map { case GeneratedEndpointsForFile(k, ge) => val definitions = ge - .map { case GeneratedEndpoint(name, definition, maybeEnums) => - s"""lazy val $name = + .map { case GeneratedEndpoint(name, definition, maybeEnums, types) => + val theCapabilities = if (definition.contains(".capabilities.")) capabilities else "Any" + val endpointTypeDecl = + if (generateEndpointTypes) + s"type ${name.capitalize}Endpoint = Endpoint[${types.securityTypes}, ${types.inTypes}, ${types.errTypes}, ${types.outTypes}, $theCapabilities]\n" + else "" + + val maybeType = if (generateEndpointTypes) s": ${name.capitalize}Endpoint" else "" + s"""${endpointTypeDecl}lazy val $name$maybeType = |${indent(2)(definition)}${maybeEnums.fold("")("\n" + _)} |""".stripMargin } @@ -89,7 +119,8 @@ class EndpointGenerator { useHeadTagForObjectNames: Boolean, targetScala3: Boolean, jsonSerdeLib: JsonSerdeLib, - streamingImplementation: StreamingImplementation + streamingImplementation: StreamingImplementation, + doc: OpenapiDocument )(p: OpenapiPath): GeneratedEndpoints = { val parameters = components.map(_.parameters).getOrElse(Map.empty) val securitySchemes = components.map(_.securitySchemes).getOrElse(Map.empty) @@ -111,15 +142,19 @@ class EndpointGenerator { } val name = strippedToCamelCase(m.operationId.getOrElse(m.methodType + p.url.capitalize)) - val (inParams, maybeLocalEnums) = + val (pathDecl, pathTypes) = urlMapper(p.url, m.resolvedParameters) + val (securityDecl, securityTypes) = security(securitySchemes, m.security) + val (inParams, maybeLocalEnums, inTypes) = ins(m.resolvedParameters, m.requestBody, name, targetScala3, jsonSerdeLib, streamingImplementation) + val (outDecl, outTypes, errTypes) = outs(m.responses, streamingImplementation, doc, targetScala3) + val allTypes = EndpointTypes(securityTypes.toSeq, pathTypes ++ inTypes, errTypes.toSeq, outTypes.toSeq) val definition = s"""|endpoint | .${m.methodType} - | ${urlMapper(p.url, m.resolvedParameters)} - |${indent(2)(security(securitySchemes, m.security))} + | $pathDecl + |${indent(2)(securityDecl)} |${indent(2)(inParams)} - |${indent(2)(outs(m.responses, streamingImplementation))} + |${indent(2)(outDecl)} |${indent(2)(tags(m.tags))} |$attributeString |""".stripMargin.linesIterator.filterNot(_.trim.isEmpty).mkString("\n") @@ -148,7 +183,7 @@ class EndpointGenerator { } .toSet ( - (maybeTargetFileName, GeneratedEndpoint(name, definition, maybeLocalEnums)), + (maybeTargetFileName, GeneratedEndpoint(name, definition, maybeLocalEnums, allTypes)), (queryOrPathParamRefs, jsonParamRefs), maybeLocalEnums.isDefined ) @@ -167,26 +202,30 @@ class EndpointGenerator { ) } - private def urlMapper(url: String, parameters: Seq[OpenapiParameter])(implicit location: Location): String = { + private def urlMapper(url: String, parameters: Seq[OpenapiParameter])(implicit location: Location): (String, Seq[String]) = { // .in(("books" / path[String]("genre") / path[Int]("year")).mapTo[BooksFromYear]) - val inPath = url.split('/').filter(_.nonEmpty) map { segment => - if (segment.startsWith("{")) { - val name = segment.drop(1).dropRight(1) - val param = parameters.find(_.name == name) - param.fold(bail(s"URLParam $name not found!")) { p => - p.schema match { - case st: OpenapiSchemaSimpleType => - val (t, _) = mapSchemaSimpleTypeToType(st) - val desc = p.description.fold("")(d => s""".description("$d")""") - s"""path[$t]("$name")$desc""" - case _ => bail("Can't create non-simple params to url yet") + val (inPath, tpes) = url + .split('/') + .filter(_.nonEmpty) + .map { segment => + if (segment.startsWith("{")) { + val name = segment.drop(1).dropRight(1) + val param = parameters.find(_.name == name) + param.fold(bail(s"URLParam $name not found!")) { p => + p.schema match { + case st: OpenapiSchemaSimpleType => + val (t, _) = mapSchemaSimpleTypeToType(st) + val desc = p.description.fold("")(d => s""".description("$d")""") + s"""path[$t]("$name")$desc""" -> Some(t) + case _ => bail("Can't create non-simple params to url yet") + } } + } else { + '"' + segment + '"' -> None } - } else { - '"' + segment + '"' } - } - ".in((" + inPath.mkString(" / ") + "))" + .unzip + ".in((" + inPath.mkString(" / ") + "))" -> tpes.toSeq.flatten } private def security(securitySchemes: Map[String, OpenapiSecuritySchemeType], security: Seq[Seq[String]])(implicit location: Location) = { @@ -195,16 +234,16 @@ class EndpointGenerator { security.headOption .flatMap(_.headOption) - .fold("") { schemeName => + .fold("" -> Option.empty[String]) { schemeName => securitySchemes.get(schemeName) match { case Some(OpenapiSecuritySchemeType.OpenapiSecuritySchemeBearerType) => - ".securityIn(auth.bearer[String]())" + ".securityIn(auth.bearer[String]())" -> Some("String") case Some(OpenapiSecuritySchemeType.OpenapiSecuritySchemeBasicType) => - ".securityIn(auth.basic[UsernamePassword]())" + ".securityIn(auth.basic[UsernamePassword]())" -> Some("String") case Some(OpenapiSecuritySchemeType.OpenapiSecuritySchemeApiKeyType(in, name)) => - s""".securityIn(auth.apiKey($in[String]("$name")))""" + s""".securityIn(auth.apiKey($in[String]("$name")))""" -> Some("String") case None => bail(s"Unknown security scheme $schemeName!") @@ -219,7 +258,7 @@ class EndpointGenerator { targetScala3: Boolean, jsonSerdeLib: JsonSerdeLib, streamingImplementation: StreamingImplementation - )(implicit location: Location): (String, Option[String]) = { + )(implicit location: Location): (String, Option[String], Seq[String]) = { def getEnumParamDefn(param: OpenapiParameter, e: OpenapiSchemaEnum, isArray: Boolean) = { val enumName = endpointName.capitalize + strippedToCamelCase(param.name).capitalize val enumParamRefs = if (param.in == "query" || param.in == "path") Set(enumName) else Set.empty[String] @@ -237,14 +276,20 @@ class EndpointGenerator { // 'exploded' params have no distinction between an empty list and an absent value, so don't wrap in 'Option' for them val noOptionWrapper = required || (isArray && param.isExploded) val req = if (noOptionWrapper) tpe else s"Option[$tpe]" + val outType = (isArray, noOptionWrapper) match { + case (true, true) => s"List[$enumName]" + case (true, false) => s"Option[List[$enumName]]" + case (false, true) => enumName + case (false, false) => s"Option[$enumName]" + } def mapToList = if (!isArray) "" else if (noOptionWrapper) s".map(_.values)($arrayType(_))" else s".map(_.map(_.values))(_.map($arrayType(_)))" val desc = param.description.map(d => JavaEscape.escapeString(d)).fold("")(d => s""".description("$d")""") - s""".in(${param.in}[$req]("${param.name}")$mapToList$desc)""" -> Some(enumDefn) + (s""".in(${param.in}[$req]("${param.name}")$mapToList$desc)""", Some(enumDefn), outType) } // .in(query[Limit]("limit").description("Maximum number of books to retrieve")) // .in(header[AuthToken]("X-Auth-Token")) - val (params, maybeEnumDefns) = parameters + val (params, maybeEnumDefns, inTypes) = parameters .filter(_.in != "path") .map { param => param.schema match { @@ -252,7 +297,7 @@ class EndpointGenerator { val (t, _) = mapSchemaSimpleTypeToType(st) val req = if (param.required.getOrElse(true)) t else s"Option[$t]" val desc = param.description.map(d => JavaEscape.escapeString(d)).fold("")(d => s""".description("$d")""") - s""".in(${param.in}[$req]("${param.name}")$desc)""" -> None + (s""".in(${param.in}[$req]("${param.name}")$desc)""", None, req) case OpenapiSchemaArray(st: OpenapiSchemaSimpleType, _) => val (t, _) = mapSchemaSimpleTypeToType(st) val arrayType = if (param.isExploded) "ExplodedValues" else "CommaSeparatedValues" @@ -263,25 +308,32 @@ class EndpointGenerator { val req = if (noOptionWrapper) arr else s"Option[$arr]" def mapToList = if (noOptionWrapper) s".map(_.values)($arrayType(_))" else s".map(_.map(_.values))(_.map($arrayType(_)))" val desc = param.description.map(d => JavaEscape.escapeString(d)).fold("")(d => s""".description("$d")""") - s""".in(${param.in}[$req]("${param.name}")$mapToList$desc)""" -> None + (s""".in(${param.in}[$req]("${param.name}")$mapToList$desc)""", None, req) case e @ OpenapiSchemaEnum(_, _, _) => getEnumParamDefn(param, e, isArray = false) case OpenapiSchemaArray(e: OpenapiSchemaEnum, _) => getEnumParamDefn(param, e, isArray = true) case x => bail(s"Can't create non-simple params to input - found $x") } } - .unzip + .unzip3 - val rqBody = requestBody.flatMap { b => + val (rqBody, maybeReqType) = requestBody.flatMap { b => if (b.content.isEmpty) None else if (b.content.size != 1) bail(s"We can handle only one requestBody content! Saw ${b.content.map(_.contentType)}") - else Some(s".in(${contentTypeMapper(b.content.head.contentType, b.content.head.schema, streamingImplementation, b.required)})") - } + else { + val (decl, tpe) = contentTypeMapper(b.content.head.contentType, b.content.head.schema, streamingImplementation, b.required) + Some(s".in($decl)" -> tpe) + } + }.unzip - (params ++ rqBody).mkString("\n") -> maybeEnumDefns.foldLeft(Option.empty[String]) { - case (acc, None) => acc - case (None, Some(nxt)) => Some(nxt.mkString("\n")) - case (Some(acc), Some(nxt)) => Some(acc + "\n" + nxt.mkString("\n")) - } + ( + (params ++ rqBody).mkString("\n"), + maybeEnumDefns.foldLeft(Option.empty[String]) { + case (acc, None) => acc + case (None, Some(nxt)) => Some(nxt.mkString("\n")) + case (Some(acc), Some(nxt)) => Some(acc + "\n" + nxt.mkString("\n")) + }, + inTypes ++ maybeReqType + ) } private def tags(openapiTags: Option[Seq[String]]): String = { @@ -305,7 +357,14 @@ class EndpointGenerator { // treats redirects as ok private val okStatus = """([23]\d\d)""".r private val errorStatus = """([45]\d\d)""".r - private def outs(responses: Seq[OpenapiResponse], streamingImplementation: StreamingImplementation)(implicit location: Location) = { + private def outs( + responses: Seq[OpenapiResponse], + streamingImplementation: StreamingImplementation, + doc: OpenapiDocument, + targetScala3: Boolean + )(implicit + location: Location + ) = { // .errorOut(stringBody) // .out(jsonBody[List[Book]]) @@ -320,44 +379,83 @@ class EndpointGenerator { case _ => bail("We can handle only one return content!") } } - def bodyFmt(resp: OpenapiResponse): String = { + def bodyFmt(resp: OpenapiResponse): (String, Option[String]) = { val d = s""".description("${JavaEscape.escapeString(resp.description)}")""" resp.content match { - case Nil => "" + case Nil => "" -> None case content +: Nil => - s"${contentTypeMapper(content.contentType, content.schema, streamingImplementation)}$d" + val (decl, tpe) = contentTypeMapper(content.contentType, content.schema, streamingImplementation) + s"$decl$d" -> Some(tpe) } } - def mappedGroup(group: Seq[OpenapiResponse]) = group match { - case Nil => None + def mappedGroup(group: Seq[OpenapiResponse]): (Option[String], Option[String]) = group match { + case Nil => None -> None case resp +: Nil => resp.content match { case Nil => val d = s""".description("${JavaEscape.escapeString(resp.description)}")""" - resp.code match { - case "200" | "default" => None - case okStatus(s) => Some(s"statusCode(sttp.model.StatusCode($s))$d") - case errorStatus(s) => Some(s"statusCode(sttp.model.StatusCode($s))$d") - } + ( + resp.code match { + case "200" | "default" => None + case okStatus(s) => Some(s"statusCode(sttp.model.StatusCode($s))$d") + case errorStatus(s) => Some(s"statusCode(sttp.model.StatusCode($s))$d") + }, + None + ) case _ => + val (decl, tpe) = bodyFmt(resp) Some(resp.code match { - case "200" | "default" => s"${bodyFmt(resp)}" - case okStatus(s) => s"${bodyFmt(resp)}.and(statusCode(sttp.model.StatusCode($s)))" - case errorStatus(s) => s"${bodyFmt(resp)}.and(statusCode(sttp.model.StatusCode($s)))" - }) + case "200" | "default" => decl + case okStatus(s) => s"$decl.and(statusCode(sttp.model.StatusCode($s)))" + case errorStatus(s) => s"$decl.and(statusCode(sttp.model.StatusCode($s)))" + }) -> tpe } case many => if (many.map(_.code).distinct.size != many.size) bail("Cannot construct schema for multiple responses with same status code") - val oneOfs = many.map { m => + val (oneOfs, types) = many.map { m => + val (decl, tpe) = bodyFmt(m) val code = if (m.code == "default") "400" else m.code - s"oneOfVariant(sttp.model.StatusCode(${code}), ${bodyFmt(m)})" - } - Some(s"oneOf(${oneOfs.mkString(", ")})") + s"oneOfVariant(sttp.model.StatusCode(${code}), $decl)" -> tpe + }.unzip + val parentMap = doc.components.toSeq + .flatMap(_.schemas) + .collect { case (k, v: OpenapiSchemaOneOf) => + v.types.map { + case r: OpenapiSchemaRef => r.stripped -> k + case x: OpenapiSchemaSimpleType => mapSchemaSimpleTypeToType(x)._1 -> k + case x => bail(s"Unexpected oneOf child type $x") + } + } + .flatten + .groupBy(_._1) + .map { case (k, vs) => k -> vs.map(_._2) } + .toMap + val allElemTypes = many + .flatMap(_.content.map(_.schema)) + .map { + case r: OpenapiSchemaRef => r.stripped + case x: OpenapiSchemaSimpleType => mapSchemaSimpleTypeToType(x)._1 + case x => bail(s"Unexpected oneOf elem type $x") + } + .distinct + val commmonType = + if (allElemTypes.size == 1) allElemTypes.head + else + allElemTypes.map { s => parentMap.getOrElse(s, Nil).toSet }.reduce(_ intersect _) match { + case s if s.isEmpty && targetScala3 => types.mkString(" | ") + case s if s.isEmpty => "Any" + case s if targetScala3 => s.mkString(" & ") + case s => s.mkString(" with ") + } + Some(s"oneOf[$commmonType](${oneOfs.mkString(", ")})") -> Some(commmonType) } - val mappedOuts = mappedGroup(outs).map(s => s".out($s)") - val mappedErrorOuts = mappedGroup(errorOuts).map(s => s".errorOut($s)") - Seq(mappedErrorOuts, mappedOuts).flatten.mkString("\n") + val (outDecls, outTypes) = mappedGroup(outs) + val mappedOuts = outDecls.map(s => s".out($s)") + val (errDecls, errTypes) = mappedGroup(errorOuts) + val mappedErrorOuts = errDecls.map(s => s".errorOut($s)") + + (Seq(mappedErrorOuts, mappedOuts).flatten.mkString("\n"), outTypes, errTypes) } private def contentTypeMapper( @@ -365,10 +463,10 @@ class EndpointGenerator { schema: OpenapiSchemaType, streamingImplementation: StreamingImplementation, required: Boolean = true - )(implicit location: Location) = { + )(implicit location: Location): (String, String) = { contentType match { case "text/plain" => - "stringBody" + "stringBody" -> "String" case "application/json" => val outT = schema match { case st: OpenapiSchemaSimpleType => @@ -383,27 +481,22 @@ class EndpointGenerator { case x => bail(s"Can't create non-simple or array params as output (found $x)") } val req = if (required) outT else s"Option[$outT]" - s"jsonBody[$req]" + s"jsonBody[$req]" -> req case "multipart/form-data" => schema match { case _: OpenapiSchemaBinary => - "multipartBody" + "multipartBody" -> " Seq[Part[Array[Byte]]]" case schemaRef: OpenapiSchemaRef => val (t, _) = mapSchemaSimpleTypeToType(schemaRef, multipartForm = true) - s"multipartBody[$t]" + s"multipartBody[$t]" -> t case x => bail(s"$contentType only supports schema ref or binary. Found $x") } case "application/octet-stream" => - val capability = streamingImplementation match { - case StreamingImplementation.Akka => "sttp.capabilities.akka.AkkaStreams" - case StreamingImplementation.FS2 => "sttp.capabilities.fs2.Fs2Streams[cats.effect.IO]" - case StreamingImplementation.Pekko => "sttp.capabilities.pekko.PekkoStreams" - case StreamingImplementation.Zio => "sttp.capabilities.zio.ZioStreams" - } + val capability = capabilityImpl(streamingImplementation) schema match { case _: OpenapiSchemaString => - s"streamTextBody($capability)(CodecFormat.OctetStream())" + s"streamTextBody($capability)(CodecFormat.OctetStream())" -> s"$capability.BinaryStream" case schema => val outT = schema match { case st: OpenapiSchemaSimpleType => @@ -417,7 +510,7 @@ class EndpointGenerator { s"Map[String, $t]" case x => bail(s"Can't create this param as output (found $x)") } - s"streamBody($capability)(Schema.binary[$outT], CodecFormat.OctetStream())" + s"streamBody($capability)(Schema.binary[$outT], CodecFormat.OctetStream())" -> s"$capability.BinaryStream" } case x => bail(s"Not all content types supported! Found $x") diff --git a/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/BasicGeneratorSpec.scala b/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/BasicGeneratorSpec.scala index a4f334339b..d1b5d61501 100644 --- a/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/BasicGeneratorSpec.scala +++ b/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/BasicGeneratorSpec.scala @@ -18,7 +18,8 @@ class BasicGeneratorSpec extends CompileCheckTestBase { jsonSerdeLib = jsonSerdeLib, validateNonDiscriminatedOneOfs = true, maxSchemasPerFile = 400, - streamingImplementation = "fs2" + streamingImplementation = "fs2", + generateEndpointTypes = false ) } def gen( diff --git a/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/ClassDefinitionGeneratorSpec.scala b/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/ClassDefinitionGeneratorSpec.scala index b73060d8a7..de41c97a6c 100644 --- a/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/ClassDefinitionGeneratorSpec.scala +++ b/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/ClassDefinitionGeneratorSpec.scala @@ -396,7 +396,8 @@ class ClassDefinitionGeneratorSpec extends CompileCheckTestBase { useHeadTagForObjectNames = false, targetScala3 = false, jsonSerdeLib = JsonSerdeLib.Circe, - streamingImplementation = StreamingImplementation.FS2 + streamingImplementation = StreamingImplementation.FS2, + generateEndpointTypes = false ) .endpointDecls(None) } diff --git a/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/EndpointGeneratorSpec.scala b/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/EndpointGeneratorSpec.scala index 453ea55dab..c0f199ef31 100644 --- a/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/EndpointGeneratorSpec.scala +++ b/openapi-codegen/core/src/test/scala/sttp/tapir/codegen/EndpointGeneratorSpec.scala @@ -68,7 +68,8 @@ class EndpointGeneratorSpec extends CompileCheckTestBase { useHeadTagForObjectNames = false, targetScala3 = false, jsonSerdeLib = JsonSerdeLib.Circe, - streamingImplementation = StreamingImplementation.FS2 + streamingImplementation = StreamingImplementation.FS2, + generateEndpointTypes = false ) .endpointDecls(None) generatedCode should include("val getTestAsdId =") @@ -153,7 +154,8 @@ class EndpointGeneratorSpec extends CompileCheckTestBase { useHeadTagForObjectNames = false, targetScala3 = false, jsonSerdeLib = JsonSerdeLib.Circe, - streamingImplementation = StreamingImplementation.FS2 + streamingImplementation = StreamingImplementation.FS2, + generateEndpointTypes = false ) .endpointDecls(None) shouldCompile () } @@ -205,7 +207,8 @@ class EndpointGeneratorSpec extends CompileCheckTestBase { useHeadTagForObjectNames = false, targetScala3 = false, jsonSerdeLib = JsonSerdeLib.Circe, - streamingImplementation = StreamingImplementation.FS2 + streamingImplementation = StreamingImplementation.FS2, + generateEndpointTypes = false ) .endpointDecls(None) generatedCode should include( @@ -272,7 +275,8 @@ class EndpointGeneratorSpec extends CompileCheckTestBase { jsonSerdeLib = "circe", validateNonDiscriminatedOneOfs = true, maxSchemasPerFile = 400, - streamingImplementation = "fs2" + streamingImplementation = "fs2", + generateEndpointTypes = false )("TapirGeneratedEndpoints") generatedCode should include( """file: sttp.model.Part[java.io.File]""" @@ -294,7 +298,8 @@ class EndpointGeneratorSpec extends CompileCheckTestBase { jsonSerdeLib = "circe", validateNonDiscriminatedOneOfs = true, maxSchemasPerFile = 400, - streamingImplementation = "fs2" + streamingImplementation = "fs2", + generateEndpointTypes = false )("TapirGeneratedEndpoints") generatedCode shouldCompile () val expectedAttrDecls = Seq( diff --git a/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenKeys.scala b/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenKeys.scala index ba00d8a34e..510f5b8540 100644 --- a/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenKeys.scala +++ b/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenKeys.scala @@ -11,6 +11,7 @@ case class OpenApiConfiguration( streamingImplementation: String, validateNonDiscriminatedOneOfs: Boolean, maxSchemasPerFile: Int, + generateEndpointTypes: Boolean, additionalPackages: List[(String, File)] ) @@ -27,6 +28,7 @@ trait OpenapiCodegenKeys { lazy val openapiMaxSchemasPerFile = settingKey[Int]("Maximum number of schemas to generate for a single file") lazy val openapiAdditionalPackages = settingKey[List[(String, File)]]("Addition package -> spec mappings to generate.") lazy val openapiStreamingImplementation = settingKey[String]("Implementation for streamTextBody. Supports: akka, fs2, pekko, zio.") + lazy val openapiGenerateEndpointTypes = settingKey[Boolean]("Whether to emit explicit types for endpoint denfs") lazy val openapiOpenApiConfiguration = settingKey[OpenApiConfiguration]("Aggregation of other settings. Manually set value will be disregarded.") diff --git a/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenPlugin.scala b/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenPlugin.scala index 5f086617e1..16ebcb092b 100644 --- a/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenPlugin.scala +++ b/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenPlugin.scala @@ -32,6 +32,7 @@ object OpenapiCodegenPlugin extends AutoPlugin { openapiStreamingImplementation.value, openapiValidateNonDiscriminatedOneOfs.value, openapiMaxSchemasPerFile.value, + openapiGenerateEndpointTypes.value, openapiAdditionalPackages.value ) def openapiCodegenDefaultSettings: Seq[Setting[_]] = Seq( @@ -44,6 +45,7 @@ object OpenapiCodegenPlugin extends AutoPlugin { openapiMaxSchemasPerFile := 400, openapiAdditionalPackages := Nil, openapiStreamingImplementation := "fs2", + openapiGenerateEndpointTypes := false, standardParamSetting ) @@ -73,6 +75,7 @@ object OpenapiCodegenPlugin extends AutoPlugin { c.streamingImplementation, c.validateNonDiscriminatedOneOfs, c.maxSchemasPerFile, + c.generateEndpointTypes, srcDir, taskStreams.cacheDirectory, sv.startsWith("3"), diff --git a/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenTask.scala b/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenTask.scala index e689e3a09e..ea07a0a226 100644 --- a/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenTask.scala +++ b/openapi-codegen/sbt-plugin/src/main/scala/sttp/tapir/sbt/OpenapiCodegenTask.scala @@ -14,6 +14,7 @@ case class OpenapiCodegenTask( streamingImplementation: String, validateNonDiscriminatedOneOfs: Boolean, maxSchemasPerFile: Int, + generateEndpointTypes: Boolean, dir: File, cacheDir: File, targetScala3: Boolean, @@ -59,7 +60,8 @@ case class OpenapiCodegenTask( jsonSerdeLib, streamingImplementation, validateNonDiscriminatedOneOfs, - maxSchemasPerFile + maxSchemasPerFile, + generateEndpointTypes ) .map { case (objectName, fileBody) => val file = directory / s"$objectName.scala" diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/Expected.scala.txt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/Expected.scala.txt index 4b2c350770..98e8d347f2 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/Expected.scala.txt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/Expected.scala.txt @@ -44,7 +44,6 @@ object TapirGeneratedEndpoints { support.mapDecode(l => DecodeResult.Value(ExplodedValues(l)))(_.values) } - case class EnumExtraParamSupport[T <: enumeratum.EnumEntry](enumName: String, T: enumeratum.Enum[T]) extends ExtraParamSupport[T] { // Case-insensitive mapping def decode(s: String): sttp.tapir.DecodeResult[T] = @@ -63,9 +62,16 @@ object TapirGeneratedEndpoints { } def extraCodecSupport[T <: enumeratum.EnumEntry](enumName: String, T: enumeratum.Enum[T]): ExtraParamSupport[T] = EnumExtraParamSupport(enumName, T) + sealed trait Error sealed trait ADTWithoutDiscriminator sealed trait ADTWithDiscriminator sealed trait ADTWithDiscriminatorNoMapping + case class SimpleError ( + message: String + ) extends Error + case class NotFoundError ( + reason: String + ) extends Error case class SubtypeWithoutD1 ( s: String, i: Option[Int] = None, @@ -119,34 +125,39 @@ object TapirGeneratedEndpoints { - lazy val getBinaryTest = + type GetBinaryTestEndpoint = Endpoint[Unit, Unit, Unit, sttp.capabilities.pekko.PekkoStreams.BinaryStream, sttp.capabilities.pekko.PekkoStreams] + lazy val getBinaryTest: GetBinaryTestEndpoint = endpoint .get .in(("binary" / "test")) .out(streamBody(sttp.capabilities.pekko.PekkoStreams)(Schema.binary[Array[Byte]], CodecFormat.OctetStream()).description("Response CSV body")) - lazy val postBinaryTest = + type PostBinaryTestEndpoint = Endpoint[Unit, sttp.capabilities.pekko.PekkoStreams.BinaryStream, Unit, String, sttp.capabilities.pekko.PekkoStreams] + lazy val postBinaryTest: PostBinaryTestEndpoint = endpoint .post .in(("binary" / "test")) .in(streamBody(sttp.capabilities.pekko.PekkoStreams)(Schema.binary[Array[Byte]], CodecFormat.OctetStream())) .out(jsonBody[String].description("successful operation")) - lazy val putAdtTest = + type PutAdtTestEndpoint = Endpoint[Unit, ADTWithoutDiscriminator, Unit, ADTWithoutDiscriminator, Any] + lazy val putAdtTest: PutAdtTestEndpoint = endpoint .put .in(("adt" / "test")) .in(jsonBody[ADTWithoutDiscriminator]) .out(jsonBody[ADTWithoutDiscriminator].description("successful operation")) - lazy val postAdtTest = + type PostAdtTestEndpoint = Endpoint[Unit, ADTWithDiscriminatorNoMapping, Unit, ADTWithDiscriminator, Any] + lazy val postAdtTest: PostAdtTestEndpoint = endpoint .post .in(("adt" / "test")) .in(jsonBody[ADTWithDiscriminatorNoMapping]) .out(jsonBody[ADTWithDiscriminator].description("successful operation")) - lazy val postInlineEnumTest = + type PostInlineEnumTestEndpoint = Endpoint[Unit, (PostInlineEnumTestQueryEnum, Option[PostInlineEnumTestQueryOptEnum], List[PostInlineEnumTestQuerySeqEnum], Option[List[PostInlineEnumTestQueryOptSeqEnum]], ObjectWithInlineEnum), Unit, Unit, Any] + lazy val postInlineEnumTest: PostInlineEnumTestEndpoint = endpoint .post .in(("inline" / "enum" / "test")) @@ -197,7 +208,14 @@ object TapirGeneratedEndpoints { extraCodecSupport[PostInlineEnumTestQueryOptSeqEnum]("PostInlineEnumTestQueryOptSeqEnum", PostInlineEnumTestQueryOptSeqEnum) } + type GetOneofErrorTestEndpoint = Endpoint[Unit, Unit, Error, Unit, Any] + lazy val getOneofErrorTest: GetOneofErrorTestEndpoint = + endpoint + .get + .in(("oneof" / "error" / "test")) + .errorOut(oneOf[Error](oneOfVariant(sttp.model.StatusCode(404), jsonBody[NotFoundError].description("Not found")), oneOfVariant(sttp.model.StatusCode(400), jsonBody[SimpleError].description("Not found")))) + .out(statusCode(sttp.model.StatusCode(204)).description("No response")) - lazy val generatedEndpoints = List(getBinaryTest, postBinaryTest, putAdtTest, postAdtTest, postInlineEnumTest) + lazy val generatedEndpoints = List(getBinaryTest, postBinaryTest, putAdtTest, postAdtTest, postInlineEnumTest, getOneofErrorTest) } diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedJsonSerdes.scala.txt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedJsonSerdes.scala.txt index eff2439305..9013ccbdfc 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedJsonSerdes.scala.txt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedJsonSerdes.scala.txt @@ -16,6 +16,10 @@ object TapirGeneratedEndpointsJsonSerdes { } } yield res } + implicit lazy val simpleErrorJsonDecoder: io.circe.Decoder[SimpleError] = io.circe.generic.semiauto.deriveDecoder[SimpleError] + implicit lazy val simpleErrorJsonEncoder: io.circe.Encoder[SimpleError] = io.circe.generic.semiauto.deriveEncoder[SimpleError] + implicit lazy val notFoundErrorJsonDecoder: io.circe.Decoder[NotFoundError] = io.circe.generic.semiauto.deriveDecoder[NotFoundError] + implicit lazy val notFoundErrorJsonEncoder: io.circe.Encoder[NotFoundError] = io.circe.generic.semiauto.deriveEncoder[NotFoundError] implicit lazy val subtypeWithoutD1JsonDecoder: io.circe.Decoder[SubtypeWithoutD1] = io.circe.generic.semiauto.deriveDecoder[SubtypeWithoutD1] implicit lazy val subtypeWithoutD1JsonEncoder: io.circe.Encoder[SubtypeWithoutD1] = io.circe.generic.semiauto.deriveEncoder[SubtypeWithoutD1] implicit lazy val subtypeWithD1JsonDecoder: io.circe.Decoder[SubtypeWithD1] = io.circe.generic.semiauto.deriveDecoder[SubtypeWithD1] diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedSchemas.scala.txt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedSchemas.scala.txt index 90179526d3..f8a7ec11c4 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedSchemas.scala.txt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/ExpectedSchemas.scala.txt @@ -4,8 +4,10 @@ object TapirGeneratedEndpointsSchemas { import sttp.tapir.generated.TapirGeneratedEndpoints._ import sttp.tapir.generic.auto._ implicit lazy val anEnumTapirSchema: sttp.tapir.Schema[AnEnum] = sttp.tapir.Schema.derived + implicit lazy val notFoundErrorTapirSchema: sttp.tapir.Schema[NotFoundError] = sttp.tapir.Schema.derived implicit lazy val objectWithInlineEnumInlineEnumTapirSchema: sttp.tapir.Schema[ObjectWithInlineEnumInlineEnum] = sttp.tapir.Schema.derived implicit lazy val objectWithInlineEnumTapirSchema: sttp.tapir.Schema[ObjectWithInlineEnum] = sttp.tapir.Schema.derived + implicit lazy val simpleErrorTapirSchema: sttp.tapir.Schema[SimpleError] = sttp.tapir.Schema.derived implicit lazy val subtypeWithD1TapirSchema: sttp.tapir.Schema[SubtypeWithD1] = sttp.tapir.Schema.derived implicit lazy val subtypeWithD2TapirSchema: sttp.tapir.Schema[SubtypeWithD2] = sttp.tapir.Schema.derived implicit lazy val subtypeWithoutD1TapirSchema: sttp.tapir.Schema[SubtypeWithoutD1] = sttp.tapir.Schema.derived @@ -38,6 +40,7 @@ object TapirGeneratedEndpointsSchemas { case _ => throw new IllegalStateException("Derived schema for ADTWithDiscriminatorNoMapping should be a coproduct") } } + implicit lazy val errorTapirSchema: sttp.tapir.Schema[Error] = sttp.tapir.Schema.derived implicit lazy val subtypeWithoutD3TapirSchema: sttp.tapir.Schema[SubtypeWithoutD3] = sttp.tapir.Schema.derived implicit lazy val aDTWithoutDiscriminatorTapirSchema: sttp.tapir.Schema[ADTWithoutDiscriminator] = sttp.tapir.Schema.derived } diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt index 034a656e36..dd0e5c6bae 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/build.sbt @@ -3,7 +3,8 @@ lazy val root = (project in file(".")) .settings( scalaVersion := "2.13.15", version := "0.1", - openapiStreamingImplementation := "pekko" + openapiStreamingImplementation := "pekko", + openapiGenerateEndpointTypes := true ) libraryDependencies ++= Seq( diff --git a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/swagger.yaml b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/swagger.yaml index c380f44bd7..20b5b94910 100644 --- a/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/swagger.yaml +++ b/openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/swagger.yaml @@ -127,6 +127,24 @@ paths: application/json: schema: $ref: '#/components/schemas/ObjectWithInlineEnum' + '/oneof/error/test': + get: + responses: + "204": + description: "No response" + "404": + description: Not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + default: + description: Not found + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleError' + components: schemas: @@ -247,4 +265,26 @@ components: - foo1 - foo2 - foo3 - - foo4 \ No newline at end of file + - foo4 + Error: + title: Error + type: object + oneOf: + - $ref: '#/components/schemas/NotFoundError' + - $ref: '#/components/schemas/SimpleError' + NotFoundError: + title: NotFoundError + required: + - reason + type: object + properties: + reason: + type: string + SimpleError: + title: SimpleError + required: + - message + type: object + properties: + message: + type: string \ No newline at end of file