Skip to content

Commit 2842c43

Browse files
authored
feat: add support for contact object (ePages-de#208)
* feat: add support for contact object Closes ePages-de#88 * docs: add documentation on how to define contacts
1 parent 26cd0dd commit 2842c43

File tree

6 files changed

+56
-5
lines changed

6 files changed

+56
-5
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,10 @@ openapi3 {
483483
title = 'My API title'
484484
version = '1.0.1'
485485
format = 'yaml'
486+
contact = {
487+
name = 'John Doe'
488+
489+
}
486490
separatePublicApi = true
487491
outputFileNamePrefix = 'my-api-spec'
488492
oauth2SecuritySchemeDefinition = {

restdocs-api-spec-gradle-plugin/src/main/kotlin/com/epages/restdocs/apispec/gradle/OpenApi3Task.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.epages.restdocs.apispec.gradle
22

33
import com.epages.restdocs.apispec.model.ResourceModel
44
import com.epages.restdocs.apispec.openapi3.OpenApi3Generator
5+
import io.swagger.v3.oas.models.info.Contact
56
import io.swagger.v3.oas.models.servers.Server
67
import org.gradle.api.tasks.Input
78
import org.gradle.api.tasks.Optional
@@ -12,9 +13,14 @@ open class OpenApi3Task : OpenApiBaseTask() {
1213
@Optional
1314
var servers: List<Server> = listOf()
1415

16+
@Input
17+
@Optional
18+
var contact: Contact? = null
19+
1520
fun applyExtension(extension: OpenApi3Extension) {
1621
super.applyExtension(extension)
1722
servers = extension.servers
23+
contact = extension.contact
1824
}
1925

2026
override fun generateSpecification(resourceModels: List<ResourceModel>): String {
@@ -26,7 +32,8 @@ open class OpenApi3Task : OpenApiBaseTask() {
2632
tagDescriptions = tagDescriptions,
2733
version = apiVersion,
2834
oauth2SecuritySchemeDefinition = oauth2SecuritySchemeDefinition,
29-
format = format
35+
format = format,
36+
contact = contact
3037
)
3138
}
3239
}

restdocs-api-spec-gradle-plugin/src/main/kotlin/com/epages/restdocs/apispec/gradle/OpenApiExtension.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
55
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
66
import com.fasterxml.jackson.module.kotlin.readValue
77
import groovy.lang.Closure
8+
import io.swagger.v3.oas.models.info.Contact
89
import io.swagger.v3.oas.models.servers.Server
910
import org.gradle.api.Project
1011
import java.io.File
@@ -63,6 +64,7 @@ open class OpenApi3Extension(project: Project) : OpenApiBaseExtension(project) {
6364
override var outputFileNamePrefix = "openapi3"
6465

6566
private var _servers: List<Server> = mutableListOf(Server().apply { url = "http://localhost" })
67+
private var _contact: Contact? = null
6668

6769
val servers
6870
get() = _servers
@@ -79,6 +81,13 @@ open class OpenApi3Extension(project: Project) : OpenApiBaseExtension(project) {
7981
_servers = serversActions.map { project.configure(Server(), it) as Server }
8082
}
8183

84+
val contact
85+
get() = _contact
86+
87+
fun setContact(contact: Closure<Contact>) {
88+
_contact = project.configure(Contact(), contact) as Contact
89+
}
90+
8291
companion object {
8392
const val name = "openapi3"
8493
}

restdocs-api-spec-gradle-plugin/src/test/kotlin/com/epages/restdocs/apispec/gradle/RestdocsOpenApi3TaskTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ class RestdocsOpenApi3TaskTest : RestdocsOpenApiTaskTestBase() {
3737
thenSingleServerContainedInOutput()
3838
}
3939

40+
@Test
41+
fun `should run openapi task with contact`() {
42+
givenBuildFileWithOpenApiClosureWithContact()
43+
givenResourceSnippet()
44+
45+
whenPluginExecuted()
46+
47+
thenApiSpecTaskSuccessful()
48+
thenOutputFileFound()
49+
thenContactContainedInOutput()
50+
}
51+
4052
@Test
4153
fun `should run openapi task with single server string`() {
4254
givenBuildFileWithOpenApiClosureWithSingleServerString()
@@ -67,6 +79,12 @@ class RestdocsOpenApi3TaskTest : RestdocsOpenApiTaskTestBase() {
6779
}
6880
}
6981

82+
private fun thenContactContainedInOutput() {
83+
with(outputFileContext()) {
84+
then(read<String>("info.contact.name")).isEqualTo("Test Contact")
85+
}
86+
}
87+
7088
private fun thenHeaderWithDefaultValuesContainedInOutput() {
7189
with(outputFileContext()) {
7290
then(read<String>("paths./products/{id}.get.parameters[1].name")).isEqualTo("one")
@@ -86,6 +104,10 @@ class RestdocsOpenApi3TaskTest : RestdocsOpenApiTaskTestBase() {
86104
givenBuildFileWithOpenApiClosure("server", """{ url = 'http://some.api' }""")
87105
}
88106

107+
fun givenBuildFileWithOpenApiClosureWithContact() {
108+
givenBuildFileWithOpenApiClosure("contact", """{ name = 'Test Contact' }""")
109+
}
110+
89111
override fun givenBuildFileWithOpenApiClosure() {
90112
givenBuildFileWithOpenApiClosure(
91113
"servers",
@@ -136,6 +158,7 @@ class RestdocsOpenApi3TaskTest : RestdocsOpenApiTaskTestBase() {
136158
baseBuildFile() + """
137159
openapi3 {
138160
servers = [ { url = "http://some.api" } ]
161+
contact = { name = "Test Contact" }
139162
title = '$title'
140163
description = '$description'
141164
tagDescriptionsPropertiesFile = "tagDescriptions.yaml"

restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import io.swagger.v3.oas.models.PathItem
2323
import io.swagger.v3.oas.models.Paths
2424
import io.swagger.v3.oas.models.examples.Example
2525
import io.swagger.v3.oas.models.headers.Header
26+
import io.swagger.v3.oas.models.info.Contact
2627
import io.swagger.v3.oas.models.info.Info
2728
import io.swagger.v3.oas.models.media.BooleanSchema
2829
import io.swagger.v3.oas.models.media.Content
@@ -51,7 +52,8 @@ object OpenApi3Generator {
5152
description: String? = null,
5253
tagDescriptions: Map<String, String> = emptyMap(),
5354
version: String = "1.0.0",
54-
oauth2SecuritySchemeDefinition: Oauth2Configuration? = null
55+
oauth2SecuritySchemeDefinition: Oauth2Configuration? = null,
56+
contact: Contact? = null
5557
): OpenAPI {
5658
return OpenAPI().apply {
5759

@@ -60,6 +62,7 @@ object OpenApi3Generator {
6062
this.title = title
6163
this.description = description
6264
this.version = version
65+
this.contact = contact
6366
}
6467
this.tags(
6568
tagDescriptions.map {
@@ -86,7 +89,8 @@ object OpenApi3Generator {
8689
tagDescriptions: Map<String, String> = emptyMap(),
8790
version: String = "1.0.0",
8891
oauth2SecuritySchemeDefinition: Oauth2Configuration? = null,
89-
format: String
92+
format: String,
93+
contact: Contact? = null
9094
) =
9195
ApiSpecificationWriter.serialize(
9296
format,
@@ -97,7 +101,8 @@ object OpenApi3Generator {
97101
description = description,
98102
tagDescriptions = tagDescriptions,
99103
version = version,
100-
oauth2SecuritySchemeDefinition = oauth2SecuritySchemeDefinition
104+
oauth2SecuritySchemeDefinition = oauth2SecuritySchemeDefinition,
105+
contact = contact
101106
)
102107
)
103108

restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.jayway.jsonpath.JsonPath
1818
import com.jayway.jsonpath.Option
1919
import io.swagger.parser.OpenAPIParser
2020
import io.swagger.parser.models.ParseOptions
21+
import io.swagger.v3.oas.models.info.Contact
2122
import io.swagger.v3.oas.models.servers.Server
2223
import org.assertj.core.api.BDDAssertions.then
2324
import org.junit.jupiter.api.Test
@@ -518,6 +519,7 @@ class OpenApi3GeneratorTest {
518519
then(openApiJsonPathContext.read<String>("info.title")).isEqualTo("API")
519520
then(openApiJsonPathContext.read<String>("info.description")).isEqualTo("API Description")
520521
then(openApiJsonPathContext.read<String>("info.version")).isEqualTo("1.0.0")
522+
then(openApiJsonPathContext.read<String>("info.contact.name")).isEqualTo("Test Contact")
521523
}
522524

523525
private fun thenTagFieldsPresent() {
@@ -578,7 +580,8 @@ class OpenApi3GeneratorTest {
578580
),
579581
format = "json",
580582
description = "API Description",
581-
tagDescriptions = mapOf("tag1" to "tag1 description", "tag2" to "tag2 description")
583+
tagDescriptions = mapOf("tag1" to "tag1 description", "tag2" to "tag2 description"),
584+
contact = Contact().apply { name = "Test Contact" }
582585
)
583586

584587
println(openApiSpecJsonString)

0 commit comments

Comments
 (0)