From 96b98d22c5499e3c69af3505d5c2d1e84db603c3 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Thu, 12 May 2016 23:42:29 -0400 Subject: [PATCH 1/2] [generator] Exclude api/model tests & docs via options Adds support for system properties apiTests, modelTests, modelTests, modelDocs. All accepting a boolean value to explicitly define whether or not these should be generated. These properties aren't considered "features", so specifying -DmodelTests=false for example won't cause api or supportFiles to be ignored. Includes additionalProperty excludeTests for when apiTests and modelTests are both set to false. Also includes update to csharp client generator to prevent generation of the Test project or inclusion of the Test project when both api and model tests are excluded. see #2506 --- README.md | 20 ++ .../io/swagger/codegen/CodegenConstants.java | 10 + .../io/swagger/codegen/DefaultGenerator.java | 212 +++++++++++------- .../languages/CSharpClientCodegen.java | 18 +- .../main/resources/csharp/Solution.mustache | 4 +- 5 files changed, 173 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index bce750740c7..dc75524ccf4 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,26 @@ To control the specific files being generated, you can pass a CSV list of what y -Dmodels=User -DsupportingFiles=StringUtil.java ``` +To control generation of docs and tests for api and models, pass false to the option. For api, these options are `-DapiTest=false` and `-DapiDocs=false`. For models, `-DmodelTest=false` and `-DmodelDocs=false`. +These options default to true and don't limit the generation of the feature options listed above (like `-Dapi`): + +``` +# generate only models (with tests and documentation) +java -Dmodels {opts} + +# generate only models (with tests but no documentation) +java -Dmodels -DmodelDocs=false {opts} + +# generate only User and Pet models (no tests and no documentation) +java -Dmodels=User,Pet -DmodelTests=false {opts} + +# generate only apis (without tests) +java -Dapis -DapiTests=false {opts} + +# generate only apis (modelTests option is ignored) +java -Dapis -DmodelTests=false {opts} +``` + When using selective generation, _only_ the templates needed for the specific generation will be used. ### Customizing the generator diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index b4b414bb00d..52af81d0726 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -105,4 +105,14 @@ public class CodegenConstants { public static final String SUPPORTS_ES6 = "supportsES6"; public static final String SUPPORTS_ES6_DESC = "Generate code that conforms to ES6."; + + public static final String EXCLUDE_TESTS = "excludeTests"; + public static final String EXCLUDE_TESTS_DESC = "Specifies that no tests are to be generated."; + + public static final String GENERATE_API_TESTS = "generateApiTests"; + public static final String GENERATE_API_TESTS_DESC = "Specifies that api tests are to be generated."; + + public static final String GENERATE_MODEL_TESTS = "generateModelTests"; + public static final String GENERATE_MODEL_TESTS_DESC = "Specifies that model tests are to be generated."; + } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 8be354df1ee..e6bef99468d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -41,6 +41,10 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Boolean generateApis = null; Boolean generateModels = null; Boolean generateSupportingFiles = null; + Boolean generateApiTests = null; + Boolean generateApiDocumentation = null; + Boolean generateModelTests = null; + Boolean generateModelDocumentation = null; Set modelsToGenerate = null; Set apisToGenerate = null; @@ -68,6 +72,18 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { supportingFilesToGenerate = new HashSet(Arrays.asList(supportingFiles.split(","))); } } + if(System.getProperty("modelTests") != null) { + generateModelTests = Boolean.valueOf(System.getProperty("modelTests")); + } + if(System.getProperty("modelDocs") != null) { + generateModelDocumentation = Boolean.valueOf(System.getProperty("modelDocs")); + } + if(System.getProperty("apiTests") != null) { + generateApiTests = Boolean.valueOf(System.getProperty("apiTests")); + } + if(System.getProperty("apiDocs") != null) { + generateApiDocumentation = Boolean.valueOf(System.getProperty("apiDocs")); + } if(generateApis == null && generateModels == null && generateSupportingFiles == null) { // no specifics are set, generate everything @@ -85,6 +101,28 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } + // model/api tests and documentation options rely on parent generate options (api or model) and no other options. + // They default to true in all scenarios and can only be marked false explicitly + if (generateModelTests == null) { + generateModelTests = true; + } + if (generateModelDocumentation == null) { + generateModelDocumentation = true; + } + if (generateApiTests == null) { + generateApiTests = true; + } + if (generateApiDocumentation == null) { + generateApiDocumentation = true; + } + + // Additional properties added for tests to exclude references in project related files + config.additionalProperties().put(CodegenConstants.GENERATE_API_TESTS, generateApiTests); + config.additionalProperties().put(CodegenConstants.GENERATE_MODEL_TESTS, generateModelTests); + if(Boolean.FALSE.equals(generateApiTests) && Boolean.FALSE.equals(generateModelTests)) { + config.additionalProperties().put(CodegenConstants.EXCLUDE_TESTS, Boolean.TRUE); + } + if (swagger == null || config == null) { throw new RuntimeException("missing swagger input or config!"); } @@ -282,51 +320,55 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { files.add(new File(filename)); } - // to generate model test files - for (String templateName : config.modelTestTemplateFiles().keySet()) { - String suffix = config.modelTestTemplateFiles().get(templateName); - String filename = config.modelTestFileFolder() + File.separator + config.toModelTestFilename(name) + suffix; - // do not overwrite test file that already exists - if (new File(filename).exists()) { - LOGGER.info("File exists. Skipped overwriting " + filename); - continue; + if(generateModelTests) { + // to generate model test files + for (String templateName : config.modelTestTemplateFiles().keySet()) { + String suffix = config.modelTestTemplateFiles().get(templateName); + String filename = config.modelTestFileFolder() + File.separator + config.toModelTestFilename(name) + suffix; + // do not overwrite test file that already exists + if (new File(filename).exists()) { + LOGGER.info("File exists. Skipped overwriting " + filename); + continue; + } + String templateFile = getFullTemplateFile(config, templateName); + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); + } + }) + .defaultValue("") + .compile(template); + writeToFile(filename, tmpl.execute(models)); + files.add(new File(filename)); } - String templateFile = getFullTemplateFile(config, templateName); - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); - writeToFile(filename, tmpl.execute(models)); - files.add(new File(filename)); } - // to generate model documentation files - for (String templateName : config.modelDocTemplateFiles().keySet()) { - String suffix = config.modelDocTemplateFiles().get(templateName); - String filename = config.modelDocFileFolder() + File.separator + config.toModelDocFilename(name) + suffix; - if (!config.shouldOverwrite(filename)) { - LOGGER.info("Skipped overwriting " + filename); - continue; + if(generateModelDocumentation) { + // to generate model documentation files + for (String templateName : config.modelDocTemplateFiles().keySet()) { + String suffix = config.modelDocTemplateFiles().get(templateName); + String filename = config.modelDocFileFolder() + File.separator + config.toModelDocFilename(name) + suffix; + if (!config.shouldOverwrite(filename)) { + LOGGER.info("Skipped overwriting " + filename); + continue; + } + String templateFile = getFullTemplateFile(config, templateName); + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); + } + }) + .defaultValue("") + .compile(template); + writeToFile(filename, tmpl.execute(models)); + files.add(new File(filename)); } - String templateFile = getFullTemplateFile(config, templateName); - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); - writeToFile(filename, tmpl.execute(models)); - files.add(new File(filename)); } } catch (Exception e) { throw new RuntimeException("Could not generate model '" + name + "'", e); @@ -417,52 +459,56 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { files.add(new File(filename)); } - // to generate api test files - for (String templateName : config.apiTestTemplateFiles().keySet()) { - String filename = config.apiTestFilename(templateName, tag); - // do not overwrite test file that already exists - if (new File(filename).exists()) { - LOGGER.info("File exists. Skipped overwriting " + filename); - continue; - } - String templateFile = getFullTemplateFile(config, templateName); - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); + if(generateApiTests) { + // to generate api test files + for (String templateName : config.apiTestTemplateFiles().keySet()) { + String filename = config.apiTestFilename(templateName, tag); + // do not overwrite test file that already exists + if (new File(filename).exists()) { + LOGGER.info("File exists. Skipped overwriting " + filename); + continue; + } + String templateFile = getFullTemplateFile(config, templateName); + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); + } + }) + .defaultValue("") + .compile(template); - writeToFile(filename, tmpl.execute(operation)); - files.add(new File(filename)); + writeToFile(filename, tmpl.execute(operation)); + files.add(new File(filename)); + } } - // to generate api documentation files - for (String templateName : config.apiDocTemplateFiles().keySet()) { - String filename = config.apiDocFilename(templateName, tag); - if (!config.shouldOverwrite(filename) && new File(filename).exists()) { - LOGGER.info("Skipped overwriting " + filename); - continue; + if(generateApiDocumentation) { + // to generate api documentation files + for (String templateName : config.apiDocTemplateFiles().keySet()) { + String filename = config.apiDocFilename(templateName, tag); + if (!config.shouldOverwrite(filename) && new File(filename).exists()) { + LOGGER.info("Skipped overwriting " + filename); + continue; + } + + String templateFile = getFullTemplateFile(config, templateName); + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); + } + }) + .defaultValue("") + .compile(template); + + writeToFile(filename, tmpl.execute(operation)); + files.add(new File(filename)); } - - String templateFile = getFullTemplateFile(config, templateName); - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); - - writeToFile(filename, tmpl.execute(operation)); - files.add(new File(filename)); } } catch (Exception e) { diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index 2fc8738f067..78941c5a4b6 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -137,6 +137,11 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { @Override public void processOpts() { super.processOpts(); + Boolean excludeTests = false; + + if(additionalProperties.containsKey(CodegenConstants.EXCLUDE_TESTS)) { + excludeTests = Boolean.valueOf(additionalProperties.get(CodegenConstants.EXCLUDE_TESTS).toString()); + } apiPackage = "Api"; modelPackage = "Model"; @@ -232,7 +237,10 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { // copy package.config to nuget's standard location for project-level installs supportingFiles.add(new SupportingFile("packages.config.mustache", packageFolder + File.separator, "packages.config")); - supportingFiles.add(new SupportingFile("packages_test.config.mustache", testPackageFolder + File.separator, "packages.config")); + + if(Boolean.FALSE.equals(excludeTests)) { + supportingFiles.add(new SupportingFile("packages_test.config.mustache", testPackageFolder + File.separator, "packages.config")); + } supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh")); @@ -245,11 +253,9 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { supportingFiles.add(new SupportingFile("Solution.mustache", "", packageName + ".sln")); supportingFiles.add(new SupportingFile("Project.mustache", packageFolder, packageName + ".csproj")); - // TODO: Check if test project output is enabled, partially related to #2506. Should have options for: - // 1) No test project - // 2) No model tests - // 3) No api tests - supportingFiles.add(new SupportingFile("TestProject.mustache", testPackageFolder, testPackageName + ".csproj")); + if(Boolean.FALSE.equals(excludeTests)) { + supportingFiles.add(new SupportingFile("TestProject.mustache", testPackageFolder, testPackageName + ".csproj")); + } } additionalProperties.put("apiDocPath", apiDocPath); diff --git a/modules/swagger-codegen/src/main/resources/csharp/Solution.mustache b/modules/swagger-codegen/src/main/resources/csharp/Solution.mustache index 57f6201600f..763780f657e 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Solution.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Solution.mustache @@ -4,9 +4,9 @@ VisualStudioVersion = 12.0.0.0 MinimumVisualStudioVersion = 10.0.0.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "{{packageName}}", "src\{{packageName}}\{{packageName}}.csproj", "{{packageGuid}}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "{{testPackageName}}", "src\{{testPackageName}}\{{testPackageName}}.csproj", "{19F1DEBC-DE5E-4517-8062-F000CD499087}" +{{^excludeTests}}Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "{{testPackageName}}", "src\{{testPackageName}}\{{testPackageName}}.csproj", "{19F1DEBC-DE5E-4517-8062-F000CD499087}" EndProject -Global +{{/excludeTests}}Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU From f6b42b1a4fb8984e72f78c9c2205d2ef31bd63a2 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Fri, 13 May 2016 22:27:46 -0400 Subject: [PATCH 2/2] [python] Excluded tests shouldn't write test init --- .../swagger/codegen/languages/PythonClientCodegen.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index 113c6a6e1c1..cc3892bb937 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -116,6 +116,11 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig @Override public void processOpts() { super.processOpts(); + Boolean excludeTests = false; + + if(additionalProperties.containsKey(CodegenConstants.EXCLUDE_TESTS)) { + excludeTests = Boolean.valueOf(additionalProperties.get(CodegenConstants.EXCLUDE_TESTS).toString()); + } if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); @@ -151,7 +156,10 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig supportingFiles.add(new SupportingFile("__init__package.mustache", swaggerFolder, "__init__.py")); supportingFiles.add(new SupportingFile("__init__model.mustache", modelPackage, "__init__.py")); supportingFiles.add(new SupportingFile("__init__api.mustache", apiPackage, "__init__.py")); - supportingFiles.add(new SupportingFile("__init__test.mustache", testFolder, "__init__.py")); + + if(Boolean.FALSE.equals(excludeTests)) { + supportingFiles.add(new SupportingFile("__init__test.mustache", testFolder, "__init__.py")); + } supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh")); supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore")); }