Compare commits
1 Commits
v1.3.4
...
githubActi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb03267275 |
6
.github/workflows/gradle-build.yml
vendored
6
.github/workflows/gradle-build.yml
vendored
@@ -3,9 +3,9 @@
|
|||||||
name: Build
|
name: Build
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ 1.3.x ]
|
branches: [ master ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ 1.3.x ]
|
branches: [ master ]
|
||||||
jobs:
|
jobs:
|
||||||
validation:
|
validation:
|
||||||
name: "Gradle wrapper validation"
|
name: "Gradle wrapper validation"
|
||||||
@@ -71,7 +71,7 @@ jobs:
|
|||||||
dependencies-cache-enabled: true
|
dependencies-cache-enabled: true
|
||||||
configuration-cache-enabled: true
|
configuration-cache-enabled: true
|
||||||
- name: Publish to Sonatype
|
- name: Publish to Sonatype
|
||||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/1.3.x' }}
|
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
|
||||||
uses: eskatos/gradle-command-action@v1
|
uses: eskatos/gradle-command-action@v1
|
||||||
env:
|
env:
|
||||||
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USER }}
|
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USER }}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ image::swagger2markup-documentation/src/docs/asciidoc/images/Swagger2Markup.PNG[
|
|||||||
image::swagger2markup-documentation/src/docs/asciidoc/images/Swagger2Markup_definitions.PNG[]
|
image::swagger2markup-documentation/src/docs/asciidoc/images/Swagger2Markup_definitions.PNG[]
|
||||||
|
|
||||||
== Reference documentation
|
== Reference documentation
|
||||||
- http://swagger2markup.github.io/swagger2markup/1.3.4/[Reference Documentation]
|
- http://swagger2markup.github.io/swagger2markup/1.3.3/[Reference Documentation]
|
||||||
- https://github.com/Swagger2Markup/swagger2markup/blob/master/RELEASENOTES.adoc[Release notes]
|
- https://github.com/Swagger2Markup/swagger2markup/blob/master/RELEASENOTES.adoc[Release notes]
|
||||||
- https://github.com/Swagger2Markup/spring-swagger2markup-demo[Demo using Swagger2Markup, Spring Boot, Springfox and spring-restdocs]
|
- https://github.com/Swagger2Markup/spring-swagger2markup-demo[Demo using Swagger2Markup, Spring Boot, Springfox and spring-restdocs]
|
||||||
|
|
||||||
|
|||||||
@@ -163,10 +163,7 @@
|
|||||||
* PR #294: Examples always start with a newline if there is other content in the same cell
|
* PR #294: Examples always start with a newline if there is other content in the same cell
|
||||||
* PR 307: Include required parameters in example request
|
* PR 307: Include required parameters in example request
|
||||||
|
|
||||||
=== Version 1.3.4
|
=== Version 2.0.0
|
||||||
* Moved from bintray to Sonatype
|
* Added openapi2markup to support OpenAPI v3
|
||||||
* Introduced Github actions
|
* Issue #409: Fixed JSON response example
|
||||||
* Certain bug fixes
|
|
||||||
* Added support for MIME types with structured syntax suffixes (#410)
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
61
build.gradle
61
build.gradle
@@ -1,49 +1,55 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "org.sonarqube" version "2.7"
|
id "org.sonarqube" version "2.7"
|
||||||
|
id "com.jfrog.bintray" version "1.8.4"
|
||||||
id "me.champeau.gradle.jmh" version "0.4.8"
|
id "me.champeau.gradle.jmh" version "0.4.8"
|
||||||
id 'org.asciidoctor.convert' version '1.6.0'
|
id 'org.asciidoctor.convert' version '1.6.0'
|
||||||
|
id "com.jfrog.artifactory" version "4.9.5"
|
||||||
id "org.ajoberstar.github-pages" version "1.7.2"
|
id "org.ajoberstar.github-pages" version "1.7.2"
|
||||||
id "io.github.gradle-nexus.publish-plugin" version "1.1.0"
|
|
||||||
}
|
}
|
||||||
apply plugin: 'idea'
|
apply plugin: 'idea'
|
||||||
apply from: "${rootDir}/libraries.gradle"
|
apply from: "${rootDir}/libraries.gradle"
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
releaseVersion = '1.3.4'
|
releaseVersion = '1.3.3'
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
apply plugin: 'jacoco'
|
apply plugin: 'jacoco'
|
||||||
apply plugin: 'me.champeau.gradle.jmh'
|
apply plugin: 'me.champeau.gradle.jmh'
|
||||||
|
apply plugin: 'com.jfrog.artifactory'
|
||||||
|
|
||||||
version = '1.3.4'
|
version = '2.0.0-SNAPSHOT'
|
||||||
group 'io.github.swagger2markup'
|
group 'io.github.swagger2markup'
|
||||||
description = 'swagger2markup Build'
|
description = 'swagger2markup Build'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
name "OSS Snapshots"
|
||||||
|
url "https://oss.jfrog.org/artifactory/oss-snapshot-local"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//artifactoryPublish.skip = true // apply to all projects except the root
|
artifactoryPublish.skip = true // apply to all projects except the root
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
coreProjects = subprojects.findAll {
|
coreProjects = subprojects.findAll {
|
||||||
p -> !p.name.endsWith("-bom")
|
p -> !p.name.contains("documentation") && !p.name.endsWith("-bom")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
configure(project.coreProjects) {
|
configure(project.coreProjects) {
|
||||||
apply plugin: 'signing'
|
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
apply plugin: 'maven'
|
apply plugin: 'maven'
|
||||||
apply plugin: 'maven-publish'
|
apply plugin: 'maven-publish'
|
||||||
|
apply plugin: 'com.jfrog.bintray'
|
||||||
apply from: "${rootDir}/publishing.gradle"
|
apply from: "${rootDir}/publishing.gradle"
|
||||||
apply plugin: 'jacoco'
|
apply plugin: 'jacoco'
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
sourceCompatibility = "11"
|
sourceCompatibility = "1.8"
|
||||||
targetCompatibility = "11"
|
targetCompatibility = "1.8"
|
||||||
options.deprecation = true
|
options.deprecation = true
|
||||||
options.encoding = 'UTF-8'
|
options.encoding = 'UTF-8'
|
||||||
options.compilerArgs += ["-Xlint:unchecked", "-parameters"]
|
options.compilerArgs += ["-Xlint:unchecked", "-parameters"]
|
||||||
@@ -61,18 +67,10 @@ configure(project.coreProjects) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nexusPublishing {
|
|
||||||
repositories {
|
|
||||||
sonatype()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sonarqube {
|
sonarqube {
|
||||||
properties {
|
properties {
|
||||||
property "sonar.host.url", "https://sonarcloud.io"
|
|
||||||
property "sonar.organization", "swagger2markup"
|
|
||||||
property "sonar.projectName", "swagger2markup"
|
property "sonar.projectName", "swagger2markup"
|
||||||
property "sonar.projectKey", "Swagger2Markup_swagger2markup"
|
property "sonar.projectKey", "swagger2markup_swagger2markup"
|
||||||
property "sonar.links.homepage", "https://github.com/Swagger2Markup/swagger2markup"
|
property "sonar.links.homepage", "https://github.com/Swagger2Markup/swagger2markup"
|
||||||
property "sonar.links.ci", "https://travis-ci.org/Swagger2Markup/swagger2markup"
|
property "sonar.links.ci", "https://travis-ci.org/Swagger2Markup/swagger2markup"
|
||||||
property "sonar.links.scm", "https://github.com/Swagger2Markup/swagger2markup"
|
property "sonar.links.scm", "https://github.com/Swagger2Markup/swagger2markup"
|
||||||
@@ -112,6 +110,33 @@ subprojects {
|
|||||||
|
|
||||||
tasks.check.dependsOn tasks.jacocoTestReport
|
tasks.check.dependsOn tasks.jacocoTestReport
|
||||||
|
|
||||||
|
|
||||||
test {
|
test {
|
||||||
dependsOn(subprojects.test) // required by cobertura to aggregate report
|
dependsOn(subprojects.test) // required by cobertura to aggregate report
|
||||||
}
|
}
|
||||||
|
|
||||||
|
artifactory {
|
||||||
|
contextUrl = 'https://oss.jfrog.org'
|
||||||
|
resolve {
|
||||||
|
repository {
|
||||||
|
repoKey = 'libs-release'
|
||||||
|
maven = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
publish {
|
||||||
|
repository {
|
||||||
|
repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
|
||||||
|
//when using oss.jfrog.org the credentials are from Bintray. For local build we expect them to be found in
|
||||||
|
//~/.gradle/gradle.properties, otherwise to be set in the build server
|
||||||
|
username = project.hasProperty('bintrayUsername') ? project.bintrayUsername : System.getenv('BINTRAY_USER')
|
||||||
|
password = project.hasProperty('bintrayApiKey') ? project.bintrayApiKey : System.getenv('BINTRAY_KEY')
|
||||||
|
}
|
||||||
|
defaults {
|
||||||
|
publications('mavenJava')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.properties['https.proxyHost']) {
|
||||||
|
clientConfig.proxy.host = System.properties['https.proxyHost']
|
||||||
|
clientConfig.proxy.port = System.properties['https.proxyPort'].toInteger()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
34
openapi2markup/build.gradle
Normal file
34
openapi2markup/build.gradle
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
ext.moduleName="io.github.swagger2markup.openapi2markup"
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
configurations.all {
|
||||||
|
resolutionStrategy.force dependencyOverrides.commonsCodec
|
||||||
|
resolutionStrategy.force dependencyOverrides.commonsIO
|
||||||
|
resolutionStrategy.force dependencyOverrides.commonsLang3
|
||||||
|
resolutionStrategy.force dependencyOverrides.jnrConstants
|
||||||
|
resolutionStrategy.force dependencyOverrides.jnrEnxio
|
||||||
|
resolutionStrategy.force dependencyOverrides.jnrPosix
|
||||||
|
resolutionStrategy.force dependencyOverrides.jodaTime
|
||||||
|
resolutionStrategy.force dependencyOverrides.slf4j
|
||||||
|
resolutionStrategy.force dependencyOverrides.jacksonDatabind
|
||||||
|
resolutionStrategy.force dependencyOverrides.guava
|
||||||
|
resolutionStrategy.force dependencyOverrides.findBugs
|
||||||
|
resolutionStrategy.force dependencyOverrides.jaksonCore
|
||||||
|
resolutionStrategy.force dependencyOverrides.assertj
|
||||||
|
}
|
||||||
|
// implementation implLibraries.swaggerV2Converter
|
||||||
|
compile project(':swagger2markup-asciidoc')
|
||||||
|
compile project(':swagger2markup-core')
|
||||||
|
implementation implLibraries.asciiDocJApi
|
||||||
|
implementation implLibraries.commonsText
|
||||||
|
implementation implLibraries.commonsBeanUtils
|
||||||
|
implementation implLibraries.slf4j
|
||||||
|
implementation implLibraries.swaggerV3
|
||||||
|
implementation implLibraries.commonsCollections4
|
||||||
|
implementation implLibraries.commonsConf2
|
||||||
|
implementation implLibraries.vavr
|
||||||
|
testImplementation testLibraries.assertj
|
||||||
|
testImplementation testLibraries.assertjDiff
|
||||||
|
testImplementation testLibraries.junit
|
||||||
|
testImplementation testLibraries.logback
|
||||||
|
}
|
||||||
@@ -0,0 +1,378 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DocumentImpl;
|
||||||
|
import io.github.swagger2markup.config.OpenAPILabels;
|
||||||
|
import io.github.swagger2markup.config.builder.OpenAPI2MarkupConfigBuilder;
|
||||||
|
import io.github.swagger2markup.extension.OpenAPI2MarkupExtensionRegistry;
|
||||||
|
import io.github.swagger2markup.extension.builder.OpenAPI2MarkupExtensionRegistryBuilder;
|
||||||
|
import io.github.swagger2markup.internal.document.ComponentsDocument;
|
||||||
|
import io.github.swagger2markup.internal.document.OverviewDocument;
|
||||||
|
import io.github.swagger2markup.internal.document.PathsDocument;
|
||||||
|
import io.github.swagger2markup.internal.document.SecurityDocument;
|
||||||
|
import io.github.swagger2markup.utils.URIUtils;
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.parser.OpenAPIV3Parser;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
public class OpenAPI2MarkupConverter extends AbstractSchema2MarkupConverter<OpenAPI> {
|
||||||
|
private final OverviewDocument overviewDocument;
|
||||||
|
private final PathsDocument pathsDocument;
|
||||||
|
private final ComponentsDocument componentsDocument;
|
||||||
|
private final SecurityDocument securityDocument;
|
||||||
|
private final OpenAPIContext openAPIContext;
|
||||||
|
|
||||||
|
|
||||||
|
public OpenAPI2MarkupConverter(OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.openAPIContext = context;
|
||||||
|
this.overviewDocument = new OverviewDocument(context);
|
||||||
|
this.pathsDocument = new PathsDocument(context);
|
||||||
|
this.componentsDocument = new ComponentsDocument(context);
|
||||||
|
this.securityDocument = new SecurityDocument(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a OpenAPI2MarkupConverter.Builder from a URI.
|
||||||
|
*
|
||||||
|
* @param swaggerUri the URI
|
||||||
|
* @return a OpenAPI2MarkupConverter
|
||||||
|
*/
|
||||||
|
public static Builder from(URI swaggerUri) {
|
||||||
|
Validate.notNull(swaggerUri, "swaggerUri must not be null");
|
||||||
|
String scheme = swaggerUri.getScheme();
|
||||||
|
if (scheme != null && swaggerUri.getScheme().startsWith("http")) {
|
||||||
|
try {
|
||||||
|
return from(swaggerUri.toURL());
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
throw new RuntimeException("Failed to convert URI to URL", e);
|
||||||
|
}
|
||||||
|
} else if (scheme != null && swaggerUri.getScheme().startsWith("file")) {
|
||||||
|
return from(Paths.get(swaggerUri));
|
||||||
|
} else {
|
||||||
|
return from(URIUtils.convertUriWithoutSchemeToFileScheme(swaggerUri));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a OpenAPI2MarkupConverter.Builder using a remote URL.
|
||||||
|
*
|
||||||
|
* @param swaggerURL the remote URL
|
||||||
|
* @return a OpenAPI2MarkupConverter
|
||||||
|
*/
|
||||||
|
public static Builder from(URL swaggerURL) {
|
||||||
|
Validate.notNull(swaggerURL, "swaggerURL must not be null");
|
||||||
|
return new Builder(swaggerURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a OpenAPI2MarkupConverter.Builder using a local Path.
|
||||||
|
*
|
||||||
|
* @param swaggerPath the local Path
|
||||||
|
* @return a OpenAPI2MarkupConverter
|
||||||
|
*/
|
||||||
|
public static Builder from(Path swaggerPath) {
|
||||||
|
Validate.notNull(swaggerPath, "swaggerPath must not be null");
|
||||||
|
if (Files.notExists(swaggerPath)) {
|
||||||
|
throw new IllegalArgumentException(String.format("swaggerPath does not exist: %s", swaggerPath));
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (Files.isHidden(swaggerPath)) {
|
||||||
|
throw new IllegalArgumentException("swaggerPath must not be a hidden file");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed to check if swaggerPath is a hidden file", e);
|
||||||
|
}
|
||||||
|
return new Builder(swaggerPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a OpenAPI2MarkupConverter.Builder from a given Swagger model.
|
||||||
|
*
|
||||||
|
* @param openAPI the Swagger source.
|
||||||
|
* @return a OpenAPI2MarkupConverter
|
||||||
|
*/
|
||||||
|
public static Builder from(OpenAPI openAPI) {
|
||||||
|
Validate.notNull(openAPI, "schema must not be null");
|
||||||
|
return new Builder(openAPI);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a OpenAPI2MarkupConverter.Builder from a given Swagger YAML or JSON String.
|
||||||
|
*
|
||||||
|
* @param swaggerString the Swagger YAML or JSON String.
|
||||||
|
* @return a OpenAPI2MarkupConverter
|
||||||
|
*/
|
||||||
|
public static Builder from(String swaggerString) {
|
||||||
|
Validate.notEmpty(swaggerString, "swaggerString must not be null");
|
||||||
|
return from(new StringReader(swaggerString));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a OpenAPI2MarkupConverter.Builder from a given Swagger YAML or JSON reader.
|
||||||
|
*
|
||||||
|
* @param schemaReader the schema YAML or JSON reader.
|
||||||
|
* @return a OpenAPI2MarkupConverter
|
||||||
|
*/
|
||||||
|
public static Builder from(Reader schemaReader) {
|
||||||
|
Validate.notNull(schemaReader, "swaggerReader must not be null");
|
||||||
|
OpenAPI openAPI;
|
||||||
|
try {
|
||||||
|
//TODO
|
||||||
|
openAPI = new OpenAPIV3Parser().read(IOUtils.toString(schemaReader));
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Swagger source can not be parsed", e);
|
||||||
|
}
|
||||||
|
if (openAPI == null)
|
||||||
|
throw new IllegalArgumentException("Swagger source is in a wrong format");
|
||||||
|
|
||||||
|
return new Builder(openAPI);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toFolder(Path outputDirectory) {
|
||||||
|
Validate.notNull(outputDirectory, "outputDirectory must not be null");
|
||||||
|
openAPIContext.setOutputPath(outputDirectory);
|
||||||
|
writeToFile(applyOverviewDocument(), outputDirectory.resolve(openAPIContext.config.getOverviewDocument()));
|
||||||
|
writeToFile(applyPathsDocument(), outputDirectory.resolve(openAPIContext.config.getPathsDocument()));
|
||||||
|
writeToFile(applyComponentsDocument(), outputDirectory.resolve(openAPIContext.config.getDefinitionsDocument()));
|
||||||
|
writeToFile(applySecurityDocument(), outputDirectory.resolve(openAPIContext.config.getSecurityDocument()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toFile(Path outputFile) {
|
||||||
|
Validate.notNull(outputFile, "outputFile must not be null");
|
||||||
|
|
||||||
|
writeToFile(applyOverviewDocument(), outputFile);
|
||||||
|
writeToFile(applyPathsDocument(), outputFile);
|
||||||
|
writeToFile(applyComponentsDocument(), outputFile);
|
||||||
|
writeToFile(applySecurityDocument(), outputFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toFileWithoutExtension(Path outputFile) {
|
||||||
|
Validate.notNull(outputFile, "outputFile must not be null");
|
||||||
|
|
||||||
|
writeToFileWithoutExtension(applyOverviewDocument(), outputFile);
|
||||||
|
writeToFileWithoutExtension(applyPathsDocument(), outputFile);
|
||||||
|
writeToFileWithoutExtension(applyComponentsDocument(), outputFile);
|
||||||
|
writeToFileWithoutExtension(applySecurityDocument(), outputFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return applyOverviewDocument().convert() +
|
||||||
|
applyPathsDocument().convert() +
|
||||||
|
applyComponentsDocument().convert() +
|
||||||
|
applySecurityDocument().convert();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document applyOverviewDocument() {
|
||||||
|
return overviewDocument.apply(
|
||||||
|
openAPIContext.createDocument(),
|
||||||
|
OverviewDocument.parameters(openAPIContext.getSchema()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document applyPathsDocument() {
|
||||||
|
return pathsDocument.apply(
|
||||||
|
openAPIContext.createDocument(),
|
||||||
|
PathsDocument.parameters(openAPIContext.getSchema()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document applyComponentsDocument() {
|
||||||
|
return componentsDocument.apply(
|
||||||
|
openAPIContext.createDocument(),
|
||||||
|
ComponentsDocument.parameters(openAPIContext.getSchema().getComponents()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document applySecurityDocument() {
|
||||||
|
return securityDocument.apply(
|
||||||
|
openAPIContext.createDocument(),
|
||||||
|
SecurityDocument.parameters(openAPIContext.getSchema()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeToFile(Document document, Path path) {
|
||||||
|
MarkupLanguage markupLanguage = openAPIContext.config.getMarkupLanguage();
|
||||||
|
if (isMarkupLanguageSupported(markupLanguage)) {
|
||||||
|
String fileExtension = markupLanguage.getFileNameExtensions().get(0);
|
||||||
|
writeToFileWithoutExtension(document, path.resolveSibling(path.getFileName().toString() + fileExtension));
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Given Markup language '"+markupLanguage+"' is not supported by "+getClass().getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isMarkupLanguageSupported(MarkupLanguage markupLanguage) {
|
||||||
|
return markupLanguage == MarkupLanguage.ASCIIDOC;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeToFileWithoutExtension(Document document, Path file) {
|
||||||
|
if (file.getParent() != null) {
|
||||||
|
try {
|
||||||
|
Files.createDirectories(file.getParent());
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed create directory", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
|
||||||
|
writer.write(document.convert());
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed to write file", e);
|
||||||
|
}
|
||||||
|
if (logger.isInfoEnabled()) {
|
||||||
|
logger.info("Markup document written to: {}", file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class OpenAPIContext extends Context<OpenAPI> {
|
||||||
|
private OpenSchema2MarkupConfig config;
|
||||||
|
private OpenAPI2MarkupExtensionRegistry extensionRegistry;
|
||||||
|
|
||||||
|
public OpenAPIContext(OpenSchema2MarkupConfig config,
|
||||||
|
OpenAPI2MarkupExtensionRegistry extensionRegistry,
|
||||||
|
OpenAPI schema, URI swaggerLocation, Labels labels) {
|
||||||
|
super(config, extensionRegistry, schema, swaggerLocation, labels);
|
||||||
|
this.config = config;
|
||||||
|
this.extensionRegistry = extensionRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenSchema2MarkupConfig getConfig() {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenAPI2MarkupExtensionRegistry getExtensionRegistry() {
|
||||||
|
return extensionRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document createDocument() {
|
||||||
|
return new DocumentImpl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
private final OpenAPI openAPI;
|
||||||
|
private final URI schemaLocation;
|
||||||
|
private OpenSchema2MarkupConfig config;
|
||||||
|
private OpenAPI2MarkupExtensionRegistry extensionRegistry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Builder from a remote URL.
|
||||||
|
*
|
||||||
|
* @param schemaUrl the remote URL
|
||||||
|
*/
|
||||||
|
Builder(URL schemaUrl) {
|
||||||
|
try {
|
||||||
|
this.schemaLocation = schemaUrl.toURI();
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
throw new IllegalArgumentException("swaggerURL is in a wrong format", e);
|
||||||
|
}
|
||||||
|
this.openAPI = readSchema(schemaUrl.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Builder from a local Path.
|
||||||
|
*
|
||||||
|
* @param swaggerPath the local Path
|
||||||
|
*/
|
||||||
|
Builder(Path swaggerPath) {
|
||||||
|
this.schemaLocation = swaggerPath.toAbsolutePath().toUri();
|
||||||
|
this.openAPI = readSchema(swaggerPath.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Builder using a given Swagger model.
|
||||||
|
*
|
||||||
|
* @param openAPI the Swagger source.
|
||||||
|
*/
|
||||||
|
Builder(OpenAPI openAPI) {
|
||||||
|
this.openAPI = openAPI;
|
||||||
|
this.schemaLocation = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses the SwaggerParser to read the Swagger source.
|
||||||
|
*
|
||||||
|
* @param schemaLocation the location of the Swagger source
|
||||||
|
* @return the Swagger model
|
||||||
|
*/
|
||||||
|
private OpenAPI readSchema(String schemaLocation) {
|
||||||
|
OpenAPI openAPI = new OpenAPIV3Parser().read(schemaLocation);
|
||||||
|
if (openAPI == null) {
|
||||||
|
throw new IllegalArgumentException("Failed to read the schema");
|
||||||
|
}
|
||||||
|
return openAPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder withConfig(OpenSchema2MarkupConfig config) {
|
||||||
|
Validate.notNull(config, "config must not be null");
|
||||||
|
this.config = config;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder withExtensionRegistry(OpenAPI2MarkupExtensionRegistry registry) {
|
||||||
|
Validate.notNull(registry, "registry must not be null");
|
||||||
|
this.extensionRegistry = registry;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupConverter build() {
|
||||||
|
if (config == null)
|
||||||
|
config = new OpenAPI2MarkupConfigBuilder().build();
|
||||||
|
|
||||||
|
if (extensionRegistry == null)
|
||||||
|
extensionRegistry = new OpenAPI2MarkupExtensionRegistryBuilder().build();
|
||||||
|
OpenAPILabels openApiLabels = new OpenAPILabels(config);
|
||||||
|
OpenAPIContext context = new OpenAPIContext(config, extensionRegistry, openAPI, schemaLocation, openApiLabels);
|
||||||
|
|
||||||
|
initExtensions(context);
|
||||||
|
|
||||||
|
applySwaggerExtensions(context);
|
||||||
|
|
||||||
|
return new OpenAPI2MarkupConverter(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initExtensions(OpenAPIContext context) {
|
||||||
|
extensionRegistry.getSwaggerModelExtensions().forEach(extension -> extension.setGlobalContext(context));
|
||||||
|
extensionRegistry.getOverviewDocumentExtensions().forEach(extension -> extension.setGlobalContext(context));
|
||||||
|
extensionRegistry.getDefinitionsDocumentExtensions().forEach(extension -> extension.setGlobalContext(context));
|
||||||
|
extensionRegistry.getPathsDocumentExtensions().forEach(extension -> extension.setGlobalContext(context));
|
||||||
|
extensionRegistry.getSecurityDocumentExtensions().forEach(extension -> extension.setGlobalContext(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applySwaggerExtensions(OpenAPIContext context) {
|
||||||
|
extensionRegistry.getSwaggerModelExtensions().forEach(extension -> extension.apply(context.getSchema()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup;
|
||||||
|
|
||||||
|
import org.apache.commons.configuration2.Configuration;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class OpenAPI2MarkupProperties extends Schema2MarkupProperties {
|
||||||
|
|
||||||
|
public OpenAPI2MarkupProperties(Properties properties) {
|
||||||
|
super(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupProperties(Map<String, String> map) {
|
||||||
|
super(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupProperties(Configuration configuration) {
|
||||||
|
super(configuration);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package io.github.swagger2markup;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.config.builder.Schema2MarkupConfigBuilder;
|
||||||
|
|
||||||
|
public class OpenSchema2MarkupConfig extends Schema2MarkupConfigBuilder.DefaultSchema2MarkupConfig {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package io.github.swagger2markup.config;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.Labels;
|
||||||
|
import io.github.swagger2markup.OpenSchema2MarkupConfig;
|
||||||
|
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
public class OpenAPILabels extends Labels {
|
||||||
|
|
||||||
|
public static final String LABEL_CONTENT = "label_content";
|
||||||
|
public static final String LABEL_DEFAULT = "label_default";
|
||||||
|
public static final String LABEL_DEPRECATED = "label_deprecated";
|
||||||
|
public static final String LABEL_EXAMPLE = "label_example";
|
||||||
|
public static final String LABEL_EXAMPLES = "label_examples";
|
||||||
|
public static final String LABEL_EXCLUSIVE_MAXIMUM = "label_exclusive_maximum";
|
||||||
|
public static final String LABEL_EXCLUSIVE_MINIMUM = "label_exclusive_minimum";
|
||||||
|
public static final String LABEL_EXTERNAL_VALUE = "label_external_value";
|
||||||
|
public static final String LABEL_FORMAT = "label_format";
|
||||||
|
public static final String LABEL_MAXIMUM = "label_maximum";
|
||||||
|
public static final String LABEL_MAX_ITEMS = "label_max_items";
|
||||||
|
public static final String LABEL_MAX_LENGTH = "label_max_length";
|
||||||
|
public static final String LABEL_MAX_PROPERTIES = "label_max_properties";
|
||||||
|
public static final String LABEL_MINIMUM = "label_minimum";
|
||||||
|
public static final String LABEL_MIN_ITEMS = "label_min_items";
|
||||||
|
public static final String LABEL_MIN_LENGTH = "label_min_length";
|
||||||
|
public static final String LABEL_MIN_PROPERTIES = "label_min_properties";
|
||||||
|
public static final String LABEL_MULTIPLE_OF = "label_multiple_of";
|
||||||
|
public static final String LABEL_NO_LINKS = "label_no_links";
|
||||||
|
public static final String LABEL_NULLABLE = "label_nullable";
|
||||||
|
public static final String LABEL_OPERATION = "label_operation";
|
||||||
|
public static final String LABEL_OPTIONAL = "label_optional";
|
||||||
|
public static final String LABEL_PARAMETERS = "label_parameters";
|
||||||
|
public static final String LABEL_READ_ONLY = "label_read_only";
|
||||||
|
public static final String LABEL_REQUIRED = "label_required";
|
||||||
|
public static final String LABEL_SERVER = "label_server";
|
||||||
|
public static final String LABEL_TERMS_OF_SERVICE = "label_terms_of_service";
|
||||||
|
public static final String LABEL_TITLE = "label_title";
|
||||||
|
public static final String LABEL_TYPE = "label_type";
|
||||||
|
public static final String LABEL_UNIQUE_ITEMS = "label_unique_items";
|
||||||
|
public static final String LABEL_WRITE_ONLY = "label_write_only";
|
||||||
|
public static final String SECTION_TITLE_COMPONENTS = "section_title_components";
|
||||||
|
public static final String SECTION_TITLE_PARAMETERS = "section_title_parameters";
|
||||||
|
public static final String SECTION_TITLE_PATHS = "section_title_paths";
|
||||||
|
public static final String SECTION_TITLE_SCHEMAS = "section_title_schemas";
|
||||||
|
public static final String SECTION_TITLE_SECURITY = "section_title_security";
|
||||||
|
public static final String SECTION_TITLE_SERVERS = "section_title_servers";
|
||||||
|
public static final String SECTION_TITLE_OVERVIEW = "section_title_overview";
|
||||||
|
public static final String SECTION_TITLE_TAGS = "section_title_tags";
|
||||||
|
public static final String SECTION_TITLE_RESPONSES = "section_title_responses";
|
||||||
|
public static final String SECTION_TITLE_HEADERS = "section_title_headers";
|
||||||
|
public static final String SECTION_TITLE_LINKS = "section_title_links";
|
||||||
|
public static final String TABLE_HEADER_DEFAULT = "table_header_default";
|
||||||
|
public static final String TABLE_HEADER_DESCRIPTION = "table_header_description";
|
||||||
|
public static final String TABLE_HEADER_HTTP_CODE = "table_header_http_code";
|
||||||
|
public static final String TABLE_HEADER_LINKS = "table_header_links";
|
||||||
|
public static final String TABLE_HEADER_NAME = "table_header_name";
|
||||||
|
public static final String TABLE_HEADER_POSSIBLE_VALUES = "table_header_possible_values";
|
||||||
|
public static final String TABLE_HEADER_SCHEMA = "table_header_schema";
|
||||||
|
public static final String TABLE_HEADER_SCOPES = "table_header_scopes";
|
||||||
|
public static final String TABLE_HEADER_TYPE = "table_header_type";
|
||||||
|
public static final String TABLE_HEADER_VARIABLE = "table_header_variable";
|
||||||
|
public static final String TABLE_TITLE_HEADERS = "table_title_headers";
|
||||||
|
public static final String TABLE_TITLE_PARAMETERS = "table_title_parameters";
|
||||||
|
public static final String TABLE_TITLE_PROPERTIES = "table_title_properties";
|
||||||
|
public static final String TABLE_TITLE_RESPONSES = "table_title_responses";
|
||||||
|
public static final String TABLE_TITLE_SECURITY = "table_title_security";
|
||||||
|
public static final String TABLE_TITLE_SERVER_VARIABLES = "table_title_server_variables";
|
||||||
|
|
||||||
|
public OpenAPILabels(OpenSchema2MarkupConfig config) {
|
||||||
|
super(ResourceBundle.getBundle("io/github/swagger2markup/lang/labels", config.getLanguage().toLocale()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package io.github.swagger2markup.config.builder;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupProperties;
|
||||||
|
import io.github.swagger2markup.OpenSchema2MarkupConfig;
|
||||||
|
import org.apache.commons.configuration2.Configuration;
|
||||||
|
import org.apache.commons.configuration2.ConfigurationConverter;
|
||||||
|
import org.apache.commons.configuration2.MapConfiguration;
|
||||||
|
import org.apache.commons.configuration2.PropertiesConfiguration;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class OpenAPI2MarkupConfigBuilder extends Schema2MarkupConfigBuilder<OpenAPI2MarkupConfigBuilder, OpenSchema2MarkupConfig> {
|
||||||
|
|
||||||
|
public OpenAPI2MarkupConfigBuilder() {
|
||||||
|
this(new PropertiesConfiguration());
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupConfigBuilder(Properties properties) {
|
||||||
|
this(ConfigurationConverter.getConfiguration(properties));
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupConfigBuilder(Map<String, String> map) {
|
||||||
|
this(new MapConfiguration(map));
|
||||||
|
}
|
||||||
|
|
||||||
|
private OpenAPI2MarkupConfigBuilder(Configuration configuration) {
|
||||||
|
super(OpenAPI2MarkupConfigBuilder.class,
|
||||||
|
new OpenSchema2MarkupConfig(),
|
||||||
|
new OpenAPI2MarkupProperties(getCompositeConfiguration(configuration)), configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenSchema2MarkupConfig build() {
|
||||||
|
buildNaturalOrdering();
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter.OpenAPIContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract OpenAPI extension which must be extended by an other OpenAPI extensions
|
||||||
|
*/
|
||||||
|
abstract class AbstractExtension implements Extension {
|
||||||
|
|
||||||
|
protected OpenAPIContext globalContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global context lazy initialization
|
||||||
|
*
|
||||||
|
* @param globalContext Global context
|
||||||
|
*/
|
||||||
|
public void setGlobalContext(OpenAPIContext globalContext) {
|
||||||
|
this.globalContext = globalContext;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package io.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
|
||||||
|
public class ContentContext {
|
||||||
|
private Document document;
|
||||||
|
|
||||||
|
public ContentContext(Document document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import io.swagger.models.Model;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefinitionsDocumentExtension extension point can be used to extend the definitions document content.
|
||||||
|
*/
|
||||||
|
public abstract class DefinitionsDocumentExtension extends AbstractExtension {
|
||||||
|
|
||||||
|
|
||||||
|
public abstract void apply(Context context);
|
||||||
|
|
||||||
|
public enum Position {
|
||||||
|
DOCUMENT_BEFORE,
|
||||||
|
DOCUMENT_BEGIN,
|
||||||
|
DOCUMENT_END,
|
||||||
|
DOCUMENT_AFTER,
|
||||||
|
DEFINITION_BEFORE,
|
||||||
|
DEFINITION_BEGIN,
|
||||||
|
DEFINITION_END,
|
||||||
|
DEFINITION_AFTER
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Context extends ContentContext {
|
||||||
|
private Position position;
|
||||||
|
/**
|
||||||
|
* null if position == DOCUMENT_*
|
||||||
|
*/
|
||||||
|
private String definitionName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* null if position == DOCUMENT_*
|
||||||
|
*/
|
||||||
|
private Model model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param position the current position
|
||||||
|
* @param document document object
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document) {
|
||||||
|
super(document);
|
||||||
|
Validate.inclusiveBetween(Position.DOCUMENT_BEFORE, Position.DOCUMENT_AFTER, position);
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param position the current position
|
||||||
|
* @param document document object
|
||||||
|
* @param definitionName the name of the current definition
|
||||||
|
* @param model the current Model of the definition
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document, String definitionName, Model model) {
|
||||||
|
super(document);
|
||||||
|
Validate.inclusiveBetween(Position.DEFINITION_BEFORE, Position.DEFINITION_AFTER, position);
|
||||||
|
Validate.notNull(definitionName);
|
||||||
|
Validate.notNull(model);
|
||||||
|
this.position = position;
|
||||||
|
this.definitionName = definitionName;
|
||||||
|
this.model = model;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<String> getDefinitionName() {
|
||||||
|
return Optional.ofNullable(definitionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Model> getModel() {
|
||||||
|
return Optional.ofNullable(model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.OpenAPI2MarkupConverter.OpenAPIContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension interface which must be implemented by an OpenAPI extension
|
||||||
|
*/
|
||||||
|
interface Extension {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global context lazy initialization
|
||||||
|
*
|
||||||
|
* @param globalContext Global context
|
||||||
|
*/
|
||||||
|
void setGlobalContext(OpenAPIContext globalContext);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenSchema2MarkupConfig;
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.Labels;
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.vavr.Function2;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public abstract class MarkupComponent<D, T, R> implements Function2<D, T, R> {
|
||||||
|
|
||||||
|
protected Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
protected OpenAPI2MarkupConverter.Context<OpenAPI> context;
|
||||||
|
protected Labels labels;
|
||||||
|
protected OpenSchema2MarkupConfig config;
|
||||||
|
protected OpenAPI2MarkupExtensionRegistry extensionRegistry;
|
||||||
|
|
||||||
|
public MarkupComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
this.context = context;
|
||||||
|
this.config = context.getConfig();
|
||||||
|
this.extensionRegistry = context.getExtensionRegistry();
|
||||||
|
this.labels = context.getLabels();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension points registry interface.
|
||||||
|
*/
|
||||||
|
public interface OpenAPI2MarkupExtensionRegistry extends Schema2MarkupExtensionRegistry {
|
||||||
|
/**
|
||||||
|
* OpenAPIModelExtension extension point can be used to preprocess the Swagger model.
|
||||||
|
*
|
||||||
|
* @return registered extensions extending OpenAPIModelExtension extension point
|
||||||
|
*/
|
||||||
|
List<OpenAPIModelExtension> getSwaggerModelExtensions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OverviewDocumentExtension extension point can be used to extend the overview document content.
|
||||||
|
*
|
||||||
|
* @return registered extensions extending OverviewDocumentExtension extension point
|
||||||
|
*/
|
||||||
|
List<OverviewDocumentExtension> getOverviewDocumentExtensions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefinitionsDocumentExtension extension point can be used to extend the definitions document content.
|
||||||
|
*
|
||||||
|
* @return registered extensions extending DefinitionsDocumentExtension extension point
|
||||||
|
*/
|
||||||
|
List<DefinitionsDocumentExtension> getDefinitionsDocumentExtensions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SecurityContentExtension extension point can be used to extend the security document content.
|
||||||
|
*
|
||||||
|
* @return registered extensions extending SecurityContentExtension extension point
|
||||||
|
*/
|
||||||
|
List<SecurityDocumentExtension> getSecurityDocumentExtensions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PathsDocumentExtension extension point can be used to extend the paths document content.
|
||||||
|
*
|
||||||
|
* @return registered extensions extending PathsDocumentExtension extension point
|
||||||
|
*/
|
||||||
|
List<PathsDocumentExtension> getPathsDocumentExtensions();
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OpenAPIModelExtension extension point can be used to preprocess the Swagger model.
|
||||||
|
*/
|
||||||
|
public abstract class OpenAPIModelExtension extends AbstractExtension {
|
||||||
|
|
||||||
|
public abstract void apply(OpenAPI openAPI);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OverviewDocumentExtension extension point can be used to extend the overview document content.
|
||||||
|
*/
|
||||||
|
public abstract class OverviewDocumentExtension extends AbstractExtension {
|
||||||
|
|
||||||
|
public abstract void apply(Context context);
|
||||||
|
|
||||||
|
public enum Position {
|
||||||
|
DOCUMENT_BEFORE,
|
||||||
|
DOCUMENT_AFTER,
|
||||||
|
DOCUMENT_BEGIN,
|
||||||
|
DOCUMENT_END
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Context extends ContentContext {
|
||||||
|
private Position position;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param position the current position
|
||||||
|
* @param document document object
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document) {
|
||||||
|
super(document);
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.model.PathOperation;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PathsDocumentExtension extension point can be used to extend the paths document content.
|
||||||
|
*/
|
||||||
|
public abstract class PathsDocumentExtension extends AbstractExtension {
|
||||||
|
|
||||||
|
public abstract void apply(Context context);
|
||||||
|
|
||||||
|
public enum Position {
|
||||||
|
DOCUMENT_BEFORE,
|
||||||
|
DOCUMENT_BEGIN,
|
||||||
|
DOCUMENT_END,
|
||||||
|
DOCUMENT_AFTER,
|
||||||
|
OPERATION_BEFORE,
|
||||||
|
OPERATION_BEGIN,
|
||||||
|
OPERATION_END,
|
||||||
|
OPERATION_AFTER,
|
||||||
|
OPERATION_DESCRIPTION_BEFORE,
|
||||||
|
OPERATION_DESCRIPTION_BEGIN,
|
||||||
|
OPERATION_DESCRIPTION_END,
|
||||||
|
OPERATION_DESCRIPTION_AFTER,
|
||||||
|
OPERATION_PARAMETERS_BEFORE,
|
||||||
|
OPERATION_PARAMETERS_BEGIN,
|
||||||
|
OPERATION_PARAMETERS_END,
|
||||||
|
OPERATION_PARAMETERS_AFTER,
|
||||||
|
OPERATION_RESPONSES_BEFORE,
|
||||||
|
OPERATION_RESPONSES_BEGIN,
|
||||||
|
OPERATION_RESPONSES_END,
|
||||||
|
OPERATION_RESPONSES_AFTER,
|
||||||
|
OPERATION_SECURITY_BEFORE,
|
||||||
|
OPERATION_SECURITY_BEGIN,
|
||||||
|
OPERATION_SECURITY_END,
|
||||||
|
OPERATION_SECURITY_AFTER
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Context extends ContentContext {
|
||||||
|
private Position position;
|
||||||
|
/**
|
||||||
|
* null if position == DOCUMENT_*
|
||||||
|
*/
|
||||||
|
private PathOperation operation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Context for positions DOCUMENT_*
|
||||||
|
*
|
||||||
|
* @param position the current position
|
||||||
|
* @param document document object
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document) {
|
||||||
|
super(document);
|
||||||
|
Validate.inclusiveBetween(Position.DOCUMENT_BEFORE, Position.DOCUMENT_AFTER, position);
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Context for all other positions
|
||||||
|
*
|
||||||
|
* @param position the current position
|
||||||
|
* @param document document object
|
||||||
|
* @param operation the current path operation
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document, PathOperation operation) {
|
||||||
|
super(document);
|
||||||
|
Validate.inclusiveBetween(Position.OPERATION_BEFORE, Position.OPERATION_SECURITY_AFTER, position);
|
||||||
|
Validate.notNull(operation);
|
||||||
|
this.position = position;
|
||||||
|
this.operation = operation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<PathOperation> getOperation() {
|
||||||
|
return Optional.ofNullable(operation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension;
|
||||||
|
|
||||||
|
import io.swagger.models.auth.SecuritySchemeDefinition;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SecurityContentExtension extension point can be used to extend the security document content.
|
||||||
|
*/
|
||||||
|
public abstract class SecurityDocumentExtension extends AbstractExtension {
|
||||||
|
|
||||||
|
|
||||||
|
public abstract void apply(Context context);
|
||||||
|
|
||||||
|
public enum Position {
|
||||||
|
DOCUMENT_BEFORE,
|
||||||
|
DOCUMENT_BEGIN,
|
||||||
|
DOCUMENT_END,
|
||||||
|
DOCUMENT_AFTER,
|
||||||
|
SECURITY_SCHEME_BEFORE,
|
||||||
|
SECURITY_SCHEME_BEGIN,
|
||||||
|
SECURITY_SCHEME_END,
|
||||||
|
SECURITY_SCHEME_AFTER
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Context extends ContentContext {
|
||||||
|
private Position position;
|
||||||
|
/**
|
||||||
|
* null if position == DOCUMENT_*
|
||||||
|
*/
|
||||||
|
private String securitySchemeName;
|
||||||
|
/**
|
||||||
|
* null if position == DOCUMENT_*
|
||||||
|
*/
|
||||||
|
private SecuritySchemeDefinition securityScheme;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param position the current position
|
||||||
|
* @param document the MarkupDocBuilder
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document) {
|
||||||
|
super(document);
|
||||||
|
Validate.inclusiveBetween(Position.DOCUMENT_BEFORE, Position.DOCUMENT_AFTER, position);
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param position the current position
|
||||||
|
* @param document the MarkupDocBuilder
|
||||||
|
* @param securitySchemeName the name of the current securityScheme
|
||||||
|
* @param securityScheme the current security scheme securityScheme
|
||||||
|
*/
|
||||||
|
public Context(Position position, Document document, String securitySchemeName, SecuritySchemeDefinition securityScheme) {
|
||||||
|
super(document);
|
||||||
|
Validate.inclusiveBetween(Position.SECURITY_SCHEME_BEFORE, Position.SECURITY_SCHEME_AFTER, position);
|
||||||
|
Validate.notNull(securitySchemeName);
|
||||||
|
Validate.notNull(securityScheme);
|
||||||
|
this.position = position;
|
||||||
|
this.securitySchemeName = securitySchemeName;
|
||||||
|
this.securityScheme = securityScheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<String> getSecuritySchemeName() {
|
||||||
|
return Optional.ofNullable(securitySchemeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<SecuritySchemeDefinition> getSecurityScheme() {
|
||||||
|
return Optional.ofNullable(securityScheme);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.extension.builder;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.extension.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static java.util.ServiceLoader.load;
|
||||||
|
import static org.apache.commons.collections4.IteratorUtils.toList;
|
||||||
|
|
||||||
|
public class OpenAPI2MarkupExtensionRegistryBuilder {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistryBuilder() {
|
||||||
|
List<OpenAPIModelExtension> openAPIModelExtensions = toList(load(OpenAPIModelExtension.class).iterator());
|
||||||
|
List<OverviewDocumentExtension> overviewDocumentExtensions = toList(load(OverviewDocumentExtension.class).iterator());
|
||||||
|
List<DefinitionsDocumentExtension> definitionsDocumentExtensions = toList(load(DefinitionsDocumentExtension.class).iterator());
|
||||||
|
List<PathsDocumentExtension> pathsDocumentExtensions = toList(load(PathsDocumentExtension.class).iterator());
|
||||||
|
List<SecurityDocumentExtension> securityDocumentExtensions = toList(load(SecurityDocumentExtension.class).iterator());
|
||||||
|
context = new Context(
|
||||||
|
openAPIModelExtensions,
|
||||||
|
overviewDocumentExtensions,
|
||||||
|
definitionsDocumentExtensions,
|
||||||
|
pathsDocumentExtensions,
|
||||||
|
securityDocumentExtensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistry build() {
|
||||||
|
return new DefaultOpenAPI2MarkupExtensionRegistry(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistryBuilder withSwaggerModelExtension(OpenAPIModelExtension extension) {
|
||||||
|
context.openAPIModelExtensions.add(extension);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistryBuilder withOverviewDocumentExtension(OverviewDocumentExtension extension) {
|
||||||
|
context.overviewDocumentExtensions.add(extension);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistryBuilder withDefinitionsDocumentExtension(DefinitionsDocumentExtension extension) {
|
||||||
|
context.definitionsDocumentExtensions.add(extension);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistryBuilder withPathsDocumentExtension(PathsDocumentExtension extension) {
|
||||||
|
context.pathsDocumentExtensions.add(extension);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAPI2MarkupExtensionRegistryBuilder withSecurityDocumentExtension(SecurityDocumentExtension extension) {
|
||||||
|
context.securityDocumentExtensions.add(extension);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class DefaultOpenAPI2MarkupExtensionRegistry implements OpenAPI2MarkupExtensionRegistry {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
DefaultOpenAPI2MarkupExtensionRegistry(Context context) {
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<OpenAPIModelExtension> getSwaggerModelExtensions() {
|
||||||
|
return context.openAPIModelExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<OverviewDocumentExtension> getOverviewDocumentExtensions() {
|
||||||
|
return context.overviewDocumentExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DefinitionsDocumentExtension> getDefinitionsDocumentExtensions() {
|
||||||
|
return context.definitionsDocumentExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SecurityDocumentExtension> getSecurityDocumentExtensions() {
|
||||||
|
return context.securityDocumentExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PathsDocumentExtension> getPathsDocumentExtensions() {
|
||||||
|
return context.pathsDocumentExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Context {
|
||||||
|
final List<OpenAPIModelExtension> openAPIModelExtensions;
|
||||||
|
final List<OverviewDocumentExtension> overviewDocumentExtensions;
|
||||||
|
final List<DefinitionsDocumentExtension> definitionsDocumentExtensions;
|
||||||
|
final List<PathsDocumentExtension> pathsDocumentExtensions;
|
||||||
|
final List<SecurityDocumentExtension> securityDocumentExtensions;
|
||||||
|
|
||||||
|
Context(List<OpenAPIModelExtension> openAPIModelExtensions,
|
||||||
|
List<OverviewDocumentExtension> overviewDocumentExtensions,
|
||||||
|
List<DefinitionsDocumentExtension> definitionsDocumentExtensions,
|
||||||
|
List<PathsDocumentExtension> pathsDocumentExtensions,
|
||||||
|
List<SecurityDocumentExtension> securityDocumentExtensions) {
|
||||||
|
this.openAPIModelExtensions = openAPIModelExtensions;
|
||||||
|
this.overviewDocumentExtensions = overviewDocumentExtensions;
|
||||||
|
this.definitionsDocumentExtensions = definitionsDocumentExtensions;
|
||||||
|
this.pathsDocumentExtensions = pathsDocumentExtensions;
|
||||||
|
this.securityDocumentExtensions = securityDocumentExtensions;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListEntryImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ListItemImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.media.Encoding;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.LABEL_EXAMPLES;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.italicUnconstrained;
|
||||||
|
|
||||||
|
public class EncodingComponent extends MarkupComponent<StructuralNode, EncodingComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final HeadersComponent headersComponent;
|
||||||
|
|
||||||
|
public EncodingComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.headersComponent = new HeadersComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EncodingComponent.Parameters parameters(Map<String, Encoding> encodings) {
|
||||||
|
return new EncodingComponent.Parameters(encodings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode node, Map<String, Encoding> encodings) {
|
||||||
|
return apply(node, parameters(encodings));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, EncodingComponent.Parameters parameters) {
|
||||||
|
Map<String, Encoding> encodings = parameters.encodings;
|
||||||
|
if (encodings == null || encodings.isEmpty()) return node;
|
||||||
|
|
||||||
|
DescriptionListImpl encodingList = new DescriptionListImpl(node);
|
||||||
|
encodingList.setTitle(labels.getLabel(LABEL_EXAMPLES));
|
||||||
|
|
||||||
|
encodings.forEach((name, encoding) -> {
|
||||||
|
DescriptionListEntryImpl encodingEntry = new DescriptionListEntryImpl(encodingList, Collections.singletonList(new ListItemImpl(encodingList, name)));
|
||||||
|
ListItemImpl tagDesc = new ListItemImpl(encodingEntry, "");
|
||||||
|
ParagraphBlockImpl encodingBlock = new ParagraphBlockImpl(tagDesc);
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String contentType = encoding.getContentType();
|
||||||
|
if(StringUtils.isNotBlank(contentType)){
|
||||||
|
sb.append("Content-Type:").append(contentType).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
if(encoding.getAllowReserved()){
|
||||||
|
sb.append(italicUnconstrained("Allow Reserved").toLowerCase()).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
if(encoding.getExplode()){
|
||||||
|
sb.append(italicUnconstrained("Explode").toLowerCase()).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
Encoding.StyleEnum style = encoding.getStyle();
|
||||||
|
if(style != null){
|
||||||
|
sb.append("style").append(style).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
encodingBlock.setSource(sb.toString());
|
||||||
|
tagDesc.append(encodingBlock);
|
||||||
|
headersComponent.apply(tagDesc, encoding.getHeaders());
|
||||||
|
|
||||||
|
encodingEntry.setDescription(tagDesc);
|
||||||
|
|
||||||
|
encodingList.addEntry(encodingEntry);
|
||||||
|
});
|
||||||
|
node.append(encodingList);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Map<String, Encoding> encodings;
|
||||||
|
|
||||||
|
public Parameters(Map<String, Encoding> encodings) {
|
||||||
|
this.encodings = encodings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListEntryImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ListItemImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.examples.Example;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.LABEL_EXAMPLES;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.LABEL_EXTERNAL_VALUE;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.appendDescription;
|
||||||
|
|
||||||
|
public class ExamplesComponent extends MarkupComponent<StructuralNode, ExamplesComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final MediaTypeExampleComponent mediaTypeExampleComponent;
|
||||||
|
|
||||||
|
public ExamplesComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.mediaTypeExampleComponent = new MediaTypeExampleComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExamplesComponent.Parameters parameters(Map<String, Example> examples) {
|
||||||
|
return new ExamplesComponent.Parameters(examples);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode node, Map<String, Example> examples) {
|
||||||
|
return apply(node, parameters(examples));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, ExamplesComponent.Parameters parameters) {
|
||||||
|
Map<String, Example> examples = parameters.examples;
|
||||||
|
if (examples == null || examples.isEmpty()) return node;
|
||||||
|
|
||||||
|
DescriptionListImpl examplesList = new DescriptionListImpl(node);
|
||||||
|
examplesList.setTitle(labels.getLabel(LABEL_EXAMPLES));
|
||||||
|
|
||||||
|
examples.forEach((name, example) -> {
|
||||||
|
DescriptionListEntryImpl exampleEntry = new DescriptionListEntryImpl(examplesList, Collections.singletonList(new ListItemImpl(examplesList, name)));
|
||||||
|
ListItemImpl tagDesc = new ListItemImpl(exampleEntry, "");
|
||||||
|
|
||||||
|
ParagraphBlockImpl exampleBlock = new ParagraphBlockImpl(tagDesc);
|
||||||
|
|
||||||
|
appendDescription(exampleBlock, example.getSummary());
|
||||||
|
appendDescription(exampleBlock, example.getDescription());
|
||||||
|
mediaTypeExampleComponent.apply(tagDesc, example.getValue());
|
||||||
|
|
||||||
|
ParagraphBlockImpl paragraphBlock = new ParagraphBlockImpl(tagDesc);
|
||||||
|
String source = "";
|
||||||
|
generateRefLink(source, example.getExternalValue(), labels.getLabel(LABEL_EXTERNAL_VALUE));
|
||||||
|
generateRefLink(source, example.get$ref(), "");
|
||||||
|
if(StringUtils.isNotBlank(source)){
|
||||||
|
paragraphBlock.setSource(source);
|
||||||
|
tagDesc.append(paragraphBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleEntry.setDescription(tagDesc);
|
||||||
|
|
||||||
|
examplesList.addEntry(exampleEntry);
|
||||||
|
});
|
||||||
|
node.append(examplesList);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateRefLink(String source, String ref, String alt) {
|
||||||
|
if (StringUtils.isNotBlank(ref)) {
|
||||||
|
if (StringUtils.isBlank(alt)) {
|
||||||
|
alt = ref.substring(ref.lastIndexOf('/') + 1);
|
||||||
|
}
|
||||||
|
String anchor = ref.replaceFirst("#", "").replaceAll("/", "_");
|
||||||
|
source += "<<" + anchor + "," + alt + ">>" + LINE_SEPARATOR;
|
||||||
|
}
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Map<String, Example> examples;
|
||||||
|
|
||||||
|
public Parameters(Map<String, Example> examples) {
|
||||||
|
this.examples = examples;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.swagger.v3.oas.models.ExternalDocumentation;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.Block;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
|
||||||
|
public class ExternalDocumentationComponent extends MarkupComponent<StructuralNode, ExternalDocumentationComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
public ExternalDocumentationComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Parameters parameters(ExternalDocumentation externalDocs) {
|
||||||
|
return new Parameters(externalDocs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode node, ExternalDocumentation externalDocs) {
|
||||||
|
return apply(node, parameters(externalDocs));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, Parameters params) {
|
||||||
|
ExternalDocumentation externalDocs = params.externalDocs;
|
||||||
|
if (externalDocs == null) return node;
|
||||||
|
|
||||||
|
String url = externalDocs.getUrl();
|
||||||
|
if (StringUtils.isNotBlank(url)) {
|
||||||
|
Block paragraph = new ParagraphBlockImpl(node);
|
||||||
|
String desc = externalDocs.getDescription();
|
||||||
|
paragraph.setSource(url + (StringUtils.isNotBlank(desc) ? "[" + desc + "]" : ""));
|
||||||
|
node.append(paragraph);
|
||||||
|
}
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final ExternalDocumentation externalDocs;
|
||||||
|
|
||||||
|
public Parameters(ExternalDocumentation externalDocs) {
|
||||||
|
this.externalDocs = externalDocs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.TableImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.headers.Header;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.generateInnerDoc;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.getSchemaTypeAsString;
|
||||||
|
|
||||||
|
public class HeadersComponent extends MarkupComponent<StructuralNode, HeadersComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final SchemaComponent schemaComponent;
|
||||||
|
|
||||||
|
public HeadersComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.schemaComponent = new SchemaComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HeadersComponent.Parameters parameters(Map<String, Header> headers) {
|
||||||
|
return new HeadersComponent.Parameters(headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode node, Map<String, Header> headers) {
|
||||||
|
return apply(node, parameters(headers));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, HeadersComponent.Parameters parameters) {
|
||||||
|
Map<String, Header> headers = parameters.headers;
|
||||||
|
if (null == headers || headers.isEmpty()) return node;
|
||||||
|
|
||||||
|
TableImpl responseHeadersTable = new TableImpl(node, new HashMap<>(), new ArrayList<>());
|
||||||
|
responseHeadersTable.setOption("header");
|
||||||
|
responseHeadersTable.setAttribute("caption", "", true);
|
||||||
|
responseHeadersTable.setAttribute("cols", ".^2a,.^14a,.^4a", true);
|
||||||
|
responseHeadersTable.setTitle(labels.getLabel(TABLE_TITLE_HEADERS));
|
||||||
|
responseHeadersTable.setHeaderRow(labels.getLabel(TABLE_HEADER_NAME), labels.getLabel(TABLE_HEADER_DESCRIPTION), labels.getLabel(TABLE_HEADER_SCHEMA));
|
||||||
|
headers.forEach((name, header) ->
|
||||||
|
responseHeadersTable.addRow(
|
||||||
|
generateInnerDoc(responseHeadersTable, name),
|
||||||
|
generateInnerDoc(responseHeadersTable, Optional.ofNullable(header.getDescription()).orElse("")),
|
||||||
|
generateInnerDoc(responseHeadersTable, getSchemaTypeAsString(header.getSchema()))
|
||||||
|
));
|
||||||
|
node.append(responseHeadersTable);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Map<String, Header> headers;
|
||||||
|
|
||||||
|
public Parameters(Map<String, Header> headers) {
|
||||||
|
this.headers = headers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DocumentImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.links.Link;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.italicUnconstrained;
|
||||||
|
|
||||||
|
public class LinkComponent extends MarkupComponent<StructuralNode, LinkComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
public LinkComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LinkComponent.Parameters parameters(Map<String, Link> links) {
|
||||||
|
return new LinkComponent.Parameters(links);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document apply(StructuralNode parent, Map<String, Link> links) {
|
||||||
|
return apply(parent, parameters(links));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Document apply(StructuralNode parent, LinkComponent.Parameters parameters) {
|
||||||
|
DocumentImpl linksDocument = new DocumentImpl(parent);
|
||||||
|
ParagraphBlockImpl linkParagraph = new ParagraphBlockImpl(linksDocument);
|
||||||
|
|
||||||
|
Map<String, Link> links = parameters.links;
|
||||||
|
if (null == links || links.isEmpty()) {
|
||||||
|
linkParagraph.setSource(labels.getLabel(LABEL_NO_LINKS));
|
||||||
|
} else {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
links.forEach((name, link) -> {
|
||||||
|
sb.append(name).append(" +").append(LINE_SEPARATOR);
|
||||||
|
sb.append(italicUnconstrained(labels.getLabel(LABEL_OPERATION))).append(' ')
|
||||||
|
.append(italicUnconstrained(link.getOperationId())).append(" +").append(LINE_SEPARATOR);
|
||||||
|
Map<String, String> linkParameters = link.getParameters();
|
||||||
|
if (null != linkParameters && !linkParameters.isEmpty()) {
|
||||||
|
sb.append(italicUnconstrained(labels.getLabel(LABEL_PARAMETERS))).append(" {").append(" +").append(LINE_SEPARATOR);
|
||||||
|
linkParameters.forEach((param, value) ->
|
||||||
|
sb.append('"').append(param).append("\": \"").append(value).append('"').append(" +").append(LINE_SEPARATOR)
|
||||||
|
);
|
||||||
|
sb.append('}').append(" +").append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
linkParagraph.setSource(sb.toString());
|
||||||
|
}
|
||||||
|
linksDocument.append(linkParagraph);
|
||||||
|
return linksDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final Map<String, Link> links;
|
||||||
|
|
||||||
|
public Parameters(Map<String, Link> links) {
|
||||||
|
this.links = links;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListEntryImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ListItemImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.media.Content;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.LABEL_CONTENT;
|
||||||
|
|
||||||
|
public class MediaContentComponent extends MarkupComponent<StructuralNode, MediaContentComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final MediaTypeExampleComponent mediaTypeExampleComponent;
|
||||||
|
private final ExamplesComponent examplesComponent;
|
||||||
|
private final SchemaComponent schemaComponent;
|
||||||
|
private final EncodingComponent encodingComponent;
|
||||||
|
|
||||||
|
public MediaContentComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.mediaTypeExampleComponent = new MediaTypeExampleComponent(context);
|
||||||
|
this.examplesComponent = new ExamplesComponent(context);
|
||||||
|
this.schemaComponent = new SchemaComponent(context);
|
||||||
|
this.encodingComponent = new EncodingComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MediaContentComponent.Parameters parameters(Content content) {
|
||||||
|
return new MediaContentComponent.Parameters(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode node, Content content) {
|
||||||
|
return apply(node, parameters(content));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, MediaContentComponent.Parameters parameters) {
|
||||||
|
Content content = parameters.content;
|
||||||
|
if (content == null || content.isEmpty()) return node;
|
||||||
|
|
||||||
|
DescriptionListImpl mediaContentList = new DescriptionListImpl(node);
|
||||||
|
mediaContentList.setTitle(labels.getLabel(LABEL_CONTENT));
|
||||||
|
|
||||||
|
content.forEach((type, mediaType) -> {
|
||||||
|
DescriptionListEntryImpl tagEntry = new DescriptionListEntryImpl(mediaContentList, Collections.singletonList(new ListItemImpl(mediaContentList, type)));
|
||||||
|
ListItemImpl tagDesc = new ListItemImpl(tagEntry, "");
|
||||||
|
|
||||||
|
Document tagDescDocument = schemaComponent.apply(mediaContentList, mediaType.getSchema());
|
||||||
|
mediaTypeExampleComponent.apply(tagDescDocument, mediaType.getExample());
|
||||||
|
examplesComponent.apply(tagDescDocument, mediaType.getExamples());
|
||||||
|
encodingComponent.apply(tagDescDocument, mediaType.getEncoding());
|
||||||
|
tagDesc.append(tagDescDocument);
|
||||||
|
|
||||||
|
tagEntry.setDescription(tagDesc);
|
||||||
|
mediaContentList.addEntry(tagEntry);
|
||||||
|
});
|
||||||
|
node.append(mediaContentList);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Content content;
|
||||||
|
|
||||||
|
public Parameters(Content content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.DELIMITER_BLOCK;
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.LABEL_EXAMPLE;
|
||||||
|
|
||||||
|
public class MediaTypeExampleComponent extends MarkupComponent<StructuralNode, MediaTypeExampleComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
public MediaTypeExampleComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MediaTypeExampleComponent.Parameters parameters(Object example) {
|
||||||
|
return new MediaTypeExampleComponent.Parameters(example);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode node, Object example) {
|
||||||
|
return apply(node, parameters(example));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, MediaTypeExampleComponent.Parameters parameters) {
|
||||||
|
Object example = parameters.example;
|
||||||
|
if (example == null || StringUtils.isBlank(example.toString())) return node;
|
||||||
|
|
||||||
|
ParagraphBlockImpl sourceBlock = new ParagraphBlockImpl(node);
|
||||||
|
sourceBlock.setTitle(labels.getLabel(LABEL_EXAMPLE));
|
||||||
|
sourceBlock.setAttribute("style", "source", true);
|
||||||
|
sourceBlock.setSource(DELIMITER_BLOCK + LINE_SEPARATOR + example + LINE_SEPARATOR + DELIMITER_BLOCK);
|
||||||
|
node.append(sourceBlock);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Object example;
|
||||||
|
|
||||||
|
public Parameters(Object example) {
|
||||||
|
this.example = example;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.TableImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.parameters.Parameter;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
import org.asciidoctor.ast.Table;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.*;
|
||||||
|
|
||||||
|
public class ParametersComponent extends MarkupComponent<StructuralNode, ParametersComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final SchemaComponent schemaComponent;
|
||||||
|
|
||||||
|
public ParametersComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.schemaComponent = new SchemaComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParametersComponent.Parameters parameters(Map<String, Parameter> parameters) {
|
||||||
|
return new ParametersComponent.Parameters(parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParametersComponent.Parameters parameters(List<Parameter> parameters) {
|
||||||
|
if(null == parameters) {
|
||||||
|
return new ParametersComponent.Parameters(new HashMap<>());
|
||||||
|
}
|
||||||
|
return new ParametersComponent.Parameters(parameters.stream().collect(Collectors.toMap(Parameter::getName, parameter -> parameter)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode parent, List<Parameter> params) {
|
||||||
|
return apply(parent, parameters(params));
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode parent, Map<String, Parameter> params) {
|
||||||
|
return apply(parent, parameters(params));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode parent, ParametersComponent.Parameters componentParameters) {
|
||||||
|
Map<String, Parameter> parameters = componentParameters.parameters;
|
||||||
|
if (null == parameters || parameters.isEmpty()) return parent;
|
||||||
|
|
||||||
|
TableImpl pathParametersTable = new TableImpl(parent, new HashMap<>(), new ArrayList<>());
|
||||||
|
pathParametersTable.setOption("header");
|
||||||
|
pathParametersTable.setAttribute("caption", "", true);
|
||||||
|
pathParametersTable.setAttribute("cols", ".^2a,.^3a,.^10a,.^5a", true);
|
||||||
|
pathParametersTable.setTitle(labels.getLabel(TABLE_TITLE_PARAMETERS));
|
||||||
|
pathParametersTable.setHeaderRow(
|
||||||
|
labels.getLabel(TABLE_HEADER_TYPE),
|
||||||
|
labels.getLabel(TABLE_HEADER_NAME),
|
||||||
|
labels.getLabel(TABLE_HEADER_DESCRIPTION),
|
||||||
|
labels.getLabel(TABLE_HEADER_SCHEMA));
|
||||||
|
|
||||||
|
parameters.forEach((alt, parameter) ->
|
||||||
|
pathParametersTable.addRow(
|
||||||
|
generateInnerDoc(pathParametersTable, boldUnconstrained(parameter.getIn()), alt),
|
||||||
|
getParameterNameDocument(pathParametersTable, parameter),
|
||||||
|
generateInnerDoc(pathParametersTable, Optional.ofNullable(parameter.getDescription()).orElse("")),
|
||||||
|
generateInnerDoc(pathParametersTable, getSchemaTypeAsString(parameter.getSchema()))
|
||||||
|
));
|
||||||
|
parent.append(pathParametersTable);
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document getParameterNameDocument(Table table, Parameter parameter) {
|
||||||
|
String documentContent = boldUnconstrained(parameter.getName()) + " +" + LINE_SEPARATOR + requiredIndicator(parameter.getRequired(),
|
||||||
|
labels.getLabel(LABEL_REQUIRED), labels.getLabel(LABEL_OPTIONAL));
|
||||||
|
return generateInnerDoc(table, documentContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Map<String, Parameter> parameters;
|
||||||
|
|
||||||
|
public Parameters(Map<String, Parameter> parameters) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.TableImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.*;
|
||||||
|
|
||||||
|
public class PropertiesTableComponent extends MarkupComponent<StructuralNode, PropertiesTableComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final SchemaComponent schemaComponent;
|
||||||
|
|
||||||
|
PropertiesTableComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.schemaComponent = new SchemaComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Parameters parameters(@SuppressWarnings("rawtypes") Map<String, Schema> properties, List<String> schemaRequired) {
|
||||||
|
return new Parameters(properties, schemaRequired);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode parent, @SuppressWarnings("rawtypes") Map<String, Schema> properties, List<String> schemaRequired) {
|
||||||
|
return apply(parent, parameters(properties, schemaRequired));
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode parent, Parameters params) {
|
||||||
|
@SuppressWarnings("rawtypes") Map<String, Schema> properties = params.properties;
|
||||||
|
List<String> schemaRequired = params.schemaRequired;
|
||||||
|
|
||||||
|
if (null == properties || properties.isEmpty()) return parent;
|
||||||
|
|
||||||
|
List<String> finalSchemaRequired = (null == schemaRequired) ? new ArrayList<>() : schemaRequired;
|
||||||
|
|
||||||
|
TableImpl propertiesTable = new TableImpl(parent, new HashMap<>(), new ArrayList<>());
|
||||||
|
propertiesTable.setOption("header");
|
||||||
|
propertiesTable.setAttribute("caption", "", true);
|
||||||
|
propertiesTable.setAttribute("cols", ".^4a,.^16a,.^4a", true);
|
||||||
|
propertiesTable.setTitle(labels.getLabel(TABLE_TITLE_PROPERTIES));
|
||||||
|
propertiesTable.setHeaderRow(
|
||||||
|
labels.getLabel(TABLE_HEADER_NAME),
|
||||||
|
labels.getLabel(TABLE_HEADER_DESCRIPTION),
|
||||||
|
labels.getLabel(TABLE_HEADER_SCHEMA));
|
||||||
|
|
||||||
|
properties.forEach((name, schema) -> propertiesTable.addRow(
|
||||||
|
generateInnerDoc(propertiesTable, name + LINE_SEPARATOR + requiredIndicator(finalSchemaRequired.contains(name),
|
||||||
|
labels.getLabel(LABEL_REQUIRED), labels.getLabel(LABEL_OPTIONAL))),
|
||||||
|
schemaComponent.apply(propertiesTable, schema),
|
||||||
|
generateInnerDoc(propertiesTable, getSchemaTypeAsString(schema))
|
||||||
|
));
|
||||||
|
parent.append(propertiesTable);
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
public static class Parameters {
|
||||||
|
private final Map<String, Schema> properties;
|
||||||
|
private final List<String> schemaRequired;
|
||||||
|
|
||||||
|
public Parameters(Map<String, Schema> properties, List<String> schemaRequired) {
|
||||||
|
|
||||||
|
this.properties = properties;
|
||||||
|
this.schemaRequired = schemaRequired;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.TableImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.responses.ApiResponse;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
import org.asciidoctor.ast.Table;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.generateInnerDoc;
|
||||||
|
|
||||||
|
public class ResponseComponent extends MarkupComponent<StructuralNode, ResponseComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final HeadersComponent headersComponent;
|
||||||
|
private final LinkComponent linkComponent;
|
||||||
|
private final MediaContentComponent mediaContentComponent;
|
||||||
|
|
||||||
|
public ResponseComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.headersComponent = new HeadersComponent(context);
|
||||||
|
this.linkComponent = new LinkComponent(context);
|
||||||
|
this.mediaContentComponent = new MediaContentComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Parameters parameters(Map<String, ApiResponse> apiResponses) {
|
||||||
|
return new Parameters(apiResponses);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode serverSection, Map<String, ApiResponse> apiResponses) {
|
||||||
|
return apply(serverSection, parameters(apiResponses));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode serverSection, Parameters params) {
|
||||||
|
Map<String, ApiResponse> apiResponses = params.apiResponses;
|
||||||
|
|
||||||
|
if (null == apiResponses || apiResponses.isEmpty()) return serverSection;
|
||||||
|
|
||||||
|
TableImpl pathResponsesTable = new TableImpl(serverSection, new HashMap<>(), new ArrayList<>());
|
||||||
|
pathResponsesTable.setOption("header");
|
||||||
|
pathResponsesTable.setAttribute("caption", "", true);
|
||||||
|
pathResponsesTable.setAttribute("cols", ".^2a,.^14a,.^4a", true);
|
||||||
|
pathResponsesTable.setTitle(labels.getLabel(TABLE_TITLE_RESPONSES));
|
||||||
|
pathResponsesTable.setHeaderRow(
|
||||||
|
labels.getLabel(TABLE_HEADER_HTTP_CODE),
|
||||||
|
labels.getLabel(TABLE_HEADER_DESCRIPTION),
|
||||||
|
labels.getLabel(TABLE_HEADER_LINKS));
|
||||||
|
|
||||||
|
apiResponses.forEach((httpCode, apiResponse) ->
|
||||||
|
pathResponsesTable.addRow(
|
||||||
|
generateInnerDoc(pathResponsesTable, httpCode),
|
||||||
|
getResponseDescriptionColumnDocument(pathResponsesTable, apiResponse),
|
||||||
|
linkComponent.apply(pathResponsesTable, apiResponse.getLinks())
|
||||||
|
));
|
||||||
|
serverSection.append(pathResponsesTable);
|
||||||
|
return serverSection;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document getResponseDescriptionColumnDocument(Table table, ApiResponse apiResponse) {
|
||||||
|
Document document = generateInnerDoc(table, Optional.ofNullable(apiResponse.getDescription()).orElse(""));
|
||||||
|
headersComponent.apply(document, apiResponse.getHeaders());
|
||||||
|
mediaContentComponent.apply(document, apiResponse.getContent());
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final Map<String, ApiResponse> apiResponses;
|
||||||
|
|
||||||
|
public Parameters(Map<String, ApiResponse> apiResponses) {
|
||||||
|
|
||||||
|
this.apiResponses = apiResponses;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DocumentImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.github.swagger2markup.internal.helper.OpenApiHelpers;
|
||||||
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.boldUnconstrained;
|
||||||
|
|
||||||
|
public class SchemaComponent extends MarkupComponent<StructuralNode, SchemaComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
private final OpenAPI2MarkupConverter.OpenAPIContext context;
|
||||||
|
|
||||||
|
public SchemaComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SchemaComponent.Parameters parameters(@SuppressWarnings("rawtypes") Schema schema) {
|
||||||
|
return new SchemaComponent.Parameters(schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document apply(StructuralNode parent, @SuppressWarnings("rawtypes") Schema schema) {
|
||||||
|
return apply(parent, parameters(schema));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
|
@Override
|
||||||
|
public Document apply(StructuralNode parent, SchemaComponent.Parameters parameters) {
|
||||||
|
Document schemaDocument = new DocumentImpl(parent);
|
||||||
|
Schema schema = parameters.schema;
|
||||||
|
if (null == schema) return schemaDocument;
|
||||||
|
|
||||||
|
OpenApiHelpers.appendDescription(schemaDocument, schema.getDescription());
|
||||||
|
|
||||||
|
Map<String, Boolean> schemasBooleanProperties = new HashMap<String, Boolean>() {{
|
||||||
|
put(labels.getLabel(LABEL_DEPRECATED), schema.getDeprecated());
|
||||||
|
put(labels.getLabel(LABEL_NULLABLE), schema.getNullable());
|
||||||
|
put(labels.getLabel(LABEL_READ_ONLY), schema.getReadOnly());
|
||||||
|
put(labels.getLabel(LABEL_WRITE_ONLY), schema.getWriteOnly());
|
||||||
|
put(labels.getLabel(LABEL_UNIQUE_ITEMS), schema.getUniqueItems());
|
||||||
|
put(labels.getLabel(LABEL_EXCLUSIVE_MAXIMUM), schema.getExclusiveMaximum());
|
||||||
|
put(labels.getLabel(LABEL_EXCLUSIVE_MINIMUM), schema.getExclusiveMinimum());
|
||||||
|
}};
|
||||||
|
|
||||||
|
Map<String, Object> schemasValueProperties = new HashMap<String, Object>() {{
|
||||||
|
put(labels.getLabel(LABEL_TITLE), schema.getTitle());
|
||||||
|
put(labels.getLabel(LABEL_DEFAULT), schema.getDefault());
|
||||||
|
put(labels.getLabel(LABEL_MAXIMUM), schema.getMaximum());
|
||||||
|
put(labels.getLabel(LABEL_MINIMUM), schema.getMinimum());
|
||||||
|
put(labels.getLabel(LABEL_MAX_LENGTH), schema.getMaxLength());
|
||||||
|
put(labels.getLabel(LABEL_MIN_LENGTH), schema.getMinLength());
|
||||||
|
put(labels.getLabel(LABEL_MAX_ITEMS), schema.getMaxItems());
|
||||||
|
put(labels.getLabel(LABEL_MIN_ITEMS), schema.getMinItems());
|
||||||
|
put(labels.getLabel(LABEL_MAX_PROPERTIES), schema.getMaxProperties());
|
||||||
|
put(labels.getLabel(LABEL_MIN_PROPERTIES), schema.getMinProperties());
|
||||||
|
put(labels.getLabel(LABEL_MULTIPLE_OF), schema.getMultipleOf());
|
||||||
|
}};
|
||||||
|
|
||||||
|
Stream<String> schemaBooleanStream = schemasBooleanProperties.entrySet().stream()
|
||||||
|
.filter(e -> null != e.getValue() && e.getValue())
|
||||||
|
.map(e -> OpenApiHelpers.italicUnconstrained(e.getKey().toLowerCase()));
|
||||||
|
Stream<String> schemaValueStream = schemasValueProperties.entrySet().stream()
|
||||||
|
.filter(e -> null != e.getValue() && StringUtils.isNotBlank(e.getValue().toString()))
|
||||||
|
.map(e -> boldUnconstrained(e.getKey()) + ": " + e.getValue());
|
||||||
|
|
||||||
|
ParagraphBlockImpl paragraphBlock = new ParagraphBlockImpl(schemaDocument);
|
||||||
|
String source = Stream.concat(schemaBooleanStream, schemaValueStream).collect(Collectors.joining(" +" + LINE_SEPARATOR));
|
||||||
|
paragraphBlock.setSource(source);
|
||||||
|
|
||||||
|
schemaDocument.append(paragraphBlock);
|
||||||
|
|
||||||
|
Map<String, Schema> properties = schema.getProperties();
|
||||||
|
if (null != properties && !properties.isEmpty()) {
|
||||||
|
PropertiesTableComponent propertiesTableComponent = new PropertiesTableComponent(context);
|
||||||
|
propertiesTableComponent.apply(schemaDocument, properties, schema.getRequired());
|
||||||
|
}
|
||||||
|
|
||||||
|
return schemaDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final Schema schema;
|
||||||
|
|
||||||
|
public Parameters(Schema schema) {
|
||||||
|
this.schema = schema;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.TableImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.*;
|
||||||
|
|
||||||
|
public class SecurityRequirementTableComponent extends MarkupComponent<StructuralNode, SecurityRequirementTableComponent.Parameters, StructuralNode> {
|
||||||
|
|
||||||
|
public SecurityRequirementTableComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SecurityRequirementTableComponent.Parameters parameters(List<SecurityRequirement> securityRequirements, boolean addTitle) {
|
||||||
|
return new SecurityRequirementTableComponent.Parameters(securityRequirements, addTitle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StructuralNode apply(StructuralNode document, List<SecurityRequirement> securityRequirements, boolean addTitle) {
|
||||||
|
return apply(document, parameters(securityRequirements, addTitle));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructuralNode apply(StructuralNode node, SecurityRequirementTableComponent.Parameters parameters) {
|
||||||
|
List<SecurityRequirement> securityRequirements = parameters.securityRequirements;
|
||||||
|
|
||||||
|
if (securityRequirements == null || securityRequirements.isEmpty()) return node;
|
||||||
|
|
||||||
|
TableImpl securityRequirementsTable = new TableImpl(node, new HashMap<>(), new ArrayList<>());
|
||||||
|
securityRequirementsTable.setOption("header");
|
||||||
|
securityRequirementsTable.setAttribute("caption", "", true);
|
||||||
|
securityRequirementsTable.setAttribute("cols", ".^3a,.^4a,.^13a", true);
|
||||||
|
if (parameters.addTitle) {
|
||||||
|
securityRequirementsTable.setTitle(labels.getLabel(TABLE_TITLE_SECURITY));
|
||||||
|
}
|
||||||
|
securityRequirementsTable.setHeaderRow(
|
||||||
|
labels.getLabel(TABLE_HEADER_TYPE),
|
||||||
|
labels.getLabel(TABLE_HEADER_NAME),
|
||||||
|
labels.getLabel(TABLE_HEADER_SCOPES));
|
||||||
|
|
||||||
|
securityRequirements.forEach(securityRequirement ->
|
||||||
|
securityRequirement.forEach((name, scopes) ->
|
||||||
|
securityRequirementsTable.addRow(
|
||||||
|
generateInnerDoc(securityRequirementsTable, boldUnconstrained(scopes.isEmpty() ? "apiKey" : "oauth2")),
|
||||||
|
generateInnerDoc(securityRequirementsTable, name),
|
||||||
|
generateInnerDoc(securityRequirementsTable, String.join(", ", scopes))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
node.append(securityRequirementsTable);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final List<SecurityRequirement> securityRequirements;
|
||||||
|
private final boolean addTitle;
|
||||||
|
|
||||||
|
public Parameters(List<SecurityRequirement> securityRequirements, boolean addTitle) {
|
||||||
|
this.securityRequirements = securityRequirements;
|
||||||
|
this.addTitle = addTitle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.internal.component;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListEntryImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DescriptionListImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ListItemImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.SectionImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.swagger.v3.oas.models.tags.Tag;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.Section;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.SECTION_TITLE_TAGS;
|
||||||
|
|
||||||
|
|
||||||
|
public class TagsComponent extends MarkupComponent<Document, TagsComponent.Parameters, Document> {
|
||||||
|
|
||||||
|
private final ExternalDocumentationComponent externalDocumentationComponent;
|
||||||
|
|
||||||
|
public TagsComponent(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.externalDocumentationComponent = new ExternalDocumentationComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TagsComponent.Parameters parameters(List<Tag> tags) {
|
||||||
|
return new TagsComponent.Parameters(tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document apply(Document document, List<Tag> tags) {
|
||||||
|
return apply(document, parameters(tags));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Document apply(Document document, TagsComponent.Parameters parameters) {
|
||||||
|
List<Tag> openAPITags = parameters.tags;
|
||||||
|
if (null == openAPITags || openAPITags.isEmpty()) return document;
|
||||||
|
|
||||||
|
Section tagsSection = new SectionImpl(document);
|
||||||
|
tagsSection.setTitle(labels.getLabel(SECTION_TITLE_TAGS));
|
||||||
|
|
||||||
|
DescriptionListImpl tagsList = new DescriptionListImpl(tagsSection);
|
||||||
|
openAPITags.forEach(tag -> {
|
||||||
|
DescriptionListEntryImpl tagEntry = new DescriptionListEntryImpl(tagsList, Collections.singletonList(new ListItemImpl(tagsList, tag.getName())));
|
||||||
|
String description = tag.getDescription();
|
||||||
|
if(StringUtils.isNotBlank(description)){
|
||||||
|
ListItemImpl tagDesc = new ListItemImpl(tagEntry, "");
|
||||||
|
tagDesc.setSource(description);
|
||||||
|
externalDocumentationComponent.apply(tagDesc, tag.getExternalDocs());
|
||||||
|
tagEntry.setDescription(tagDesc);
|
||||||
|
}
|
||||||
|
tagsList.addEntry(tagEntry);
|
||||||
|
});
|
||||||
|
|
||||||
|
tagsSection.append(tagsList);
|
||||||
|
document.append(tagsSection);
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
|
||||||
|
private final List<Tag> tags;
|
||||||
|
|
||||||
|
public Parameters(List<Tag> tags) {
|
||||||
|
this.tags = tags;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
package io.github.swagger2markup.internal.document;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.SectionImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.*;
|
||||||
|
import io.swagger.v3.oas.models.Components;
|
||||||
|
import io.swagger.v3.oas.models.headers.Header;
|
||||||
|
import io.swagger.v3.oas.models.links.Link;
|
||||||
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
|
import io.swagger.v3.oas.models.parameters.Parameter;
|
||||||
|
import io.swagger.v3.oas.models.responses.ApiResponse;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.Section;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
|
||||||
|
public class ComponentsDocument extends MarkupComponent<Document, ComponentsDocument.Parameters, Document> {
|
||||||
|
|
||||||
|
private final ParametersComponent parametersComponent;
|
||||||
|
private final ResponseComponent responseComponent;
|
||||||
|
private final HeadersComponent headersComponent;
|
||||||
|
private final SchemaComponent schemaComponent;
|
||||||
|
private final LinkComponent linkComponent;
|
||||||
|
|
||||||
|
public ComponentsDocument(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.parametersComponent = new ParametersComponent(context);
|
||||||
|
this.responseComponent = new ResponseComponent(context);
|
||||||
|
this.headersComponent = new HeadersComponent(context);
|
||||||
|
this.schemaComponent = new SchemaComponent(context);
|
||||||
|
this.linkComponent = new LinkComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Parameters parameters(Components components) {
|
||||||
|
return new Parameters(components);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Document apply(Document document, ComponentsDocument.Parameters parameters) {
|
||||||
|
|
||||||
|
appendComponentsSection(document, parameters.components);
|
||||||
|
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final Components components;
|
||||||
|
|
||||||
|
public Parameters(Components components) {
|
||||||
|
this.components = Validate.notNull(components, "Schema must not be null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendComponentsSection(Document document, Components components) {
|
||||||
|
if (null == components) return;
|
||||||
|
|
||||||
|
Section componentsSection = new SectionImpl(document);
|
||||||
|
componentsSection.setTitle(labels.getLabel(SECTION_TITLE_COMPONENTS));
|
||||||
|
String componentSectionId = "_components";
|
||||||
|
componentsSection.setId(componentSectionId);
|
||||||
|
|
||||||
|
appendComponentsSchemasSection(componentsSection, componentSectionId, components.getSchemas());
|
||||||
|
Map<String, Parameter> parameters = components.getParameters();
|
||||||
|
if (null != parameters && !parameters.isEmpty()) {
|
||||||
|
appendSubSection(componentsSection, componentSectionId, parametersComponent, SECTION_TITLE_PARAMETERS,
|
||||||
|
new ParametersComponent.Parameters(parameters));
|
||||||
|
}
|
||||||
|
Map<String, ApiResponse> responses = components.getResponses();
|
||||||
|
if (null != responses && !responses.isEmpty()) {
|
||||||
|
appendSubSection(componentsSection, componentSectionId, responseComponent, SECTION_TITLE_RESPONSES,
|
||||||
|
new ResponseComponent.Parameters(responses));
|
||||||
|
}
|
||||||
|
Map<String, Header> headers = components.getHeaders();
|
||||||
|
if (null != headers && !headers.isEmpty()) {
|
||||||
|
appendSubSection(componentsSection, componentSectionId, headersComponent, SECTION_TITLE_HEADERS,
|
||||||
|
new HeadersComponent.Parameters(headers));
|
||||||
|
}
|
||||||
|
Map<String, Link> links = components.getLinks();
|
||||||
|
if (null != links && !links.isEmpty()) {
|
||||||
|
appendSubSection(componentsSection, componentSectionId, linkComponent, SECTION_TITLE_LINKS,
|
||||||
|
new LinkComponent.Parameters(links));
|
||||||
|
}
|
||||||
|
document.append(componentsSection);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendComponentsSchemasSection(
|
||||||
|
Section componentsSection, String componentSectionId,
|
||||||
|
@SuppressWarnings("rawtypes") Map<String, Schema> schemas) {
|
||||||
|
if (null == schemas || schemas.isEmpty()) return;
|
||||||
|
|
||||||
|
SectionImpl schemasSection = new SectionImpl(componentsSection);
|
||||||
|
String schemasSectionId = componentSectionId + "_schemas";
|
||||||
|
schemasSection.setTitle(labels.getLabel(SECTION_TITLE_SCHEMAS));
|
||||||
|
schemasSection.setId(schemasSectionId);
|
||||||
|
schemas.forEach((name, schema) -> {
|
||||||
|
String schemaDocumentId = schemasSectionId + "_" + name;
|
||||||
|
Document schemaDocument = schemaComponent.apply(schemasSection, schema);
|
||||||
|
schemaDocument.setTitle(name);
|
||||||
|
schemaDocument.setId(schemaDocumentId);
|
||||||
|
schemasSection.append(schemaDocument);
|
||||||
|
});
|
||||||
|
componentsSection.append(schemasSection);
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> void appendSubSection(Section componentsSection, String componentSectionId,
|
||||||
|
MarkupComponent<StructuralNode, T, StructuralNode> markupComponent,
|
||||||
|
String sectionLabel, T parameters) {
|
||||||
|
SectionImpl parametersSection = new SectionImpl(componentsSection);
|
||||||
|
String parametersSectionId = componentSectionId + "_parameters";
|
||||||
|
parametersSection.setTitle(labels.getLabel(sectionLabel));
|
||||||
|
parametersSection.setId(parametersSectionId);
|
||||||
|
markupComponent.apply(parametersSection, parameters);
|
||||||
|
componentsSection.append(parametersSection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
package io.github.swagger2markup.internal.document;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.BlockImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DocumentImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.SectionImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.github.swagger2markup.extension.OverviewDocumentExtension;
|
||||||
|
import io.github.swagger2markup.internal.component.ExternalDocumentationComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.TagsComponent;
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.oas.models.info.Contact;
|
||||||
|
import io.swagger.v3.oas.models.info.Info;
|
||||||
|
import io.swagger.v3.oas.models.info.License;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Block;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.Section;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.LABEL_TERMS_OF_SERVICE;
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.SECTION_TITLE_OVERVIEW;
|
||||||
|
import static io.github.swagger2markup.extension.OverviewDocumentExtension.Context;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.appendDescription;
|
||||||
|
|
||||||
|
public class OverviewDocument extends MarkupComponent<Document, OverviewDocument.Parameters, Document> {
|
||||||
|
private final TagsComponent tagsComponent;
|
||||||
|
private final ExternalDocumentationComponent externalDocumentationComponent;
|
||||||
|
|
||||||
|
public OverviewDocument(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
tagsComponent = new TagsComponent(context);
|
||||||
|
this.externalDocumentationComponent = new ExternalDocumentationComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OverviewDocument.Parameters parameters(OpenAPI schema) {
|
||||||
|
return new OverviewDocument.Parameters(schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Document apply(Document document, Parameters parameters) {
|
||||||
|
Info apiInfo = parameters.openAPI.getInfo();
|
||||||
|
document.setAttribute("openapi", parameters.openAPI.getOpenapi(), true);
|
||||||
|
addDocumentTitle(document, apiInfo);
|
||||||
|
addAuthorInfo(document, apiInfo);
|
||||||
|
addVersionInfo(document, apiInfo);
|
||||||
|
|
||||||
|
applyOverviewDocumentExtension(new Context(OverviewDocumentExtension.Position.DOCUMENT_BEFORE, document));
|
||||||
|
Document subDocument = new DocumentImpl(document);
|
||||||
|
Section overviewDoc = new SectionImpl(subDocument, "section", new HashMap<>(), new ArrayList<>(),
|
||||||
|
null, new ArrayList<>(), 1, "", new ArrayList<>(),
|
||||||
|
null, null, "", "", false, false);
|
||||||
|
applyOverviewDocumentExtension(new Context(OverviewDocumentExtension.Position.DOCUMENT_BEGIN, subDocument));
|
||||||
|
overviewDoc.setTitle(labels.getLabel(SECTION_TITLE_OVERVIEW));
|
||||||
|
|
||||||
|
appendDescription(overviewDoc, apiInfo.getDescription());
|
||||||
|
appendTermsOfServiceInfo(overviewDoc, apiInfo);
|
||||||
|
appendLicenseInfo(overviewDoc, apiInfo);
|
||||||
|
subDocument.append(overviewDoc);
|
||||||
|
applyOverviewDocumentExtension(new Context(OverviewDocumentExtension.Position.DOCUMENT_END, subDocument));
|
||||||
|
document.append(subDocument);
|
||||||
|
|
||||||
|
externalDocumentationComponent.apply(document, parameters.openAPI.getExternalDocs());
|
||||||
|
tagsComponent.apply(document, parameters.openAPI.getTags());
|
||||||
|
applyOverviewDocumentExtension(new Context(OverviewDocumentExtension.Position.DOCUMENT_AFTER, document));
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyOverviewDocumentExtension(Context context) {
|
||||||
|
extensionRegistry.getOverviewDocumentExtensions().forEach(extension -> extension.apply(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addDocumentTitle(Document rootDocument, Info apiInfo) {
|
||||||
|
String title = apiInfo.getTitle();
|
||||||
|
if (StringUtils.isNotBlank(title)) {
|
||||||
|
rootDocument.setTitle(title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addVersionInfo(Document rootDocument, Info info) {
|
||||||
|
String version = info.getVersion();
|
||||||
|
if (StringUtils.isNotBlank(version)) {
|
||||||
|
rootDocument.setAttribute("revnumber", version, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAuthorInfo(Document rootDocument, Info info) {
|
||||||
|
Contact contact = info.getContact();
|
||||||
|
if (null != contact) {
|
||||||
|
String author = Optional.ofNullable(contact.getName()).orElse("");
|
||||||
|
String email = contact.getEmail();
|
||||||
|
if (StringUtils.isNotBlank(email)) {
|
||||||
|
rootDocument.setAttribute("email", email, true);
|
||||||
|
}
|
||||||
|
rootDocument.setAttribute("author", author, true);
|
||||||
|
rootDocument.setAttribute("authorcount", 1L, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendLicenseInfo(Section overviewDoc, Info info) {
|
||||||
|
License license = info.getLicense();
|
||||||
|
if (null != license) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (StringUtils.isNotBlank(license.getUrl())) {
|
||||||
|
sb.append(license.getUrl()).append("[");
|
||||||
|
}
|
||||||
|
sb.append(license.getName());
|
||||||
|
if (StringUtils.isNotBlank(license.getUrl())) {
|
||||||
|
sb.append("]");
|
||||||
|
}
|
||||||
|
BlockImpl paragraph = new ParagraphBlockImpl(overviewDoc);
|
||||||
|
paragraph.setSource(sb.toString());
|
||||||
|
overviewDoc.append(paragraph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendTermsOfServiceInfo(Section overviewDoc, Info info) {
|
||||||
|
String termsOfService = info.getTermsOfService();
|
||||||
|
if (StringUtils.isNotBlank(termsOfService)) {
|
||||||
|
Block paragraph = new ParagraphBlockImpl(overviewDoc);
|
||||||
|
paragraph.setSource(termsOfService + "[" + labels.getLabel(LABEL_TERMS_OF_SERVICE) + "]");
|
||||||
|
overviewDoc.append(paragraph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final OpenAPI openAPI;
|
||||||
|
|
||||||
|
public Parameters(OpenAPI openAPI) {
|
||||||
|
this.openAPI = Validate.notNull(openAPI, "Schema must not be null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
package io.github.swagger2markup.internal.document;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.SectionImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.TableImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.ExternalDocumentationComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.ParametersComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.ResponseComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.SecurityRequirementTableComponent;
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.oas.models.Paths;
|
||||||
|
import io.swagger.v3.oas.models.servers.Server;
|
||||||
|
import io.swagger.v3.oas.models.servers.ServerVariables;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.Section;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.*;
|
||||||
|
import static io.github.swagger2markup.internal.helper.OpenApiHelpers.*;
|
||||||
|
|
||||||
|
public class PathsDocument extends MarkupComponent<Document, PathsDocument.Parameters, Document> {
|
||||||
|
private final ParametersComponent parametersComponent;
|
||||||
|
private final ExternalDocumentationComponent externalDocumentationComponent;
|
||||||
|
private final ResponseComponent responseComponent;
|
||||||
|
private final SecurityRequirementTableComponent securityRequirementTableComponent;
|
||||||
|
|
||||||
|
public PathsDocument(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.parametersComponent = new ParametersComponent(context);
|
||||||
|
this.externalDocumentationComponent = new ExternalDocumentationComponent(context);
|
||||||
|
this.responseComponent = new ResponseComponent(context);
|
||||||
|
this.securityRequirementTableComponent = new SecurityRequirementTableComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Parameters parameters(OpenAPI schema) {
|
||||||
|
return new Parameters(schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Document apply(Document document, Parameters parameters) {
|
||||||
|
Paths apiPaths = parameters.schema.getPaths();
|
||||||
|
|
||||||
|
if (null == apiPaths || apiPaths.isEmpty()) return document;
|
||||||
|
|
||||||
|
SectionImpl allPathsSection = new SectionImpl(document);
|
||||||
|
allPathsSection.setTitle(labels.getLabel(SECTION_TITLE_PATHS));
|
||||||
|
|
||||||
|
apiPaths.forEach((name, pathItem) ->
|
||||||
|
pathItem.readOperationsMap().forEach(((httpMethod, operation) -> {
|
||||||
|
SectionImpl operationSection = new SectionImpl(allPathsSection);
|
||||||
|
String summary = Optional.ofNullable(operation.getSummary()).orElse("");
|
||||||
|
operationSection.setTitle((italicUnconstrained(httpMethod.name().toUpperCase()) + " " + monospaced(name) + " " + summary).trim());
|
||||||
|
appendDescription(operationSection, operation.getDescription());
|
||||||
|
externalDocumentationComponent.apply(operationSection, operation.getExternalDocs());
|
||||||
|
parametersComponent.apply(operationSection, operation.getParameters());
|
||||||
|
responseComponent.apply(operationSection, operation.getResponses());
|
||||||
|
appendServersSection(operationSection, operation.getServers());
|
||||||
|
securityRequirementTableComponent.apply(operationSection, operation.getSecurity(), false);
|
||||||
|
allPathsSection.append(operationSection);
|
||||||
|
})));
|
||||||
|
|
||||||
|
document.append(allPathsSection);
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendServersSection(StructuralNode node, List<Server> servers) {
|
||||||
|
if (null == servers || servers.isEmpty()) return;
|
||||||
|
|
||||||
|
Section serversSection = new SectionImpl(node);
|
||||||
|
serversSection.setTitle(labels.getLabel(SECTION_TITLE_SERVERS));
|
||||||
|
|
||||||
|
servers.forEach(server -> {
|
||||||
|
Section serverSection = new SectionImpl(serversSection);
|
||||||
|
serverSection.setTitle(italicUnconstrained(labels.getLabel(LABEL_SERVER)) + ": " + server.getUrl());
|
||||||
|
|
||||||
|
appendDescription(serverSection, server.getDescription());
|
||||||
|
ServerVariables variables = server.getVariables();
|
||||||
|
appendVariables(serverSection, variables);
|
||||||
|
serversSection.append(serverSection);
|
||||||
|
});
|
||||||
|
node.append(serversSection);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendVariables(Section serverSection, ServerVariables variables) {
|
||||||
|
if (null == variables || variables.isEmpty()) return;
|
||||||
|
|
||||||
|
TableImpl serverVariables = new TableImpl(serverSection, new HashMap<String, Object>() {{
|
||||||
|
put("header-option", "");
|
||||||
|
put("cols", ".^2a,.^9a,.^3a,.^4a");
|
||||||
|
}}, new ArrayList<>());
|
||||||
|
serverVariables.setTitle(labels.getLabel(TABLE_TITLE_SERVER_VARIABLES));
|
||||||
|
|
||||||
|
serverVariables.setHeaderRow(labels.getLabel(TABLE_HEADER_VARIABLE), labels.getLabel(TABLE_HEADER_DESCRIPTION),
|
||||||
|
labels.getLabel(TABLE_HEADER_POSSIBLE_VALUES), labels.getLabel(TABLE_HEADER_DEFAULT)
|
||||||
|
);
|
||||||
|
|
||||||
|
variables.forEach((name, variable) -> {
|
||||||
|
String possibleValues = String.join(", ", Optional.ofNullable(variable.getEnum()).orElse(Collections.singletonList("Any")));
|
||||||
|
serverVariables.addRow(name, Optional.ofNullable(variable.getDescription()).orElse(""), possibleValues, variable.getDefault());
|
||||||
|
|
||||||
|
});
|
||||||
|
serverSection.append(serverVariables);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final OpenAPI schema;
|
||||||
|
|
||||||
|
public Parameters(OpenAPI schema) {
|
||||||
|
this.schema = Validate.notNull(schema, "Schema must not be null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package io.github.swagger2markup.internal.document;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.OpenAPI2MarkupConverter;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.SectionImpl;
|
||||||
|
import io.github.swagger2markup.extension.MarkupComponent;
|
||||||
|
import io.github.swagger2markup.internal.component.SecurityRequirementTableComponent;
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.Section;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.config.OpenAPILabels.SECTION_TITLE_SECURITY;
|
||||||
|
|
||||||
|
public class SecurityDocument extends MarkupComponent<Document, SecurityDocument.Parameters, Document> {
|
||||||
|
private final SecurityRequirementTableComponent securityRequirementTableComponent;
|
||||||
|
|
||||||
|
public SecurityDocument(OpenAPI2MarkupConverter.OpenAPIContext context) {
|
||||||
|
super(context);
|
||||||
|
this.securityRequirementTableComponent = new SecurityRequirementTableComponent(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Parameters parameters(OpenAPI schema) {
|
||||||
|
return new Parameters(schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Document apply(Document document, SecurityDocument.Parameters parameters) {
|
||||||
|
List<SecurityRequirement> securityRequirements = parameters.schema.getSecurity();
|
||||||
|
if (null == securityRequirements || securityRequirements.isEmpty()) return document;
|
||||||
|
|
||||||
|
Section securityRequirementsSection = new SectionImpl(document);
|
||||||
|
securityRequirementsSection.setTitle(labels.getLabel(SECTION_TITLE_SECURITY));
|
||||||
|
securityRequirementTableComponent.apply(securityRequirementsSection, securityRequirements, false);
|
||||||
|
document.append(securityRequirementsSection);
|
||||||
|
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Parameters {
|
||||||
|
private final OpenAPI schema;
|
||||||
|
|
||||||
|
public Parameters(OpenAPI schema) {
|
||||||
|
this.schema = Validate.notNull(schema, "Schema must not be null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
package io.github.swagger2markup.internal.helper;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.DocumentImpl;
|
||||||
|
import io.github.swagger2markup.adoc.ast.impl.ParagraphBlockImpl;
|
||||||
|
import io.swagger.v3.oas.models.media.ArraySchema;
|
||||||
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.asciidoctor.ast.Block;
|
||||||
|
import org.asciidoctor.ast.Document;
|
||||||
|
import org.asciidoctor.ast.StructuralNode;
|
||||||
|
import org.asciidoctor.ast.Table;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static io.github.swagger2markup.adoc.converter.internal.Delimiters.LINE_SEPARATOR;
|
||||||
|
|
||||||
|
public class OpenApiHelpers {
|
||||||
|
|
||||||
|
public static void appendDescription(StructuralNode node, String description) {
|
||||||
|
if (StringUtils.isNotBlank(description)) {
|
||||||
|
Block paragraph = new ParagraphBlockImpl(node);
|
||||||
|
paragraph.setSource(description);
|
||||||
|
node.append(paragraph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Document generateInnerDoc(Table table, String documentContent) {
|
||||||
|
return generateInnerDoc(table, documentContent, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Document generateInnerDoc(Table table, String documentContent, String id) {
|
||||||
|
Document innerDoc = new DocumentImpl(table);
|
||||||
|
if (StringUtils.isNotBlank(id)) {
|
||||||
|
innerDoc.setId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
Block paragraph = new ParagraphBlockImpl(innerDoc);
|
||||||
|
paragraph.setSource(documentContent);
|
||||||
|
innerDoc.append(paragraph);
|
||||||
|
return innerDoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String requiredIndicator(boolean isRequired, String labelRequired, String labelOptional) {
|
||||||
|
return italicUnconstrained(isRequired ? labelRequired : labelOptional).toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String superScript(String str) {
|
||||||
|
return "^" + str + "^";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String subScript(String str) {
|
||||||
|
return "~" + str + "~";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String italicUnconstrained(String str) {
|
||||||
|
return "__" + str + "__";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String boldUnconstrained(String str) {
|
||||||
|
return "**" + str + "**";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String monospaced(String str) {
|
||||||
|
return "`" + str + "`";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSchemaTypeAsString(Schema schema) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
if (schema instanceof ArraySchema) {
|
||||||
|
stringBuilder.append("< ");
|
||||||
|
Schema<?> items = ((ArraySchema) schema).getItems();
|
||||||
|
stringBuilder.append(getSchemaType(items));
|
||||||
|
stringBuilder.append(" > ");
|
||||||
|
stringBuilder.append(schema.getType());
|
||||||
|
} else {
|
||||||
|
List enumList = schema.getEnum();
|
||||||
|
if (enumList != null) {
|
||||||
|
stringBuilder.append("enum (");
|
||||||
|
for (Object value : enumList) {
|
||||||
|
stringBuilder.append(value.toString());
|
||||||
|
stringBuilder.append(",");
|
||||||
|
}
|
||||||
|
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
|
||||||
|
stringBuilder.append(')');
|
||||||
|
} else {
|
||||||
|
stringBuilder.append(getSchemaType(schema));
|
||||||
|
String format = schema.getFormat();
|
||||||
|
if (format != null) {
|
||||||
|
stringBuilder.append(' ');
|
||||||
|
stringBuilder.append('(');
|
||||||
|
stringBuilder.append(format);
|
||||||
|
stringBuilder.append(')');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getSchemaType(Schema<?> schema) {
|
||||||
|
String type = schema.getType();
|
||||||
|
if (StringUtils.isNotEmpty(type)) {
|
||||||
|
return type;
|
||||||
|
} else {
|
||||||
|
return generateRefLink(schema.get$ref());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String generateRefLink(String ref) {
|
||||||
|
if (StringUtils.isNotBlank(ref)) {
|
||||||
|
String anchor = ref.toLowerCase().replaceFirst("#", "").replaceAll("/", "_");
|
||||||
|
return "<<" + anchor + ">>" + LINE_SEPARATOR;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
swagger2markup.markupLanguage=ASCIIDOC
|
||||||
|
swagger2markup.swaggerMarkupLanguage=ASCIIDOC
|
||||||
|
swagger2markup.hostnameEnabled=false
|
||||||
|
swagger2markup.basePathPrefixEnabled=false
|
||||||
|
swagger2markup.operationExtensionsEnabled=false
|
||||||
|
swagger2markup.definitionExtensionsEnabled=false
|
||||||
|
swagger2markup.separatedDefinitionsEnabled=false
|
||||||
|
swagger2markup.separatedOperationsEnabled=false
|
||||||
|
swagger2markup.pathsGroupedBy=AS_IS
|
||||||
|
swagger2markup.outputLanguage=EN
|
||||||
|
swagger2markup.inlineSchemaEnabled=true
|
||||||
|
swagger2markup.interDocumentCrossReferencesEnabled=false
|
||||||
|
swagger2markup.flatBodyEnabled=false
|
||||||
|
swagger2markup.pathSecuritySectionEnabled=true
|
||||||
|
swagger2markup.overviewDocument=overview
|
||||||
|
swagger2markup.pathsDocument=paths
|
||||||
|
swagger2markup.definitionsDocument=definitions
|
||||||
|
swagger2markup.securityDocument=security
|
||||||
|
swagger2markup.separatedOperationsFolder=operations
|
||||||
|
swagger2markup.separatedDefinitionsFolder=definitions
|
||||||
|
swagger2markup.tagOrderBy=NATURAL
|
||||||
|
swagger2markup.operationOrderBy=NATURAL
|
||||||
|
swagger2markup.definitionOrderBy=NATURAL
|
||||||
|
swagger2markup.parameterOrderBy=NATURAL
|
||||||
|
swagger2markup.propertyOrderBy=NATURAL
|
||||||
|
swagger2markup.responseOrderBy=NATURAL
|
||||||
|
swagger2markup.listDelimiterEnabled=false
|
||||||
|
swagger2markup.listDelimiter=,
|
||||||
|
swagger2markup.asciidoc.pegdown.timeoutMillis=2000
|
||||||
|
|
||||||
|
swagger2markup.generatedExamplesEnabled=false
|
||||||
|
# basic, curl, invoke-webrequest
|
||||||
|
swagger2markup.requestExamplesFormat=basic
|
||||||
|
# default, bash, powershell, etc.
|
||||||
|
swagger2markup.requestExamplesSourceFormat=default
|
||||||
|
# hide, inherit or hostname
|
||||||
|
swagger2markup.requestExamplesHost=hide
|
||||||
|
# hide, inherit or schema (e.g. https, https, etc.)
|
||||||
|
swagger2markup.requestExamplesSchema=hide
|
||||||
|
swagger2markup.requestExamplesHideBasePath=true
|
||||||
|
swagger2markup.requestExamplesIncludeAllQueryParams=false
|
||||||
|
# single, commaSeparated, multiple, multiple[]
|
||||||
|
swagger2markup.requestExamplesQueryArrayStyle=single
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
label_content=Content
|
||||||
|
label_default=Default
|
||||||
|
label_deprecated=Deprecated
|
||||||
|
label_example=Example
|
||||||
|
label_examples=Examples
|
||||||
|
label_exclusive_maximum=Exclusive Maximum
|
||||||
|
label_exclusive_minimum=Exclusive Minimum
|
||||||
|
label_external_value=External Value
|
||||||
|
label_format=Format
|
||||||
|
label_maximum=Maximum
|
||||||
|
label_max_items=Maximum Items
|
||||||
|
label_max_length=Maximum Length
|
||||||
|
label_max_properties=Maximum Properties
|
||||||
|
label_minimum=Minimum
|
||||||
|
label_min_items=Minimum Items
|
||||||
|
label_min_length=Minimum Length
|
||||||
|
label_min_properties=Minimum Properties
|
||||||
|
label_multiple_of=Multiple Of
|
||||||
|
label_no_links=No Links
|
||||||
|
label_nullable=Nullable
|
||||||
|
label_operation=Operation
|
||||||
|
label_optional=Optional
|
||||||
|
label_parameters=Parameters
|
||||||
|
label_read_only=Read Only
|
||||||
|
label_required=Required
|
||||||
|
label_server=Server
|
||||||
|
label_terms_of_service=Terms Of Service
|
||||||
|
label_title=Title
|
||||||
|
label_type=Type
|
||||||
|
label_unique_items=Unique Items
|
||||||
|
label_write_only=Write Only
|
||||||
|
section_title_components=Components
|
||||||
|
section_title_parameters=Parameters
|
||||||
|
section_title_paths=Paths
|
||||||
|
section_title_schemas=Schemas
|
||||||
|
section_title_security=Security
|
||||||
|
section_title_servers=Servers
|
||||||
|
section_title_overview=Overview
|
||||||
|
section_title_tags=Tags
|
||||||
|
section_title_responses=Responses
|
||||||
|
section_title_headers=Headers
|
||||||
|
section_title_links=Links
|
||||||
|
table_header_default=Default
|
||||||
|
table_header_description=Description
|
||||||
|
table_header_http_code=Code
|
||||||
|
table_header_links=Links
|
||||||
|
table_header_name=Name
|
||||||
|
table_header_possible_values=Possible Values
|
||||||
|
table_header_schema=Schema
|
||||||
|
table_header_scopes=Scopes
|
||||||
|
table_header_type=Type
|
||||||
|
table_header_variable=Variable
|
||||||
|
table_title_headers=Headers
|
||||||
|
table_title_parameters=Parameters
|
||||||
|
table_title_properties=Properties
|
||||||
|
table_title_responses=Responses
|
||||||
|
table_title_security=Security
|
||||||
|
table_title_server_variables=Server Variables
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup;
|
||||||
|
|
||||||
|
import io.github.swagger2markup.assertions.DiffUtils;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.assertj.core.api.Assertions;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
public class AsciidocConverterTest {
|
||||||
|
|
||||||
|
private static final String[] EXPECTED_FILES = new String[]{"definitions.adoc", "overview.adoc", "paths.adoc", "security.adoc"};
|
||||||
|
private List<String> expectedFiles;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
expectedFiles = new ArrayList<>(asList(EXPECTED_FILES));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToString() throws URISyntaxException {
|
||||||
|
//Given
|
||||||
|
Path file = Paths.get(AsciidocConverterTest.class.getResource("/yaml/swagger_petstore.yaml").toURI());
|
||||||
|
|
||||||
|
//When
|
||||||
|
String asciiDocAsString = OpenAPI2MarkupConverter.from(file).build()
|
||||||
|
.toString();
|
||||||
|
//Then
|
||||||
|
Assertions.assertThat(asciiDocAsString).isNotEmpty();
|
||||||
|
System.out.println(asciiDocAsString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToFolder() throws URISyntaxException {
|
||||||
|
//Given
|
||||||
|
Path file = Paths.get(AsciidocConverterTest.class.getResource("/yaml/swagger_petstore.yaml").toURI());
|
||||||
|
Path outputDirectory = Paths.get("build/test/asciidoc/to_folder");
|
||||||
|
FileUtils.deleteQuietly(outputDirectory.toFile());
|
||||||
|
|
||||||
|
//When
|
||||||
|
OpenAPI2MarkupConverter.from(file).build()
|
||||||
|
.toFolder(outputDirectory);
|
||||||
|
|
||||||
|
//Then
|
||||||
|
String[] files = outputDirectory.toFile().list();
|
||||||
|
assertThat(files).hasSize(4).containsAll(expectedFiles);
|
||||||
|
|
||||||
|
Path expectedFilesDirectory = Paths.get(AsciidocConverterTest.class.getResource("/expected/asciidoc/to_folder").toURI());
|
||||||
|
DiffUtils.assertThatAllFilesAreEqual(expectedFilesDirectory, outputDirectory, "testToFolder.html");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package io.github.swagger2markup;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.parser.OpenAPIV3Parser;
|
||||||
|
import io.swagger.v3.parser.core.models.ParseOptions;
|
||||||
|
import io.swagger.v3.parser.core.models.SwaggerParseResult;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
@RunWith(Parameterized.class)
|
||||||
|
public class OpenApi2AsciiDocTest {
|
||||||
|
|
||||||
|
final private String openApiFile;
|
||||||
|
final private String expectedAsciiDoc;
|
||||||
|
|
||||||
|
public OpenApi2AsciiDocTest(String openApiFile, String expectedAsciiDoc) throws IOException {
|
||||||
|
this.openApiFile = "./src/test/resources/open_api/" + openApiFile;
|
||||||
|
this.expectedAsciiDoc = IOUtils.toString(getClass().getResourceAsStream("/asciidoc/" + expectedAsciiDoc), StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameters(name = "Run {index}: open api={0}, asciidoc={1}")
|
||||||
|
public static Iterable<Object[]> data() {
|
||||||
|
return Arrays.asList(new Object[][]{
|
||||||
|
{"simple.yaml", "simple.adoc"},
|
||||||
|
{"petstore.yaml", "petstore.adoc"}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void converts_open_api_v3_to_asciidoc() {
|
||||||
|
ParseOptions options = new ParseOptions();
|
||||||
|
options.setResolve(true);
|
||||||
|
SwaggerParseResult result = new OpenAPIV3Parser().readLocation(openApiFile, null, options);
|
||||||
|
OpenAPI swagger = result.getOpenAPI();
|
||||||
|
assertNotNull(swagger);
|
||||||
|
|
||||||
|
OpenAPI2MarkupConverter converter = OpenAPI2MarkupConverter.from(swagger).build();
|
||||||
|
converter.toFolder(Paths.get("build/test/asciidoc"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 Robert Winkler
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* http://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.github.swagger2markup.assertions;
|
||||||
|
|
||||||
|
import io.github.robwin.diff.DiffAssertions;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.DirectoryStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
public class DiffUtils {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(DiffUtils.class);
|
||||||
|
|
||||||
|
public static void assertThatAllFilesAreEqual(Path expectedDirectory, Path actualDirectory, String reportName) {
|
||||||
|
Path reportPath = Paths.get("build/diff-report/", reportName);
|
||||||
|
try {
|
||||||
|
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(expectedDirectory)) {
|
||||||
|
for (Path expectedFile : directoryStream) {
|
||||||
|
Path actualFile = actualDirectory.resolve(expectedFile.getFileName());
|
||||||
|
LOGGER.info("Diffing file '{}' with '{}'", actualFile, expectedFile);
|
||||||
|
DiffAssertions.assertThat(actualFile).isEqualTo(expectedFile, reportPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed to assert that all files are equal", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void assertThatFileIsEqual(Path expectedFile, Path actualFile, String reportName) {
|
||||||
|
Path reportPath = Paths.get("build/diff-report/", reportName);
|
||||||
|
LOGGER.info("Diffing file '{}' with '{}'", actualFile, expectedFile);
|
||||||
|
DiffAssertions.assertThat(actualFile).isEqualTo(expectedFile, reportPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
1898
openapi2markup/src/test/resources/asciidoc/petstore.adoc
Normal file
1898
openapi2markup/src/test/resources/asciidoc/petstore.adoc
Normal file
File diff suppressed because it is too large
Load Diff
276
openapi2markup/src/test/resources/asciidoc/simple.adoc
Normal file
276
openapi2markup/src/test/resources/asciidoc/simple.adoc
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
= Simple Inventory API
|
||||||
|
<you@your-company.com>
|
||||||
|
v1.0.0
|
||||||
|
:revnumber: 1.0.0
|
||||||
|
:openapi: 3.0.0
|
||||||
|
:authorcount: 1
|
||||||
|
:email: you@your-company.com
|
||||||
|
|
||||||
|
== Overview
|
||||||
|
This is a simple API
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0.html[Apache 2.0]
|
||||||
|
|
||||||
|
== Tags
|
||||||
|
admins::
|
||||||
|
Secured Admin-only calls
|
||||||
|
developers::
|
||||||
|
Operations available to regular developers
|
||||||
|
|
||||||
|
== Servers
|
||||||
|
=== __Server__: /
|
||||||
|
|
||||||
|
== Paths
|
||||||
|
=== __GET__ `/inventory` searches inventory
|
||||||
|
By passing in the appropriate options, you can search for
|
||||||
|
available inventory in the system
|
||||||
|
|
||||||
|
.Parameters
|
||||||
|
[%header,caption=,cols=".^2a,.^3a,.^10a,.^5a"]
|
||||||
|
|===
|
||||||
|
<.<|Type
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**query**
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**searchString** +
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|pass an optional search string for looking up inventory
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**query**
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**limit** +
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|maximum number of records to return
|
||||||
|
|
||||||
|
|
||||||
|
<.<|minimum: 0 +
|
||||||
|
type: integer +
|
||||||
|
maximum: 50 +
|
||||||
|
format: int32
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**query**
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**skip** +
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|number of records to skip for pagination
|
||||||
|
|
||||||
|
|
||||||
|
<.<|minimum: 0 +
|
||||||
|
type: integer +
|
||||||
|
format: int32
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
.Responses
|
||||||
|
[%header,caption=,cols=".^2a,.^14a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Code
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|200
|
||||||
|
|
||||||
|
|
||||||
|
<.<|search results matching criteria
|
||||||
|
|
||||||
|
.Content
|
||||||
|
application/json::
|
||||||
|
+
|
||||||
|
|
||||||
|
type: array
|
||||||
|
|
||||||
|
|
||||||
|
<.<|No Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|400
|
||||||
|
|
||||||
|
|
||||||
|
<.<|bad input parameter
|
||||||
|
|
||||||
|
|
||||||
|
<.<|No Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
|
||||||
|
=== __POST__ `/inventory` adds an inventory item
|
||||||
|
Adds an item to the system
|
||||||
|
|
||||||
|
.Responses
|
||||||
|
[%header,caption=,cols=".^2a,.^14a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Code
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|201
|
||||||
|
|
||||||
|
|
||||||
|
<.<|item created
|
||||||
|
|
||||||
|
|
||||||
|
<.<|No Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|400
|
||||||
|
|
||||||
|
|
||||||
|
<.<|invalid input, object invalid
|
||||||
|
|
||||||
|
|
||||||
|
<.<|No Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|409
|
||||||
|
|
||||||
|
|
||||||
|
<.<|an existing item already exists
|
||||||
|
|
||||||
|
|
||||||
|
<.<|No Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
|
||||||
|
[[_components]]
|
||||||
|
== Components
|
||||||
|
[[_components_schemas]]
|
||||||
|
=== Schemas
|
||||||
|
[[_components_schemas_inventoryitem]]
|
||||||
|
==== InventoryItem
|
||||||
|
|
||||||
|
type: object
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|id
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string +
|
||||||
|
format: uuid
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|name
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|releaseDate
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string +
|
||||||
|
format: date-time
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|manufacturer
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|<<_components_schemas_Manufacturer,Manufacturer>>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
[[_components_schemas_manufacturer]]
|
||||||
|
==== Manufacturer
|
||||||
|
|
||||||
|
type: object
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|name
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|homePage
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string +
|
||||||
|
format: url
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|phone
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|type: string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
|
||||||
@@ -0,0 +1,351 @@
|
|||||||
|
|
||||||
|
[[_components]]
|
||||||
|
== Components
|
||||||
|
[[_components_schemas]]
|
||||||
|
=== Schemas
|
||||||
|
[[_components_schemas_user]]
|
||||||
|
==== User
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|id
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|integer (int64)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|username
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|firstName
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|lastName
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|email
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|password
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|phone
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|userStatus
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|User Status
|
||||||
|
|
||||||
|
|
||||||
|
<.<|integer (int32)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
[[_components_schemas_category]]
|
||||||
|
==== Category
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|id
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|integer (int64)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|name
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|The name of the category
|
||||||
|
|
||||||
|
**Maximum Length**: 255 +
|
||||||
|
**Minimum Length**: 0 +
|
||||||
|
**Default**: DefaultCategory
|
||||||
|
|
||||||
|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
[[_components_schemas_pet]]
|
||||||
|
==== Pet
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|id
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|integer (int64)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|category
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|<<_components_schemas_category>>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|name
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|photoUrls
|
||||||
|
__required__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|< string > array
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|tags
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|< <<_components_schemas_tag>>
|
||||||
|
> array
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|status
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|pet status in the store,
|
||||||
|
|
||||||
|
|
||||||
|
<.<|enum (Dead,Alive)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
[[_components_schemas_tag]]
|
||||||
|
==== Tag
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|id
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|integer (int64)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|name
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
[[_components_schemas_order]]
|
||||||
|
==== Order
|
||||||
|
|
||||||
|
.Properties
|
||||||
|
[%header,caption=,cols=".^4a,.^16a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Name
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Schema
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|id
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|integer (int64)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|petId
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|integer (int64)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|quantity
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|**Maximum**: 10000 +
|
||||||
|
**Minimum**: 0 +
|
||||||
|
**Default**: 0
|
||||||
|
|
||||||
|
|
||||||
|
<.<|integer (int32)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|shipDate
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|string (date-time)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|status
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Order Status
|
||||||
|
|
||||||
|
|
||||||
|
<.<|enum (Ordered,Cancelled)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|complete
|
||||||
|
__optional__
|
||||||
|
|
||||||
|
|
||||||
|
<.<|
|
||||||
|
<.<|boolean
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
|
||||||
|
[[_components_parameters]]
|
||||||
|
=== Responses
|
||||||
|
.Responses
|
||||||
|
[%header,caption=,cols=".^2a,.^14a,.^4a"]
|
||||||
|
|===
|
||||||
|
<.<|Code
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Description
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<.<|InvalidId
|
||||||
|
|
||||||
|
|
||||||
|
<.<|Invalid ID supplied
|
||||||
|
|
||||||
|
|
||||||
|
<.<|No Links
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|===
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
= Swagger Petstore
|
||||||
|
apiteam@swagger.io
|
||||||
|
v1.0.0
|
||||||
|
:revnumber: 1.0.0
|
||||||
|
:openapi: 3.0.0
|
||||||
|
:author: apiteam@swagger.io
|
||||||
|
:authorcount: 1
|
||||||
|
|
||||||
|
|
||||||
|
== Overview
|
||||||
|
This is a sample server Petstore server.
|
||||||
|
|
||||||
|
[Learn about Swagger](http://swagger.io) or join the IRC channel `#swagger` on irc.freenode.net.
|
||||||
|
|
||||||
|
For this sample, you can use the api key `special-key` to test the authorization filters
|
||||||
|
|
||||||
|
http://helloreverb.com/terms/[Terms Of Service]
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0.html[Apache 2.0]
|
||||||
|
|
||||||
|
http://swagger.io[Find out more about Swagger]
|
||||||
|
|
||||||
|
== Tags
|
||||||
|
pet::
|
||||||
|
Pet resource
|
||||||
|
store::
|
||||||
|
Store resource
|
||||||
|
user::
|
||||||
|
User resource
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
14
openapi2markup/src/test/resources/logback.xml
Normal file
14
openapi2markup/src/test/resources/logback.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration scan="true">
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<logger name="io.github.swagger2markup" level="DEBUG"/>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
732
openapi2markup/src/test/resources/open_api/petstore.yaml
Normal file
732
openapi2markup/src/test/resources/open_api/petstore.yaml
Normal file
@@ -0,0 +1,732 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
servers:
|
||||||
|
- url: 'http://localhost:8000/v2/api'
|
||||||
|
info:
|
||||||
|
description: >-
|
||||||
|
This is a sample server Petstore server. You can find out more about
|
||||||
|
Swagger at http://swagger.io or on
|
||||||
|
irc.freenode.net, #swagger. For this sample, you can use the api key
|
||||||
|
"special-key" to test the authorization filters
|
||||||
|
version: 1.0.0
|
||||||
|
title: Swagger Petstore
|
||||||
|
termsOfService: 'http://swagger.io/terms/'
|
||||||
|
contact:
|
||||||
|
name: apiteam@swagger.io
|
||||||
|
license:
|
||||||
|
name: Apache 2.0
|
||||||
|
url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
|
||||||
|
externalDocs:
|
||||||
|
description: Find more info here
|
||||||
|
url: 'https://swagger.io'
|
||||||
|
tags:
|
||||||
|
- name: pet
|
||||||
|
description: Pet Operations
|
||||||
|
externalDocs:
|
||||||
|
url: 'http://swagger.io'
|
||||||
|
- name: user
|
||||||
|
description: All about the Users
|
||||||
|
paths:
|
||||||
|
/pet/add:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Add a new pet to the store
|
||||||
|
description: ''
|
||||||
|
operationId: createPet
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: This is a sample
|
||||||
|
content:
|
||||||
|
text/plain:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
example: 'whoa!'
|
||||||
|
'405':
|
||||||
|
description: Invalid input
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
description: Pet object that needs to be added to the store
|
||||||
|
/pet:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Add a new pet to the store
|
||||||
|
description: ''
|
||||||
|
operationId: addPet
|
||||||
|
responses:
|
||||||
|
'405':
|
||||||
|
description: Invalid input
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
description: Pet object that needs to be added to the store
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Update an existing pet
|
||||||
|
description: ''
|
||||||
|
operationId: updatePet
|
||||||
|
responses:
|
||||||
|
'400':
|
||||||
|
description: Invalid ID supplied
|
||||||
|
'404':
|
||||||
|
description: Pet not found
|
||||||
|
'405':
|
||||||
|
description: Validation exception
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
requestBody:
|
||||||
|
$ref: '#/components/requestBodies/Pet'
|
||||||
|
/pet/findByStatus:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Finds Pets by status
|
||||||
|
description: Multiple status values can be provided with comma seperated strings
|
||||||
|
operationId: findPetsByStatus
|
||||||
|
parameters:
|
||||||
|
- name: status
|
||||||
|
in: query
|
||||||
|
description: Status values that need to be considered for filter
|
||||||
|
required: false
|
||||||
|
style: pipeDelimited
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
default: available
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/PetArray'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/PetArray'
|
||||||
|
'400':
|
||||||
|
description: Invalid status value
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
/pet/findByTags:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Finds Pets by tags
|
||||||
|
description: >-
|
||||||
|
Muliple tags can be provided with comma seperated strings. Use tag1,
|
||||||
|
tag2, tag3 for testing.
|
||||||
|
operationId: findPetsByTags
|
||||||
|
parameters:
|
||||||
|
- name: tags
|
||||||
|
in: query
|
||||||
|
description: Tags to filter by
|
||||||
|
required: false
|
||||||
|
explode: true
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
'400':
|
||||||
|
description: Invalid tag value
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
'/pet/{petId}':
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Find pet by ID
|
||||||
|
description: >-
|
||||||
|
Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API
|
||||||
|
error conditions
|
||||||
|
operationId: getPetById
|
||||||
|
parameters:
|
||||||
|
- name: petId
|
||||||
|
in: path
|
||||||
|
description: ID of pet that needs to be fetched
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
'400':
|
||||||
|
description: Invalid ID supplied
|
||||||
|
'404':
|
||||||
|
description: Pet not found
|
||||||
|
security:
|
||||||
|
- api_key: []
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Updates a pet in the store with form data
|
||||||
|
description: ''
|
||||||
|
operationId: updatePetWithForm
|
||||||
|
parameters:
|
||||||
|
- name: petId
|
||||||
|
in: path
|
||||||
|
description: ID of pet that needs to be updated
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'405':
|
||||||
|
description: Invalid input
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/x-www-form-urlencoded:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Updated name of the pet
|
||||||
|
type: string
|
||||||
|
status:
|
||||||
|
description: Updated status of the pet
|
||||||
|
type: string
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Deletes a pet
|
||||||
|
description: ''
|
||||||
|
operationId: deletePet
|
||||||
|
parameters:
|
||||||
|
- name: api_key
|
||||||
|
in: header
|
||||||
|
description: ''
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: petId
|
||||||
|
in: path
|
||||||
|
description: Pet id to delete
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
responses:
|
||||||
|
'400':
|
||||||
|
description: Invalid pet value
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
description: Pet extra params that needs to be deleted
|
||||||
|
'/pet/{petId}/uploadImage':
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: uploads an image
|
||||||
|
description: ''
|
||||||
|
operationId: uploadFile
|
||||||
|
parameters:
|
||||||
|
- name: petId
|
||||||
|
in: path
|
||||||
|
description: ID of pet to update
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/ApiResponse"
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- 'write:pets'
|
||||||
|
- 'read:pets'
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
multipart/form-data:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
additionalMetadata:
|
||||||
|
description: Additional data to pass to server
|
||||||
|
type: string
|
||||||
|
file:
|
||||||
|
description: file to upload
|
||||||
|
type: string
|
||||||
|
format: binary
|
||||||
|
/store/inventory:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Returns pet inventories by status
|
||||||
|
description: Returns a map of status codes to quantities
|
||||||
|
operationId: get inventory+1
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
additionalProperties:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
additionalProperties:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
security:
|
||||||
|
- api_key: []
|
||||||
|
/store/order:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Place an order for a pet
|
||||||
|
description: ''
|
||||||
|
operationId: placeOrder
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Order'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Order'
|
||||||
|
'400':
|
||||||
|
description: Invalid Order
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Order'
|
||||||
|
description: order placed for purchasing the pet
|
||||||
|
'/store/order/{orderId}':
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Find purchase order by ID
|
||||||
|
description: >-
|
||||||
|
For valid response try integer IDs with value <= 5 or > 10. Other values
|
||||||
|
will generated exceptions
|
||||||
|
operationId: getOrderById
|
||||||
|
parameters:
|
||||||
|
- name: orderId
|
||||||
|
in: path
|
||||||
|
description: ID of pet that needs to be fetched
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Order'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Order'
|
||||||
|
'400':
|
||||||
|
description: Invalid ID supplied
|
||||||
|
'404':
|
||||||
|
description: Order not found
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Delete purchase order by ID
|
||||||
|
description: >-
|
||||||
|
For valid response try integer IDs with value < 1000. Anything above
|
||||||
|
1000 or nonintegers will generate API errors
|
||||||
|
operationId: deleteOrder
|
||||||
|
parameters:
|
||||||
|
- name: orderId
|
||||||
|
in: path
|
||||||
|
description: ID of the order that needs to be deleted
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'400':
|
||||||
|
description: Invalid ID supplied
|
||||||
|
'404':
|
||||||
|
description: Order not found
|
||||||
|
/user:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Create user
|
||||||
|
description: This can only be done by the logged in user.
|
||||||
|
operationId: createUser
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
content:
|
||||||
|
'application/json':
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
# default is text/plain
|
||||||
|
type: string
|
||||||
|
format: text
|
||||||
|
examples:
|
||||||
|
foo:
|
||||||
|
value: {"foo": "bar"}
|
||||||
|
bar:
|
||||||
|
summary: A bar example
|
||||||
|
value: {"bar": "baz"}
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/User'
|
||||||
|
description: Created user object
|
||||||
|
/user/createWithArray:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Creates list of users with given input array
|
||||||
|
description: ''
|
||||||
|
operationId: createUsersWithArrayInput
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
requestBody:
|
||||||
|
$ref: '#/components/requestBodies/UserArray'
|
||||||
|
/user/createWithList:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Creates list of users with given input array
|
||||||
|
description: ''
|
||||||
|
operationId: createUsersWithListInput
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
requestBody:
|
||||||
|
$ref: '#/components/requestBodies/UserArray'
|
||||||
|
/user/login:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
security:
|
||||||
|
- https
|
||||||
|
summary: Logs user into the system
|
||||||
|
description: ''
|
||||||
|
operationId: loginUser
|
||||||
|
parameters:
|
||||||
|
- name: username
|
||||||
|
in: query
|
||||||
|
description: The user name for login
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: password
|
||||||
|
in: query
|
||||||
|
description: The password for login in clear text
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
'400':
|
||||||
|
description: Invalid username/password supplied
|
||||||
|
/user/logout:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
security:
|
||||||
|
- https
|
||||||
|
summary: Logs out current logged in user session
|
||||||
|
description: ''
|
||||||
|
operationId: logoutUser
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
'/user/{username}':
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Get user by user name
|
||||||
|
description: ''
|
||||||
|
operationId: getUserByName
|
||||||
|
parameters:
|
||||||
|
- name: username
|
||||||
|
in: path
|
||||||
|
description: 'The name that needs to be fetched. Use user1 for testing.'
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/User'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/User'
|
||||||
|
'400':
|
||||||
|
description: Invalid username supplied
|
||||||
|
'404':
|
||||||
|
description: User not found
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Updated user
|
||||||
|
description: This can only be done by the logged in user.
|
||||||
|
operationId: updateUser
|
||||||
|
parameters:
|
||||||
|
- name: username
|
||||||
|
in: path
|
||||||
|
description: name that need to be deleted
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'400':
|
||||||
|
description: Invalid user supplied
|
||||||
|
'404':
|
||||||
|
description: User not found
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/User'
|
||||||
|
description: Updated user object
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Delete user
|
||||||
|
description: This can only be done by the logged in user.
|
||||||
|
operationId: deleteUser
|
||||||
|
parameters:
|
||||||
|
- name: username
|
||||||
|
in: path
|
||||||
|
description: The name that needs to be deleted
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'400':
|
||||||
|
description: Invalid username supplied
|
||||||
|
'404':
|
||||||
|
description: User not found
|
||||||
|
security:
|
||||||
|
- foo:
|
||||||
|
- bar
|
||||||
|
- baz
|
||||||
|
a:
|
||||||
|
- b
|
||||||
|
- c
|
||||||
|
components:
|
||||||
|
parameters:
|
||||||
|
sharedSkip:
|
||||||
|
name: skip
|
||||||
|
in: query
|
||||||
|
description: Results to skip
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
responses:
|
||||||
|
veryBad:
|
||||||
|
description: failed
|
||||||
|
requestBodies:
|
||||||
|
UserArray:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/User'
|
||||||
|
description: List of user object
|
||||||
|
Pet:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
description: Pet object that needs to be added to the store
|
||||||
|
securitySchemes:
|
||||||
|
api_key:
|
||||||
|
type: apiKey
|
||||||
|
name: api_key
|
||||||
|
in: header
|
||||||
|
petstore_auth:
|
||||||
|
type: oauth2
|
||||||
|
flows:
|
||||||
|
implicit:
|
||||||
|
authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
|
||||||
|
scopes:
|
||||||
|
'write:pets': modify pets in your account
|
||||||
|
'read:pets': read your pets
|
||||||
|
schemas:
|
||||||
|
User:
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
username:
|
||||||
|
type: string
|
||||||
|
firstName:
|
||||||
|
type: string
|
||||||
|
lastName:
|
||||||
|
type: string
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
password:
|
||||||
|
type: string
|
||||||
|
phone:
|
||||||
|
type: string
|
||||||
|
userStatus:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
description: User Status
|
||||||
|
xml:
|
||||||
|
name: User
|
||||||
|
Category:
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
xml:
|
||||||
|
name: Category
|
||||||
|
Pet:
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- photoUrls
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
category:
|
||||||
|
$ref: '#/components/schemas/Category'
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: doggie
|
||||||
|
photoUrls:
|
||||||
|
type: array
|
||||||
|
xml:
|
||||||
|
name: photoUrl
|
||||||
|
wrapped: true
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
tags:
|
||||||
|
type: array
|
||||||
|
xml:
|
||||||
|
name: tag
|
||||||
|
wrapped: true
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Tag'
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
description: pet status in the store
|
||||||
|
xml:
|
||||||
|
name: Pet
|
||||||
|
Tag:
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
xml:
|
||||||
|
name: Tag
|
||||||
|
Order:
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
petId:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
quantity:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
shipDate:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
description: Order Status
|
||||||
|
complete:
|
||||||
|
type: boolean
|
||||||
|
xml:
|
||||||
|
name: Order
|
||||||
|
PetArray:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
115
openapi2markup/src/test/resources/open_api/simple.yaml
Normal file
115
openapi2markup/src/test/resources/open_api/simple.yaml
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
description: This is a simple API
|
||||||
|
version: "1.0.0"
|
||||||
|
title: Simple Inventory API
|
||||||
|
contact:
|
||||||
|
email: you@your-company.com
|
||||||
|
license:
|
||||||
|
name: Apache 2.0
|
||||||
|
url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
|
||||||
|
tags:
|
||||||
|
- name: admins
|
||||||
|
description: Secured Admin-only calls
|
||||||
|
- name: developers
|
||||||
|
description: Operations available to regular developers
|
||||||
|
paths:
|
||||||
|
/inventory:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- developers
|
||||||
|
summary: searches inventory
|
||||||
|
operationId: searchInventory
|
||||||
|
description: |
|
||||||
|
By passing in the appropriate options, you can search for
|
||||||
|
available inventory in the system
|
||||||
|
parameters:
|
||||||
|
- in: query
|
||||||
|
name: searchString
|
||||||
|
description: pass an optional search string for looking up inventory
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- in: query
|
||||||
|
name: skip
|
||||||
|
description: number of records to skip for pagination
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
minimum: 0
|
||||||
|
- in: query
|
||||||
|
name: limit
|
||||||
|
description: maximum number of records to return
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
minimum: 0
|
||||||
|
maximum: 50
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: search results matching criteria
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/InventoryItem'
|
||||||
|
'400':
|
||||||
|
description: bad input parameter
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- admins
|
||||||
|
summary: adds an inventory item
|
||||||
|
operationId: addInventory
|
||||||
|
description: Adds an item to the system
|
||||||
|
responses:
|
||||||
|
'201':
|
||||||
|
description: item created
|
||||||
|
'400':
|
||||||
|
description: 'invalid input, object invalid'
|
||||||
|
'409':
|
||||||
|
description: an existing item already exists
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/InventoryItem'
|
||||||
|
description: Inventory item to add
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
InventoryItem:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- manufacturer
|
||||||
|
- releaseDate
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
format: uuid
|
||||||
|
example: d290f1ee-6c54-4b01-90e6-d701748f0851
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: Widget Adapter
|
||||||
|
releaseDate:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
example: '2016-08-29T09:12:33.001Z'
|
||||||
|
manufacturer:
|
||||||
|
$ref: '#/components/schemas/Manufacturer'
|
||||||
|
Manufacturer:
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: ACME Corporation
|
||||||
|
homePage:
|
||||||
|
type: string
|
||||||
|
format: url
|
||||||
|
example: 'https://www.acme-corp.com'
|
||||||
|
phone:
|
||||||
|
type: string
|
||||||
|
example: 408-867-5309
|
||||||
|
type: object
|
||||||
693
openapi2markup/src/test/resources/yaml/swagger_petstore.yaml
Normal file
693
openapi2markup/src/test/resources/yaml/swagger_petstore.yaml
Normal file
@@ -0,0 +1,693 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
description: >
|
||||||
|
This is a sample server Petstore server.
|
||||||
|
|
||||||
|
|
||||||
|
[Learn about Swagger](http://swagger.io) or join the IRC channel `#swagger` on irc.freenode.net.
|
||||||
|
|
||||||
|
|
||||||
|
For this sample, you can use the api key `special-key` to test the authorization filters
|
||||||
|
version: 1.0.0
|
||||||
|
title: Swagger Petstore
|
||||||
|
termsOfService: http://helloreverb.com/terms/
|
||||||
|
contact:
|
||||||
|
name: apiteam@swagger.io
|
||||||
|
license:
|
||||||
|
name: Apache 2.0
|
||||||
|
url: http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
tags:
|
||||||
|
- name: pet
|
||||||
|
description: Pet resource
|
||||||
|
- name: store
|
||||||
|
description: Store resource
|
||||||
|
- name: user
|
||||||
|
description: User resource
|
||||||
|
paths:
|
||||||
|
/pets:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Add a new pet to the store
|
||||||
|
description: ""
|
||||||
|
operationId: addPet
|
||||||
|
requestBody:
|
||||||
|
$ref: "#/components/requestBodies/Pet"
|
||||||
|
responses:
|
||||||
|
"405":
|
||||||
|
description: Invalid input
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Update an existing pet
|
||||||
|
description: ""
|
||||||
|
operationId: updatePet
|
||||||
|
requestBody:
|
||||||
|
$ref: "#/components/requestBodies/Pet"
|
||||||
|
responses:
|
||||||
|
"400":
|
||||||
|
$ref: "#/components/responses/InvalidId"
|
||||||
|
"404":
|
||||||
|
description: Pet not found
|
||||||
|
"405":
|
||||||
|
description: Validation exception
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
/pets/findByStatus:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Finds Pets by status
|
||||||
|
description: Multiple status values can be provided with comma seperated strings
|
||||||
|
operationId: findPetsByStatus
|
||||||
|
parameters:
|
||||||
|
- in: query
|
||||||
|
name: status
|
||||||
|
description: Status values that need to be considered for filter
|
||||||
|
required: false
|
||||||
|
explode: true
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
"400":
|
||||||
|
description: Invalid status value
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
/pets/findByTags:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Finds Pets by tags
|
||||||
|
description: Muliple tags can be provided with comma seperated strings. Use tag1,
|
||||||
|
tag2, tag3 for testing.
|
||||||
|
operationId: findPetsByTags
|
||||||
|
parameters:
|
||||||
|
- in: query
|
||||||
|
name: tags
|
||||||
|
description: Tags to filter by
|
||||||
|
required: false
|
||||||
|
example: adorable
|
||||||
|
explode: true
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
"400":
|
||||||
|
description: Invalid tag value
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
"/pets/{petId}":
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Find pet by ID
|
||||||
|
description: Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API
|
||||||
|
error conditions
|
||||||
|
operationId: getPetById
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: petId
|
||||||
|
description: ID of pet that needs to be fetched
|
||||||
|
required: true
|
||||||
|
example: 30
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
"400":
|
||||||
|
$ref: "#/components/responses/InvalidId"
|
||||||
|
"404":
|
||||||
|
description: Pet not found
|
||||||
|
security:
|
||||||
|
- api_key: []
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Updates a pet in the store with form data
|
||||||
|
description: ""
|
||||||
|
operationId: updatePetWithForm
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: petId
|
||||||
|
description: ID of pet that needs to be updated
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/x-www-form-urlencoded:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Updated name of the pet
|
||||||
|
type: string
|
||||||
|
status:
|
||||||
|
description: Updated status of the pet
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- status
|
||||||
|
responses:
|
||||||
|
"405":
|
||||||
|
description: Invalid input
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- pet
|
||||||
|
summary: Deletes a pet
|
||||||
|
description: ""
|
||||||
|
operationId: deletePet
|
||||||
|
parameters:
|
||||||
|
- in: header
|
||||||
|
name: api_key
|
||||||
|
description: ""
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- in: path
|
||||||
|
name: petId
|
||||||
|
description: Pet id to delete
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
responses:
|
||||||
|
"400":
|
||||||
|
description: Invalid pet value
|
||||||
|
security:
|
||||||
|
- petstore_auth:
|
||||||
|
- write_pets
|
||||||
|
- read_pets
|
||||||
|
/stores/order:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Place an order for a pet
|
||||||
|
description: ""
|
||||||
|
operationId: placeOrder
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Order"
|
||||||
|
description: order placed for purchasing the pet
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Order"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Order"
|
||||||
|
"400":
|
||||||
|
description: Invalid Order
|
||||||
|
"/stores/order/{orderId}":
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Find purchase order by ID
|
||||||
|
description: For valid response try integer IDs with value <= 5 or > 10. Other values
|
||||||
|
will generated exceptions
|
||||||
|
operationId: getOrderById
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: orderId
|
||||||
|
description: ID of pet that needs to be fetched
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Order"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Order"
|
||||||
|
"400":
|
||||||
|
$ref: "#/components/responses/InvalidId"
|
||||||
|
"404":
|
||||||
|
description: Order not found
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- store
|
||||||
|
summary: Delete purchase order by ID
|
||||||
|
description: For valid response try integer IDs with value < 1000. Anything above
|
||||||
|
1000 or nonintegers will generate API errors
|
||||||
|
operationId: deleteOrder
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: orderId
|
||||||
|
description: ID of the order that needs to be deleted
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"400":
|
||||||
|
$ref: "#/components/responses/InvalidId"
|
||||||
|
"404":
|
||||||
|
description: Order not found
|
||||||
|
/users:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Create user
|
||||||
|
description: This can only be done by the logged in user.
|
||||||
|
operationId: createUser
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/User"
|
||||||
|
description: Created user object
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
/users/createWithArray:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Creates list of users with given input array
|
||||||
|
description: ""
|
||||||
|
operationId: createUsersWithArrayInput
|
||||||
|
requestBody:
|
||||||
|
$ref: "#/components/requestBodies/UserArray"
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
/users/createWithList:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Creates list of users with given input array
|
||||||
|
description: ""
|
||||||
|
operationId: createUsersWithListInput
|
||||||
|
requestBody:
|
||||||
|
$ref: "#/components/requestBodies/UserArray"
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
/users/login:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Logs user into the system
|
||||||
|
description: ""
|
||||||
|
operationId: loginUser
|
||||||
|
parameters:
|
||||||
|
- in: query
|
||||||
|
name: username
|
||||||
|
description: The user name for login
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- in: query
|
||||||
|
name: password
|
||||||
|
description: The password for login in clear text
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
"400":
|
||||||
|
description: Invalid username/password supplied
|
||||||
|
/users/logout:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Logs out current logged in user session
|
||||||
|
description: ""
|
||||||
|
operationId: logoutUser
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: successful operation
|
||||||
|
"/users/{username}":
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Get user by user name
|
||||||
|
description: ""
|
||||||
|
operationId: getUserByName
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: username
|
||||||
|
description: The name that needs to be fetched. Use user1 for testing.
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: successful operation
|
||||||
|
headers:
|
||||||
|
X-Rate-Limit-Limit:
|
||||||
|
description: The number of allowed requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Remaining:
|
||||||
|
description: The number of remaining requests in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
X-Rate-Limit-Reset:
|
||||||
|
description: The number of seconds left in the current period
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/User"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/User"
|
||||||
|
"400":
|
||||||
|
description: Invalid username supplied
|
||||||
|
"404":
|
||||||
|
description: User not found
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Updated user
|
||||||
|
description: This can only be done by the logged in user.
|
||||||
|
operationId: updateUser
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: username
|
||||||
|
description: name that need to be deleted
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/User"
|
||||||
|
description: Updated user object
|
||||||
|
responses:
|
||||||
|
"400":
|
||||||
|
description: Invalid user supplied
|
||||||
|
"404":
|
||||||
|
description: User not found
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
summary: Delete user
|
||||||
|
description: This can only be done by the logged in user.
|
||||||
|
operationId: deleteUser
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: username
|
||||||
|
description: The name that needs to be deleted
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"400":
|
||||||
|
description: Invalid username supplied
|
||||||
|
"404":
|
||||||
|
description: User not found
|
||||||
|
externalDocs:
|
||||||
|
description: Find out more about Swagger
|
||||||
|
url: http://swagger.io
|
||||||
|
servers:
|
||||||
|
- url: http://petstore.swagger.io/v2
|
||||||
|
components:
|
||||||
|
responses:
|
||||||
|
InvalidId:
|
||||||
|
description: Invalid ID supplied
|
||||||
|
requestBodies:
|
||||||
|
UserArray:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/User"
|
||||||
|
description: List of user object
|
||||||
|
Pet:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
application/xml:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Pet"
|
||||||
|
description: Pet object that needs to be added to the store
|
||||||
|
securitySchemes:
|
||||||
|
api_key:
|
||||||
|
type: apiKey
|
||||||
|
name: api_key
|
||||||
|
in: header
|
||||||
|
description: This is another description
|
||||||
|
petstore_auth:
|
||||||
|
type: oauth2
|
||||||
|
description: This is a standard oauth flow
|
||||||
|
flows:
|
||||||
|
implicit:
|
||||||
|
authorizationUrl: http://petstore.swagger.io/api/oauth/dialog
|
||||||
|
scopes:
|
||||||
|
write_pets: modify pets in your account
|
||||||
|
read_pets: read your pets
|
||||||
|
schemas:
|
||||||
|
User:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
username:
|
||||||
|
type: string
|
||||||
|
firstName:
|
||||||
|
type: string
|
||||||
|
lastName:
|
||||||
|
type: string
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
password:
|
||||||
|
type: string
|
||||||
|
phone:
|
||||||
|
type: string
|
||||||
|
userStatus:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
description: User Status
|
||||||
|
Category:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
description: The name of the category
|
||||||
|
minLength: 0
|
||||||
|
maxLength: 255
|
||||||
|
pattern: "[A-Za-zäöüÄÖÜß]{0,255}"
|
||||||
|
default: DefaultCategory
|
||||||
|
example: FoobarCategory
|
||||||
|
Pet:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- photoUrls
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
category:
|
||||||
|
$ref: "#/components/schemas/Category"
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: doggie
|
||||||
|
photoUrls:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
tags:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Tag"
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
description: pet status in the store,
|
||||||
|
enum:
|
||||||
|
- Dead
|
||||||
|
- Alive
|
||||||
|
Tag:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
Order:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
petId:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
quantity:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
minimum: 0
|
||||||
|
maximum: 10000
|
||||||
|
default: 0
|
||||||
|
example: 10
|
||||||
|
shipDate:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
description: Order Status
|
||||||
|
enum:
|
||||||
|
- Ordered
|
||||||
|
- Cancelled
|
||||||
|
complete:
|
||||||
|
type: boolean
|
||||||
@@ -44,8 +44,36 @@ artifacts {
|
|||||||
archives javadocJar
|
archives javadocJar
|
||||||
}
|
}
|
||||||
|
|
||||||
signing {
|
bintray {
|
||||||
sign publishing.publications
|
user = project.hasProperty('bintrayUsername') ? project.property('bintrayUsername') : ''
|
||||||
|
key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : ''
|
||||||
|
dryRun = false //Whether to run this as dry-run, without deploying
|
||||||
|
publish = true //If version should be auto published after an upload
|
||||||
|
publications = ['mavenJava']
|
||||||
|
pkg {
|
||||||
|
repo = 'Maven'
|
||||||
|
name = "${projectArtifactId}"
|
||||||
|
userOrg = "${projectArtifactId}"
|
||||||
|
websiteUrl = "${projectUrl}"
|
||||||
|
issueTrackerUrl = issuesUrl
|
||||||
|
vcsUrl = scmUrl
|
||||||
|
desc = project.description
|
||||||
|
licenses = ['Apache-2.0']
|
||||||
|
version {
|
||||||
|
name = project.version
|
||||||
|
vcsTag = "v${project.version}"
|
||||||
|
gpg {
|
||||||
|
sign = true //Determines whether to GPG sign the files. The default is false
|
||||||
|
//Optional. The passphrase for GPG signing'
|
||||||
|
passphrase = project.hasProperty('gpgPassphrase') ? project.property('gpgPassphrase') : ''
|
||||||
|
}
|
||||||
|
mavenCentralSync {
|
||||||
|
sync = true //Optional (true by default). Determines whether to sync the version to Maven Central.
|
||||||
|
user = project.hasProperty('ossUser') ? project.property('ossUser') : '' //OSS user token
|
||||||
|
password = project.hasProperty('ossPassword') ? project.property('ossPassword') : '' //OSS user password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
|
|||||||
@@ -6,4 +6,5 @@ include 'swagger2markup-builder'
|
|||||||
include 'swagger2markup-documentation'
|
include 'swagger2markup-documentation'
|
||||||
include 'swagger2markup'
|
include 'swagger2markup'
|
||||||
include 'swagger2markup-core'
|
include 'swagger2markup-core'
|
||||||
|
include 'openapi2markup'
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,12 @@
|
|||||||
description = "swagger2markup bom"
|
description = "swagger2markup bom"
|
||||||
|
|
||||||
apply plugin: 'maven-publish'
|
apply plugin: 'maven-publish'
|
||||||
apply plugin: 'signing'
|
|
||||||
|
|
||||||
def projectArtifactId = 'swagger2markup'
|
|
||||||
def url = 'https://github.com/Swagger2Markup/swagger2markup'
|
|
||||||
|
|
||||||
signing {
|
|
||||||
sign publishing.publications
|
|
||||||
}
|
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
mavenJava(MavenPublication) {
|
mavenJava(MavenPublication) {
|
||||||
from components.java
|
from components.java
|
||||||
pom.withXml {
|
pom.withXml {
|
||||||
def devs = ['RobWin': 'Robert Winkler',
|
|
||||||
'austek': 'Ali Ustek']
|
|
||||||
|
|
||||||
asNode().appendNode('packaging', 'pom')
|
asNode().appendNode('packaging', 'pom')
|
||||||
|
|
||||||
def license = asNode().appendNode('licenses').appendNode('license')
|
def license = asNode().appendNode('licenses').appendNode('license')
|
||||||
@@ -25,12 +14,6 @@ publishing {
|
|||||||
license.appendNode('url', 'https://github.com/Swagger2Markup/swagger2markup/blob/master/LICENSE.txt')
|
license.appendNode('url', 'https://github.com/Swagger2Markup/swagger2markup/blob/master/LICENSE.txt')
|
||||||
license.appendNode('distribution', 'repo')
|
license.appendNode('distribution', 'repo')
|
||||||
|
|
||||||
def root = asNode()
|
|
||||||
|
|
||||||
root.appendNode('name', "${projectArtifactId}")
|
|
||||||
root.appendNode('url', "${url}")
|
|
||||||
root.appendNode('description', project.description)
|
|
||||||
|
|
||||||
asNode().appendNode('scm').appendNode('url', 'https://github.com/Swagger2Markup/swagger2markup.git')
|
asNode().appendNode('scm').appendNode('url', 'https://github.com/Swagger2Markup/swagger2markup.git')
|
||||||
|
|
||||||
Node deps = asNode().appendNode('dependencyManagement').appendNode('dependencies')
|
Node deps = asNode().appendNode('dependencyManagement').appendNode('dependencies')
|
||||||
@@ -40,13 +23,6 @@ publishing {
|
|||||||
dep.appendNode('artifactId').value = it.name
|
dep.appendNode('artifactId').value = it.name
|
||||||
dep.appendNode('version').value = it.version
|
dep.appendNode('version').value = it.version
|
||||||
}
|
}
|
||||||
|
|
||||||
def developers = root.appendNode('developers')
|
|
||||||
devs.each {
|
|
||||||
def d = developers.appendNode('developer')
|
|
||||||
d.appendNode('id', it.key)
|
|
||||||
d.appendNode('name', it.value)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,15 +20,15 @@ package io.github.swagger2markup.markup.builder;
|
|||||||
|
|
||||||
public enum LineSeparator {
|
public enum LineSeparator {
|
||||||
/**
|
/**
|
||||||
* Line separator for Unix systems (<code>\n</code>).
|
* Line separator for Unix systems (<tt>\n</tt>).
|
||||||
*/
|
*/
|
||||||
UNIX("\n"),
|
UNIX("\n"),
|
||||||
/**
|
/**
|
||||||
* Line separator for Windows systems (<code>\r\n</code>).
|
* Line separator for Windows systems (<tt>\r\n</tt>).
|
||||||
*/
|
*/
|
||||||
WINDOWS("\r\n"),
|
WINDOWS("\r\n"),
|
||||||
/**
|
/**
|
||||||
* Line separator for Macintosh systems (<code>\r</code>).
|
* Line separator for Macintosh systems (<tt>\r</tt>).
|
||||||
*/
|
*/
|
||||||
MAC("\r");
|
MAC("\r");
|
||||||
|
|
||||||
|
|||||||
@@ -20,15 +20,15 @@ package io.github.swagger2markup.config;
|
|||||||
|
|
||||||
public enum LineSeparator {
|
public enum LineSeparator {
|
||||||
/**
|
/**
|
||||||
* Line separator for Unix systems (<code>\n</code>).
|
* Line separator for Unix systems (<tt>\n</tt>).
|
||||||
*/
|
*/
|
||||||
UNIX("\n"),
|
UNIX("\n"),
|
||||||
/**
|
/**
|
||||||
* Line separator for Windows systems (<code>\r\n</code>).
|
* Line separator for Windows systems (<tt>\r\n</tt>).
|
||||||
*/
|
*/
|
||||||
WINDOWS("\r\n"),
|
WINDOWS("\r\n"),
|
||||||
/**
|
/**
|
||||||
* Line separator for Macintosh systems (<code>\r</code>).
|
* Line separator for Macintosh systems (<tt>\r</tt>).
|
||||||
*/
|
*/
|
||||||
MAC("\r");
|
MAC("\r");
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,7 @@
|
|||||||
apply plugin: "org.asciidoctor.convert"
|
apply plugin: 'org.asciidoctor.convert'
|
||||||
apply plugin: 'org.ajoberstar.github-pages'
|
apply plugin: 'org.ajoberstar.github-pages'
|
||||||
|
|
||||||
dependencies {
|
artifactoryPublish.skip=true
|
||||||
|
|
||||||
configurations.all {
|
|
||||||
resolutionStrategy.force dependencyOverrides.jnrConstants
|
|
||||||
resolutionStrategy.force dependencyOverrides.jnrEnxio
|
|
||||||
resolutionStrategy.force dependencyOverrides.jnrPosix
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//artifactoryPublish.skip=true
|
|
||||||
sonarqube.skipProject=true
|
sonarqube.skipProject=true
|
||||||
|
|
||||||
asciidoctor.dependsOn test
|
asciidoctor.dependsOn test
|
||||||
@@ -19,7 +10,7 @@ asciidoctor {
|
|||||||
sources {
|
sources {
|
||||||
include 'index.adoc'
|
include 'index.adoc'
|
||||||
}
|
}
|
||||||
backends = ['html5']
|
backends = ['html5', 'pdf']
|
||||||
attributes = [
|
attributes = [
|
||||||
doctype: 'book',
|
doctype: 'book',
|
||||||
toc: 'left',
|
toc: 'left',
|
||||||
|
|||||||
Reference in New Issue
Block a user