forked from loafle/openapi-generator-original
* prioritize mapped discriminators over generated * update samples with new ordering * explain reason behind discriminator prioritization * add new samples * prioritize explicit mapping over any generated mappings * update examples to reflect new logic * update tests to reflect explicit mappings
This commit is contained in:
parent
4f8d61c05c
commit
beb67aa74d
@ -123,9 +123,16 @@ public class CodegenDiscriminator {
|
||||
|
||||
private CodegenModel model;
|
||||
|
||||
public MappedModel(String mappingName, String modelName) {
|
||||
private final boolean explicitMapping;
|
||||
|
||||
public MappedModel(String mappingName, String modelName, boolean explicitMapping) {
|
||||
this.mappingName = mappingName;
|
||||
this.modelName = modelName;
|
||||
this.explicitMapping = explicitMapping;
|
||||
}
|
||||
|
||||
public MappedModel(String mappingName, String modelName) {
|
||||
this(mappingName, modelName, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -137,7 +144,14 @@ public class CodegenDiscriminator {
|
||||
} else if (other.getMappingName() == null) {
|
||||
return -1;
|
||||
}
|
||||
return getMappingName().compareTo(other.getMappingName());
|
||||
|
||||
// prioritize mappings based on mappings in the spec before any auto-generated
|
||||
// so that during serialization the proper values are used in the json
|
||||
if (explicitMapping != other.explicitMapping) {
|
||||
return explicitMapping ? -1 : 1;
|
||||
} else {
|
||||
return getMappingName().compareTo(other.getMappingName());
|
||||
}
|
||||
}
|
||||
|
||||
public String getMappingName() {
|
||||
|
@ -3492,7 +3492,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
Map<String, Object> vendorExtensions = cs.getExtensions();
|
||||
if (vendorExtensions != null && !vendorExtensions.isEmpty() && vendorExtensions.containsKey("x-discriminator-value")) {
|
||||
String xDiscriminatorValue = (String) vendorExtensions.get("x-discriminator-value");
|
||||
mm = new MappedModel(xDiscriminatorValue, toModelName(modelName));
|
||||
mm = new MappedModel(xDiscriminatorValue, toModelName(modelName), true);
|
||||
descendentSchemas.add(mm);
|
||||
}
|
||||
}
|
||||
@ -3550,7 +3550,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
.map(ve -> ve.get("x-discriminator-value"))
|
||||
.map(discriminatorValue -> (String) discriminatorValue)
|
||||
.orElse(currentSchemaName);
|
||||
MappedModel mm = new MappedModel(mappingName, toModelName(currentSchemaName));
|
||||
MappedModel mm = new MappedModel(mappingName, toModelName(currentSchemaName), mappingName != currentSchemaName);
|
||||
descendentSchemas.add(mm);
|
||||
}
|
||||
return descendentSchemas;
|
||||
@ -3604,7 +3604,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
} else {
|
||||
name = e.getValue();
|
||||
}
|
||||
uniqueDescendants.add(new MappedModel(e.getKey(), toModelName(name)));
|
||||
uniqueDescendants.add(new MappedModel(e.getKey(), toModelName(name), true));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1164,7 +1164,7 @@ public class DefaultCodegenTest {
|
||||
sc = openAPI.getComponents().getSchemas().get(modelName);
|
||||
cm = codegen.fromModel(modelName, sc);
|
||||
hs.clear();
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B"), true));
|
||||
hs.add(new CodegenDiscriminator.MappedModel("C", codegen.toModelName("C")));
|
||||
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
|
||||
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);
|
||||
@ -1174,7 +1174,7 @@ public class DefaultCodegenTest {
|
||||
sc = openAPI.getComponents().getSchemas().get(modelName);
|
||||
cm = codegen.fromModel(modelName, sc);
|
||||
hs.clear();
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B"), true));
|
||||
hs.add(new CodegenDiscriminator.MappedModel("C", codegen.toModelName("C")));
|
||||
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
|
||||
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);
|
||||
@ -1184,7 +1184,7 @@ public class DefaultCodegenTest {
|
||||
sc = openAPI.getComponents().getSchemas().get(modelName);
|
||||
cm = codegen.fromModel(modelName, sc);
|
||||
hs.clear();
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B"), true));
|
||||
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
|
||||
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);
|
||||
}
|
||||
@ -1265,7 +1265,7 @@ public class DefaultCodegenTest {
|
||||
sc = openAPI.getComponents().getSchemas().get(modelName);
|
||||
cm = codegen.fromModel(modelName, sc);
|
||||
hs.clear();
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
|
||||
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B"), true));
|
||||
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);
|
||||
|
||||
// the mapping in b is in B
|
||||
@ -1654,8 +1654,8 @@ public class DefaultCodegenTest {
|
||||
discriminator.setPropertyBaseName(prop);
|
||||
discriminator.setMapping(null);
|
||||
discriminator.setMappedModels(new HashSet<CodegenDiscriminator.MappedModel>() {{
|
||||
add(new CodegenDiscriminator.MappedModel("daily", "DailySubObj"));
|
||||
add(new CodegenDiscriminator.MappedModel("sub-obj", "SubObj"));
|
||||
add(new CodegenDiscriminator.MappedModel("daily", "DailySubObj", true));
|
||||
add(new CodegenDiscriminator.MappedModel("sub-obj", "SubObj", true));
|
||||
}});
|
||||
assertEquals(cm.discriminator, discriminator);
|
||||
}
|
||||
@ -2049,8 +2049,8 @@ public class DefaultCodegenTest {
|
||||
test.setMapping(new HashMap<>());
|
||||
test.getMapping().put("a", "#/components/schemas/Adult");
|
||||
test.getMapping().put("c", "Child");
|
||||
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("a", "Adult"));
|
||||
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("c", "Child"));
|
||||
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("a", "Adult", true));
|
||||
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("c", "Child", true));
|
||||
Assert.assertEquals(discriminator, test);
|
||||
}
|
||||
|
||||
|
@ -386,8 +386,8 @@ public class RubyClientCodegenTest {
|
||||
|
||||
CodegenDiscriminator codegenDiscriminator = person.getDiscriminator();
|
||||
Set<CodegenDiscriminator.MappedModel> mappedModels = new LinkedHashSet<CodegenDiscriminator.MappedModel>();
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("a", "Adult"));
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("c", "Child"));
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("a", "Adult", true));
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("c", "Child", true));
|
||||
Assert.assertEquals(codegenDiscriminator.getMappedModels(), mappedModels);
|
||||
}
|
||||
|
||||
@ -405,8 +405,8 @@ public class RubyClientCodegenTest {
|
||||
|
||||
CodegenDiscriminator codegenDiscriminator = person.getDiscriminator();
|
||||
Set<CodegenDiscriminator.MappedModel> mappedModels = new LinkedHashSet<CodegenDiscriminator.MappedModel>();
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("a", "Adult"));
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("c", "Child"));
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("a", "Adult", true));
|
||||
mappedModels.add(new CodegenDiscriminator.MappedModel("c", "Child", true));
|
||||
Assert.assertEquals(codegenDiscriminator.getMappedModels(), mappedModels);
|
||||
}
|
||||
|
||||
|
BIN
samples/openapi3/client/petstore/python-nextgen/.coverage
Normal file
BIN
samples/openapi3/client/petstore/python-nextgen/.coverage
Normal file
Binary file not shown.
@ -0,0 +1,115 @@
|
||||
Defaulting to user installation because normal site-packages is not writeable
|
||||
Collecting tox
|
||||
Downloading tox-4.4.12-py3-none-any.whl (148 kB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 149.0/149.0 KB 3.0 MB/s eta 0:00:00
|
||||
Collecting flake8
|
||||
Downloading flake8-6.0.0-py2.py3-none-any.whl (57 kB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.8/57.8 KB 10.7 MB/s eta 0:00:00
|
||||
Collecting chardet>=5.1
|
||||
Downloading chardet-5.1.0-py3-none-any.whl (199 kB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 199.1/199.1 KB 8.7 MB/s eta 0:00:00
|
||||
Collecting tomli>=2.0.1
|
||||
Downloading tomli-2.0.1-py3-none-any.whl (12 kB)
|
||||
Collecting filelock>=3.11
|
||||
Downloading filelock-3.12.0-py3-none-any.whl (10 kB)
|
||||
Collecting platformdirs>=3.2
|
||||
Downloading platformdirs-3.2.0-py3-none-any.whl (14 kB)
|
||||
Collecting pyproject-api>=1.5.1
|
||||
Downloading pyproject_api-1.5.1-py3-none-any.whl (12 kB)
|
||||
Collecting packaging>=23
|
||||
Downloading packaging-23.1-py3-none-any.whl (48 kB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.9/48.9 KB 6.8 MB/s eta 0:00:00
|
||||
Collecting pluggy>=1
|
||||
Downloading pluggy-1.0.0-py2.py3-none-any.whl (13 kB)
|
||||
Collecting virtualenv>=20.21
|
||||
Downloading virtualenv-20.22.0-py3-none-any.whl (3.2 MB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 14.5 MB/s eta 0:00:00
|
||||
Collecting colorama>=0.4.6
|
||||
Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
|
||||
Collecting cachetools>=5.3
|
||||
Downloading cachetools-5.3.0-py3-none-any.whl (9.3 kB)
|
||||
Collecting mccabe<0.8.0,>=0.7.0
|
||||
Downloading mccabe-0.7.0-py2.py3-none-any.whl (7.3 kB)
|
||||
Collecting pycodestyle<2.11.0,>=2.10.0
|
||||
Downloading pycodestyle-2.10.0-py2.py3-none-any.whl (41 kB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.3/41.3 KB 5.0 MB/s eta 0:00:00
|
||||
Collecting pyflakes<3.1.0,>=3.0.0
|
||||
Downloading pyflakes-3.0.1-py2.py3-none-any.whl (62 kB)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 KB 14.3 MB/s eta 0:00:00
|
||||
Requirement already satisfied: distlib<1,>=0.3.6 in /home/robbert/.local/lib/python3.10/site-packages (from virtualenv>=20.21->tox->-r dev-requirements.txt (line 1)) (0.3.6)
|
||||
Installing collected packages: tomli, pyflakes, pycodestyle, pluggy, platformdirs, packaging, mccabe, filelock, colorama, chardet, cachetools, virtualenv, pyproject-api, flake8, tox
|
||||
Attempting uninstall: filelock
|
||||
Found existing installation: filelock 3.10.4
|
||||
Uninstalling filelock-3.10.4:
|
||||
Successfully uninstalled filelock-3.10.4
|
||||
Attempting uninstall: virtualenv
|
||||
Found existing installation: virtualenv 20.4.2
|
||||
Uninstalling virtualenv-20.4.2:
|
||||
Successfully uninstalled virtualenv-20.4.2
|
||||
Successfully installed cachetools-5.3.0 chardet-5.1.0 colorama-0.4.6 filelock-3.12.0 flake8-6.0.0 mccabe-0.7.0 packaging-23.1 platformdirs-3.2.0 pluggy-1.0.0 pycodestyle-2.10.0 pyflakes-3.0.1 pyproject-api-1.5.1 tomli-2.0.1 tox-4.4.12 virtualenv-20.22.0
|
||||
Collecting tox (from -r dev-requirements.txt (line 1))
|
||||
Using cached tox-4.4.12-py3-none-any.whl (148 kB)
|
||||
Collecting flake8 (from -r dev-requirements.txt (line 2))
|
||||
Using cached flake8-6.0.0-py2.py3-none-any.whl (57 kB)
|
||||
Collecting cachetools>=5.3 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached cachetools-5.3.0-py3-none-any.whl (9.3 kB)
|
||||
Collecting chardet>=5.1 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached chardet-5.1.0-py3-none-any.whl (199 kB)
|
||||
Collecting colorama>=0.4.6 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
|
||||
Collecting filelock>=3.11 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached filelock-3.12.0-py3-none-any.whl (10 kB)
|
||||
Collecting packaging>=23 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached packaging-23.1-py3-none-any.whl (48 kB)
|
||||
Collecting platformdirs>=3.2 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached platformdirs-3.2.0-py3-none-any.whl (14 kB)
|
||||
Collecting pluggy>=1 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached pluggy-1.0.0-py2.py3-none-any.whl (13 kB)
|
||||
Collecting pyproject-api>=1.5.1 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached pyproject_api-1.5.1-py3-none-any.whl (12 kB)
|
||||
Collecting tomli>=2.0.1 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached tomli-2.0.1-py3-none-any.whl (12 kB)
|
||||
Collecting virtualenv>=20.21 (from tox->-r dev-requirements.txt (line 1))
|
||||
Using cached virtualenv-20.22.0-py3-none-any.whl (3.2 MB)
|
||||
Collecting mccabe<0.8.0,>=0.7.0 (from flake8->-r dev-requirements.txt (line 2))
|
||||
Using cached mccabe-0.7.0-py2.py3-none-any.whl (7.3 kB)
|
||||
Collecting pycodestyle<2.11.0,>=2.10.0 (from flake8->-r dev-requirements.txt (line 2))
|
||||
Using cached pycodestyle-2.10.0-py2.py3-none-any.whl (41 kB)
|
||||
Collecting pyflakes<3.1.0,>=3.0.0 (from flake8->-r dev-requirements.txt (line 2))
|
||||
Using cached pyflakes-3.0.1-py2.py3-none-any.whl (62 kB)
|
||||
Collecting distlib<1,>=0.3.6 (from virtualenv>=20.21->tox->-r dev-requirements.txt (line 1))
|
||||
Using cached distlib-0.3.6-py2.py3-none-any.whl (468 kB)
|
||||
Installing collected packages: distlib, tomli, pyflakes, pycodestyle, pluggy, platformdirs, packaging, mccabe, filelock, colorama, chardet, cachetools, virtualenv, pyproject-api, flake8, tox
|
||||
Successfully installed cachetools-5.3.0 chardet-5.1.0 colorama-0.4.6 distlib-0.3.6 filelock-3.12.0 flake8-6.0.0 mccabe-0.7.0 packaging-23.1 platformdirs-3.2.0 pluggy-1.0.0 pycodestyle-2.10.0 pyflakes-3.0.1 pyproject-api-1.5.1 tomli-2.0.1 tox-4.4.12 virtualenv-20.22.0
|
||||
Requirement already satisfied: tox in ./venv/lib/python3.10/site-packages (from -r dev-requirements.txt (line 1)) (4.4.12)
|
||||
Requirement already satisfied: flake8 in ./venv/lib/python3.10/site-packages (from -r dev-requirements.txt (line 2)) (6.0.0)
|
||||
Requirement already satisfied: cachetools>=5.3 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (5.3.0)
|
||||
Requirement already satisfied: chardet>=5.1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (5.1.0)
|
||||
Requirement already satisfied: colorama>=0.4.6 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (0.4.6)
|
||||
Requirement already satisfied: filelock>=3.11 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (3.12.0)
|
||||
Requirement already satisfied: packaging>=23 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (23.1)
|
||||
Requirement already satisfied: platformdirs>=3.2 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (3.2.0)
|
||||
Requirement already satisfied: pluggy>=1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (1.0.0)
|
||||
Requirement already satisfied: pyproject-api>=1.5.1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (1.5.1)
|
||||
Requirement already satisfied: tomli>=2.0.1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (2.0.1)
|
||||
Requirement already satisfied: virtualenv>=20.21 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (20.22.0)
|
||||
Requirement already satisfied: mccabe<0.8.0,>=0.7.0 in ./venv/lib/python3.10/site-packages (from flake8->-r dev-requirements.txt (line 2)) (0.7.0)
|
||||
Requirement already satisfied: pycodestyle<2.11.0,>=2.10.0 in ./venv/lib/python3.10/site-packages (from flake8->-r dev-requirements.txt (line 2)) (2.10.0)
|
||||
Requirement already satisfied: pyflakes<3.1.0,>=3.0.0 in ./venv/lib/python3.10/site-packages (from flake8->-r dev-requirements.txt (line 2)) (3.0.1)
|
||||
Requirement already satisfied: distlib<1,>=0.3.6 in ./venv/lib/python3.10/site-packages (from virtualenv>=20.21->tox->-r dev-requirements.txt (line 1)) (0.3.6)
|
||||
Requirement already satisfied: tox in ./venv/lib/python3.10/site-packages (from -r dev-requirements.txt (line 1)) (4.4.12)
|
||||
Requirement already satisfied: flake8 in ./venv/lib/python3.10/site-packages (from -r dev-requirements.txt (line 2)) (6.0.0)
|
||||
Requirement already satisfied: cachetools>=5.3 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (5.3.0)
|
||||
Requirement already satisfied: chardet>=5.1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (5.1.0)
|
||||
Requirement already satisfied: colorama>=0.4.6 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (0.4.6)
|
||||
Requirement already satisfied: filelock>=3.11 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (3.12.0)
|
||||
Requirement already satisfied: packaging>=23 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (23.1)
|
||||
Requirement already satisfied: platformdirs>=3.2 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (3.2.0)
|
||||
Requirement already satisfied: pluggy>=1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (1.0.0)
|
||||
Requirement already satisfied: pyproject-api>=1.5.1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (1.5.1)
|
||||
Requirement already satisfied: tomli>=2.0.1 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (2.0.1)
|
||||
Requirement already satisfied: virtualenv>=20.21 in ./venv/lib/python3.10/site-packages (from tox->-r dev-requirements.txt (line 1)) (20.22.0)
|
||||
Requirement already satisfied: mccabe<0.8.0,>=0.7.0 in ./venv/lib/python3.10/site-packages (from flake8->-r dev-requirements.txt (line 2)) (0.7.0)
|
||||
Requirement already satisfied: pycodestyle<2.11.0,>=2.10.0 in ./venv/lib/python3.10/site-packages (from flake8->-r dev-requirements.txt (line 2)) (2.10.0)
|
||||
Requirement already satisfied: pyflakes<3.1.0,>=3.0.0 in ./venv/lib/python3.10/site-packages (from flake8->-r dev-requirements.txt (line 2)) (3.0.1)
|
||||
Requirement already satisfied: distlib<1,>=0.3.6 in ./venv/lib/python3.10/site-packages (from virtualenv>=20.21->tox->-r dev-requirements.txt (line 1)) (0.3.6)
|
@ -0,0 +1,13 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: petstore-api
|
||||
Version: 1.0.0
|
||||
Summary: OpenAPI Petstore
|
||||
Home-page:
|
||||
Author: OpenAPI Generator community
|
||||
Author-email: team@openapitools.org
|
||||
License: Apache-2.0
|
||||
Keywords: OpenAPI,OpenAPI-Generator,OpenAPI Petstore
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \ # noqa: E501
|
||||
|
@ -0,0 +1,176 @@
|
||||
README.md
|
||||
pyproject.toml
|
||||
setup.cfg
|
||||
setup.py
|
||||
petstore_api/__init__.py
|
||||
petstore_api/api_client.py
|
||||
petstore_api/configuration.py
|
||||
petstore_api/exceptions.py
|
||||
petstore_api/rest.py
|
||||
petstore_api/signing.py
|
||||
petstore_api.egg-info/PKG-INFO
|
||||
petstore_api.egg-info/SOURCES.txt
|
||||
petstore_api.egg-info/dependency_links.txt
|
||||
petstore_api.egg-info/requires.txt
|
||||
petstore_api.egg-info/top_level.txt
|
||||
petstore_api/api/__init__.py
|
||||
petstore_api/api/another_fake_api.py
|
||||
petstore_api/api/default_api.py
|
||||
petstore_api/api/fake_api.py
|
||||
petstore_api/api/fake_classname_tags123_api.py
|
||||
petstore_api/api/fake_classname_tags_123_api.py
|
||||
petstore_api/api/pet_api.py
|
||||
petstore_api/api/store_api.py
|
||||
petstore_api/api/user_api.py
|
||||
petstore_api/models/__init__.py
|
||||
petstore_api/models/additional_properties_class.py
|
||||
petstore_api/models/all_of_with_single_ref.py
|
||||
petstore_api/models/animal.py
|
||||
petstore_api/models/any_of_color.py
|
||||
petstore_api/models/any_of_pig.py
|
||||
petstore_api/models/api_response.py
|
||||
petstore_api/models/array_of_array_of_number_only.py
|
||||
petstore_api/models/array_of_number_only.py
|
||||
petstore_api/models/array_test.py
|
||||
petstore_api/models/basque_pig.py
|
||||
petstore_api/models/capitalization.py
|
||||
petstore_api/models/cat.py
|
||||
petstore_api/models/cat_all_of.py
|
||||
petstore_api/models/category.py
|
||||
petstore_api/models/circular_reference_model.py
|
||||
petstore_api/models/class_model.py
|
||||
petstore_api/models/client.py
|
||||
petstore_api/models/color.py
|
||||
petstore_api/models/danish_pig.py
|
||||
petstore_api/models/deprecated_object.py
|
||||
petstore_api/models/dog.py
|
||||
petstore_api/models/dog_all_of.py
|
||||
petstore_api/models/dummy_model.py
|
||||
petstore_api/models/enum_arrays.py
|
||||
petstore_api/models/enum_class.py
|
||||
petstore_api/models/enum_test.py
|
||||
petstore_api/models/file.py
|
||||
petstore_api/models/file_schema_test_class.py
|
||||
petstore_api/models/first_ref.py
|
||||
petstore_api/models/foo.py
|
||||
petstore_api/models/foo_get_default_response.py
|
||||
petstore_api/models/format_test.py
|
||||
petstore_api/models/has_only_read_only.py
|
||||
petstore_api/models/health_check_result.py
|
||||
petstore_api/models/inner_dict_with_property.py
|
||||
petstore_api/models/list.py
|
||||
petstore_api/models/map_test.py
|
||||
petstore_api/models/mixed_properties_and_additional_properties_class.py
|
||||
petstore_api/models/model200_response.py
|
||||
petstore_api/models/model_return.py
|
||||
petstore_api/models/name.py
|
||||
petstore_api/models/nullable_class.py
|
||||
petstore_api/models/number_only.py
|
||||
petstore_api/models/object_with_deprecated_fields.py
|
||||
petstore_api/models/order.py
|
||||
petstore_api/models/outer_composite.py
|
||||
petstore_api/models/outer_enum.py
|
||||
petstore_api/models/outer_enum_default_value.py
|
||||
petstore_api/models/outer_enum_integer.py
|
||||
petstore_api/models/outer_enum_integer_default_value.py
|
||||
petstore_api/models/outer_object_with_enum_property.py
|
||||
petstore_api/models/parent.py
|
||||
petstore_api/models/parent_with_optional_dict.py
|
||||
petstore_api/models/pet.py
|
||||
petstore_api/models/pig.py
|
||||
petstore_api/models/read_only_first.py
|
||||
petstore_api/models/second_ref.py
|
||||
petstore_api/models/self_reference_model.py
|
||||
petstore_api/models/single_ref_type.py
|
||||
petstore_api/models/special_character_enum.py
|
||||
petstore_api/models/special_model_name.py
|
||||
petstore_api/models/special_name.py
|
||||
petstore_api/models/tag.py
|
||||
petstore_api/models/user.py
|
||||
petstore_api/models/with_nested_one_of.py
|
||||
test/test_additional_properties_class.py
|
||||
test/test_all_of_with_single_ref.py
|
||||
test/test_animal.py
|
||||
test/test_another_fake_api.py
|
||||
test/test_any_of_color.py
|
||||
test/test_any_of_pig.py
|
||||
test/test_api_response.py
|
||||
test/test_array_of_array_of_number_only.py
|
||||
test/test_array_of_number_only.py
|
||||
test/test_array_test.py
|
||||
test/test_basque_pig.py
|
||||
test/test_capitalization.py
|
||||
test/test_cat.py
|
||||
test/test_cat_all_of.py
|
||||
test/test_category.py
|
||||
test/test_circular_reference_model.py
|
||||
test/test_class_model.py
|
||||
test/test_client.py
|
||||
test/test_color.py
|
||||
test/test_configuration.py
|
||||
test/test_danish_pig.py
|
||||
test/test_default_api.py
|
||||
test/test_deprecated_object.py
|
||||
test/test_dog.py
|
||||
test/test_dog_all_of.py
|
||||
test/test_dummy_model.py
|
||||
test/test_enum_arrays.py
|
||||
test/test_enum_class.py
|
||||
test/test_enum_test.py
|
||||
test/test_fake_api.py
|
||||
test/test_fake_classname_tags123_api.py
|
||||
test/test_fake_classname_tags_123_api.py
|
||||
test/test_file.py
|
||||
test/test_file_schema_test_class.py
|
||||
test/test_first_ref.py
|
||||
test/test_foo.py
|
||||
test/test_foo_get_default_response.py
|
||||
test/test_format_test.py
|
||||
test/test_has_only_read_only.py
|
||||
test/test_health_check_result.py
|
||||
test/test_inner_dict_with_property.py
|
||||
test/test_list.py
|
||||
test/test_map_test.py
|
||||
test/test_mixed_properties_and_additional_properties_class.py
|
||||
test/test_model200_response.py
|
||||
test/test_model_return.py
|
||||
test/test_name.py
|
||||
test/test_nullable_class.py
|
||||
test/test_number_only.py
|
||||
test/test_object_with_deprecated_fields.py
|
||||
test/test_order.py
|
||||
test/test_outer_composite.py
|
||||
test/test_outer_enum.py
|
||||
test/test_outer_enum_default_value.py
|
||||
test/test_outer_enum_integer.py
|
||||
test/test_outer_enum_integer_default_value.py
|
||||
test/test_outer_object_with_enum_property.py
|
||||
test/test_parent.py
|
||||
test/test_parent_with_optional_dict.py
|
||||
test/test_pet.py
|
||||
test/test_pet_api.py
|
||||
test/test_pig.py
|
||||
test/test_read_only_first.py
|
||||
test/test_second_ref.py
|
||||
test/test_self_reference_model.py
|
||||
test/test_single_ref_type.py
|
||||
test/test_special_character_enum.py
|
||||
test/test_special_model_name.py
|
||||
test/test_special_name.py
|
||||
test/test_store_api.py
|
||||
test/test_tag.py
|
||||
test/test_user.py
|
||||
test/test_user_api.py
|
||||
test/test_with_nested_one_of.py
|
||||
tests/test_api_client.py
|
||||
tests/test_api_exception.py
|
||||
tests/test_api_validation.py
|
||||
tests/test_configuration.py
|
||||
tests/test_deserialization.py
|
||||
tests/test_http_signature.py
|
||||
tests/test_map_test.py
|
||||
tests/test_model.py
|
||||
tests/test_order_model.py
|
||||
tests/test_pet_api.py
|
||||
tests/test_pet_model.py
|
||||
tests/test_store_api.py
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1,6 @@
|
||||
urllib3>=1.25.3
|
||||
python-dateutil
|
||||
pem>=19.3.0
|
||||
pycryptodome>=3.9.0
|
||||
pydantic<2,>=1.10.5
|
||||
aenum
|
@ -0,0 +1 @@
|
||||
petstore_api
|
@ -0,0 +1,349 @@
|
||||
"""
|
||||
OpenAPI Petstore
|
||||
|
||||
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
|
||||
|
||||
The version of the OpenAPI document: 1.0.0
|
||||
Generated by: https://openapi-generator.tech
|
||||
"""
|
||||
|
||||
|
||||
import re # noqa: F401
|
||||
import sys # noqa: F401
|
||||
|
||||
from petstore_api.model_utils import ( # noqa: F401
|
||||
ApiTypeError,
|
||||
ModelComposed,
|
||||
ModelNormal,
|
||||
ModelSimple,
|
||||
cached_property,
|
||||
change_keys_js_to_python,
|
||||
convert_js_args_to_python_args,
|
||||
date,
|
||||
datetime,
|
||||
file_type,
|
||||
none_type,
|
||||
validate_get_composed_info,
|
||||
OpenApiModel
|
||||
)
|
||||
from petstore_api.exceptions import ApiAttributeError
|
||||
|
||||
|
||||
def lazy_import():
|
||||
from petstore_api.model.pig import Pig
|
||||
from petstore_api.model.whale import Whale
|
||||
from petstore_api.model.zebra import Zebra
|
||||
globals()['Pig'] = Pig
|
||||
globals()['Whale'] = Whale
|
||||
globals()['Zebra'] = Zebra
|
||||
|
||||
|
||||
class Mammal(ModelComposed):
|
||||
"""NOTE: This class is auto generated by OpenAPI Generator.
|
||||
Ref: https://openapi-generator.tech
|
||||
|
||||
Do not edit the class manually.
|
||||
|
||||
Attributes:
|
||||
allowed_values (dict): The key is the tuple path to the attribute
|
||||
and the for var_name this is (var_name,). The value is a dict
|
||||
with a capitalized key describing the allowed value and an allowed
|
||||
value. These dicts store the allowed enum values.
|
||||
attribute_map (dict): The key is attribute name
|
||||
and the value is json key in definition.
|
||||
discriminator_value_class_map (dict): A dict to go from the discriminator
|
||||
variable value to the discriminator class name.
|
||||
validations (dict): The key is the tuple path to the attribute
|
||||
and the for var_name this is (var_name,). The value is a dict
|
||||
that stores validations for max_length, min_length, max_items,
|
||||
min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum,
|
||||
inclusive_minimum, and regex.
|
||||
additional_properties_type (tuple): A tuple of classes accepted
|
||||
as additional properties values.
|
||||
"""
|
||||
|
||||
allowed_values = {
|
||||
('type',): {
|
||||
'PLAINS': "plains",
|
||||
'MOUNTAIN': "mountain",
|
||||
'GREVYS': "grevys",
|
||||
},
|
||||
}
|
||||
|
||||
validations = {
|
||||
}
|
||||
|
||||
@cached_property
|
||||
def additional_properties_type():
|
||||
"""
|
||||
This must be a method because a model may have properties that are
|
||||
of type self, this must run after the class is loaded
|
||||
"""
|
||||
lazy_import()
|
||||
return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501
|
||||
|
||||
_nullable = False
|
||||
|
||||
@cached_property
|
||||
def openapi_types():
|
||||
"""
|
||||
This must be a method because a model may have properties that are
|
||||
of type self, this must run after the class is loaded
|
||||
|
||||
Returns
|
||||
openapi_types (dict): The key is attribute name
|
||||
and the value is attribute type.
|
||||
"""
|
||||
lazy_import()
|
||||
return {
|
||||
'class_name': (str,), # noqa: E501
|
||||
'has_baleen': (bool,), # noqa: E501
|
||||
'has_teeth': (bool,), # noqa: E501
|
||||
'type': (str,), # noqa: E501
|
||||
}
|
||||
|
||||
@cached_property
|
||||
def discriminator():
|
||||
lazy_import()
|
||||
val = {
|
||||
'whale': Whale,
|
||||
'zebra': Zebra,
|
||||
'Pig': Pig,
|
||||
}
|
||||
if not val:
|
||||
return None
|
||||
return {'class_name': val}
|
||||
|
||||
attribute_map = {
|
||||
'class_name': 'className', # noqa: E501
|
||||
'has_baleen': 'hasBaleen', # noqa: E501
|
||||
'has_teeth': 'hasTeeth', # noqa: E501
|
||||
'type': 'type', # noqa: E501
|
||||
}
|
||||
|
||||
read_only_vars = {
|
||||
}
|
||||
|
||||
@classmethod
|
||||
@convert_js_args_to_python_args
|
||||
def _from_openapi_data(cls, *args, **kwargs): # noqa: E501
|
||||
"""Mammal - a model defined in OpenAPI
|
||||
|
||||
Keyword Args:
|
||||
class_name (str):
|
||||
_check_type (bool): if True, values for parameters in openapi_types
|
||||
will be type checked and a TypeError will be
|
||||
raised if the wrong type is input.
|
||||
Defaults to True
|
||||
_path_to_item (tuple/list): This is a list of keys or values to
|
||||
drill down to the model in received_data
|
||||
when deserializing a response
|
||||
_spec_property_naming (bool): True if the variable names in the input data
|
||||
are serialized names, as specified in the OpenAPI document.
|
||||
False if the variable names in the input data
|
||||
are pythonic names, e.g. snake case (default)
|
||||
_configuration (Configuration): the instance to use when
|
||||
deserializing a file_type parameter.
|
||||
If passed, type conversion is attempted
|
||||
If omitted no type conversion is done.
|
||||
_visited_composed_classes (tuple): This stores a tuple of
|
||||
classes that we have traveled through so that
|
||||
if we see that class again we will not use its
|
||||
discriminator again.
|
||||
When traveling through a discriminator, the
|
||||
composed schema that is
|
||||
is traveled through is added to this set.
|
||||
For example if Animal has a discriminator
|
||||
petType and we pass in "Dog", and the class Dog
|
||||
allOf includes Animal, we move through Animal
|
||||
once using the discriminator, and pick Dog.
|
||||
Then in Dog, we will make an instance of the
|
||||
Animal class but this time we won't travel
|
||||
through its discriminator because we passed in
|
||||
_visited_composed_classes = (Animal,)
|
||||
has_baleen (bool): [optional] # noqa: E501
|
||||
has_teeth (bool): [optional] # noqa: E501
|
||||
type (str): [optional] # noqa: E501
|
||||
"""
|
||||
|
||||
_check_type = kwargs.pop('_check_type', True)
|
||||
_spec_property_naming = kwargs.pop('_spec_property_naming', False)
|
||||
_path_to_item = kwargs.pop('_path_to_item', ())
|
||||
_configuration = kwargs.pop('_configuration', None)
|
||||
_visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
|
||||
|
||||
self = super(OpenApiModel, cls).__new__(cls)
|
||||
|
||||
if args:
|
||||
for arg in args:
|
||||
if isinstance(arg, dict):
|
||||
kwargs.update(arg)
|
||||
else:
|
||||
raise ApiTypeError(
|
||||
"Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % (
|
||||
args,
|
||||
self.__class__.__name__,
|
||||
),
|
||||
path_to_item=_path_to_item,
|
||||
valid_classes=(self.__class__,),
|
||||
)
|
||||
|
||||
self._data_store = {}
|
||||
self._check_type = _check_type
|
||||
self._spec_property_naming = _spec_property_naming
|
||||
self._path_to_item = _path_to_item
|
||||
self._configuration = _configuration
|
||||
self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
|
||||
|
||||
constant_args = {
|
||||
'_check_type': _check_type,
|
||||
'_path_to_item': _path_to_item,
|
||||
'_spec_property_naming': _spec_property_naming,
|
||||
'_configuration': _configuration,
|
||||
'_visited_composed_classes': self._visited_composed_classes,
|
||||
}
|
||||
composed_info = validate_get_composed_info(
|
||||
constant_args, kwargs, self)
|
||||
self._composed_instances = composed_info[0]
|
||||
self._var_name_to_model_instances = composed_info[1]
|
||||
self._additional_properties_model_instances = composed_info[2]
|
||||
discarded_args = composed_info[3]
|
||||
|
||||
for var_name, var_value in kwargs.items():
|
||||
if var_name in discarded_args and \
|
||||
self._configuration is not None and \
|
||||
self._configuration.discard_unknown_keys and \
|
||||
self._additional_properties_model_instances:
|
||||
# discard variable.
|
||||
continue
|
||||
setattr(self, var_name, var_value)
|
||||
|
||||
return self
|
||||
|
||||
required_properties = set([
|
||||
'_data_store',
|
||||
'_check_type',
|
||||
'_spec_property_naming',
|
||||
'_path_to_item',
|
||||
'_configuration',
|
||||
'_visited_composed_classes',
|
||||
'_composed_instances',
|
||||
'_var_name_to_model_instances',
|
||||
'_additional_properties_model_instances',
|
||||
])
|
||||
|
||||
@convert_js_args_to_python_args
|
||||
def __init__(self, *args, **kwargs): # noqa: E501
|
||||
"""Mammal - a model defined in OpenAPI
|
||||
|
||||
Keyword Args:
|
||||
class_name (str):
|
||||
_check_type (bool): if True, values for parameters in openapi_types
|
||||
will be type checked and a TypeError will be
|
||||
raised if the wrong type is input.
|
||||
Defaults to True
|
||||
_path_to_item (tuple/list): This is a list of keys or values to
|
||||
drill down to the model in received_data
|
||||
when deserializing a response
|
||||
_spec_property_naming (bool): True if the variable names in the input data
|
||||
are serialized names, as specified in the OpenAPI document.
|
||||
False if the variable names in the input data
|
||||
are pythonic names, e.g. snake case (default)
|
||||
_configuration (Configuration): the instance to use when
|
||||
deserializing a file_type parameter.
|
||||
If passed, type conversion is attempted
|
||||
If omitted no type conversion is done.
|
||||
_visited_composed_classes (tuple): This stores a tuple of
|
||||
classes that we have traveled through so that
|
||||
if we see that class again we will not use its
|
||||
discriminator again.
|
||||
When traveling through a discriminator, the
|
||||
composed schema that is
|
||||
is traveled through is added to this set.
|
||||
For example if Animal has a discriminator
|
||||
petType and we pass in "Dog", and the class Dog
|
||||
allOf includes Animal, we move through Animal
|
||||
once using the discriminator, and pick Dog.
|
||||
Then in Dog, we will make an instance of the
|
||||
Animal class but this time we won't travel
|
||||
through its discriminator because we passed in
|
||||
_visited_composed_classes = (Animal,)
|
||||
has_baleen (bool): [optional] # noqa: E501
|
||||
has_teeth (bool): [optional] # noqa: E501
|
||||
type (str): [optional] # noqa: E501
|
||||
"""
|
||||
|
||||
_check_type = kwargs.pop('_check_type', True)
|
||||
_spec_property_naming = kwargs.pop('_spec_property_naming', False)
|
||||
_path_to_item = kwargs.pop('_path_to_item', ())
|
||||
_configuration = kwargs.pop('_configuration', None)
|
||||
_visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
|
||||
|
||||
if args:
|
||||
for arg in args:
|
||||
if isinstance(arg, dict):
|
||||
kwargs.update(arg)
|
||||
else:
|
||||
raise ApiTypeError(
|
||||
"Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % (
|
||||
args,
|
||||
self.__class__.__name__,
|
||||
),
|
||||
path_to_item=_path_to_item,
|
||||
valid_classes=(self.__class__,),
|
||||
)
|
||||
|
||||
self._data_store = {}
|
||||
self._check_type = _check_type
|
||||
self._spec_property_naming = _spec_property_naming
|
||||
self._path_to_item = _path_to_item
|
||||
self._configuration = _configuration
|
||||
self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
|
||||
|
||||
constant_args = {
|
||||
'_check_type': _check_type,
|
||||
'_path_to_item': _path_to_item,
|
||||
'_spec_property_naming': _spec_property_naming,
|
||||
'_configuration': _configuration,
|
||||
'_visited_composed_classes': self._visited_composed_classes,
|
||||
}
|
||||
composed_info = validate_get_composed_info(
|
||||
constant_args, kwargs, self)
|
||||
self._composed_instances = composed_info[0]
|
||||
self._var_name_to_model_instances = composed_info[1]
|
||||
self._additional_properties_model_instances = composed_info[2]
|
||||
discarded_args = composed_info[3]
|
||||
|
||||
for var_name, var_value in kwargs.items():
|
||||
if var_name in discarded_args and \
|
||||
self._configuration is not None and \
|
||||
self._configuration.discard_unknown_keys and \
|
||||
self._additional_properties_model_instances:
|
||||
# discard variable.
|
||||
continue
|
||||
setattr(self, var_name, var_value)
|
||||
if var_name in self.read_only_vars:
|
||||
raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate "
|
||||
f"class with read only attributes.")
|
||||
|
||||
@cached_property
|
||||
def _composed_schemas():
|
||||
# we need this here to make our import statements work
|
||||
# we must store _composed_schemas in here so the code is only run
|
||||
# when we invoke this method. If we kept this at the class
|
||||
# level we would get an error because the class level
|
||||
# code would be run when this module is imported, and these composed
|
||||
# classes don't exist yet because their module has not finished
|
||||
# loading
|
||||
lazy_import()
|
||||
return {
|
||||
'anyOf': [
|
||||
],
|
||||
'allOf': [
|
||||
],
|
||||
'oneOf': [
|
||||
Pig,
|
||||
Whale,
|
||||
Zebra,
|
||||
],
|
||||
}
|
@ -29,8 +29,8 @@ import javax.annotation.Generated;
|
||||
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "fruitType", visible = true)
|
||||
@JsonSubTypes({
|
||||
@JsonSubTypes.Type(value = Apple.class, name = "APPLE"),
|
||||
@JsonSubTypes.Type(value = Apple.class, name = "Apple"),
|
||||
@JsonSubTypes.Type(value = Banana.class, name = "BANANA"),
|
||||
@JsonSubTypes.Type(value = Apple.class, name = "Apple"),
|
||||
@JsonSubTypes.Type(value = Banana.class, name = "Banana")
|
||||
})
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user