forked from loafle/openapi-generator-original
[python-experimental] Fixes issue 12986 (#13054)
* Adds fix for api names and tag names * Removes sample spec * Samples regenerated
This commit is contained in:
@@ -637,6 +637,8 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
|
||||
String sanitizedName = sanitizeName(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'.
|
||||
// remove dollar sign
|
||||
sanitizedName = sanitizedName.replaceAll("$", "");
|
||||
// remove whitespace
|
||||
sanitizedName = sanitizedName.replaceAll("\\s+", "");
|
||||
|
||||
String nameWithPrefixSuffix = sanitizedName;
|
||||
if (!StringUtils.isEmpty(modelNamePrefix)) {
|
||||
|
||||
@@ -98,6 +98,14 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen {
|
||||
protected CodegenIgnoreProcessor ignoreProcessor;
|
||||
protected TemplateProcessor templateProcessor = null;
|
||||
|
||||
// for apis.tags imports
|
||||
private Map<String, String> tagModuleNameToApiClassname = new LinkedHashMap<>();
|
||||
// for apis.tags enum tag definition
|
||||
private Map<String, String> enumToTag = new LinkedHashMap<>();
|
||||
// for apis.tags tag api definition
|
||||
private Map<String, String> tagEnumToApiClassname = new LinkedHashMap<>();
|
||||
|
||||
|
||||
public PythonExperimentalClientCodegen() {
|
||||
super();
|
||||
loadDeepObjectIntoItems = false;
|
||||
@@ -473,6 +481,14 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toApiName(String name) {
|
||||
if (name.length() == 0) {
|
||||
return "DefaultApi";
|
||||
}
|
||||
return toModelName(name) + apiNameSuffix;
|
||||
}
|
||||
|
||||
/*
|
||||
I made this method because endpoint parameters not contain a lot of needed metadata
|
||||
It is very verbose to write all of this info into the api template
|
||||
@@ -491,11 +507,38 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen {
|
||||
List<List<Object>> testFiles = new ArrayList<>();
|
||||
String outputFilename;
|
||||
|
||||
// endpoint tags may not exist in the root of the spec file
|
||||
// this is allowed per openapi
|
||||
// because spec tags may be empty ro incomplete, tags are also accumulated from endpoints
|
||||
List<Tag> tags = openAPI.getTags();
|
||||
if (tags != null) {
|
||||
for (Tag tag: tags) {
|
||||
String tagName = tag.getName();
|
||||
String tagModuleName = toApiFilename(tagName);
|
||||
String apiClassname = toApiName(tagName);
|
||||
tagModuleNameToApiClassname.put(tagModuleName, apiClassname);
|
||||
String tagEnum = toEnumVarName(tagName, "str");
|
||||
enumToTag.put(tagEnum, tagName);
|
||||
tagEnumToApiClassname.put(tagEnum, apiClassname);
|
||||
}
|
||||
}
|
||||
|
||||
OperationMap operations = objs.getOperations();
|
||||
List<CodegenOperation> codegenOperations = operations.getOperation();
|
||||
HashMap<String, String> pathModuleToPath = new HashMap<>();
|
||||
// paths.some_path.post.py (single endpoint definition)
|
||||
for (CodegenOperation co: codegenOperations) {
|
||||
if (co.tags != null) {
|
||||
for (Tag tag: co.tags) {
|
||||
String tagName = tag.getName();
|
||||
String tagModuleName = toApiFilename(tagName);
|
||||
String apiClassname = toApiName(tagName);
|
||||
tagModuleNameToApiClassname.put(tagModuleName, apiClassname);
|
||||
String tagEnum = toEnumVarName(tagName, "str");
|
||||
enumToTag.put(tagEnum, tagName);
|
||||
tagEnumToApiClassname.put(tagEnum, apiClassname);
|
||||
}
|
||||
}
|
||||
String path = co.path;
|
||||
String pathModuleName = co.nickname;
|
||||
if (!pathModuleToPath.containsKey(pathModuleName)) {
|
||||
@@ -530,22 +573,6 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen {
|
||||
pathEnumToApiClassname.put(pathEnumVar, apiClassName);
|
||||
pathModuleToApiClassname.put(toVarName(path), apiClassName);
|
||||
}
|
||||
List<Tag> tags = openAPI.getTags();
|
||||
// for imports
|
||||
Map<String, String> tagModuleNameToApiClassname = new LinkedHashMap<>();
|
||||
// for enum tag definition
|
||||
Map<String, String> enumToTag = new LinkedHashMap<>();
|
||||
// for tag api definition
|
||||
Map<String, String> tagEnumToApiClassname = new LinkedHashMap<>();
|
||||
for (Tag tag: tags) {
|
||||
String tagName = tag.getName();
|
||||
String tagModuleName = toApiFilename(tagName);
|
||||
String apiClassname = toApiName(tagName);
|
||||
tagModuleNameToApiClassname.put(tagModuleName, apiClassname);
|
||||
String tagEnum = toEnumVarName(tagName, "str");
|
||||
enumToTag.put(tagEnum, tagName);
|
||||
tagEnumToApiClassname.put(tagEnum, apiClassname);
|
||||
}
|
||||
// Note: __init__apis.handlebars is generated as a supporting file
|
||||
// apis.tag_to_api.py
|
||||
Map<String, Object> tagToApiMap = new HashMap<>();
|
||||
@@ -2617,6 +2644,17 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Note: a custom version of this function is used so the original tag value can be used
|
||||
*
|
||||
* @param tag Tag
|
||||
* @return the tag to use
|
||||
*/
|
||||
@Override
|
||||
public String sanitizeTag(String tag) {
|
||||
return tag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcess() {
|
||||
System.out.println("################################################################################");
|
||||
|
||||
@@ -4,6 +4,10 @@ from petstore_api.apis.tags import TagValues
|
||||
from petstore_api.apis.tags.pet_api import PetApi
|
||||
from petstore_api.apis.tags.store_api import StoreApi
|
||||
from petstore_api.apis.tags.user_api import UserApi
|
||||
from petstore_api.apis.tags.another_fake_api import AnotherFakeApi
|
||||
from petstore_api.apis.tags.default_api import DefaultApi
|
||||
from petstore_api.apis.tags.fake_api import FakeApi
|
||||
from petstore_api.apis.tags.fake_classname_tags123_api import FakeClassnameTags123Api
|
||||
|
||||
TagToApi = typing.TypedDict(
|
||||
'TagToApi',
|
||||
@@ -11,6 +15,10 @@ TagToApi = typing.TypedDict(
|
||||
TagValues.PET: PetApi,
|
||||
TagValues.STORE: StoreApi,
|
||||
TagValues.USER: UserApi,
|
||||
TagValues.ANOTHERFAKE: AnotherFakeApi,
|
||||
TagValues.DEFAULT: DefaultApi,
|
||||
TagValues.FAKE: FakeApi,
|
||||
TagValues.FAKE_CLASSNAME_TAGS_123: FakeClassnameTags123Api,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -19,5 +27,9 @@ tag_to_api = TagToApi(
|
||||
TagValues.PET: PetApi,
|
||||
TagValues.STORE: StoreApi,
|
||||
TagValues.USER: UserApi,
|
||||
TagValues.ANOTHERFAKE: AnotherFakeApi,
|
||||
TagValues.DEFAULT: DefaultApi,
|
||||
TagValues.FAKE: FakeApi,
|
||||
TagValues.FAKE_CLASSNAME_TAGS_123: FakeClassnameTags123Api,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -9,3 +9,7 @@ class TagValues(str, enum.Enum):
|
||||
PET = "pet"
|
||||
STORE = "store"
|
||||
USER = "user"
|
||||
ANOTHERFAKE = "$another-fake?"
|
||||
DEFAULT = "default"
|
||||
FAKE = "fake"
|
||||
FAKE_CLASSNAME_TAGS_123 = "fake_classname_tags 123#$%^"
|
||||
|
||||
Reference in New Issue
Block a user