Compare commits

...

21 Commits

Author SHA1 Message Date
ShubhamRwt
504bdb8e6c fixed gh pages 2022-03-01 12:44:13 +05:30
ShubhamRwt
0b6f4fb7e6 Fixing the docmentation for 1.3.4 2022-02-25 16:37:16 +05:30
ShubhamRwt
8748254d5a fixes for releasing 1.3.4 2022-02-22 14:56:21 +05:30
ShubhamRwt
7917565654 fixes for releasing 1.3.4 2022-02-22 14:22:38 +05:30
ShubhamRwt
30b41b0d70 Releasing 1.3.4 2022-02-22 13:49:22 +05:30
ShubhamRwt
a421b6d83a Releasing 1.3.4 2022-02-22 13:40:35 +05:30
ShubhamRwt
a8665290a0 Releasing 1.3.4 2022-02-21 15:25:20 +05:30
ShubhamRwt
61af76927e Release notes for 1.3.4 2022-02-21 15:14:33 +05:30
Shubham Rawat
2ffe3d5b8e Merge pull request #432 from Swagger2Markup/revert-431-signing
Revert "Added signing"
2022-02-18 22:03:47 +05:30
Shubham Rawat
03b5c42696 Revert "Added signing" 2022-02-18 22:03:27 +05:30
Shubham Rawat
f9b812a58d Merge pull request #431 from ShubhamRwt/signing
Added signing
2022-02-18 22:00:21 +05:30
ShubhamRwt
16cd99aece changes 2022-02-18 21:51:07 +05:30
ShubhamRwt
368bed514e github action file changes 2022-02-18 17:10:50 +05:30
Shubham Rawat
1492c40fc2 Merge pull request #430 from ShubhamRwt/github
github action file
2022-02-17 16:20:52 +05:30
Shubham Rawat
dafa73832e Update gradle-build.yml 2022-02-17 16:18:03 +05:30
Shubham Rawat
702a2cb180 Update gradle-build.yml 2022-02-17 15:38:54 +05:30
ShubhamRwt
89dbbc284b github action file 2022-02-17 15:30:04 +05:30
Shubham Rawat
6023d015b6 Merge pull request #429 from ShubhamRwt/1.3.x
Changing the build.gradle file
2022-02-17 15:22:55 +05:30
ShubhamRwt
ea2e61cfd9 Changing the build.gradle 2022-02-17 15:22:06 +05:30
ShubhamRwt
bdcbd0069c Changing the build.gradle 2022-02-17 15:15:54 +05:30
austek
859312b7d2 Remove OpenApi2Markup for 1.3.x release 2020-11-11 06:00:16 +00:00
60 changed files with 151 additions and 8819 deletions

82
.github/workflows/gradle-build.yml vendored Normal file
View File

@@ -0,0 +1,82 @@
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Build
on:
push:
branches: [ 1.3.x ]
pull_request:
branches: [ 1.3.x ]
jobs:
validation:
name: "Gradle wrapper validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.3.5
- uses: gradle/wrapper-validation-action@v1.0.4
build:
name: "Build and publish"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.3.5
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'temurin'
- name: Cache SonarCloud packages
uses: actions/cache@v2.1.6
if: env.SONAR_TOKEN != null && env.SONAR_TOKEN != ''
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Build
id: gradle
uses: eskatos/gradle-command-action@v1
with:
arguments: check
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true
- name: "Comment build scan url"
uses: actions/github-script@v5
if: github.event_name == 'pull_request' && failure()
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '❌ ${{ github.workflow }} failed: ${{ steps.gradle.outputs.build-scan-url }}'
})
- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action/composite@v1
if: always()
with:
files: '**/test-results/**/*.xml'
- name: Analyze with SonarCloud
continue-on-error: true
if: env.SONAR_TOKEN != null && env.SONAR_TOKEN != ''
uses: eskatos/gradle-command-action@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
arguments: sonarqube -Psonar.organization=swagger2markup
dependencies-cache-enabled: true
configuration-cache-enabled: true
- name: Publish to Sonatype
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/1.3.x' }}
uses: eskatos/gradle-command-action@v1
env:
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USER }}
ORG_GRADLE_PROJECT_sonatypePassword : ${{ secrets.SONATYPE_PASSWORD }}
with:
arguments: publishToSonatype
dependencies-cache-enabled: true
configuration-cache-enabled: true

View File

