Skip to content

Commit 13ecf37

Browse files
authored
Fix multiple issues with docs in generating OpenAPI (#3132) (#3147)
1 parent 017d975 commit 13ecf37

File tree

4 files changed

+55
-17
lines changed

4 files changed

+55
-17
lines changed

zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,11 @@ object OpenAPIGenSpec extends ZIOSpecDefault {
251251
assertTrue(json == toJsonAst(expectedJson))
252252
},
253253
test("simple endpoint to OpenAPI") {
254-
val generated = OpenAPIGen.fromEndpoints("Simple Endpoint", "1.0", simpleEndpoint.tag("simple", "endpoint"))
254+
val generated = OpenAPIGen.fromEndpoints(
255+
"Simple Endpoint",
256+
"1.0",
257+
simpleEndpoint.tag("simple", "endpoint") ?? Doc.p("some extra doc"),
258+
)
255259
val json = toJsonAst(generated)
256260
val expectedJson = """{
257261
| "openapi" : "3.1.0",
@@ -261,7 +265,7 @@ object OpenAPIGenSpec extends ZIOSpecDefault {
261265
| },
262266
| "paths" : {
263267
| "/static/{id}/{uuid}/{name}" : {
264-
| "description" : "- simple\n- endpoint\n",
268+
| "description" : "some extra doc\n\n- simple\n- endpoint\n",
265269
| "get" : {
266270
| "tags" : [
267271
| "simple",

zio-http/shared/src/main/scala/zio/http/codec/Doc.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ sealed trait Doc { self =>
3131

3232
def +(that: Doc): Doc =
3333
(self, that) match {
34-
case (self, that) if self.isEmpty => that
35-
case (self, that) if that.isEmpty => self
36-
case _ => Doc.Sequence(self, that)
34+
case (self, that) if self.isEmpty => that
35+
case (self, that) if that.isEmpty => self
36+
case _ if tags.isEmpty && that.tags.isEmpty => Doc.Sequence(self, that)
37+
case _ => Doc.Sequence(self, that).tag(self.tags ++ that.tags)
3738
}
3839

3940
def isEmpty: Boolean =
@@ -148,7 +149,8 @@ sealed trait Doc { self =>
148149
case Doc.Raw(_, docType) =>
149150
throw new IllegalArgumentException(s"Unsupported raw doc type: $docType")
150151

151-
case Doc.Tagged(_, _) =>
152+
case Doc.Tagged(doc, _) =>
153+
render(doc, indent)
152154

153155
}
154156
}

zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPI.scala

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,48 @@ final case class OpenAPI(
9797
.groupBy(_._1)
9898
.map { case (path, pathItems) =>
9999
val pathItem = pathItems.map(_._2).reduce { (i, j) =>
100+
var docI = Doc.empty
101+
var docJ = Doc.empty
102+
var get = i.get
103+
var put = i.put
104+
var post = i.post
105+
var delete = i.delete
106+
var options = i.options
107+
var head = i.head
108+
var patch = i.patch
109+
var trace = i.trace
110+
111+
if (
112+
get.isDefined || put.isDefined || post.isDefined || delete.isDefined || options.isDefined || head.isDefined || patch.isDefined || trace.isDefined
113+
) {
114+
docI = i.description.getOrElse(Doc.empty)
115+
}
116+
if (
117+
(get.isEmpty && j.get.isDefined) || (put.isEmpty && j.put.isDefined) || (post.isEmpty && j.post.isDefined) || (delete.isEmpty && j.delete.isDefined) || (options.isEmpty && j.options.isDefined) || (head.isEmpty && j.head.isDefined) || (patch.isEmpty && j.patch.isDefined) || (trace.isEmpty && j.trace.isDefined)
118+
) {
119+
docJ = j.description.getOrElse(Doc.empty)
120+
}
121+
get = get.orElse(j.get)
122+
put = put.orElse(j.put)
123+
post = post.orElse(j.post)
124+
delete = delete.orElse(j.delete)
125+
options = options.orElse(j.options)
126+
head = head.orElse(j.head)
127+
patch = patch.orElse(j.patch)
128+
trace = trace.orElse(j.trace)
129+
100130
i.copy(
101-
get = i.get.orElse(j.get),
102-
put = i.put.orElse(j.put),
103-
post = i.post.orElse(j.post),
104-
delete = i.delete.orElse(j.delete),
105-
options = i.options.orElse(j.options),
106-
head = i.head.orElse(j.head),
107-
patch = i.patch.orElse(j.patch),
108-
trace = i.trace.orElse(j.trace),
131+
get = get,
132+
put = put,
133+
post = post,
134+
delete = delete,
135+
options = options,
136+
head = head,
137+
patch = patch,
138+
trace = trace,
139+
description = Some(docI + docJ).filter(!_.isEmpty),
140+
servers = i.servers ++ j.servers,
141+
parameters = i.parameters ++ j.parameters,
109142
)
110143
}
111144
(path, pathItem)

zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,7 @@ object OpenAPIGen {
538538
val path = buildPath(endpoint.input)
539539
val method0 = method(inAtoms.method)
540540
// Endpoint has only one doc. But open api has a summery and a description
541-
val pathItem = OpenAPI.PathItem.empty
542-
.copy(description = Some(endpoint.documentation + endpoint.input.doc.getOrElse(Doc.empty)).filter(!_.isEmpty))
541+
val pathItem = OpenAPI.PathItem.empty.copy(description = Some(endpoint.documentation).filter(!_.isEmpty))
543542
val pathItemWithOp = method0 match {
544543
case Method.OPTIONS => pathItem.addOptions(operation(endpoint))
545544
case Method.GET => pathItem.addGet(operation(endpoint))
@@ -581,7 +580,7 @@ object OpenAPIGen {
581580
}
582581

583582
def operation(endpoint: Endpoint[_, _, _, _, _]): OpenAPI.Operation = {
584-
val maybeDoc = Some(endpoint.documentation + pathDoc).filter(!_.isEmpty)
583+
val maybeDoc = Some(pathDoc).filter(!_.isEmpty)
585584
OpenAPI.Operation(
586585
tags = endpoint.tags,
587586
summary = None,

0 commit comments

Comments
 (0)