- Sealed class for generated Modules
- Empty constructor added to model classes
- Code cleanup
This commit is contained in:
Jakub Malek 2016-05-30 10:33:22 +02:00 committed by Jakub Malek
parent c59f2b0322
commit a72640ce9c
4 changed files with 103 additions and 50 deletions

View File

@ -1,6 +1,24 @@
package io.swagger.codegen.languages; package io.swagger.codegen.languages;
import com.google.common.collect.ImmutableMap; import static com.google.common.base.Strings.isNullOrEmpty;
import static io.swagger.codegen.CodegenConstants.OPTIONAL_PROJECT_FILE;
import static io.swagger.codegen.CodegenConstants.OPTIONAL_PROJECT_FILE_DESC;
import static io.swagger.codegen.CodegenConstants.PACKAGE_NAME;
import static io.swagger.codegen.CodegenConstants.PACKAGE_VERSION;
import static io.swagger.codegen.CodegenConstants.RETURN_ICOLLECTION;
import static io.swagger.codegen.CodegenConstants.RETURN_ICOLLECTION_DESC;
import static io.swagger.codegen.CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG;
import static io.swagger.codegen.CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC;
import static io.swagger.codegen.CodegenConstants.SOURCE_FOLDER;
import static io.swagger.codegen.CodegenConstants.SOURCE_FOLDER_DESC;
import static io.swagger.codegen.CodegenConstants.USE_COLLECTION;
import static io.swagger.codegen.CodegenConstants.USE_COLLECTION_DESC;
import static io.swagger.codegen.CodegenConstants.USE_DATETIME_OFFSET;
import static io.swagger.codegen.CodegenConstants.USE_DATETIME_OFFSET_DESC;
import static io.swagger.codegen.CodegenType.SERVER;
import static java.util.Arrays.asList;
import static java.util.UUID.randomUUID;
import static org.apache.commons.lang3.StringUtils.capitalize;
import io.swagger.codegen.CodegenOperation; import io.swagger.codegen.CodegenOperation;
import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenProperty;
import io.swagger.codegen.CodegenType; import io.swagger.codegen.CodegenType;
@ -8,20 +26,26 @@ import io.swagger.codegen.SupportingFile;
import io.swagger.models.Swagger; import io.swagger.models.Swagger;
import io.swagger.models.properties.Property; import io.swagger.models.properties.Property;
import io.swagger.models.properties.StringProperty; import io.swagger.models.properties.StringProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File; import java.io.File;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import static io.swagger.codegen.CodegenConstants.*; import org.slf4j.Logger;
import static io.swagger.codegen.CodegenType.SERVER; import org.slf4j.LoggerFactory;
import static java.util.Arrays.asList;
import static java.util.UUID.randomUUID; import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
public class NancyFXServerCodegen extends AbstractCSharpCodegen { public class NancyFXServerCodegen extends AbstractCSharpCodegen {
private static final Logger log = LoggerFactory.getLogger(NancyFXServerCodegen.class); private static final Logger log = LoggerFactory.getLogger(NancyFXServerCodegen.class);
private static final String API_NAMESPACE = "Modules";
private static final String MODEL_NAMESPACE = "Models";
private static final Map<String, Predicate<Property>> propertyToSwaggerTypeMapping =
createPropertyToSwaggerTypeMapping();
private final String packageGuid = "{" + randomUUID().toString().toUpperCase() + "}"; private final String packageGuid = "{" + randomUUID().toString().toUpperCase() + "}";
public NancyFXServerCodegen() { public NancyFXServerCodegen() {
@ -69,8 +93,8 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
public void processOpts() { public void processOpts() {
super.processOpts(); super.processOpts();
apiPackage = packageName + ".Modules"; apiPackage = isNullOrEmpty(packageName) ? API_NAMESPACE : packageName + "." + API_NAMESPACE;
modelPackage = packageName + ".Models"; modelPackage = isNullOrEmpty(packageName) ? MODEL_NAMESPACE : packageName + "." + MODEL_NAMESPACE;
supportingFiles.add(new SupportingFile("parameters.mustache", sourceFile("Utils"), "Parameters.cs")); supportingFiles.add(new SupportingFile("parameters.mustache", sourceFile("Utils"), "Parameters.cs"));
supportingFiles.add(new SupportingFile("packages.config.mustache", sourceFolder(), "packages.config")); supportingFiles.add(new SupportingFile("packages.config.mustache", sourceFolder(), "packages.config"));
@ -92,78 +116,94 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
@Override @Override
public String apiFileFolder() { public String apiFileFolder() {
return outputFolder + File.separator + sourceFolder() + File.separator + "Modules"; return outputFolder + File.separator + sourceFolder() + File.separator + API_NAMESPACE;
} }
@Override @Override
public String modelFileFolder() { public String modelFileFolder() {
return outputFolder + File.separator + sourceFolder() + File.separator + "Models"; return outputFolder + File.separator + sourceFolder() + File.separator + MODEL_NAMESPACE;
} }
@Override @Override
protected void processOperation(CodegenOperation operation) { protected void processOperation(final CodegenOperation operation) {
super.processOperation(operation); super.processOperation(operation);
if (!isNullOrEmpty(operation.path) && operation.path.contains("?")) {
// HACK: Unlikely in the wild, but we need to clean operation paths for MVC Routing
if (operation.path != null) {
String original = operation.path;
operation.path = operation.path.replace("?", "/"); operation.path = operation.path.replace("?", "/");
if (!original.equals(operation.path)) {
log.warn("Normalized " + original + " to " + operation.path + ". Please verify generated source.");
}
} }
if (!isNullOrEmpty(operation.httpMethod)) {
// Converts, for example, PUT to HttpPut for controller attributes operation.httpMethod = capitalize(operation.httpMethod.toLowerCase());
operation.httpMethod = operation.httpMethod.substring(0, 1) + operation.httpMethod.substring(1).toLowerCase(); }
} }
@Override @Override
public String toEnumVarName(String name, String datatype) { public String toEnumVarName(final String name, final String datatype) {
final String enumName = camelize( final String enumName = camelize(
sanitizeName(name) sanitizeName(name)
.replaceFirst("^_", "") .replaceFirst("^_", "")
.replaceFirst("_$", "")); .replaceFirst("_$", ""));
log.info("toEnumVarName = " + enumName); final String result;
if (enumName.matches("\\d.*")) {
if (enumName.matches("\\d.*")) { // starts with number result = "_" + enumName;
return "_" + enumName;
} else { } else {
return enumName; result = enumName;
} }
log.info(String.format("toEnumVarName('%s', %s) = '%s'", name, datatype, enumName));
return result;
} }
@Override @Override
public String toApiName(String name) { public String toApiName(final String name) {
if (name.length() == 0) { final String apiName;
return "Default"; if (isNullOrEmpty(name)) {
apiName = "Default";
} else {
apiName = capitalize(name);
} }
return initialCaps(name); log.info(String.format("toApiName('%s') = '%s'", name, apiName));
return apiName;
} }
@Override @Override
public String toApiFilename(String name) { public String toApiFilename(final String name) {
return super.toApiFilename(name) + "Module"; return super.toApiFilename(name) + "Module";
} }
@Override @Override
public void preprocessSwagger(Swagger swagger) { public void preprocessSwagger(final Swagger swagger) {
additionalProperties.put("packageContext", sanitizeName(swagger.getBasePath())); additionalProperties.put("packageContext", sanitizeName(swagger.getBasePath()));
additionalProperties.put("baseContext", swagger.getBasePath()); additionalProperties.put("baseContext", swagger.getBasePath());
} }
@Override @Override
public String toEnumName(CodegenProperty property) { public String toEnumName(final CodegenProperty property) {
return sanitizeName(camelize(property.name)) ; return sanitizeName(camelize(property.name)) ;
} }
@Override @Override
public String getSwaggerType(Property property) { public String getSwaggerType(final Property property) {
if (property instanceof StringProperty && "time".equalsIgnoreCase(property.getFormat())) { for (Entry<String, Predicate<Property>> entry : propertyToSwaggerTypeMapping.entrySet()) {
return "time"; if (entry.getValue().apply(property)) {
return entry.getKey();
}
} }
return super.getSwaggerType(property); return super.getSwaggerType(property);
} }
private static Map<String, Predicate<Property>> createPropertyToSwaggerTypeMapping() {
final ImmutableMap.Builder<String, Predicate<Property>> mapping = ImmutableMap.builder();
mapping.put("time", timeProperty());
return mapping.build();
}
private static Predicate<Property> timeProperty() {
return new Predicate<Property>() {
@Override
public boolean apply(Property property) {
return property instanceof StringProperty && "time".equalsIgnoreCase(property.getFormat());
}
};
}
private static Map<String, String> nodaTimeTypesMappings() { private static Map<String, String> nodaTimeTypesMappings() {
return ImmutableMap.of( return ImmutableMap.of(
"time", "LocalTime?", "time", "LocalTime?",

View File

@ -11,7 +11,7 @@ namespace {{packageName}}.{{packageContext}}.Modules
{ {{#operations}}{{#operation}}{{#allParams}}{{#isEnum}} { {{#operations}}{{#operation}}{{#allParams}}{{#isEnum}}
{{>innerApiEnum}}{{/isEnum}}{{/allParams}}{{/operation}} {{>innerApiEnum}}{{/isEnum}}{{/allParams}}{{/operation}}
public partial class {{classname}}Module : NancyModule public sealed class {{classname}}Module : NancyModule
{ {
public {{classname}}Module({{classname}}Service service) : base("{{baseContext}}") public {{classname}}Module({{classname}}Service service) : base("{{baseContext}}")
{ {{#operation}} { {{#operation}}

View File

@ -16,6 +16,12 @@ namespace {{packageName}}.{{packageContext}}.Models
{ {{#vars}} { {{#vars}}
public {{>nullableDataType}} {{name}} { get; private set; }{{/vars}} public {{>nullableDataType}} {{name}} { get; private set; }{{/vars}}
/// <summary>
/// Required by some serializers.
/// </summary>
[Obsolete]
public {{classname}}(){}
public {{classname}}({{#vars}}{{>nullableDataType}} {{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}) public {{classname}}({{#vars}}{{>nullableDataType}} {{name}}{{#hasMore}}, {{/hasMore}}{{/vars}})
{ {
{{#vars}} {{#vars}}

View File

@ -1,15 +1,22 @@
package io.swagger.codegen.options; package io.swagger.codegen.options;
import com.google.common.collect.ImmutableMap; import static io.swagger.codegen.CodegenConstants.PACKAGE_NAME;
import io.swagger.codegen.CodegenConstants; import static io.swagger.codegen.CodegenConstants.PACKAGE_VERSION;
import static io.swagger.codegen.CodegenConstants.RETURN_ICOLLECTION;
import static io.swagger.codegen.CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG;
import static io.swagger.codegen.CodegenConstants.SOURCE_FOLDER;
import static io.swagger.codegen.CodegenConstants.USE_COLLECTION;
import static io.swagger.codegen.CodegenConstants.USE_DATETIME_OFFSET;
import java.util.Map; import java.util.Map;
import com.google.common.collect.ImmutableMap;
public class NancyFXServerOptionsProvider implements OptionsProvider { public class NancyFXServerOptionsProvider implements OptionsProvider {
public static final String PACKAGE_NAME_VALUE = "swagger_server_nancyfx"; public static final String PACKAGE_NAME_VALUE = "swagger_server_nancyfx";
public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT"; public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT";
public static final String SOURCE_FOLDER_VALUE = "src_nancyfx"; public static final String SOURCE_FOLDER_VALUE = "src_nancyfx";
@Override @Override
public String getLanguage() { public String getLanguage() {
return "nancyfx"; return "nancyfx";
@ -17,14 +24,14 @@ public class NancyFXServerOptionsProvider implements OptionsProvider {
@Override @Override
public Map<String, String> createOptions() { public Map<String, String> createOptions() {
ImmutableMap.Builder<String, String> builder = new ImmutableMap.Builder<String, String>(); final ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
return builder.put(CodegenConstants.PACKAGE_NAME, PACKAGE_NAME_VALUE) return builder.put(PACKAGE_NAME, PACKAGE_NAME_VALUE)
.put(CodegenConstants.PACKAGE_VERSION, PACKAGE_VERSION_VALUE) .put(PACKAGE_VERSION, PACKAGE_VERSION_VALUE)
.put(CodegenConstants.SOURCE_FOLDER, SOURCE_FOLDER_VALUE) .put(SOURCE_FOLDER, SOURCE_FOLDER_VALUE)
.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, "true") .put(SORT_PARAMS_BY_REQUIRED_FLAG, "true")
.put(CodegenConstants.USE_DATETIME_OFFSET, "true") .put(USE_DATETIME_OFFSET, "true")
.put(CodegenConstants.USE_COLLECTION, "false") .put(USE_COLLECTION, "false")
.put(CodegenConstants.RETURN_ICOLLECTION, "false") .put(RETURN_ICOLLECTION, "false")
.build(); .build();
} }