@@ -38,7 +38,7 @@ image::swagger2markup-documentation/src/docs/asciidoc/images/Swagger2Markup.PNG[
image::swagger2markup-documentation/src/docs/asciidoc/images/Swagger2Markup_definitions.PNG[]
== Reference documentation
- http://swagger2markup.github.io/swagger2markup/1.3.3/[Reference Documentation]
- http://swagger2markup.github.io/swagger2markup/1.3.4/[Reference Documentation]
- 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]

View File

@@ -163,7 +163,10 @@
* 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
=== Version 2.0.0
* Added openapi2markup to support OpenAPI v3
* Issue #409: Fixed JSON response example
=== Version 1.3.4
* Moved from bintray to Sonatype
* Introduced Github actions
* Certain bug fixes
* Added support for MIME types with structured syntax suffixes (#410)

View File

@@ -1,55 +1,49 @@
plugins {
id "org.sonarqube" version "2.7"
id "com.jfrog.bintray" version "1.8.4"
id "me.champeau.gradle.jmh" version "0.4.8"
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 "io.github.gradle-nexus.publish-plugin" version "1.1.0"
}
apply plugin: 'idea'
apply from: "${rootDir}/libraries.gradle"
ext {
releaseVersion = '1.3.3'
releaseVersion = '1.3.4'
}
allprojects {
apply plugin: 'jacoco'
apply plugin: 'me.champeau.gradle.jmh'
apply plugin: 'com.jfrog.artifactory'
version = '2.0.0-SNAPSHOT'
version = '1.3.4'
group 'io.github.swagger2markup'
description = 'swagger2markup Build'
repositories {
repositories {
jcenter()
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 {
coreProjects = subprojects.findAll {
p -> !p.name.contains("documentation") && !p.name.endsWith("-bom")
p -> !p.name.endsWith("-bom")
}
}
configure(project.coreProjects) {
apply plugin: 'signing'
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'
apply from: "${rootDir}/publishing.gradle"
apply plugin: 'jacoco'
tasks.withType(JavaCompile) {
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
sourceCompatibility = "11"
targetCompatibility = "11"
options.deprecation = true
options.encoding = 'UTF-8'
options.compilerArgs += ["-Xlint:unchecked", "-parameters"]
@@ -67,10 +61,18 @@ configure(project.coreProjects) {
}
}
nexusPublishing {
repositories {
sonatype()
}
}
sonarqube {
properties {
property "sonar.host.url", "https://sonarcloud.io"
property "sonar.organization", "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.ci", "https://travis-ci.org/Swagger2Markup/swagger2markup"
property "sonar.links.scm", "https://github.com/Swagger2Markup/swagger2markup"
@@ -110,33 +112,6 @@ subprojects {
tasks.check.dependsOn tasks.jacocoTestReport
test {
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()
}
}

View File

@@ -1,34 +0,0 @@
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
}

View File

@@ -1,378 +0,0 @@
/*
* 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()));
}
}
}

View File

@@ -1,36 +0,0 @@
/*
* 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);
}
}

View File

@@ -1,7 +0,0 @@
package io.github.swagger2markup;
import io.github.swagger2markup.config.builder.Schema2MarkupConfigBuilder;
public class OpenSchema2MarkupConfig extends Schema2MarkupConfigBuilder.DefaultSchema2MarkupConfig {
}

View File

@@ -1,72 +0,0 @@
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()));
}
}

View File

@@ -1,38 +0,0 @@
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;
}
}

View File

@@ -1,36 +0,0 @@
/*
* 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;
}
}

View File

@@ -1,15 +0,0 @@
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;
}
}

View File

@@ -1,94 +0,0 @@
/*
* 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);
}
}
}

View File

@@ -1,33 +0,0 @@
/*
* 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);
}

View File

@@ -1,41 +0,0 @@
/*
* 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();
}
}

View File

@@ -1,58 +0,0 @@
/*
* 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();
}

View File

@@ -1,28 +0,0 @@
/*
* 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);
}

View File

@@ -1,52 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,101 +0,0 @@
/*
* 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);
}
}
}

View File

@@ -1,94 +0,0 @@
/*
* 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);
}
}
}

View File

@@ -1,127 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,101 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,108 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,64 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,79 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,82 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,87 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,64 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,103 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,89 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,96 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,118 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,86 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,86 +0,0 @@
/*
* 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;
}
}
}

View File

@@ -1,122 +0,0 @@
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);
}
}

View File

@@ -1,138 +0,0 @@
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");
}
}
}

View File

@@ -1,116 +0,0 @@
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");
}
}
}

View File

@@ -1,49 +0,0 @@
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");
}
}
}

View File

@@ -1,115 +0,0 @@
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 "";
}
}

View File

@@ -1,43 +0,0 @@
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

View File

@@ -1,58 +0,0 @@
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

View File

@@ -1,74 +0,0 @@
/*
* 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");
}
}

View File

@@ -1,49 +0,0 @@
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"));
}
}

View File

@@ -1,55 +0,0 @@
/*
*
* 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);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,276 +0,0 @@
= 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
|===

View File

@@ -1,351 +0,0 @@
[[_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
|===

View File

@@ -1,30 +0,0 @@
= 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

View File

@@ -1,14 +0,0 @@
<?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>

View File

@@ -1,732 +0,0 @@
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'

View File

@@ -1,115 +0,0 @@
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

View File

@@ -1,693 +0,0 @@
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

View File

@@ -44,36 +44,8 @@ artifacts {
archives javadocJar
}
bintray {
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
}
}
}
signing {
sign publishing.publications
}
publishing {

View File

@@ -6,5 +6,4 @@ include 'swagger2markup-builder'
include 'swagger2markup-documentation'
include 'swagger2markup'
include 'swagger2markup-core'
include 'openapi2markup'

View File

@@ -1,12 +1,23 @@
description = "swagger2markup bom"
apply plugin: 'maven-publish'
apply plugin: 'signing'
def projectArtifactId = 'swagger2markup'
def url = 'https://github.com/Swagger2Markup/swagger2markup'
signing {
sign publishing.publications
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
pom.withXml {
def devs = ['RobWin': 'Robert Winkler',
'austek': 'Ali Ustek']
asNode().appendNode('packaging', 'pom')
def license = asNode().appendNode('licenses').appendNode('license')
@@ -14,6 +25,12 @@ publishing {
license.appendNode('url', 'https://github.com/Swagger2Markup/swagger2markup/blob/master/LICENSE.txt')
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')
Node deps = asNode().appendNode('dependencyManagement').appendNode('dependencies')
@@ -23,6 +40,13 @@ publishing {
dep.appendNode('artifactId').value = it.name
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)
}
}
}
}

View File

@@ -20,15 +20,15 @@ package io.github.swagger2markup.markup.builder;
public enum LineSeparator {
/**
* Line separator for Unix systems (<tt>\n</tt>).
* Line separator for Unix systems (<code>\n</code>).
*/
UNIX("\n"),
/**
* Line separator for Windows systems (<tt>\r\n</tt>).
* Line separator for Windows systems (<code>\r\n</code>).
*/
WINDOWS("\r\n"),
/**
* Line separator for Macintosh systems (<tt>\r</tt>).
* Line separator for Macintosh systems (<code>\r</code>).
*/
MAC("\r");

View File

@@ -20,15 +20,15 @@ package io.github.swagger2markup.config;
public enum LineSeparator {
/**
* Line separator for Unix systems (<tt>\n</tt>).
* Line separator for Unix systems (<code>\n</code>).
*/
UNIX("\n"),
/**
* Line separator for Windows systems (<tt>\r\n</tt>).
* Line separator for Windows systems (<code>\r\n</code>).
*/
WINDOWS("\r\n"),
/**
* Line separator for Macintosh systems (<tt>\r</tt>).
* Line separator for Macintosh systems (<code>\r</code>).
*/
MAC("\r");

View File

@@ -1,7 +1,16 @@
apply plugin: 'org.asciidoctor.convert'
apply plugin: "org.asciidoctor.convert"
apply plugin: 'org.ajoberstar.github-pages'
artifactoryPublish.skip=true
dependencies {
configurations.all {
resolutionStrategy.force dependencyOverrides.jnrConstants
resolutionStrategy.force dependencyOverrides.jnrEnxio
resolutionStrategy.force dependencyOverrides.jnrPosix
}
}
//artifactoryPublish.skip=true
sonarqube.skipProject=true
asciidoctor.dependsOn test
@@ -10,7 +19,7 @@ asciidoctor {
sources {
include 'index.adoc'
}
backends = ['html5', 'pdf']
backends = ['html5']
attributes = [
doctype: 'book',
toc: 'left',