Skip to content

Commit 0a85abe

Browse files
committed
Merge branch 'develop' into release
2 parents 7324a57 + 24dd129 commit 0a85abe

8 files changed

Lines changed: 50 additions & 63 deletions

File tree

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugins {
2-
kotlin("jvm") version "1.9.25"
2+
kotlin("jvm") version "2.0.21"
33
id("org.jetbrains.dokka") version "1.9.20" apply false
44
id("org.owasp.dependencycheck") version "8.2.1" apply false
55
id("io.gitlab.arturbosch.detekt") version "1.23.0" apply false
@@ -8,4 +8,4 @@ plugins {
88

99
repositories {
1010
mavenCentral()
11-
}
11+
}

gradle.properties

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ kotlin.code.style=official
33
# project id
44
projectGroupId=io.github.smiley4
55
projectArtifactIdBase=ktor-swagger-ui
6-
projectVersion=3.6.0
6+
projectVersion=4.0.0
77

88
# publishing information
99
projectNameBase=Ktor Swagger UI
@@ -16,12 +16,12 @@ projectDeveloperName=smiley4
1616
projectDeveloperUrl=https://github.com/SMILEY4
1717

1818
# dependency versions
19-
versionKtor=2.3.12
19+
versionKtor=3.0.0
2020
versionSwaggerUI=5.17.11
2121
versionSwaggerParser=2.1.22
2222
versionSchemaKenerator=1.5.0
2323
versionKotlinLogging=7.0.0
2424
versionKotest=5.8.0
25-
versionKotlinTest=1.9.25
25+
versionKotlinTest=2.0.21
2626
versionMockk=1.13.12
27-
versionLogback=1.5.6
27+
versionLogback=1.5.6

ktor-swagger-ui-examples/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ version = projectVersion
55

66
plugins {
77
kotlin("jvm")
8-
kotlin("plugin.serialization") version "1.9.25"
8+
kotlin("plugin.serialization") version "2.0.21"
99
}
1010

1111
repositories {
@@ -41,4 +41,4 @@ dependencies {
4141

4242
kotlin {
4343
jvmToolchain(11)
44-
}
44+
}

ktor-swagger-ui/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ dependencies {
3131
val versionMockk: String by project
3232

3333
implementation("io.ktor:ktor-server-core-jvm:$versionKtor")
34-
implementation("io.ktor:ktor-server-webjars:$versionKtor")
3534
implementation("io.ktor:ktor-server-auth:$versionKtor")
3635
implementation("io.ktor:ktor-server-resources:$versionKtor")
3736

ktor-swagger-ui/src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerPlugin.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.smiley4.ktorswaggerui
22

3+
import io.github.oshai.kotlinlogging.KotlinLogging
34
import io.github.smiley4.ktorswaggerui.builder.example.ExampleContext
45
import io.github.smiley4.ktorswaggerui.builder.example.ExampleContextImpl
56
import io.github.smiley4.ktorswaggerui.builder.openapi.ComponentsBuilder
@@ -29,21 +30,17 @@ import io.github.smiley4.ktorswaggerui.builder.route.RouteDocumentationMerger
2930
import io.github.smiley4.ktorswaggerui.builder.route.RouteMeta
3031
import io.github.smiley4.ktorswaggerui.builder.schema.SchemaContext
3132
import io.github.smiley4.ktorswaggerui.builder.schema.SchemaContextImpl
33+
import io.github.smiley4.ktorswaggerui.data.OutputFormat
3234
import io.github.smiley4.ktorswaggerui.data.PluginConfigData
3335
import io.github.smiley4.ktorswaggerui.dsl.config.PluginConfigDsl
3436
import io.github.smiley4.ktorswaggerui.routing.ApiSpec
3537
import io.ktor.server.application.Application
3638
import io.ktor.server.application.ApplicationStarted
3739
import io.ktor.server.application.createApplicationPlugin
3840
import io.ktor.server.application.hooks.MonitoringEvent
39-
import io.ktor.server.application.install
4041
import io.ktor.server.application.plugin
41-
import io.ktor.server.application.pluginOrNull
42-
import io.ktor.server.routing.Routing
43-
import io.ktor.server.webjars.Webjars
42+
import io.ktor.server.routing.RoutingRoot
4443
import io.swagger.v3.core.util.Json31
45-
import io.github.oshai.kotlinlogging.KotlinLogging
46-
import io.github.smiley4.ktorswaggerui.data.OutputFormat
4744
import io.swagger.v3.core.util.Yaml31
4845

4946
/**
@@ -59,10 +56,6 @@ val SwaggerUI = createApplicationPlugin(name = "SwaggerUI", createConfiguration
5956

6057
on(MonitoringEvent(ApplicationStarted)) { application ->
6158

62-
if (application.pluginOrNull(Webjars) == null) {
63-
application.install(Webjars)
64-
}
65-
6659
try {
6760
val routes = routes(application, config)
6861
ApiSpec.setAll(buildOpenApiSpecs(config, routes))
@@ -102,7 +95,7 @@ private fun buildOpenApiSpec(specName: String, pluginConfig: PluginConfigData, r
10295
}
10396
val openApi = builder(pluginConfig, schemaContext, exampleContext).build(routes)
10497
pluginConfig.postBuild?.let { it(openApi, specName) }
105-
when(pluginConfig.outputFormat) {
98+
when (pluginConfig.outputFormat) {
10699
OutputFormat.JSON -> Json31.pretty(openApi) to pluginConfig.outputFormat
107100
OutputFormat.YAML -> Yaml31.pretty(openApi) to pluginConfig.outputFormat
108101
}
@@ -114,11 +107,12 @@ private fun buildOpenApiSpec(specName: String, pluginConfig: PluginConfigData, r
114107

115108
private fun routes(application: Application, config: PluginConfigData): List<RouteMeta> {
116109
return RouteCollector(RouteDocumentationMerger())
117-
.collectRoutes({ application.plugin(Routing) }, config)
110+
.collectRoutes({ application.plugin(RoutingRoot) }, config)
118111
.map { it.copy(path = "${application.rootPath()}${it.path}") }
119112
.toList()
120113
}
121114

115+
122116
/**
123117
* fix [#97](https://github.com/SMILEY4/ktor-swagger-ui/pull/97)
124118
*

ktor-swagger-ui/src/main/kotlin/io/github/smiley4/ktorswaggerui/builder/route/RouteCollector.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import io.ktor.server.routing.HttpMethodRouteSelector
1010
import io.ktor.server.routing.OptionalParameterRouteSelector
1111
import io.ktor.server.routing.ParameterRouteSelector
1212
import io.ktor.server.routing.RootRouteSelector
13-
import io.ktor.server.routing.Route
1413
import io.ktor.server.routing.RouteSelector
14+
import io.ktor.server.routing.RoutingNode
1515
import io.ktor.server.routing.TrailingSlashRouteSelector
1616
import kotlin.reflect.full.isSubclassOf
1717

@@ -25,7 +25,7 @@ class RouteCollector(
2525
/**
2626
* Collect all routes from the given application
2727
*/
28-
fun collectRoutes(routeProvider: () -> Route, config: PluginConfigData): Sequence<RouteMeta> {
28+
fun collectRoutes(routeProvider: () -> RoutingNode, config: PluginConfigData): Sequence<RouteMeta> {
2929
return allRoutes(routeProvider())
3030
.asSequence()
3131
.map { route ->
@@ -42,7 +42,7 @@ class RouteCollector(
4242
}
4343

4444

45-
private fun getDocumentation(route: Route, base: OpenApiRoute): OpenApiRoute {
45+
private fun getDocumentation(route: RoutingNode, base: OpenApiRoute): OpenApiRoute {
4646
var documentation = base
4747
if (route.selector is DocumentedRouteSelector) {
4848
documentation = routeDocumentationMerger.merge(documentation, (route.selector as DocumentedRouteSelector).documentation)
@@ -55,13 +55,13 @@ class RouteCollector(
5555
}
5656

5757

58-
private fun getMethod(route: Route): HttpMethod {
58+
private fun getMethod(route: RoutingNode): HttpMethod {
5959
return (route.selector as HttpMethodRouteSelector).method
6060
}
6161

6262

6363
@Suppress("CyclomaticComplexMethod")
64-
private fun getPath(route: Route, config: PluginConfigData): String {
64+
private fun getPath(route: RoutingNode, config: PluginConfigData): String {
6565
val selector = route.selector
6666
return if (isIgnoredSelector(selector, config)) {
6767
route.parent?.let { getPath(it, config) } ?: ""
@@ -96,7 +96,7 @@ class RouteCollector(
9696
}
9797

9898

99-
private fun isProtected(route: Route): Boolean {
99+
private fun isProtected(route: RoutingNode): Boolean {
100100
return when (route.selector) {
101101
is AuthenticationRouteSelector -> true
102102
is TrailingSlashRouteSelector -> false
@@ -108,7 +108,7 @@ class RouteCollector(
108108
}
109109
}
110110

111-
private fun allRoutes(root: Route): List<Route> {
111+
private fun allRoutes(root: RoutingNode): List<RoutingNode> {
112112
return (listOf(root) + root.children.flatMap { allRoutes(it) })
113113
.filter { it.selector is HttpMethodRouteSelector }
114114
}

ktor-swagger-ui/src/main/kotlin/io/github/smiley4/ktorswaggerui/dsl/routing/DocumentedRouteSelector.kt

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package io.github.smiley4.ktorswaggerui.dsl.routing
22

33
import io.github.smiley4.ktorswaggerui.dsl.routes.OpenApiRoute
44
import io.ktor.http.HttpMethod
5-
import io.ktor.server.application.ApplicationCall
65
import io.ktor.server.routing.Route
76
import io.ktor.server.routing.RouteSelector
87
import io.ktor.server.routing.RouteSelectorEvaluation
@@ -16,9 +15,7 @@ import io.ktor.server.routing.patch
1615
import io.ktor.server.routing.post
1716
import io.ktor.server.routing.put
1817
import io.ktor.server.routing.route
19-
import io.ktor.util.KtorDsl
20-
import io.ktor.util.pipeline.PipelineContext
21-
import io.ktor.util.pipeline.PipelineInterceptor
18+
import io.ktor.utils.io.KtorDsl
2219

2320
class DocumentedRouteSelector(val documentation: OpenApiRoute) : RouteSelector() {
2421

@@ -29,7 +26,7 @@ class DocumentedRouteSelector(val documentation: OpenApiRoute) : RouteSelector()
2926
}
3027
}
3128

32-
override fun evaluate(context: RoutingResolveContext, segmentIndex: Int) = RouteSelectorEvaluation.Transparent
29+
override suspend fun evaluate(context: RoutingResolveContext, segmentIndex: Int) = RouteSelectorEvaluation.Transparent
3330

3431
override fun toString() = if (includeDocumentedRouteInRouteToString) super.toString() else ""
3532
}
@@ -94,14 +91,14 @@ fun Route.method(
9491
fun Route.get(
9592
path: String,
9693
builder: OpenApiRoute.() -> Unit = { },
97-
body: PipelineInterceptor<Unit, ApplicationCall>
94+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
9895
): Route {
9996
return documentation(builder) { get(path, body) }
10097
}
10198

10299
fun Route.get(
103100
builder: OpenApiRoute.() -> Unit = { },
104-
body: PipelineInterceptor<Unit, ApplicationCall>
101+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
105102
): Route {
106103
return documentation(builder) { get(body) }
107104
}
@@ -114,15 +111,15 @@ fun Route.get(
114111
fun Route.post(
115112
path: String,
116113
builder: OpenApiRoute.() -> Unit = { },
117-
body: PipelineInterceptor<Unit, ApplicationCall>
114+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
118115
): Route {
119116
return documentation(builder) { post(path, body) }
120117
}
121118

122119
@JvmName("postTyped")
123120
inline fun <reified R : Any> Route.post(
124121
noinline builder: OpenApiRoute.() -> Unit = { },
125-
crossinline body: suspend PipelineContext<Unit, ApplicationCall>.(R) -> Unit
122+
crossinline body: suspend io.ktor.server.routing.RoutingContext.(R) -> Unit
126123
): Route {
127124
return documentation(builder) { post(body) }
128125
}
@@ -131,15 +128,15 @@ inline fun <reified R : Any> Route.post(
131128
inline fun <reified R : Any> Route.post(
132129
path: String,
133130
noinline builder: OpenApiRoute.() -> Unit = { },
134-
crossinline body: suspend PipelineContext<Unit, ApplicationCall>.(R) -> Unit
131+
crossinline body: suspend io.ktor.server.routing.RoutingContext.(R) -> Unit
135132
): Route {
136133
return documentation(builder) { post(path, body) }
137134
}
138135

139136

140137
fun Route.post(
141138
builder: OpenApiRoute.() -> Unit = { },
142-
body: PipelineInterceptor<Unit, ApplicationCall>
139+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
143140
): Route {
144141
return documentation(builder) { post(body) }
145142
}
@@ -152,22 +149,22 @@ fun Route.post(
152149
fun Route.put(
153150
path: String,
154151
builder: OpenApiRoute.() -> Unit = { },
155-
body: PipelineInterceptor<Unit, ApplicationCall>
152+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
156153
): Route {
157154
return documentation(builder) { put(path, body) }
158155
}
159156

160157
fun Route.put(
161158
builder: OpenApiRoute.() -> Unit = { },
162-
body: PipelineInterceptor<Unit, ApplicationCall>
159+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
163160
): Route {
164161
return documentation(builder) { put(body) }
165162
}
166163

167164
@JvmName("putTyped")
168165
inline fun <reified R : Any> Route.put(
169166
noinline builder: OpenApiRoute.() -> Unit = { },
170-
crossinline body: suspend PipelineContext<Unit, ApplicationCall>.(R) -> Unit
167+
crossinline body: suspend io.ktor.server.routing.RoutingContext.(R) -> Unit
171168
): Route {
172169
return documentation(builder) { put(body) }
173170
}
@@ -176,7 +173,7 @@ inline fun <reified R : Any> Route.put(
176173
inline fun <reified R : Any> Route.put(
177174
path: String,
178175
noinline builder: OpenApiRoute.() -> Unit = { },
179-
crossinline body: suspend PipelineContext<Unit, ApplicationCall>.(R) -> Unit
176+
crossinline body: suspend io.ktor.server.routing.RoutingContext.(R) -> Unit
180177
): Route {
181178
return documentation(builder) { put(path, body) }
182179
}
@@ -189,14 +186,14 @@ inline fun <reified R : Any> Route.put(
189186
fun Route.delete(
190187
path: String,
191188
builder: OpenApiRoute.() -> Unit = { },
192-
body: PipelineInterceptor<Unit, ApplicationCall>
189+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
193190
): Route {
194191
return documentation(builder) { delete(path, body) }
195192
}
196193

197194
fun Route.delete(
198195
builder: OpenApiRoute.() -> Unit = { },
199-
body: PipelineInterceptor<Unit, ApplicationCall>
196+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
200197
): Route {
201198
return documentation(builder) { delete(body) }
202199
}
@@ -210,23 +207,23 @@ fun Route.delete(
210207
fun Route.patch(
211208
path: String,
212209
builder: OpenApiRoute.() -> Unit = { },
213-
body: PipelineInterceptor<Unit, ApplicationCall>
210+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
214211
): Route {
215212
return documentation(builder) { patch(path, body) }
216213
}
217214

218215
@KtorDsl
219216
fun Route.patch(
220217
builder: OpenApiRoute.() -> Unit = { },
221-
body: PipelineInterceptor<Unit, ApplicationCall>
218+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
222219
): Route {
223220
return documentation(builder) { patch(body) }
224221
}
225222

226223
@JvmName("patchTyped")
227224
inline fun <reified R : Any> Route.patch(
228225
noinline builder: OpenApiRoute.() -> Unit = { },
229-
crossinline body: suspend PipelineContext<Unit, ApplicationCall>.(R) -> Unit
226+
crossinline body: suspend io.ktor.server.routing.RoutingContext.(R) -> Unit
230227
): Route {
231228
return documentation(builder) { patch(body) }
232229

@@ -236,7 +233,7 @@ inline fun <reified R : Any> Route.patch(
236233
inline fun <reified R : Any> Route.patch(
237234
path: String,
238235
noinline builder: OpenApiRoute.() -> Unit = { },
239-
crossinline body: suspend PipelineContext<Unit, ApplicationCall>.(R) -> Unit
236+
crossinline body: suspend io.ktor.server.routing.RoutingContext.(R) -> Unit
240237
): Route {
241238
return documentation(builder) { patch(path, body) }
242239
}
@@ -249,14 +246,14 @@ inline fun <reified R : Any> Route.patch(
249246
fun Route.options(
250247
path: String,
251248
builder: OpenApiRoute.() -> Unit = { },
252-
body: PipelineInterceptor<Unit, ApplicationCall>
249+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
253250
): Route {
254251
return documentation(builder) { options(path, body) }
255252
}
256253

257254
fun Route.options(
258255
builder: OpenApiRoute.() -> Unit = { },
259-
body: PipelineInterceptor<Unit, ApplicationCall>
256+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
260257
): Route {
261258
return documentation(builder) { options(body) }
262259
}
@@ -269,14 +266,14 @@ fun Route.options(
269266
fun Route.head(
270267
path: String,
271268
builder: OpenApiRoute.() -> Unit = { },
272-
body: PipelineInterceptor<Unit, ApplicationCall>
269+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
273270
): Route {
274271
return documentation(builder) { head(path, body) }
275272
}
276273

277274
fun Route.head(
278275
builder: OpenApiRoute.() -> Unit = { },
279-
body: PipelineInterceptor<Unit, ApplicationCall>
276+
body: suspend io.ktor.server.routing.RoutingContext.() -> Unit
280277
): Route {
281278
return documentation(builder) { head(body) }
282279
}

0 commit comments

Comments
 (0)