Skip to content

Micronaut OpenAPI 6.15.0 #2706

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: 4.8.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ def openApiProperties = tasks.register("openApiProperties", WriteProperties) {
'swagger-ui.enabled': true,
'redoc.enabled': true,
'openapi-explorer.enabled': true,
'scalar.enabled': true,
'rapidoc.enabled': true,
'rapidoc.bg-color': '#14191f',
'rapidoc.text-color': '#aec2e0',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,14 @@ public String getMicronautDocumentation() {

@Override
public List<StaticResource> staticResources() {
List<StaticResource> result = new ArrayList<>(super.staticResources());
var result = new ArrayList<>(super.staticResources());
result.add(new StaticResource("openapi-explorer", "/openapi-explorer/**", "classpath:META-INF/swagger/views/openapi-explorer"));
return result;
}

@Override
public List<InterceptUrlMap> interceptUrlMaps() {
List<InterceptUrlMap> result = new ArrayList<>(super.interceptUrlMaps());
var result = new ArrayList<>(super.interceptUrlMaps());
result.add(InterceptUrlMap.anonymousAcccess("/openapi-explorer/**"));
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,14 @@ public String getMicronautDocumentation() {

@Override
public List<StaticResource> staticResources() {
List<StaticResource> result = new ArrayList<>(super.staticResources());
var result = new ArrayList<>(super.staticResources());
result.add(new StaticResource("rapidoc", "/rapidoc/**", "classpath:META-INF/swagger/views/rapidoc"));
return result;
}

@Override
public List<InterceptUrlMap> interceptUrlMaps() {
List<InterceptUrlMap> result = new ArrayList<>(super.interceptUrlMaps());
var result = new ArrayList<>(super.interceptUrlMaps());
result.add(InterceptUrlMap.anonymousAcccess("/rapidoc/**"));
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ public String getName() {

@Override
public String getTitle() {
return "Redoc View";
return "ReDoc View";
}

@Override
public String getDescription() {
return "Adds and enables Redoc view for OpenAPI";
return "Adds and enables ReDoc view for OpenAPI";
}

@Override
Expand All @@ -61,14 +61,14 @@ public String getMicronautDocumentation() {

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

@Override
public List<InterceptUrlMap> interceptUrlMaps() {
List<InterceptUrlMap> result = new ArrayList<>(super.interceptUrlMaps());
var result = new ArrayList<>(super.interceptUrlMaps());
result.add(InterceptUrlMap.anonymousAcccess("/redoc/**"));
return result;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright 2017-2025 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.starter.feature.other;

import io.micronaut.context.annotation.Requires;
import io.micronaut.core.util.StringUtils;
import io.micronaut.starter.feature.InterceptUrlMap;
import io.micronaut.starter.feature.staticResources.ContributingStaticResources;
import io.micronaut.starter.feature.staticResources.StaticResource;
import jakarta.inject.Singleton;

import java.util.ArrayList;
import java.util.List;

@Requires(property = "micronaut.starter.feature.scalar.enabled", value = StringUtils.TRUE, defaultValue = StringUtils.TRUE)
@Singleton
public class Scalar extends OpenApiView implements ContributingStaticResources {

public static final String NAME = "scalar";

public Scalar(OpenApi openApiFeature) {
super(openApiFeature);
}

@Override
public String getName() {
return NAME;
}

@Override
public String getTitle() {
return "Scalar View";
}

@Override
public String getDescription() {
return "Adds and enables Scalar view for OpenAPI";
}

@Override
public String getThirdPartyDocumentation() {
return "https://github.com/scalar/scalar";
}

@Override
public String getMicronautDocumentation() {
return "https://micronaut-projects.github.io/micronaut-openapi/latest/guide/#scalar";
}

@Override
public List<StaticResource> staticResources() {
var result = new ArrayList<>(super.staticResources());
result.add(new StaticResource("scalar", "/scalar/**", "classpath:META-INF/swagger/views/scalar"));
return result;
}

@Override
public List<InterceptUrlMap> interceptUrlMaps() {
var result = new ArrayList<>(super.interceptUrlMaps());
result.add(InterceptUrlMap.anonymousAcccess("/scalar/**"));
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,16 @@ public String getMicronautDocumentation() {
}

@Override
public List<InterceptUrlMap> interceptUrlMaps() {
List<InterceptUrlMap> result = new ArrayList<>(super.interceptUrlMaps());
result.add(InterceptUrlMap.anonymousAcccess("/swagger-ui/**"));
public List<StaticResource> staticResources() {
var result = new ArrayList<>(super.staticResources());
result.add(new StaticResource("swagger-ui", "/swagger-ui/**", "classpath:META-INF/swagger/views/swagger-ui"));
return result;
}

@Override
public List<StaticResource> staticResources() {
List<StaticResource> result = new ArrayList<>(super.staticResources());
result.add(new StaticResource("swagger-ui", "/swagger-ui/**", "classpath:META-INF/swagger/views/swagger-ui"));
public List<InterceptUrlMap> interceptUrlMaps() {
var result = new ArrayList<>(super.interceptUrlMaps());
result.add(InterceptUrlMap.anonymousAcccess("/swagger-ui/**"));
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Feature feature
[email protected]().equals("swagger-ui")
[email protected]().equals("redoc")
[email protected]().equals("openapi-explorer")
[email protected]().equals("scalar")
[email protected]().equals("rapidoc")
rapidoc.bg-color=#14191f
rapidoc.text-color=#aec2e0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ import io.micronaut.starter.feature.other.ProjectLombok
import io.micronaut.starter.feature.other.RapiDoc
import io.micronaut.starter.feature.other.Readme
import io.micronaut.starter.feature.other.Redoc
import io.micronaut.starter.feature.other.Scalar
import io.micronaut.starter.feature.other.ShadePlugin
import io.micronaut.starter.feature.other.SwaggerUI
import io.micronaut.starter.feature.picocli.Picocli
Expand Down Expand Up @@ -671,6 +672,7 @@ class FeatureDisabledSpec extends Specification {
'json-smart' | 'micronaut.starter.feature.json.smart.enabled' | JsonSmart
'chatbots-telegram-azure-function' | 'micronaut.starter.feature.chatbots.telegram.azure.function.enabled' | TelegramAzureChatBot
'openapi-explorer' | 'micronaut.starter.feature.openapi.explorer.enabled' | OpenApiExplorer
'scalar' | 'micronaut.starter.feature.scalar.enabled' | Scalar
'grpc' | 'micronaut.starter.feature.grpc.enabled' | Grpc
'neo4j-bolt' | 'micronaut.starter.feature.neo4j.bolt.enabled' | Neo4jBolt
'chatbots-basecamp-lambda' | 'micronaut.starter.feature.chatbots.basecamp.lambda.enabled' | BasecampAwsChatBot
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ class OpenApiExplorerSpec extends ApplicationContextSpec implements CommandOutpu
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=true"
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"

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

output.containsKey("src/main/java/example/micronaut/FooController.java")
output.containsKey("src/test/java/example/micronaut/FooTest.java")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ class RapiDocSpec extends ApplicationContextSpec implements CommandOutputFixture
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=true"
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=true"
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"

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

output.containsKey("src/main/java/example/micronaut/FooController.java")
output.containsKey("src/test/java/example/micronaut/FooTest.java")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ class RedocSpec extends ApplicationContextSpec implements CommandOutputFixture {
output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
output["openapi.properties"].readLines()[1] == "redoc.enabled=true"
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
output["openapi.properties"].readLines()[3] == "rapidoc.enabled=false"
output["openapi.properties"].readLines()[4] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[5] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[6] == "rapidoc.sort-endpoints-by=method"
output["openapi.properties"].readLines()[3] == "scalar.enabled=false"
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"

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

output.containsKey("src/main/java/example/micronaut/FooController.java")
output.containsKey("src/test/java/example/micronaut/FooTest.java")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package io.micronaut.starter.feature.other

import io.micronaut.starter.ApplicationContextSpec
import io.micronaut.starter.application.ApplicationType
import io.micronaut.starter.application.generator.GeneratorContext
import io.micronaut.starter.feature.Features
import io.micronaut.starter.fixture.CommandOutputFixture

class ScalarSpec extends ApplicationContextSpec implements CommandOutputFixture {

void "test scalar features"() {
when:
Features features = getFeatures(['scalar'])

then:
features.contains("openapi")
}

void "test config without security feature"() {
when:
GeneratorContext ctx = buildGeneratorContext(['scalar'])
def output = generate(ApplicationType.DEFAULT, ctx)

then:
ctx.configuration.get('micronaut.router.static-resources.swagger.paths') == "classpath:META-INF/swagger"
ctx.configuration.get('micronaut.router.static-resources.swagger.mapping') == "/swagger/**"
ctx.configuration.get('micronaut.router.static-resources.scalar.paths') == "classpath:META-INF/swagger/views/scalar"
ctx.configuration.get('micronaut.router.static-resources.scalar.mapping') == "/scalar/**"

output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
output["openapi.properties"].readLines()[3] == "scalar.enabled=true"
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"

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

void "test config with security feature"() {
when:
GeneratorContext ctx = buildGeneratorContext(['scalar', 'security'])
def output = generate(ApplicationType.DEFAULT, ctx)

then:
ctx.configuration.get('micronaut.router.static-resources.swagger.paths') == "classpath:META-INF/swagger"
ctx.configuration.get('micronaut.router.static-resources.swagger.mapping') == "/swagger/**"
ctx.configuration.get('micronaut.router.static-resources.scalar.paths') == "classpath:META-INF/swagger/views/scalar"
ctx.configuration.get('micronaut.router.static-resources.scalar.mapping') == "/scalar/**"

List<Map<String, String>> swaggerSec = ctx.configuration.get('micronaut.security.intercept-url-map') as List<Map<String, String>>

swaggerSec.any { it.access == "isAnonymous()" && it.pattern == "/swagger/**" }
swaggerSec.any { it.access == "isAnonymous()" && it.pattern == "/scalar/**" }

output["openapi.properties"].readLines()[0] == "swagger-ui.enabled=false"
output["openapi.properties"].readLines()[1] == "redoc.enabled=false"
output["openapi.properties"].readLines()[2] == "openapi-explorer.enabled=false"
output["openapi.properties"].readLines()[3] == "scalar.enabled=true"
output["openapi.properties"].readLines()[4] == "rapidoc.enabled=false"
output["openapi.properties"].readLines()[5] == "rapidoc.bg-color=#14191f"
output["openapi.properties"].readLines()[6] == "rapidoc.text-color=#aec2e0"
output["openapi.properties"].readLines()[7] == "rapidoc.sort-endpoints-by=method"

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

}

void "test scalar has third party docs"() {
when:
GeneratorContext ctx = buildGeneratorContext(['scalar'])
def output = generate(ApplicationType.DEFAULT, ctx)

then:
output["README.md"].contains("https://github.com/scalar/scalar")
}

void "test scalar has Micronaut docs"() {
when:
GeneratorContext ctx = buildGeneratorContext(['scalar'])
def output = generate(ApplicationType.DEFAULT, ctx)

then:
output["README.md"].contains("https://micronaut-projects.github.io/micronaut-openapi/latest/guide/#scalar")
}

}
Loading
Loading