Skip to content

Commit df035fb

Browse files
committed
Micronaut OpenAPI 6.14.0
1 parent 465effd commit df035fb

File tree

12 files changed

+218
-36
lines changed

12 files changed

+218
-36
lines changed

buildSrc/src/main/groovy/io.micronaut.internal.build.starter-openapi-module.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def openApiProperties = tasks.register("openApiProperties", WriteProperties) {
1313
'swagger-ui.enabled': true,
1414
'redoc.enabled': true,
1515
'openapi-explorer.enabled': true,
16+
'scalar.enabled': true,
1617
'rapidoc.enabled': true,
1718
'rapidoc.bg-color': '#14191f',
1819
'rapidoc.text-color': '#aec2e0',

starter-core/src/main/java/io/micronaut/starter/feature/other/Redoc.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ public String getName() {
4141

4242
@Override
4343
public String getTitle() {
44-
return "Redoc View";
44+
return "ReDoc View";
4545
}
4646

4747
@Override
4848
public String getDescription() {
49-
return "Adds and enables Redoc view for OpenAPI";
49+
return "Adds and enables ReDoc view for OpenAPI";
5050
}
5151

5252
@Override
@@ -61,14 +61,14 @@ public String getMicronautDocumentation() {
6161

6262
@Override
6363
public List<StaticResource> staticResources() {
64-
List<StaticResource> result = new ArrayList<>(super.staticResources());
64+
var result = new ArrayList<>(super.staticResources());
6565
result.add(new StaticResource("redoc", "/redoc/**", "classpath:META-INF/swagger/views/redoc"));
6666
return result;
6767
}
6868

6969
@Override
7070
public List<InterceptUrlMap> interceptUrlMaps() {
71-
List<InterceptUrlMap> result = new ArrayList<>(super.interceptUrlMaps());
71+
var result = new ArrayList<>(super.interceptUrlMaps());
7272
result.add(InterceptUrlMap.anonymousAcccess("/redoc/**"));
7373
return result;
7474
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright 2017-2025 original authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.micronaut.starter.feature.other;
17+
18+
import io.micronaut.context.annotation.Requires;
19+
import io.micronaut.core.util.StringUtils;
20+
import io.micronaut.starter.feature.InterceptUrlMap;
21+
import io.micronaut.starter.feature.staticResources.ContributingStaticResources;
22+
import io.micronaut.starter.feature.staticResources.StaticResource;
23+
import jakarta.inject.Singleton;
24+
25+
import java.util.ArrayList;
26+
import java.util.List;
27+
28+
@Requires(property = "micronaut.starter.feature.scalar.enabled", value = StringUtils.TRUE, defaultValue = StringUtils.TRUE)
29+
@Singleton
30+
public class Scalar extends OpenApiView implements ContributingStaticResources {
31+
32+
public static final String NAME = "scalar";
33+
34+
public Scalar(OpenApi openApiFeature) {
35+
super(openApiFeature);
36+
}
37+
38+
@Override
39+
public String getName() {
40+
return NAME;
41+
}
42+
43+
@Override
44+
public String getTitle() {
45+
return "Scalar View";
46+
}
47+
48+
@Override
49+
public String getDescription() {
50+
return "Adds and enables Scalar view for OpenAPI";
51+
}
52+
53+
@Override
54+
public String getThirdPartyDocumentation() {
55+
return "https://github.com/scalar/scalar";
56+
}
57+
58+
@Override
59+
public String getMicronautDocumentation() {
60+
return "https://micronaut-projects.github.io/micronaut-openapi/latest/guide/#scalar";
61+
}
62+
63+
@Override
64+
public List<StaticResource> staticResources() {
65+
List<StaticResource> result = new ArrayList<>(super.staticResources());
66+
result.add(new StaticResource("scalar", "/scalar/**", "classpath:META-INF/swagger/views/scalar"));
67+
return result;
68+
}
69+
70+
@Override
71+
public List<InterceptUrlMap> interceptUrlMaps() {
72+
List<InterceptUrlMap> result = new ArrayList<>(super.interceptUrlMaps());
73+
result.add(InterceptUrlMap.anonymousAcccess("/scalar/**"));
74+
return result;
75+
}
76+
}

starter-core/src/main/java/io/micronaut/starter/feature/other/template/openApiProperties.rocker.raw

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Feature feature
55
[email protected]().equals("swagger-ui")
66
[email protected]().equals("redoc")
77
[email protected]().equals("openapi-explorer")
8+
[email protected]().equals("scalar")
89
[email protected]().equals("rapidoc")
910
rapidoc.bg-color=#14191f
1011
rapidoc.text-color=#aec2e0

starter-core/src/test/groovy/io/micronaut/starter/feature/FeatureDisabledSpec.groovy

+2
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ import io.micronaut.starter.feature.other.ProjectLombok
299299
import io.micronaut.starter.feature.other.RapiDoc
300300
import io.micronaut.starter.feature.other.Readme
301301
import io.micronaut.starter.feature.other.Redoc
302+
import io.micronaut.starter.feature.other.Scalar
302303
import io.micronaut.starter.feature.other.ShadePlugin
303304
import io.micronaut.starter.feature.other.SwaggerUI
304305
import io.micronaut.starter.feature.picocli.Picocli
@@ -675,6 +676,7 @@ class FeatureDisabledSpec extends Specification {
675676
'json-smart' | 'micronaut.starter.feature.json.smart.enabled' | JsonSmart
676677
'chatbots-telegram-azure-function' | 'micronaut.starter.feature.chatbots.telegram.azure.function.enabled' | TelegramAzureChatBot
677678
'openapi-explorer' | 'micronaut.starter.feature.openapi.explorer.enabled' | OpenApiExplorer
679+
'scalar' | 'micronaut.starter.feature.scalar.enabled' | Scalar
678680
'grpc' | 'micronaut.starter.feature.grpc.enabled' | Grpc
679681
'neo4j-bolt' | 'micronaut.starter.feature.neo4j.bolt.enabled' | Neo4jBolt
680682
'chatbots-basecamp-lambda' | 'micronaut.starter.feature.chatbots.basecamp.lambda.enabled' | BasecampAwsChatBot

starter-core/src/test/groovy/io/micronaut/starter/feature/other/OpenApiExplorerSpec.groovy

+10-8
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ class OpenApiExplorerSpec extends ApplicationContextSpec implements CommandOutpu
3030
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
3131
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
3232
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=true"
33-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
34-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
35-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
36-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
33+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
34+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
35+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
36+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
37+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
3738

3839
output.containsKey("src/main/java/example/micronaut/FooController.java")
3940
output.containsKey("src/test/java/example/micronaut/FooTest.java")
@@ -58,10 +59,11 @@ class OpenApiExplorerSpec extends ApplicationContextSpec implements CommandOutpu
5859
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
5960
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
6061
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=true"
61-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
62-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
63-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
64-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
62+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
63+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
64+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
65+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
66+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
6567

6668
output.containsKey("src/main/java/example/micronaut/FooController.java")
6769
output.containsKey("src/test/java/example/micronaut/FooTest.java")

starter-core/src/test/groovy/io/micronaut/starter/feature/other/RapiDocSpec.groovy

+10-8
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ class RapiDocSpec extends ApplicationContextSpec implements CommandOutputFixture
3030
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
3131
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
3232
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
33-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=true"
34-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
35-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
36-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
33+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
34+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=true"
35+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
36+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
37+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
3738

3839
output.containsKey("src/main/java/example/micronaut/FooController.java")
3940
output.containsKey("src/test/java/example/micronaut/FooTest.java")
@@ -59,10 +60,11 @@ class RapiDocSpec extends ApplicationContextSpec implements CommandOutputFixture
5960
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
6061
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
6162
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
62-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=true"
63-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
64-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
65-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
63+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
64+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=true"
65+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
66+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
67+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
6668

6769
output.containsKey("src/main/java/example/micronaut/FooController.java")
6870
output.containsKey("src/test/java/example/micronaut/FooTest.java")

starter-core/src/test/groovy/io/micronaut/starter/feature/other/RedocSpec.groovy

+10-8
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ class RedocSpec extends ApplicationContextSpec implements CommandOutputFixture {
3030
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
3131
output["openapi.properties"].readLines()[1] == "redoc.enabled=true"
3232
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
33-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
34-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
35-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
36-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
33+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
34+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
35+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
36+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
37+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
3738

3839
output.containsKey("src/main/java/example/micronaut/FooController.java")
3940
output.containsKey("src/test/java/example/micronaut/FooTest.java")
@@ -58,10 +59,11 @@ class RedocSpec extends ApplicationContextSpec implements CommandOutputFixture {
5859
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
5960
output["openapi.properties"].readLines()[1] == "redoc.enabled=true"
6061
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
61-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
62-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
63-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
64-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
62+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
63+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
64+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
65+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
66+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
6567

6668
output.containsKey("src/main/java/example/micronaut/FooController.java")
6769
output.containsKey("src/test/java/example/micronaut/FooTest.java")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package io.micronaut.starter.feature.other
2+
3+
import io.micronaut.starter.ApplicationContextSpec
4+
import io.micronaut.starter.application.ApplicationType
5+
import io.micronaut.starter.application.generator.GeneratorContext
6+
import io.micronaut.starter.feature.Features
7+
import io.micronaut.starter.fixture.CommandOutputFixture
8+
9+
class ScalarSpec extends ApplicationContextSpec implements CommandOutputFixture {
10+
11+
void "test scalar features"() {
12+
when:
13+
Features features = getFeatures(['scalar'])
14+
15+
then:
16+
features.contains("openapi")
17+
}
18+
19+
void "test config without security feature"() {
20+
when:
21+
GeneratorContext ctx = buildGeneratorContext(['scalar'])
22+
def output = generate(ApplicationType.DEFAULT, ctx)
23+
24+
then:
25+
ctx.configuration.get('micronaut.router.static-resources.swagger.paths') == "classpath:META-INF/swagger"
26+
ctx.configuration.get('micronaut.router.static-resources.swagger.mapping') == "/swagger/**"
27+
ctx.configuration.get('micronaut.router.static-resources.scalar.paths') == "classpath:META-INF/swagger/views/scalar"
28+
ctx.configuration.get('micronaut.router.static-resources.scalar.mapping') == "/scalar/**"
29+
30+
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
31+
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
32+
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
33+
output["openapi.properties"].readLines()[3] == "scalar.enabled=true"
34+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
35+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
36+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
37+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
38+
39+
output.containsKey("src/main/java/example/micronaut/FooController.java")
40+
output.containsKey("src/test/java/example/micronaut/FooTest.java")
41+
}
42+
43+
void "test config with security feature"() {
44+
when:
45+
GeneratorContext ctx = buildGeneratorContext(['scalar', 'security'])
46+
def output = generate(ApplicationType.DEFAULT, ctx)
47+
48+
then:
49+
ctx.configuration.get('micronaut.router.static-resources.swagger.paths') == "classpath:META-INF/swagger"
50+
ctx.configuration.get('micronaut.router.static-resources.swagger.mapping') == "/swagger/**"
51+
ctx.configuration.get('micronaut.router.static-resources.scalar.paths') == "classpath:META-INF/swagger/views/scalar"
52+
ctx.configuration.get('micronaut.router.static-resources.scalar.mapping') == "/scalar/**"
53+
54+
List<Map<String, String>> swaggerSec = ctx.configuration.get('micronaut.security.intercept-url-map') as List<Map<String, String>>
55+
56+
swaggerSec.any { it.access == "isAnonymous()" && it.pattern == "/swagger/**" }
57+
swaggerSec.any { it.access == "isAnonymous()" && it.pattern == "/scalar/**" }
58+
59+
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
60+
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
61+
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
62+
output["openapi.properties"].readLines()[3] == "scalar.enabled=true"
63+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
64+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
65+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
66+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
67+
68+
output.containsKey("src/main/java/example/micronaut/FooController.java")
69+
output.containsKey("src/test/java/example/micronaut/FooTest.java")
70+
71+
}
72+
73+
void "test scalar has third party docs"() {
74+
when:
75+
GeneratorContext ctx = buildGeneratorContext(['scalar'])
76+
def output = generate(ApplicationType.DEFAULT, ctx)
77+
78+
then:
79+
output["README.md"].contains("https://github.com/scalar/scalar")
80+
}
81+
82+
void "test scalar has Micronaut docs"() {
83+
when:
84+
GeneratorContext ctx = buildGeneratorContext(['scalar'])
85+
def output = generate(ApplicationType.DEFAULT, ctx)
86+
87+
then:
88+
output["README.md"].contains("https://micronaut-projects.github.io/micronaut-openapi/latest/guide/#scalar")
89+
}
90+
91+
}

starter-core/src/test/groovy/io/micronaut/starter/feature/other/SwaggerUISpec.groovy

+10-8
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ class SwaggerUISpec extends ApplicationContextSpec implements CommandOutputFixtu
3030
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=true"
3131
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
3232
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
33-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
34-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
35-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
36-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
33+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
34+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
35+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
36+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
37+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
3738

3839
output.containsKey("src/main/java/example/micronaut/FooController.java")
3940
output.containsKey("src/test/java/example/micronaut/FooTest.java")
@@ -58,10 +59,11 @@ class SwaggerUISpec extends ApplicationContextSpec implements CommandOutputFixtu
5859
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=true"
5960
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
6061
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
61-
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
62-
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
63-
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
64-
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
62+
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
63+
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
64+
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
65+
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
66+
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"
6567

6668
output.containsKey("src/main/java/example/micronaut/FooController.java")
6769
output.containsKey("src/test/java/example/micronaut/FooTest.java")

0 commit comments

Comments
 (0)