diff --git a/bin/configs/python-fastapi.yaml b/bin/configs/python-fastapi.yaml index 7bf7405c52..fdba2dbe34 100644 --- a/bin/configs/python-fastapi.yaml +++ b/bin/configs/python-fastapi.yaml @@ -2,5 +2,6 @@ generatorName: python-fastapi outputDir: samples/server/petstore/python-fastapi inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml templateDir: modules/openapi-generator/src/main/resources/python-fastapi +sourceFolder: "src" additionalProperties: hideGenerationTimestamp: "true" diff --git a/docs/generators/python-fastapi.md b/docs/generators/python-fastapi.md index ee2e97acd8..ecb7fe8f23 100644 --- a/docs/generators/python-fastapi.md +++ b/docs/generators/python-fastapi.md @@ -30,6 +30,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |serverPort|TCP port to listen to in app.run| |8080| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| +|sourceFolder|directory for generated python source code| |src| ## IMPORT MAPPING diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java index 627e7ae100..76c13906f0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java @@ -63,10 +63,14 @@ public class PythonFastAPIServerCodegen extends AbstractPythonCodegen { final Logger LOGGER = LoggerFactory.getLogger(PythonFastAPIServerCodegen.class); + protected String sourceFolder; + + private static final String SERVER_PORT = "serverPort"; private static final String NAME = "python-fastapi"; private static final int DEFAULT_SERVER_PORT = 8080; private static final String DEFAULT_PACKAGE_NAME = "openapi_server"; - private static final String SRC_DIR = "src"; + private static final String DEFAULT_SOURCE_FOLDER = "src"; + private static final String DEFAULT_PACKAGE_VERSION = "1.0.0"; @Override public CodegenType getTag() { @@ -95,6 +99,7 @@ public class PythonFastAPIServerCodegen extends AbstractPythonCodegen { * are available in models, apis, and supporting files */ additionalProperties.put("serverPort", DEFAULT_SERVER_PORT); + additionalProperties.put(CodegenConstants.SOURCE_FOLDER, DEFAULT_SOURCE_FOLDER); additionalProperties.put(CodegenConstants.PACKAGE_NAME, DEFAULT_PACKAGE_NAME); languageSpecificPrimitives.add("List"); @@ -114,9 +119,12 @@ public class PythonFastAPIServerCodegen extends AbstractPythonCodegen { cliOptions.add(new CliOption(CodegenConstants.PACKAGE_NAME, "python package name (convention: snake_case).") .defaultValue(DEFAULT_PACKAGE_NAME)); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "python package version.") - .defaultValue("1.0.0")); - cliOptions.add(new CliOption("serverPort", "TCP port to listen to in app.run"). - defaultValue(String.valueOf(DEFAULT_SERVER_PORT))); + .defaultValue(DEFAULT_PACKAGE_VERSION)); + cliOptions.add(new CliOption(SERVER_PORT, "TCP port to listen to in app.run") + .defaultValue(String.valueOf(DEFAULT_SERVER_PORT))); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "directory for generated python source code") + .defaultValue(DEFAULT_SOURCE_FOLDER)); + } @Override @@ -127,20 +135,24 @@ public class PythonFastAPIServerCodegen extends AbstractPythonCodegen { setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); } + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + this.sourceFolder = ((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); + } + modelPackage = packageName + "." + modelPackage; apiPackage = packageName + "." + apiPackage; supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("openapi.mustache", "", "openapi.yaml")); - supportingFiles.add(new SupportingFile("main.mustache", SRC_DIR + File.separator + packageName.replace('.', File.separatorChar), "main.py")); + supportingFiles.add(new SupportingFile("main.mustache", String.join(File.separator, new String[]{sourceFolder, packageName.replace('.', File.separatorChar)}), "main.py")); supportingFiles.add(new SupportingFile("docker-compose.mustache", "", "docker-compose.yaml")); supportingFiles.add(new SupportingFile("Dockerfile.mustache", "", "Dockerfile")); supportingFiles.add(new SupportingFile("requirements.mustache", "", "requirements.txt")); - supportingFiles.add(new SupportingFile("security_api.mustache", SRC_DIR + File.separator + packageName.replace('.', File.separatorChar), "security_api.py")); + supportingFiles.add(new SupportingFile("security_api.mustache", String.join(File.separator, new String[]{sourceFolder, packageName.replace('.', File.separatorChar)}), "security_api.py")); supportingFiles.add(new SupportingFile("extra_models.mustache", StringUtils.substringAfter(modelFileFolder(), outputFolder), "extra_models.py")); // Add __init__.py to all sub-folders under namespace pkg - StringBuilder namespacePackagePath = new StringBuilder(SRC_DIR + File.separator + StringUtils.substringBefore(packageName, ".")); + StringBuilder namespacePackagePath = new StringBuilder(String.join(File.separator, new String[]{sourceFolder, StringUtils.substringBefore(packageName, ".")})); for (String tmp : StringUtils.split(StringUtils.substringAfter(packageName, "."), '.')) { namespacePackagePath.append(File.separator).append(tmp); supportingFiles.add(new SupportingFile("__init__.mustache", namespacePackagePath.toString(), "__init__.py")); @@ -270,12 +282,12 @@ public class PythonFastAPIServerCodegen extends AbstractPythonCodegen { @Override public String apiFileFolder() { - return outputFolder + File.separator + SRC_DIR + File.separator + apiPackage().replace('.', File.separatorChar); + return String.join(File.separator, new String[]{outputFolder, sourceFolder, apiPackage().replace('.', File.separatorChar)}); } @Override public String modelFileFolder() { - return outputFolder + File.separator + SRC_DIR + File.separator + modelPackage().replace('.', File.separatorChar); + return String.join(File.separator, new String[]{outputFolder, sourceFolder, modelPackage().replace('.', File.separatorChar)}); } @Override diff --git a/modules/openapi-generator/src/main/resources/python-fastapi/setup_cfg.mustache b/modules/openapi-generator/src/main/resources/python-fastapi/setup_cfg.mustache index 97721bdc49..b02423bb39 100644 --- a/modules/openapi-generator/src/main/resources/python-fastapi/setup_cfg.mustache +++ b/modules/openapi-generator/src/main/resources/python-fastapi/setup_cfg.mustache @@ -11,13 +11,10 @@ classifiers = Programming Language :: Python :: {{{generatorLanguageVersion}}} [options] -install_requires = - fastapi[all] -setup_requires = - setuptools -package_dir= - =src -packages=find_namespace: +install_requires = fastapi[all] +setup_requires = setuptools +package_dir = ={{sourceFolder}} +packages = find_namespace: [options.packages.find] -where=src +where = {{sourceFolder}} diff --git a/samples/server/petstore/python-fastapi/setup.cfg b/samples/server/petstore/python-fastapi/setup.cfg index cafb7b8cf7..7b47273dbd 100644 --- a/samples/server/petstore/python-fastapi/setup.cfg +++ b/samples/server/petstore/python-fastapi/setup.cfg @@ -11,13 +11,10 @@ classifiers = Programming Language :: Python :: 3.7 [options] -install_requires = - fastapi[all] -setup_requires = - setuptools -package_dir= - =src -packages=find_namespace: +install_requires = fastapi[all] +setup_requires = setuptools +package_dir = =src +packages = find_namespace: [options.packages.find] -where=src +where = src