mirror of
https://github.com/valitydev/openapi-generator.git
synced 2024-11-06 18:45:23 +00:00
6fe9a52229
* Iniital docusaurus based site * Remove error about default local being used by String.format * Change pinned users to represent global presence rather than alphabetical order pinning * Include generator indexes in ensure-up-to-date (docusaurus site and /generators/README) * Add Font Awesome attribution footer * Remove feature callout until it is completed * Include NPM try it out section * Improve "Getting Started" type docs * Include new custom template documentation * Updating templating and customization docs * Add vendor extension docs * Cleanup templating page(s). * Move users to yaml file for easy edit. * travis configuration, and baseUrl mods to image URLs * [docs] Migrate FAQ, release summary from wiki FAQ has been split into multiple smaller documents to better categorize and allow users to find what they're looking for (in docs folder or in new website). Release summary information (versioning strategy and cadence) has been migrated from the Wiki and clarified a bit. Also adds copy button for all code snippets in website. * Copy current contributing/code of conduct to website * [docs] Creating a new generator
376 lines
12 KiB
Bash
Executable File
376 lines
12 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
set -o noclobber
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Stubs out files for new generators
|
|
|
|
Usage:
|
|
$0 [options]
|
|
Options:
|
|
$(grep "[[:space:]].)\ #" $0 | tr -d "#" | sed -E 's/( \| \*)//' | sed -E 's/([a-z])\)/-\1/')
|
|
|
|
Examples:
|
|
Create a server generator for ktor:
|
|
$0 -n kotlin -s
|
|
|
|
Creates:
|
|
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java
|
|
modules/openapi-generator/src/main/resources/kotlin-server/README.mustache
|
|
modules/openapi-generator/src/main/resources/kotlin-server/model.mustache
|
|
modules/openapi-generator/src/main/resources/kotlin-server/api.mustache
|
|
bin/windows/kotlin-server-petstore.bat
|
|
bin/kotlin-server-petstore.sh
|
|
|
|
Create a generic C# server generator:
|
|
$0 -n csharp -s -t
|
|
Creates:
|
|
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CsharpServerCodegen.java
|
|
modules/openapi-generator/src/main/resources/csharp-server/README.mustache
|
|
modules/openapi-generator/src/main/resources/csharp-server/model.mustache
|
|
modules/openapi-generator/src/main/resources/csharp-server/api.mustache
|
|
bin/windows/csharp-server-petstore.bat
|
|
bin/csharp-server-petstore.sh
|
|
modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenTest.java
|
|
modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenModelTest.java
|
|
modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenOptionsTest.java
|
|
modules/openapi-generator/src/test/java/org/openapitools/codegen/options/CsharpServerCodegenOptionsProvider.java
|
|
EOF
|
|
exit 0;
|
|
}
|
|
|
|
declare os=${OSTYPE//[0-9.]/}
|
|
declare root=$(cd $(dirname "${BASH_SOURCE}") && pwd)
|
|
declare gen_type=
|
|
declare tests=0
|
|
declare gen_name
|
|
|
|
checkPreviousGenType() {
|
|
if [ "a" != "a$gen_type" ]; then
|
|
echo "[error] You may only set a single generator type at a time!" >&2
|
|
usage >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
[ $# -eq 0 ] && usage
|
|
while getopts ":hcsdtn:" arg; do
|
|
case ${arg} in
|
|
n) # Required. Specify generator name, should be kebab-cased.
|
|
gen_name=${OPTARG}
|
|
;;
|
|
c) # Create a client generator
|
|
checkPreviousGenType
|
|
gen_type=client
|
|
;;
|
|
s) # Create a server generator
|
|
checkPreviousGenType
|
|
gen_type=server
|
|
;;
|
|
d) # Create a documentation generator
|
|
checkPreviousGenType
|
|
gen_type=documentation
|
|
;;
|
|
h) # Create a schema generator
|
|
checkPreviousGenType
|
|
gen_type=schema
|
|
;;
|
|
f) # Create a config generator
|
|
checkPreviousGenType
|
|
gen_type=config
|
|
;;
|
|
t) # When specified, creates test file(s) for the generator.
|
|
tests=1
|
|
;;
|
|
h | *) # Display help.
|
|
usage
|
|
exit 0
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[ -z "${gen_name}" ] && usage
|
|
|
|
titleCase() {
|
|
if [ "$os" == "darwin" ]; then
|
|
echo $1 | tr '-' ' ' | tr '_' ' ' | ruby -e "print STDIN.gets.split.map(&:capitalize).join(' ')" | tr -d ' '
|
|
else
|
|
read -ra words <<< $(echo $1 | tr '-' ' ' | tr '_' ' ')
|
|
echo "${words[@]^}" | tr -d ' '
|
|
fi
|
|
}
|
|
|
|
kebabCase() {
|
|
echo $1 | tr '-' ' ' | tr '_' ' ' | tr '[:upper:]' '[:lower:]' | tr ' ' '-'
|
|
}
|
|
|
|
upperCase() {
|
|
echo $1 | tr '[[:lower:]]' '[[:upper:]]'
|
|
}
|
|
|
|
declare lang_classname=$(titleCase "${gen_name}-${gen_type}-Codegen")
|
|
declare gen_name_camel=$(kebabCase "${gen_name}")
|
|
declare codegen_type_enum=$(upperCase "${gen_type}")
|
|
|
|
# Step 1: Add Language Generator
|
|
[ -f "${root}/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/${lang_classname}.java" ] && \
|
|
echo "${lang_classname} already exists" && exit 1;
|
|
|
|
echo "Creating modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/${lang_classname}.java"
|
|
cat > "${root}/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/${lang_classname}.java" <<EOF
|
|
package org.openapitools.codegen.languages;
|
|
|
|
import org.openapitools.codegen.*;
|
|
import io.swagger.models.properties.ArrayProperty;
|
|
import io.swagger.models.properties.MapProperty;
|
|
import io.swagger.models.properties.Property;
|
|
import io.swagger.models.parameters.Parameter;
|
|
|
|
import java.io.File;
|
|
import java.util.*;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
public class ${lang_classname} extends DefaultCodegen implements CodegenConfig {
|
|
public static final String PROJECT_NAME = "projectName";
|
|
|
|
static Logger LOGGER = LoggerFactory.getLogger(${lang_classname}.class);
|
|
|
|
public CodegenType getTag() {
|
|
return CodegenType.${codegen_type_enum};
|
|
}
|
|
|
|
public String getName() {
|
|
return "${gen_name}";
|
|
}
|
|
|
|
public String getHelp() {
|
|
return "Generates a ${gen_name} ${gen_type}.";
|
|
}
|
|
|
|
public ${lang_classname}() {
|
|
super();
|
|
|
|
outputFolder = "generated-code" + File.separator + "${gen_name}";
|
|
modelTemplateFiles.put("model.mustache", ".zz");
|
|
apiTemplateFiles.put("api.mustache", ".zz");
|
|
embeddedTemplateDir = templateDir = "${gen_name}-${gen_type}";
|
|
apiPackage = File.separator + "Apis";
|
|
modelPackage = File.separator + "Models";
|
|
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
|
|
// TODO: Fill this out.
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Step 2: Register the new class with service loader
|
|
echo -e "\norg.openapitools.codegen.languages.${lang_classname}" >> "${root}/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig"
|
|
|
|
# Step 3: Create resource files
|
|
mkdir -p "${root}/modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}"
|
|
echo "Creating modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}/README.mustache" && \
|
|
touch "${root}/modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}/README.mustache"
|
|
echo "Creating modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}/model.mustache" && \
|
|
touch "${root}/modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}/model.mustache"
|
|
echo "Creating modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}/api.mustache" && \
|
|
touch "${root}/modules/openapi-generator/src/main/resources/${gen_name}-${gen_type}/api.mustache"
|
|
|
|
# Step 4: Create bash/batch scripts
|
|
|
|
## Windows batch file
|
|
echo "Creating bin/windows/${gen_name}-${gen_type}-petstore.bat"
|
|
cat > "${root}/bin/windows/${gen_name}-${gen_type}-petstore.bat"<<EOF
|
|
set executable=.\modules\openapi-generator-cli\target\openapi-generator-cli.jar
|
|
|
|
If Not Exist %executable% (
|
|
mvn clean package
|
|
)
|
|
|
|
REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M -DloggerPath=conf/log4j.properties
|
|
set ags=generate --artifact-id "${gen_name}-petstore-${gen_type}" -i modules\openapi-generator\src\test\resources\2_0\petstore.yaml -g ${gen_name} -o samples\\${gen_type}\petstore\\${gen_name}
|
|
|
|
java %JAVA_OPTS% -jar %executable% %ags%
|
|
EOF
|
|
|
|
## Bash file
|
|
echo "Creating bin/${gen_name}-${gen_type}-petstore.sh"
|
|
cat > "${root}/bin/${gen_name}-${gen_type}-petstore.sh"<<EOF
|
|
#!/bin/sh
|
|
|
|
SCRIPT="\$0"
|
|
|
|
while [ -h "\$SCRIPT" ] ; do
|
|
ls=\$(ls -ld "\$SCRIPT")
|
|
link=\$(expr "\$ls" : '.*-> \(.*\)$')
|
|
if expr "\$link" : '/.*' > /dev/null; then
|
|
SCRIPT="\$link"
|
|
else
|
|
SCRIPT=\$(dirname "\$SCRIPT")/"\$link"
|
|
fi
|
|
done
|
|
|
|
if [ ! -d "\${APP_DIR}" ]; then
|
|
APP_DIR=\$(dirname "\$SCRIPT")/..
|
|
APP_DIR=\$(cd "\${APP_DIR}"; pwd)
|
|
fi
|
|
|
|
executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar"
|
|
|
|
if [ ! -f "\$executable" ]
|
|
then
|
|
mvn clean package
|
|
fi
|
|
|
|
# if you've executed sbt assembly previously it will use that instead.
|
|
export JAVA_OPTS="\${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties"
|
|
ags="\$@ generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g ${gen_name} -o samples/${gen_type}/petstore/${gen_name}"
|
|
|
|
java \${JAVA_OPTS} -jar \${executable} \${ags}
|
|
EOF
|
|
|
|
chmod u+x "${root}/bin/${gen_name}-${gen_type}-petstore.sh"
|
|
|
|
# Step 5: (optional) Create OpenAPI Generator test files
|
|
if [ "1" -eq "${tests}" ]; then
|
|
mkdir -p "${root}/modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}"
|
|
# Codegen
|
|
echo "Creating modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}/${lang_classname}Test.java"
|
|
cat > "${root}/modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}/${lang_classname}Test.java"<<EOF
|
|
package org.openapitools.codegen.${gen_name_camel};
|
|
|
|
import org.openapitools.codegen.*;
|
|
import org.openapitools.codegen.languages.${lang_classname};
|
|
import io.swagger.models.*;
|
|
import io.swagger.parser.SwaggerParser;
|
|
import org.testng.Assert;
|
|
import org.testng.annotations.Test;
|
|
|
|
public class ${lang_classname}Test {
|
|
|
|
${lang_classname} codegen = new ${lang_classname}();
|
|
|
|
@Test
|
|
public void shouldSucceed() throws Exception {
|
|
// TODO: Complete this test.
|
|
Assert.fail("Not implemented.");
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Model
|
|
echo "Creating modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}/${lang_classname}ModelTest.java"
|
|
cat > "${root}/modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}/${lang_classname}ModelTest.java"<<EOF
|
|
package org.openapitools.codegen.${gen_name_camel};
|
|
|
|
import org.openapitools.codegen.*;
|
|
import org.openapitools.codegen.languages.${lang_classname};
|
|
import io.swagger.models.*;
|
|
import io.swagger.models.properties.*;
|
|
|
|
import org.testng.Assert;
|
|
import org.testng.annotations.Test;
|
|
|
|
@SuppressWarnings("static-method")
|
|
public class ${lang_classname}ModelTest {
|
|
|
|
@Test(description = "convert a simple java model")
|
|
public void simpleModelTest() {
|
|
final Model model = new ModelImpl()
|
|
.description("a sample model")
|
|
.property("id", new LongProperty())
|
|
.property("name", new StringProperty())
|
|
.required("id")
|
|
.required("name");
|
|
final DefaultCodegen codegen = new ${lang_classname}();
|
|
|
|
// TODO: Complete this test.
|
|
Assert.fail("Not implemented.");
|
|
}
|
|
|
|
}
|
|
|
|
EOF
|
|
|
|
# Options
|
|
echo "Creating modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}/${lang_classname}OptionsTest.java"
|
|
cat > "${root}/modules/openapi-generator/src/test/java/org/openapitools/codegen/${gen_name_camel}/${lang_classname}OptionsTest.java"<<EOF
|
|
package org.openapitools.codegen.${gen_name_camel};
|
|
|
|
import org.openapitools.codegen.AbstractOptionsTest;
|
|
import org.openapitools.codegen.CodegenConfig;
|
|
import org.openapitools.codegen.languages.${lang_classname};
|
|
import org.openapitools.codegen.options.${lang_classname}OptionsProvider;
|
|
|
|
import mockit.Expectations;
|
|
import mockit.Tested;
|
|
|
|
public class ${lang_classname}OptionsTest extends AbstractOptionsTest {
|
|
|
|
@Tested
|
|
private ${lang_classname} codegen;
|
|
|
|
public ${lang_classname}OptionsTest() {
|
|
super(new ${lang_classname}OptionsProvider());
|
|
}
|
|
|
|
@Override
|
|
protected CodegenConfig getCodegenConfig() {
|
|
return codegen;
|
|
}
|
|
|
|
@SuppressWarnings("unused")
|
|
@Override
|
|
protected void setExpectations() {
|
|
// TODO: Complete options
|
|
new Expectations(codegen) {{
|
|
|
|
}};
|
|
}
|
|
}
|
|
|
|
EOF
|
|
|
|
# Options Provider
|
|
echo "Creating modules/openapi-generator/src/test/java/org/openapitools/codegen/options/${lang_classname}OptionsProvider.java"
|
|
cat > "${root}/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/${lang_classname}OptionsProvider.java"<<EOF
|
|
package org.openapitools.codegen.options;
|
|
|
|
import org.openapitools.codegen.CodegenConstants;
|
|
import org.openapitools.codegen.languages.${lang_classname};
|
|
|
|
import com.google.common.collect.ImmutableMap;
|
|
|
|
import java.util.Map;
|
|
|
|
public class ${lang_classname}OptionsProvider implements OptionsProvider {
|
|
public static final String PROJECT_NAME_VALUE = "OpenAPI";
|
|
|
|
@Override
|
|
public String getLanguage() {
|
|
return "${gen_name_camel}";
|
|
}
|
|
|
|
@Override
|
|
public Map<String, String> createOptions() {
|
|
ImmutableMap.Builder<String, String> builder = new ImmutableMap.Builder<String, String>();
|
|
return builder
|
|
.put(${lang_classname}.PROJECT_NAME, PROJECT_NAME_VALUE)
|
|
.build();
|
|
}
|
|
|
|
@Override
|
|
public boolean isServer() {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
EOF
|
|
fi
|
|
|
|
echo "Finished."
|