mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-12-11 16:22:48 +00:00
This reverts commit 702f193f61.
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
package io.swagger.codegen.cmd;
|
||||
|
||||
import io.airlift.airline.Command;
|
||||
import io.airlift.airline.Option;
|
||||
import io.swagger.codegen.CliOption;
|
||||
import io.swagger.codegen.CodegenConfig;
|
||||
import io.swagger.codegen.CodegenConfigLoader;
|
||||
|
||||
@Command(name = "config-help", description = "Config help for chosen lang")
|
||||
public class ConfigHelp implements Runnable {
|
||||
|
||||
@Option(name = {"-l", "--lang"}, title = "language", required = true,
|
||||
description = "language to get config help for")
|
||||
private String lang;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println();
|
||||
CodegenConfig config = CodegenConfigLoader.forName(lang);
|
||||
System.out.println("CONFIG OPTIONS");
|
||||
for (CliOption langCliOption : config.cliOptions()) {
|
||||
System.out.println("\t" + langCliOption.getOpt());
|
||||
System.out.println("\t " + langCliOption.getOptionHelp().replaceAll("\n", "\n\t "));
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
package io.swagger.codegen.cmd;
|
||||
|
||||
import io.airlift.airline.Command;
|
||||
import io.airlift.airline.Option;
|
||||
import io.swagger.codegen.ClientOptInput;
|
||||
import io.swagger.codegen.CodegenConstants;
|
||||
import io.swagger.codegen.DefaultGenerator;
|
||||
import io.swagger.codegen.config.CodegenConfigurator;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static io.swagger.codegen.config.CodegenConfiguratorUtils.*;
|
||||
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
|
||||
|
||||
/**
|
||||
* User: lanwen
|
||||
* Date: 24.03.15
|
||||
* Time: 20:22
|
||||
*/
|
||||
|
||||
@Command(name = "generate", description = "Generate code with chosen lang")
|
||||
public class Generate implements Runnable {
|
||||
|
||||
public static final Logger LOG = LoggerFactory.getLogger(Generate.class);
|
||||
|
||||
@Option(name = {"-v", "--verbose"}, description = "verbose mode")
|
||||
private Boolean verbose;
|
||||
|
||||
@Option(name = {"-l", "--lang"}, title = "language", required = true,
|
||||
description = "client language to generate (maybe class name in classpath, required)")
|
||||
private String lang;
|
||||
|
||||
@Option(name = {"-o", "--output"}, title = "output directory",
|
||||
description = "where to write the generated files (current dir by default)")
|
||||
private String output = "";
|
||||
|
||||
@Option(name = {"-i", "--input-spec"}, title = "spec file", required = true,
|
||||
description = "location of the swagger spec, as URL or file (required)")
|
||||
private String spec;
|
||||
|
||||
@Option(name = {"-t", "--template-dir"}, title = "template directory",
|
||||
description = "folder containing the template files")
|
||||
private String templateDir;
|
||||
|
||||
@Option(name = {"-a", "--auth"}, title = "authorization",
|
||||
description = "adds authorization headers when fetching the swagger definitions remotely. " +
|
||||
"Pass in a URL-encoded string of name:header with a comma separating multiple values")
|
||||
private String auth;
|
||||
|
||||
@Option(name = {"-D"}, title = "system properties", description = "sets specified system properties in " +
|
||||
"the format of name=value,name=value")
|
||||
private String systemProperties;
|
||||
|
||||
@Option(name = {"-c", "--config"}, title = "configuration file", description = "Path to json configuration file. " +
|
||||
"File content should be in a json format {\"optionKey\":\"optionValue\", \"optionKey1\":\"optionValue1\"...} " +
|
||||
"Supported options can be different for each language. Run config-help -l {lang} command for language specific config options.")
|
||||
private String configFile;
|
||||
|
||||
@Option(name = {"-s", "--skip-overwrite"}, title = "skip overwrite", description = "specifies if the existing files should be " +
|
||||
"overwritten during the generation.")
|
||||
private Boolean skipOverwrite;
|
||||
|
||||
@Option(name = {"--api-package"}, title = "api package", description = CodegenConstants.API_PACKAGE_DESC)
|
||||
private String apiPackage;
|
||||
|
||||
@Option(name = {"--model-package"}, title = "model package", description = CodegenConstants.MODEL_PACKAGE_DESC)
|
||||
private String modelPackage;
|
||||
|
||||
@Option(name = {"--model-name-prefix"}, title = "model name prefix", description = CodegenConstants.MODEL_NAME_PREFIX_DESC)
|
||||
private String modelNamePrefix;
|
||||
|
||||
@Option(name = {"--model-name-suffix"}, title = "model name suffix", description = CodegenConstants.MODEL_NAME_SUFFIX_DESC)
|
||||
private String modelNameSuffix;
|
||||
|
||||
@Option(name = {"--instantiation-types"}, title = "instantiation types", description = "sets instantiation type mappings in the format of type=instantiatedType,type=instantiatedType." +
|
||||
"For example (in Java): array=ArrayList,map=HashMap. In other words array types will get instantiated as ArrayList in generated code.")
|
||||
private String instantiationTypes;
|
||||
|
||||
@Option(name = {"--type-mappings"}, title = "type mappings", description = "sets mappings between swagger spec types and generated code types " +
|
||||
"in the format of swaggerType=generatedType,swaggerType=generatedType. For example: array=List,map=Map,string=String")
|
||||
private String typeMappings;
|
||||
|
||||
@Option(name = {"--additional-properties"}, title = "additional properties", description = "sets additional properties that can be referenced by the mustache templates in the format of name=value,name=value")
|
||||
private String additionalProperties;
|
||||
|
||||
@Option(name = {"--language-specific-primitives"}, title = "language specific primitives",
|
||||
description = "specifies additional language specific primitive types in the format of type1,type2,type3,type3. For example: String,boolean,Boolean,Double")
|
||||
private String languageSpecificPrimitives;
|
||||
|
||||
@Option(name = {"--import-mappings"}, title = "import mappings",
|
||||
description = "specifies mappings between a given class and the import that should be used for that class in the format of type=import,type=import")
|
||||
private String importMappings;
|
||||
|
||||
@Option(name = {"--invoker-package"}, title = "invoker package", description = CodegenConstants.INVOKER_PACKAGE_DESC)
|
||||
private String invokerPackage;
|
||||
|
||||
@Option(name = {"--group-id"}, title = "group id", description = CodegenConstants.GROUP_ID_DESC)
|
||||
private String groupId;
|
||||
|
||||
@Option(name = {"--artifact-id"}, title = "artifact id", description = CodegenConstants.ARTIFACT_ID_DESC)
|
||||
private String artifactId;
|
||||
|
||||
@Option(name = {"--artifact-version"}, title = "artifact version", description = CodegenConstants.ARTIFACT_VERSION_DESC)
|
||||
private String artifactVersion;
|
||||
|
||||
@Option(name = {"--library"}, title = "library", description = CodegenConstants.LIBRARY_DESC)
|
||||
private String library;
|
||||
|
||||
@Option(name = {"--git-user-id"}, title = "git user id", description = CodegenConstants.GIT_USER_ID_DESC)
|
||||
private String gitUserId;
|
||||
|
||||
@Option(name = {"--git-repo-id"}, title = "git repo id", description = CodegenConstants.GIT_REPO_ID_DESC)
|
||||
private String gitRepoId;
|
||||
|
||||
@Option(name = {"--release-note"}, title = "release note", description = CodegenConstants.RELEASE_NOTE_DESC)
|
||||
private String releaseNote;
|
||||
|
||||
@Option(name = {"--http-user-agent"}, title = "http user agent", description = CodegenConstants.HTTP_USER_AGENT_DESC)
|
||||
private String httpUserAgent;
|
||||
|
||||
@Option(name = {"--reserved-words-mappings"}, title = "import mappings",
|
||||
description = "specifies how a reserved name should be escaped to. Otherwise, the default _<name> is used. For example id=identifier")
|
||||
private String reservedWordsMappings;
|
||||
|
||||
@Option(name = {"--ignore-file-override"}, title = "ignore file override location", description = CodegenConstants.IGNORE_FILE_OVERRIDE_DESC)
|
||||
private String ignoreFileOverride;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
//attempt to read from config file
|
||||
CodegenConfigurator configurator = CodegenConfigurator.fromFile(configFile);
|
||||
|
||||
//if a config file wasn't specified or we were unable to read it
|
||||
if(configurator == null) {
|
||||
//createa a fresh configurator
|
||||
configurator = new CodegenConfigurator();
|
||||
}
|
||||
|
||||
//now override with any specified parameters
|
||||
if (verbose != null) {
|
||||
configurator.setVerbose(verbose);
|
||||
}
|
||||
|
||||
if(skipOverwrite != null) {
|
||||
configurator.setSkipOverwrite(skipOverwrite);
|
||||
}
|
||||
|
||||
if(isNotEmpty(spec)) {
|
||||
configurator.setInputSpec(spec);
|
||||
}
|
||||
|
||||
if(isNotEmpty(lang)) {
|
||||
configurator.setLang(lang);
|
||||
}
|
||||
|
||||
if(isNotEmpty(output)) {
|
||||
configurator.setOutputDir(output);
|
||||
}
|
||||
|
||||
if(isNotEmpty(auth)) {
|
||||
configurator.setAuth(auth);
|
||||
}
|
||||
|
||||
if(isNotEmpty(templateDir)) {
|
||||
configurator.setTemplateDir(templateDir);
|
||||
}
|
||||
|
||||
if(isNotEmpty(apiPackage)) {
|
||||
configurator.setApiPackage(apiPackage);
|
||||
}
|
||||
|
||||
if(isNotEmpty(modelPackage)) {
|
||||
configurator.setModelPackage(modelPackage);
|
||||
}
|
||||
|
||||
if(isNotEmpty(modelNamePrefix)){
|
||||
configurator.setModelNamePrefix(modelNamePrefix);
|
||||
}
|
||||
|
||||
if(isNotEmpty(modelNameSuffix)){
|
||||
configurator.setModelNameSuffix(modelNameSuffix);
|
||||
}
|
||||
|
||||
if(isNotEmpty(invokerPackage)) {
|
||||
configurator.setInvokerPackage(invokerPackage);
|
||||
}
|
||||
|
||||
if(isNotEmpty(groupId)) {
|
||||
configurator.setGroupId(groupId);
|
||||
}
|
||||
|
||||
if(isNotEmpty(artifactId)) {
|
||||
configurator.setArtifactId(artifactId);
|
||||
}
|
||||
|
||||
if(isNotEmpty(artifactVersion)) {
|
||||
configurator.setArtifactVersion(artifactVersion);
|
||||
}
|
||||
|
||||
if(isNotEmpty(library)) {
|
||||
configurator.setLibrary(library);
|
||||
}
|
||||
|
||||
if (isNotEmpty(gitUserId)) {
|
||||
configurator.setGitUserId(gitUserId);
|
||||
}
|
||||
|
||||
if (isNotEmpty(gitRepoId)) {
|
||||
configurator.setGitRepoId(gitRepoId);
|
||||
}
|
||||
|
||||
if (isNotEmpty(releaseNote)) {
|
||||
configurator.setReleaseNote(releaseNote);
|
||||
}
|
||||
|
||||
if (isNotEmpty(httpUserAgent)) {
|
||||
configurator.setHttpUserAgent(httpUserAgent);
|
||||
}
|
||||
|
||||
if (isNotEmpty(ignoreFileOverride)) {
|
||||
configurator.setIgnoreFileOverride(ignoreFileOverride);
|
||||
}
|
||||
|
||||
applySystemPropertiesKvp(systemProperties, configurator);
|
||||
applyInstantiationTypesKvp(instantiationTypes, configurator);
|
||||
applyImportMappingsKvp(importMappings, configurator);
|
||||
applyTypeMappingsKvp(typeMappings, configurator);
|
||||
applyAdditionalPropertiesKvp(additionalProperties, configurator);
|
||||
applyLanguageSpecificPrimitivesCsv(languageSpecificPrimitives, configurator);
|
||||
applyReservedWordsMappingsKvp(reservedWordsMappings, configurator);
|
||||
final ClientOptInput clientOptInput = configurator.toClientOptInput();
|
||||
|
||||
new DefaultGenerator().opts(clientOptInput).generate();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package io.swagger.codegen.cmd;
|
||||
|
||||
import ch.lambdaj.collection.LambdaIterable;
|
||||
import io.airlift.airline.Command;
|
||||
import io.swagger.codegen.CodegenConfig;
|
||||
|
||||
import static ch.lambdaj.Lambda.on;
|
||||
import static ch.lambdaj.collection.LambdaCollections.with;
|
||||
import static java.util.ServiceLoader.load;
|
||||
|
||||
/**
|
||||
* User: lanwen
|
||||
* Date: 24.03.15
|
||||
* Time: 20:25
|
||||
*/
|
||||
@Command(name = "langs", description = "Shows available langs")
|
||||
public class Langs implements Runnable {
|
||||
@Override
|
||||
public void run() {
|
||||
LambdaIterable<String> langs = with(load(CodegenConfig.class)).extract(on(CodegenConfig.class).getName());
|
||||
System.out.printf("Available languages: %s%n", langs);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
package io.swagger.codegen.cmd;
|
||||
|
||||
import ch.lambdaj.function.convert.Converter;
|
||||
import com.google.common.base.CaseFormat;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.samskivert.mustache.Mustache;
|
||||
import io.airlift.airline.Command;
|
||||
import io.airlift.airline.Option;
|
||||
import io.swagger.codegen.DefaultGenerator;
|
||||
import io.swagger.codegen.SupportingFile;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static ch.lambdaj.collection.LambdaCollections.with;
|
||||
import static com.google.common.base.Joiner.on;
|
||||
|
||||
/**
|
||||
* User: lanwen
|
||||
* Date: 24.03.15
|
||||
* Time: 20:22
|
||||
*/
|
||||
|
||||
@Command(name = "meta", description = "MetaGenerator. Generator for creating a new template set " +
|
||||
"and configuration for Codegen. The output will be based on the language you " +
|
||||
"specify, and includes default templates to include.")
|
||||
public class Meta implements Runnable {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Meta.class);
|
||||
|
||||
private static final String TEMPLATE_DIR_CLASSPATH = "codegen";
|
||||
private static final String MUSTACHE_EXTENSION = ".mustache";
|
||||
|
||||
@Option(name = {"-o", "--output"}, title = "output directory",
|
||||
description = "where to write the generated files (current dir by default)")
|
||||
private String outputFolder = "";
|
||||
|
||||
@Option(name = {"-n", "--name"}, title = "name",
|
||||
description = "the human-readable name of the generator")
|
||||
private String name = "default";
|
||||
|
||||
@Option(name = {"-p", "--package"}, title = "package",
|
||||
description = "the package to put the main class into (defaults to io.swagger.codegen)")
|
||||
private String targetPackage = "io.swagger.codegen";
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
final File targetDir = new File(outputFolder);
|
||||
LOGGER.info("writing to folder [{}]", targetDir.getAbsolutePath());
|
||||
|
||||
String mainClass = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, name) + "Generator";
|
||||
|
||||
List<SupportingFile> supportingFiles = ImmutableList.of(
|
||||
new SupportingFile("pom.mustache", "", "pom.xml"),
|
||||
new SupportingFile("generatorClass.mustache",
|
||||
on(File.separator).join("src/main/java", asPath(targetPackage)), mainClass.concat(".java")),
|
||||
new SupportingFile("README.mustache", "", "README.md"),
|
||||
new SupportingFile("api.template", "src/main/resources" + File.separator + name, "api.mustache"),
|
||||
new SupportingFile("model.template", "src/main/resources" + File.separator + name, "model.mustache"),
|
||||
new SupportingFile("services.mustache",
|
||||
"src/main/resources/META-INF/services", "io.swagger.codegen.CodegenConfig")
|
||||
);
|
||||
|
||||
String swaggerVersion = Version.readVersionFromResources();
|
||||
|
||||
Map<String, Object> data = new ImmutableMap.Builder<String, Object>()
|
||||
.put("generatorPackage", targetPackage)
|
||||
.put("generatorClass", mainClass)
|
||||
.put("name", name)
|
||||
.put("fullyQualifiedGeneratorClass", targetPackage + "." + mainClass)
|
||||
.put("swaggerCodegenVersion", swaggerVersion).build();
|
||||
|
||||
|
||||
with(supportingFiles).convert(processFiles(targetDir, data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converter method to process supporting files: execute with mustache,
|
||||
* or simply copy to destination directory
|
||||
*
|
||||
* @param targetDir - destination directory
|
||||
* @param data - map with additional params needed to process templates
|
||||
* @return converter object to pass to lambdaj
|
||||
*/
|
||||
private static Converter<SupportingFile, File> processFiles(final File targetDir, final Map<String, Object> data) {
|
||||
return new Converter<SupportingFile, File>() {
|
||||
private DefaultGenerator generator = new DefaultGenerator();
|
||||
|
||||
@Override
|
||||
public File convert(SupportingFile support) {
|
||||
try {
|
||||
File destinationFolder = new File(new File(targetDir.getAbsolutePath()), support.folder);
|
||||
File outputFile = new File(destinationFolder, support.destinationFilename);
|
||||
|
||||
String template = generator
|
||||
.readTemplate(new File(TEMPLATE_DIR_CLASSPATH, support.templateFile).getPath());
|
||||
String formatted = template;
|
||||
|
||||
if (support.templateFile.endsWith(MUSTACHE_EXTENSION)) {
|
||||
LOGGER.info("writing file to {}", outputFile.getAbsolutePath());
|
||||
formatted = Mustache.compiler().withLoader(loader(generator))
|
||||
.defaultValue("")
|
||||
.compile(template)
|
||||
.execute(data);
|
||||
} else {
|
||||
LOGGER.info("copying file to {}", outputFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
FileUtils.writeStringToFile(outputFile, formatted);
|
||||
return outputFile;
|
||||
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Can't generate project", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates mustache loader for template using classpath loader
|
||||
*
|
||||
* @param generator - class with reader getter
|
||||
* @return loader for template
|
||||
*/
|
||||
private static Mustache.TemplateLoader loader(final DefaultGenerator generator) {
|
||||
return new Mustache.TemplateLoader() {
|
||||
@Override
|
||||
public Reader getTemplate(String name) {
|
||||
return generator.getTemplateReader(TEMPLATE_DIR_CLASSPATH
|
||||
+ File.separator + name.concat(MUSTACHE_EXTENSION));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts package name to path on file system
|
||||
*
|
||||
* @param packageName - package name to convert
|
||||
* @return relative path
|
||||
*/
|
||||
private static String asPath(String packageName) {
|
||||
return packageName.replace(".", File.separator);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package io.swagger.codegen.cmd;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
import io.airlift.airline.Command;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@Command(name = "version", description = "Show version information")
|
||||
public class Version implements Runnable {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Meta.class);
|
||||
|
||||
private static final String VERSION_PLACEHOLDER = "${project.version}";
|
||||
|
||||
private static final String UNREADABLE_VERSION = "unreadable";
|
||||
private static final String UNSET_VERSION = "unset";
|
||||
private static final String UNKNOWN_VERSION = "unknown";
|
||||
|
||||
public static String readVersionFromResources() {
|
||||
Properties versionProperties = new Properties();
|
||||
try (InputStream is = Version.class.getResourceAsStream("/version.properties")) {
|
||||
versionProperties.load(is);
|
||||
} catch (IOException ex) {
|
||||
LOGGER.error("Error loading version properties", ex);
|
||||
return UNREADABLE_VERSION;
|
||||
}
|
||||
|
||||
String version = versionProperties.getProperty("version", UNKNOWN_VERSION).trim();
|
||||
if (VERSION_PLACEHOLDER.equals(version)) {
|
||||
return UNSET_VERSION;
|
||||
} else {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
String version = readVersionFromResources();
|
||||
System.out.println(version);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
version = ${project.version}
|
||||
Reference in New Issue
Block a user