diff --git a/.github/workflows/samples-python-nextgen-client-echo-api.yaml b/.github/workflows/samples-python-nextgen-client-echo-api.yaml
index 6d267f923ac..29ea147eef1 100644
--- a/.github/workflows/samples-python-nextgen-client-echo-api.yaml
+++ b/.github/workflows/samples-python-nextgen-client-echo-api.yaml
@@ -3,10 +3,10 @@ name: Python Client (Echo API)
on:
push:
paths:
- - samples/client/echo_api/python-nextgen/**
+ - samples/client/echo_api/python/**
pull_request:
paths:
- - samples/client/echo_api/python-nextgen/**
+ - samples/client/echo_api/python/**
jobs:
build:
name: Test Python client
@@ -16,7 +16,7 @@ jobs:
matrix:
sample:
# clients
- - samples/client/echo_api/python-nextgen
+ - samples/client/echo_api/python
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
diff --git a/bin/configs/python-aiohttp.yaml b/bin/configs/python-aiohttp.yaml
index 2a10c592ae3..6bec6d585b6 100644
--- a/bin/configs/python-aiohttp.yaml
+++ b/bin/configs/python-aiohttp.yaml
@@ -1,4 +1,8 @@
-generatorName: python-aiohttp
-outputDir: samples/server/petstore/python-aiohttp
-inputSpec: modules/openapi-generator/src/test/resources/2_0/petstore.yaml
-templateDir: modules/openapi-generator/src/main/resources/python-aiohttp
+generatorName: python
+outputDir: samples/openapi3/client/petstore/python-aiohttp
+inputSpec: modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml
+templateDir: modules/openapi-generator/src/main/resources/python
+library: asyncio
+additionalProperties:
+ packageName: petstore_api
+ mapNumberTo: float
diff --git a/bin/configs/python-nextgen-echo-api.yaml b/bin/configs/python-echo-api.yaml
similarity index 68%
rename from bin/configs/python-nextgen-echo-api.yaml
rename to bin/configs/python-echo-api.yaml
index b9eb1f91416..8c161951aca 100644
--- a/bin/configs/python-nextgen-echo-api.yaml
+++ b/bin/configs/python-echo-api.yaml
@@ -1,6 +1,6 @@
-generatorName: python-nextgen
-outputDir: samples/client/echo_api/python-nextgen
+generatorName: python
+outputDir: samples/client/echo_api/python
inputSpec: modules/openapi-generator/src/test/resources/3_0/echo_api.yaml
-templateDir: modules/openapi-generator/src/main/resources/python-nextgen
+templateDir: modules/openapi-generator/src/main/resources/python
additionalProperties:
hideGenerationTimestamp: "true"
diff --git a/bin/configs/python-nextgen-aiohttp.yaml b/bin/configs/python-nextgen-aiohttp.yaml
deleted file mode 100644
index 991d18a620e..00000000000
--- a/bin/configs/python-nextgen-aiohttp.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-generatorName: python-nextgen
-outputDir: samples/openapi3/client/petstore/python-nextgen-aiohttp
-inputSpec: modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml
-templateDir: modules/openapi-generator/src/main/resources/python-nextgen
-library: asyncio
-additionalProperties:
- packageName: petstore_api
- mapNumberTo: float
diff --git a/bin/configs/python-nextgen.yaml b/bin/configs/python.yaml
similarity index 78%
rename from bin/configs/python-nextgen.yaml
rename to bin/configs/python.yaml
index c3636e22a5d..2e93f8fc12b 100644
--- a/bin/configs/python-nextgen.yaml
+++ b/bin/configs/python.yaml
@@ -1,7 +1,7 @@
-generatorName: python-nextgen
-outputDir: samples/openapi3/client/petstore/python-nextgen
+generatorName: python
+outputDir: samples/openapi3/client/petstore/python
inputSpec: modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml
-templateDir: modules/openapi-generator/src/main/resources/python-nextgen
+templateDir: modules/openapi-generator/src/main/resources/python
additionalProperties:
packageName: petstore_api
useOneOfDiscriminatorLookup: "true"
diff --git a/docs/generators.md b/docs/generators.md
index a2b0e2f2e18..ad8ee6fa062 100644
--- a/docs/generators.md
+++ b/docs/generators.md
@@ -52,7 +52,7 @@ The following generators are available:
* [php](generators/php.md)
* [php-dt (beta)](generators/php-dt.md)
* [powershell (beta)](generators/powershell.md)
-* [python-nextgen](generators/python-nextgen.md)
+* [python](generators/python.md)
* [r](generators/r.md)
* [ruby](generators/ruby.md)
* [rust](generators/rust.md)
diff --git a/docs/generators/python-nextgen.md b/docs/generators/python-nextgen.md
deleted file mode 100644
index 46fcbe79ab7..00000000000
--- a/docs/generators/python-nextgen.md
+++ /dev/null
@@ -1,230 +0,0 @@
----
-title: Documentation for the python-nextgen Generator
----
-
-## METADATA
-
-| Property | Value | Notes |
-| -------- | ----- | ----- |
-| generator name | python-nextgen | pass this to the generate command after -g |
-| generator stability | STABLE | |
-| generator type | CLIENT | |
-| generator language | Python | |
-| generator language version | 3.7+ | |
-| generator default templating engine | mustache | |
-| helpTxt | Generates a Python client library. | |
-
-## CONFIG OPTIONS
-These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
-
-| Option | Description | Values | Default |
-| ------ | ----------- | ------ | ------- |
-|dateFormat|date format for query parameters| |%Y-%m-%d|
-|datetimeFormat|datetime format for query parameters| |%Y-%m-%dT%H:%M:%S%z|
-|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|
- **false**
- The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications.
- **true**
- Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.
|true|
-|generateSourceCodeOnly|Specifies that only a library source code is to be generated.| |false|
-|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |true|
-|library|library template (sub-template) to use: asyncio, tornado (deprecated), urllib3| |urllib3|
-|mapNumberTo|Map number to Union[StrictFloat, StrictInt], StrictStr or float.| |Union[StrictFloat, StrictInt]|
-|packageName|python package name (convention: snake_case).| |openapi_client|
-|packageUrl|python package URL.| |null|
-|packageVersion|python package version.| |1.0.0|
-|projectName|python project name in setup.py (e.g. petstore-api).| |null|
-|recursionLimit|Set the recursion limit. If not set, use the system default value.| |null|
-
-## IMPORT MAPPING
-
-| Type/Alias | Imports |
-| ---------- | ------- |
-
-
-## INSTANTIATION TYPES
-
-| Type/Alias | Instantiated By |
-| ---------- | --------------- |
-
-
-## LANGUAGE PRIMITIVES
-
-
-- Dict
-- List
-- bool
-- bytearray
-- bytes
-- date
-- datetime
-- decimal.Decimal
-- dict
-- float
-- int
-- list
-- none_type
-- object
-- str
-
-
-## RESERVED WORDS
-
-
-- and
-- as
-- assert
-- async
-- await
-- base64
-- break
-- class
-- continue
-- date
-- def
-- del
-- elif
-- else
-- except
-- exec
-- false
-- finally
-- for
-- from
-- global
-- if
-- import
-- in
-- is
-- json
-- lambda
-- none
-- nonlocal
-- not
-- or
-- pass
-- print
-- property
-- raise
-- return
-- schema
-- self
-- true
-- try
-- while
-- with
-- yield
-
-
-## FEATURE SET
-
-
-### Client Modification Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|BasePath|✗|ToolingExtension
-|Authorizations|✗|ToolingExtension
-|UserAgent|✗|ToolingExtension
-|MockServer|✗|ToolingExtension
-
-### Data Type Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|Custom|✗|OAS2,OAS3
-|Int32|✓|OAS2,OAS3
-|Int64|✓|OAS2,OAS3
-|Float|✓|OAS2,OAS3
-|Double|✓|OAS2,OAS3
-|Decimal|✓|ToolingExtension
-|String|✓|OAS2,OAS3
-|Byte|✓|OAS2,OAS3
-|Binary|✓|OAS2,OAS3
-|Boolean|✓|OAS2,OAS3
-|Date|✓|OAS2,OAS3
-|DateTime|✓|OAS2,OAS3
-|Password|✓|OAS2,OAS3
-|File|✓|OAS2
-|Uuid|✗|
-|Array|✓|OAS2,OAS3
-|Null|✗|OAS3
-|AnyType|✗|OAS2,OAS3
-|Object|✓|OAS2,OAS3
-|Maps|✓|ToolingExtension
-|CollectionFormat|✓|OAS2
-|CollectionFormatMulti|✓|OAS2
-|Enum|✓|OAS2,OAS3
-|ArrayOfEnum|✓|ToolingExtension
-|ArrayOfModel|✓|ToolingExtension
-|ArrayOfCollectionOfPrimitives|✓|ToolingExtension
-|ArrayOfCollectionOfModel|✓|ToolingExtension
-|ArrayOfCollectionOfEnum|✓|ToolingExtension
-|MapOfEnum|✓|ToolingExtension
-|MapOfModel|✓|ToolingExtension
-|MapOfCollectionOfPrimitives|✓|ToolingExtension
-|MapOfCollectionOfModel|✓|ToolingExtension
-|MapOfCollectionOfEnum|✓|ToolingExtension
-
-### Documentation Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|Readme|✓|ToolingExtension
-|Model|✓|ToolingExtension
-|Api|✓|ToolingExtension
-
-### Global Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|Host|✓|OAS2,OAS3
-|BasePath|✓|OAS2,OAS3
-|Info|✓|OAS2,OAS3
-|Schemes|✗|OAS2,OAS3
-|PartialSchemes|✓|OAS2,OAS3
-|Consumes|✓|OAS2
-|Produces|✓|OAS2
-|ExternalDocumentation|✓|OAS2,OAS3
-|Examples|✓|OAS2,OAS3
-|XMLStructureDefinitions|✗|OAS2,OAS3
-|MultiServer|✗|OAS3
-|ParameterizedServer|✗|OAS3
-|ParameterStyling|✗|OAS3
-|Callbacks|✗|OAS3
-|LinkObjects|✗|OAS3
-
-### Parameter Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|Path|✓|OAS2,OAS3
-|Query|✓|OAS2,OAS3
-|Header|✓|OAS2,OAS3
-|Body|✓|OAS2
-|FormUnencoded|✓|OAS2
-|FormMultipart|✓|OAS2
-|Cookie|✗|OAS3
-
-### Schema Support Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|Simple|✓|OAS2,OAS3
-|Composite|✓|OAS2,OAS3
-|Polymorphism|✓|OAS2,OAS3
-|Union|✗|OAS3
-|allOf|✓|OAS2,OAS3
-|anyOf|✓|OAS3
-|oneOf|✓|OAS3
-|not|✗|OAS3
-
-### Security Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|BasicAuth|✓|OAS2,OAS3
-|ApiKey|✓|OAS2,OAS3
-|OpenIDConnect|✗|OAS3
-|BearerToken|✓|OAS3
-|OAuth2_Implicit|✓|OAS2,OAS3
-|OAuth2_Password|✗|OAS2,OAS3
-|OAuth2_ClientCredentials|✗|OAS2,OAS3
-|OAuth2_AuthorizationCode|✗|OAS2,OAS3
-
-### Wire Format Feature
-| Name | Supported | Defined By |
-| ---- | --------- | ---------- |
-|JSON|✓|OAS2,OAS3
-|XML|✓|OAS2,OAS3
-|PROTOBUF|✗|ToolingExtension
-|Custom|✓|OAS2,OAS3
diff --git a/docs/generators/python.md b/docs/generators/python.md
index b62d4af85bc..7b72cfde110 100644
--- a/docs/generators/python.md
+++ b/docs/generators/python.md
@@ -10,26 +10,27 @@ title: Documentation for the python Generator
| generator stability | STABLE | |
| generator type | CLIENT | |
| generator language | Python | |
-| generator language version | >=3.7 | |
-| generator default templating engine | handlebars | |
-| helpTxt | Generates a Python client library
Features in this generator:
- type hints on endpoints and model creation
- model parameter names use the spec defined keys and cases
- robust composition (oneOf/anyOf/allOf/not) where payload data is stored in one instance only
- endpoint parameter names use the spec defined keys and cases
- inline schemas are supported at any location including composition
- multiple content types supported in request body and response bodies
- run time type checking
- Sending/receiving decimals as strings supported with type:string format: number -> DecimalSchema
- Sending/receiving uuids as strings supported with type:string format: uuid -> UUIDSchema
- quicker load time for python modules (a single endpoint can be imported and used without loading others)
- all instances of schemas dynamically inherit from all matching schemas so one can use isinstance to check if validation passed
- composed schemas with type constraints supported (type:object + oneOf/anyOf/allOf)
- schemas are not coerced/cast. For example string + date are both stored as string, and there is a date accessor
- Exceptions: int/float is stored as Decimal, When receiving data from headers it will start as str and may need to be cast for example to int | |
+| generator language version | 3.7+ | |
+| generator default templating engine | mustache | |
+| helpTxt | Generates a Python client library. | |
## CONFIG OPTIONS
These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
| Option | Description | Values | Default |
| ------ | ----------- | ------ | ------- |
+|dateFormat|date format for query parameters| |%Y-%m-%d|
+|datetimeFormat|datetime format for query parameters| |%Y-%m-%dT%H:%M:%S%z|
+|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|- **false**
- The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications.
- **true**
- Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.
|true|
|generateSourceCodeOnly|Specifies that only a library source code is to be generated.| |false|
|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |true|
-|library|library template (sub-template) to use: urllib3| |urllib3|
-|nonCompliantUseDiscriminatorIfCompositionFails|When true, If the payload fails to validate against composed schemas (allOf/anyOf/oneOf/not) and a discriminator is present, then ignore the composition validation errors and attempt to use the discriminator to validate the payload.<br />Note: setting this to true makes the generated client not comply with json schema because it ignores composition validation errors. Please consider making your schemas more restrictive rather than setting this to true. You can do that by:<ul><li>defining the propertyName as an enum with only one value in the schemas that are in your discriminator map</li><li>setting additionalProperties: false in your schemas</li></ul>|- **true**
- If composition fails and a discriminator exists, the composition errors will be ignored and validation will be attempted with the discriminator
- **false**
- Composition validation must succeed. Discriminator validation must succeed.
|false|
+|library|library template (sub-template) to use: asyncio, tornado (deprecated), urllib3| |urllib3|
+|mapNumberTo|Map number to Union[StrictFloat, StrictInt], StrictStr or float.| |Union[StrictFloat, StrictInt]|
|packageName|python package name (convention: snake_case).| |openapi_client|
|packageUrl|python package URL.| |null|
|packageVersion|python package version.| |1.0.0|
|projectName|python project name in setup.py (e.g. petstore-api).| |null|
|recursionLimit|Set the recursion limit. If not set, use the system default value.| |null|
-|useInlineModelResolver|use the inline model resolver, if true inline complex models will be extracted into components and $refs to them will be used| |false|
-|useNose|use the nose test framework| |false|
## IMPORT MAPPING
@@ -41,7 +42,6 @@ These options may be applied as additional-properties (cli) or configOptions (pl
| Type/Alias | Instantiated By |
| ---------- | --------------- |
-|map|dict|
## LANGUAGE PRIMITIVES
@@ -50,12 +50,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
Dict
List
bool
+bytearray
bytes
date
datetime
+decimal.Decimal
dict
-file
-file_type
float
int
list
@@ -67,61 +67,46 @@ These options may be applied as additional-properties (cli) or configOptions (pl
## RESERVED WORDS
-- all_params
- and
- as
- assert
- async
-- auth_settings
- await
-- body_params
-- bool
+- base64
- break
- class
- continue
+- date
- def
- del
-- dict
- elif
- else
- except
- exec
- false
-- file_type
- finally
-- float
- for
-- form_params
- from
-- frozendict
- global
-- header_params
- if
- import
- in
-- int
- is
+- json
- lambda
-- list
-- local_var_files
- none
-- none_type
- nonlocal
- not
- or
- pass
-- path_params
- print
- property
-- query_params
- raise
-- resource_path
- return
+- schema
- self
-- str
- true
- try
-- tuple
- while
- with
- yield
@@ -155,10 +140,10 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|DateTime|✓|OAS2,OAS3
|Password|✓|OAS2,OAS3
|File|✓|OAS2
-|Uuid|✓|
+|Uuid|✗|
|Array|✓|OAS2,OAS3
-|Null|✓|OAS3
-|AnyType|✓|OAS2,OAS3
+|Null|✗|OAS3
+|AnyType|✗|OAS2,OAS3
|Object|✓|OAS2,OAS3
|Maps|✓|ToolingExtension
|CollectionFormat|✓|OAS2
@@ -196,8 +181,8 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|Examples|✓|OAS2,OAS3
|XMLStructureDefinitions|✗|OAS2,OAS3
|MultiServer|✗|OAS3
-|ParameterizedServer|✓|OAS3
-|ParameterStyling|✓|OAS3
+|ParameterizedServer|✗|OAS3
+|ParameterStyling|✗|OAS3
|Callbacks|✗|OAS3
|LinkObjects|✗|OAS3
@@ -218,11 +203,11 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|Simple|✓|OAS2,OAS3
|Composite|✓|OAS2,OAS3
|Polymorphism|✓|OAS2,OAS3
-|Union|✓|OAS3
+|Union|✗|OAS3
|allOf|✓|OAS2,OAS3
|anyOf|✓|OAS3
|oneOf|✓|OAS3
-|not|✓|OAS3
+|not|✗|OAS3
### Security Feature
| Name | Supported | Defined By |
@@ -240,6 +225,6 @@ These options may be applied as additional-properties (cli) or configOptions (pl
| Name | Supported | Defined By |
| ---- | --------- | ---------- |
|JSON|✓|OAS2,OAS3
-|XML|✗|OAS2,OAS3
+|XML|✓|OAS2,OAS3
|PROTOBUF|✗|ToolingExtension
|Custom|✓|OAS2,OAS3
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonNextgenClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java
similarity index 99%
rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonNextgenClientCodegen.java
rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java
index 98300f71ecd..cbba8a4f742 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonNextgenClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java
@@ -41,8 +41,8 @@ import java.util.*;
import static org.openapitools.codegen.utils.StringUtils.escape;
import static org.openapitools.codegen.utils.StringUtils.underscore;
-public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements CodegenConfig {
- private final Logger LOGGER = LoggerFactory.getLogger(PythonNextgenClientCodegen.class);
+public class PythonClientCodegen extends AbstractPythonCodegen implements CodegenConfig {
+ private final Logger LOGGER = LoggerFactory.getLogger(PythonClientCodegen.class);
public static final String PACKAGE_URL = "packageUrl";
public static final String DEFAULT_LIBRARY = "urllib3";
@@ -69,7 +69,7 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
// map of codegen models
private HashMap codegenModelMap = new HashMap<>();
- public PythonNextgenClientCodegen() {
+ public PythonClientCodegen() {
super();
// force sortParamsByRequiredFlag to true to make the api method signature less complicated
@@ -134,7 +134,7 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
modelTestTemplateFiles.put("model_test.mustache", ".py");
apiTestTemplateFiles.put("api_test.mustache", ".py");
- embeddedTemplateDir = templateDir = "python-nextgen";
+ embeddedTemplateDir = templateDir = "python";
modelDocTemplateFiles.put("model_doc.mustache", ".md");
apiDocTemplateFiles.put("api_doc.mustache", ".md");
@@ -1420,7 +1420,7 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
@Override
public String getName() {
- return "python-nextgen";
+ return "python";
}
@Override
@@ -1428,7 +1428,6 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
return "Generates a Python client library.";
}
-
@Override
public String apiDocFileFolder() {
return (outputFolder + File.separator + apiDocPath);
diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig
index 6f10a85f26d..7abf01c75ab 100644
--- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig
+++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig
@@ -100,7 +100,7 @@ org.openapitools.codegen.languages.PhpMezzioPathHandlerServerCodegen
org.openapitools.codegen.languages.PhpDataTransferClientCodegen
org.openapitools.codegen.languages.PowerShellClientCodegen
org.openapitools.codegen.languages.ProtobufSchemaCodegen
-org.openapitools.codegen.languages.PythonNextgenClientCodegen
+org.openapitools.codegen.languages.PythonClientCodegen
org.openapitools.codegen.languages.PythonFastAPIServerCodegen
org.openapitools.codegen.languages.PythonFlaskConnexionServerCodegen
org.openapitools.codegen.languages.PythonAiohttpConnexionServerCodegen
diff --git a/modules/openapi-generator/src/main/resources/python/README.handlebars b/modules/openapi-generator/src/main/resources/python/README.handlebars
deleted file mode 100644
index b8819d21161..00000000000
--- a/modules/openapi-generator/src/main/resources/python/README.handlebars
+++ /dev/null
@@ -1,146 +0,0 @@
-# {{{projectName}}}
-{{#if appDescriptionWithNewLines}}
-{{{appDescriptionWithNewLines}}}
-{{/if}}
-
-This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
-
-- API version: {{appVersion}}
-- Package version: {{packageVersion}}
-{{#unless hideGenerationTimestamp}}
-- Build date: {{generatedDate}}
-{{/unless}}
-- Build package: {{generatorClass}}
-{{#if infoUrl}}
-For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
-{{/if}}
-
-## Requirements.
-
-Python {{generatorLanguageVersion}}
-
-## Migration from other generators like python and python-legacy
-
-### Changes
-1. This generator uses spec case for all (object) property names and parameter names.
- - So if the spec has a property name like camelCase, it will use camelCase rather than camel_case
- - So you will need to update how you input and read properties to use spec case
-2. Endpoint parameters are stored in dictionaries to prevent collisions (explanation below)
- - So you will need to update how you pass data in to endpoints
-3. Endpoint responses now include the original response, the deserialized response body, and (todo)the deserialized headers
- - So you will need to update your code to use response.body to access deserialized data
-4. All validated data is instantiated in an instance that subclasses all validated Schema classes and Decimal/str/list/tuple/frozendict/NoneClass/BoolClass/bytes/io.FileIO
- - This means that you can use isinstance to check if a payload validated against a schema class
- - This means that no data will be of type None/True/False
- - ingested None will subclass NoneClass
- - ingested True will subclass BoolClass
- - ingested False will subclass BoolClass
- - So if you need to check is True/False/None, instead use instance.is_true_oapg()/.is_false_oapg()/.is_none_oapg()
-5. All validated class instances are immutable except for ones based on io.File
- - This is because if properties were changed after validation, that validation would no longer apply
- - So no changing values or property values after a class has been instantiated
-6. String + Number types with formats
- - String type data is stored as a string and if you need to access types based on its format like date,
- date-time, uuid, number etc then you will need to use accessor functions on the instance
- - type string + format: See .as_date_oapg, .as_datetime_oapg, .as_decimal_oapg, .as_uuid_oapg
- - type number + format: See .as_float_oapg, .as_int_oapg
- - this was done because openapi/json-schema defines constraints. string data may be type string with no format
- keyword in one schema, and include a format constraint in another schema
- - So if you need to access a string format based type, use as_date_oapg/as_datetime_oapg/as_decimal_oapg/as_uuid_oapg
- - So if you need to access a number format based type, use as_int_oapg/as_float_oapg
-7. Property access on AnyType(type unset) or object(dict) schemas
- - Only required keys with valid python names are properties like .someProp and have type hints
- - All optional keys may not exist, so properties are not defined for them
- - One can access optional values with dict_instance['optionalProp'] and KeyError will be raised if it does not exist
- - Use get_item_oapg if you need a way to always get a value whether or not the key exists
- - If the key does not exist, schemas.unset is returned from calling dict_instance.get_item_oapg('optionalProp')
- - All required and optional keys have type hints for this method, and @typing.overload is used
- - A type hint is also generated for additionalProperties accessed using this method
- - So you will need to update you code to use some_instance['optionalProp'] to access optional property
- and additionalProperty values
-8. The location of the api classes has changed
- - Api classes are located in your_package.apis.tags.some_api
- - This change was made to eliminate redundant code generation
- - Legacy generators generated the same endpoint twice if it had > 1 tag on it
- - This generator defines an endpoint in one class, then inherits that class to generate
- apis by tags and by paths
- - This change reduces code and allows quicker run time if you use the path apis
- - path apis are at your_package.apis.paths.some_path
- - Those apis will only load their needed models, which is less to load than all of the resources needed in a tag api
- - So you will need to update your import paths to the api classes
-
-### Why are Oapg and _oapg used in class and method names?
-Classes can have arbitrarily named properties set on them
-Endpoints can have arbitrary operationId method names set
-For those reasons, I use the prefix Oapg and _oapg to greatly reduce the likelihood of collisions
-on protected + public classes/methods.
-oapg stands for OpenApi Python Generator.
-
-### Object property spec case
-This was done because when payloads are ingested, they can be validated against N number of schemas.
-If the input signature used a different property name then that has mutated the payload.
-So SchemaA and SchemaB must both see the camelCase spec named variable.
-Also it is possible to send in two properties, named camelCase and camel_case in the same payload.
-That use case should be support so spec case is used.
-
-### Parameter spec case
-Parameters can be included in different locations including:
-- query
-- path
-- header
-- cookie
-
-Any of those parameters could use the same parameter names, so if every parameter
-was included as an endpoint parameter in a function signature, they would collide.
-For that reason, each of those inputs have been separated out into separate typed dictionaries:
-- query_params
-- path_params
-- header_params
-- cookie_params
-
-So when updating your code, you will need to pass endpoint parameters in using those
-dictionaries.
-
-### Endpoint responses
-Endpoint responses have been enriched to now include more information.
-Any response reom an endpoint will now include the following properties:
-response: urllib3.HTTPResponse
-body: typing.Union[Unset, Schema]
-headers: typing.Union[Unset, TODO]
-Note: response header deserialization has not yet been added
-
-
-## Installation & Usage
-### pip install
-
-If the python package is hosted on a repository, you can install directly using:
-
-```sh
-pip install git+https://{{gitHost}}/{{{gitUserId}}}/{{{gitRepoId}}}.git
-```
-(you may need to run `pip` with root permission: `sudo pip install git+https://{{gitHost}}/{{{gitUserId}}}/{{{gitRepoId}}}.git`)
-
-Then import the package:
-```python
-import {{{packageName}}}
-```
-
-### Setuptools
-
-Install via [Setuptools](http://pypi.python.org/pypi/setuptools).
-
-```sh
-python setup.py install --user
-```
-(or `sudo python setup.py install` to install the package for all users)
-
-Then import the package:
-```python
-import {{{packageName}}}
-```
-
-## Getting Started
-
-Please follow the [installation procedure](#installation--usage) and then run the following:
-
-{{> README_common }}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/README.mustache b/modules/openapi-generator/src/main/resources/python/README.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/README.mustache
rename to modules/openapi-generator/src/main/resources/python/README.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/README_common.handlebars b/modules/openapi-generator/src/main/resources/python/README_common.handlebars
deleted file mode 100644
index 69b27f4c48f..00000000000
--- a/modules/openapi-generator/src/main/resources/python/README_common.handlebars
+++ /dev/null
@@ -1,112 +0,0 @@
-```python
-{{#with apiInfo}}{{#each apis}}{{#unless hasMore}}{{#if hasHttpSignatureMethods}}import datetime{{/if}}{{/unless}}{{/each}}{{/with}}
-import time
-import {{{packageName}}}
-from pprint import pprint
-{{#with apiInfo}}
-{{#each apis}}
-{{#if @first}}
-from {{packageName}}.{{apiPackage}}.tags import {{classFilename}}
-{{#each imports}}
-{{{import}}}
-{{/each}}
-{{#with operations}}
-{{#each operation}}
-{{#if @first}}
-{{> doc_auth_partial}}
-
-# Enter a context with an instance of the API client
-with {{{packageName}}}.ApiClient(configuration) as api_client:
- # Create an instance of the API class
- api_instance = {{classFilename}}.{{{classname}}}(api_client)
- {{#each allParams}}{{paramName}} = {{{example}}} # {{{dataType}}} | {{{description}}}{{#unless required}} (optional){{/unless}}{{#if defaultValue}} (default to {{{.}}}){{/if}}
- {{/each}}
-
- try:
- {{#if summary}} # {{{summary}}}
- {{/if}} {{#if returnType}}api_response = {{/if}}api_instance.{{{operationId}}}({{#each allParams}}{{#if required}}{{paramName}}{{/if}}{{#unless required}}{{paramName}}={{paramName}}{{/unless}}{{#if hasMore}}, {{/if}}{{/each}}){{#if returnType}}
- pprint(api_response){{/if}}
- except {{{packageName}}}.ApiException as e:
- print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e)
-{{/if}}
-{{/each}}
-{{/with}}
-{{/if}}
-{{/each}}
-{{/with}}
-```
-
-## Documentation for API Endpoints
-
-All URIs are relative to *{{basePath}}*
-
-Class | Method | HTTP request | Description
------------- | ------------- | ------------- | -------------
-{{#with apiInfo}}{{#each apis}}{{#with operations}}{{#each operation}}*{{classname}}* | [**{{operationId}}**]({{apiDocPath}}{{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{path}} | {{#if summary}}{{summary}}{{/if}}
-{{/each}}{{/with}}{{/each}}{{/with}}
-
-## Documentation For Models
-
-{{#each models}}{{#with model}} - [{{{classname}}}]({{modelDocPath}}{{{classname}}}.md)
-{{/with}}{{/each}}
-
-## Documentation For Authorization
-
-{{#unless authMethods}}
- Endpoints do not require authorization.
-{{/unless}}
-{{#if hasAuthMethods}}Authentication schemes defined for the API:{{/if}}
-{{#each authMethods}}
-
-### {{{name}}}
-
-{{#if isApiKey}}
-- **Type**: API key
-- **API key parameter name**: {{{keyParamName}}}
-- **Location**: {{#if isKeyInQuery}}URL query string{{/if}}{{#if isKeyInHeader}}HTTP header{{/if}}
-{{/if}}
-{{#if isBasic}}
-{{#if isBasicBasic}}
-- **Type**: HTTP basic authentication
-{{/if}}
-{{#if isBasicBearer}}
-- **Type**: Bearer authentication{{#if bearerFormat}} ({{{bearerFormat}}}){{/if}}
-{{/if}}
-{{#if isHttpSignature}}
-- **Type**: HTTP signature authentication
-{{/if}}
-{{/if}}
-{{#if isOAuth}}
-- **Type**: OAuth
-- **Flow**: {{{flow}}}
-- **Authorization URL**: {{{authorizationUrl}}}
-- **Scopes**: {{#unless scopes}}N/A{{/unless}}
-{{#each scopes}} - **{{{scope}}}**: {{{description}}}
-{{/each}}
-{{/if}}
-
-{{/each}}
-
-## Author
-
-{{#with apiInfo}}{{#each apis}}{{#unless hasMore}}{{#if infoEmail}}{{infoEmail}}{{/if}}
-{{/unless}}{{/each}}{{/with}}
-
-## Notes for Large OpenAPI documents
-If the OpenAPI document is large, imports in {{{packageName}}}.apis and {{{packageName}}}.models may fail with a
-RecursionError indicating the maximum recursion limit has been exceeded. In that case, there are a couple of solutions:
-
-Solution 1:
-Use specific imports for apis and models like:
-- `from {{{packageName}}}.{{apiPackage}}.default_api import DefaultApi`
-- `from {{{packageName}}}.{{modelPackage}}.pet import Pet`
-
-Solution 1:
-Before importing the package, adjust the maximum recursion limit as shown below:
-```
-import sys
-sys.setrecursionlimit(1500)
-import {{{packageName}}}
-from {{{packageName}}}.apis import *
-from {{{packageName}}}.models import *
-```
diff --git a/modules/openapi-generator/src/main/resources/python/README_onlypackage.handlebars b/modules/openapi-generator/src/main/resources/python/README_onlypackage.handlebars
deleted file mode 100644
index 63f959375b0..00000000000
--- a/modules/openapi-generator/src/main/resources/python/README_onlypackage.handlebars
+++ /dev/null
@@ -1,43 +0,0 @@
-# {{{projectName}}}
-{{#if appDescription}}
-{{{appDescription}}}
-{{/if}}
-
-The `{{packageName}}` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
-
-- API version: {{appVersion}}
-- Package version: {{packageVersion}}
-{{#unless hideGenerationTimestamp}}
-- Build date: {{generatedDate}}
-{{/unless}}
-- Build package: {{generatorClass}}
-{{#if infoUrl}}
-For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
-{{/if}}
-
-## Requirements.
-
-Python {{generatorLanguageVersion}}
-
-## Installation & Usage
-
-This python library package is generated without supporting files like setup.py or requirements files
-
-To be able to use it, you will need these dependencies in your own package that uses this library:
-
-* urllib3 >= 1.15
-* certifi
-* python-dateutil
-{{#if asyncio}}
-* aiohttp
-{{/if}}
-{{#if tornado}}
-* tornado>=4.2,<5
-{{/if}}
-
-## Getting Started
-
-In your own code, to use this library to connect and interact with {{{projectName}}},
-you can run the following:
-
-{{> README_common }}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/README_onlypackage.mustache b/modules/openapi-generator/src/main/resources/python/README_onlypackage.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/README_onlypackage.mustache
rename to modules/openapi-generator/src/main/resources/python/README_onlypackage.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/__init__.handlebars b/modules/openapi-generator/src/main/resources/python/__init__.handlebars
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/__init__.mustache b/modules/openapi-generator/src/main/resources/python/__init__.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/__init__.mustache
rename to modules/openapi-generator/src/main/resources/python/__init__.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/__init__api.mustache b/modules/openapi-generator/src/main/resources/python/__init__api.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/__init__api.mustache
rename to modules/openapi-generator/src/main/resources/python/__init__api.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/__init__apis.handlebars b/modules/openapi-generator/src/main/resources/python/__init__apis.handlebars
deleted file mode 100644
index 7840f7726f6..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__apis.handlebars
+++ /dev/null
@@ -1,3 +0,0 @@
-# do not import all endpoints into this module because that uses a lot of memory and stack frames
-# if you need the ability to import all endpoints then import them from
-# tags, paths, or path_to_api, or tag_to_api
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/__init__apis_tags.handlebars b/modules/openapi-generator/src/main/resources/python/__init__apis_tags.handlebars
deleted file mode 100644
index 7a6fa76d6b4..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__apis_tags.handlebars
+++ /dev/null
@@ -1,11 +0,0 @@
-# do not import all endpoints into this module because that uses a lot of memory and stack frames
-# if you need the ability to import all endpoints from this module, import them with
-# from {{packageName}}.apis.tag_to_api import tag_to_api
-
-import enum
-
-
-class TagValues(str, enum.Enum):
-{{#each enumToTag}}
- {{@key}} = "{{this}}"
-{{/each}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/__init__model.handlebars b/modules/openapi-generator/src/main/resources/python/__init__model.handlebars
deleted file mode 100644
index b6b698b0452..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__model.handlebars
+++ /dev/null
@@ -1,5 +0,0 @@
-# we can not import model classes here because that would create a circular
-# reference which would not work in python2
-# do not import all models into this module because that uses a lot of memory and stack frames
-# if you need the ability to import all models from one package, import them with
-# from {{packageName}}.models import ModelA, ModelB
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/__init__model.mustache b/modules/openapi-generator/src/main/resources/python/__init__model.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/__init__model.mustache
rename to modules/openapi-generator/src/main/resources/python/__init__model.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/__init__models.handlebars b/modules/openapi-generator/src/main/resources/python/__init__models.handlebars
deleted file mode 100644
index 0899faf1da1..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__models.handlebars
+++ /dev/null
@@ -1,18 +0,0 @@
-# coding: utf-8
-
-# flake8: noqa
-
-# import all models into this package
-# if you have many models here with many references from one model to another this may
-# raise a RecursionError
-# to avoid this, import only the models that you directly need like:
-# from {{packageName}}.{{modelPackage}}.pet import Pet
-# or import this package, but before doing it, use:
-# import sys
-# sys.setrecursionlimit(n)
-
-{{#each models}}
-{{#with model}}
-from {{packageName}}.{{modelPackage}}.{{classFilename}} import {{classname}}
-{{/with}}
-{{/each}}
diff --git a/modules/openapi-generator/src/main/resources/python/__init__package.handlebars b/modules/openapi-generator/src/main/resources/python/__init__package.handlebars
deleted file mode 100644
index 26350c7252d..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__package.handlebars
+++ /dev/null
@@ -1,28 +0,0 @@
-# coding: utf-8
-
-# flake8: noqa
-
-{{>partial_header}}
-
-__version__ = "{{packageVersion}}"
-
-# import ApiClient
-from {{packageName}}.api_client import ApiClient
-
-# import Configuration
-from {{packageName}}.configuration import Configuration
-{{#if hasHttpSignatureMethods}}
-from {{packageName}}.signing import HttpSigningConfiguration
-{{/if}}
-
-# import exceptions
-from {{packageName}}.exceptions import OpenApiException
-from {{packageName}}.exceptions import ApiAttributeError
-from {{packageName}}.exceptions import ApiTypeError
-from {{packageName}}.exceptions import ApiValueError
-from {{packageName}}.exceptions import ApiKeyError
-from {{packageName}}.exceptions import ApiException
-{{#if recursionLimit}}
-
-__import__('sys').setrecursionlimit({{recursionLimit}})
-{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/__init__package.mustache b/modules/openapi-generator/src/main/resources/python/__init__package.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/__init__package.mustache
rename to modules/openapi-generator/src/main/resources/python/__init__package.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/__init__paths.handlebars b/modules/openapi-generator/src/main/resources/python/__init__paths.handlebars
deleted file mode 100644
index 3d3103913db..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__paths.handlebars
+++ /dev/null
@@ -1,3 +0,0 @@
-# do not import all endpoints into this module because that uses a lot of memory and stack frames
-# if you need the ability to import all endpoints from this module, import them with
-# from {{packageName}}.apis.path_to_api import path_to_api
diff --git a/modules/openapi-generator/src/main/resources/python/__init__paths_enum.handlebars b/modules/openapi-generator/src/main/resources/python/__init__paths_enum.handlebars
deleted file mode 100644
index ba97a8cd836..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__paths_enum.handlebars
+++ /dev/null
@@ -1,11 +0,0 @@
-# do not import all endpoints into this module because that uses a lot of memory and stack frames
-# if you need the ability to import all endpoints from this module, import them with
-# from {{packageName}}.apis.path_to_api import path_to_api
-
-import enum
-
-
-class PathValues(str, enum.Enum):
-{{#each pathValToVar}}
- {{this}} = "{{@key}}"
-{{/each}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/__init__paths_x.handlebars b/modules/openapi-generator/src/main/resources/python/__init__paths_x.handlebars
deleted file mode 100644
index 64d1977b67e..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__paths_x.handlebars
+++ /dev/null
@@ -1,7 +0,0 @@
-# do not import all endpoints into this module because that uses a lot of memory and stack frames
-# if you need the ability to import all endpoints from this module, import them with
-# from {{packageName}}.paths.{{pathModule}} import {{apiClassName}}
-
-from {{packageName}}.paths import PathValues
-
-path = PathValues.{{{pathVar}}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/__init__test_paths.handlebars b/modules/openapi-generator/src/main/resources/python/__init__test_paths.handlebars
deleted file mode 100644
index 1309632d3d5..00000000000
--- a/modules/openapi-generator/src/main/resources/python/__init__test_paths.handlebars
+++ /dev/null
@@ -1,68 +0,0 @@
-import json
-import typing
-
-import urllib3
-from urllib3._collections import HTTPHeaderDict
-
-
-class ApiTestMixin:
- json_content_type = 'application/json'
- user_agent = 'OpenAPI-Generator/1.0.0/python'
-
- @classmethod
- def assert_pool_manager_request_called_with(
- cls,
- mock_request,
- url: str,
- method: str = 'POST',
- body: typing.Optional[bytes] = None,
- content_type: typing.Optional[str] = None,
- accept_content_type: typing.Optional[str] = None,
- stream: bool = False,
- ):
- headers = {
- 'User-Agent': cls.user_agent
- }
- if accept_content_type:
- headers['Accept'] = accept_content_type
- if content_type:
- headers['Content-Type'] = content_type
- kwargs = dict(
- headers=HTTPHeaderDict(headers),
- preload_content=not stream,
- timeout=None,
- )
- if content_type and method != 'GET':
- kwargs['body'] = body
- mock_request.assert_called_with(
- method,
- url,
- **kwargs
- )
-
- @staticmethod
- def headers_for_content_type(content_type: str) -> typing.Dict[str, str]:
- return {'content-type': content_type}
-
- @classmethod
- def response(
- cls,
- body: typing.Union[str, bytes],
- status: int = 200,
- content_type: str = json_content_type,
- headers: typing.Optional[typing.Dict[str, str]] = None,
- preload_content: bool = True
- ) -> urllib3.HTTPResponse:
- if headers is None:
- headers = {}
- headers.update(cls.headers_for_content_type(content_type))
- return urllib3.HTTPResponse(
- body,
- headers=headers,
- status=status,
- preload_content=preload_content
- )
-
- @staticmethod
- def json_bytes(in_data: typing.Any) -> bytes:
- return json.dumps(in_data, separators=(",", ":"), ensure_ascii=False).encode('utf-8')
diff --git a/modules/openapi-generator/src/main/resources/python/api.handlebars b/modules/openapi-generator/src/main/resources/python/api.handlebars
deleted file mode 100644
index da9b50150d9..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api.handlebars
+++ /dev/null
@@ -1,24 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-{{#with operations}}
-{{#each operation}}
-from {{packageName}}.paths.{{nickname}}.{{httpMethod}} import {{operationIdCamelCase}}
-{{/each}}
-{{/with}}
-
-
-{{#with operations}}
-class {{classname}}(
-{{#each operation}}
- {{operationIdCamelCase}},
-{{/each}}
-):
- """NOTE: This class is auto generated by OpenAPI Generator
- Ref: https://openapi-generator.tech
-
- Do not edit the class manually.
- """
- pass
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/api.mustache b/modules/openapi-generator/src/main/resources/python/api.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/api.mustache
rename to modules/openapi-generator/src/main/resources/python/api.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/api_client.handlebars b/modules/openapi-generator/src/main/resources/python/api_client.handlebars
deleted file mode 100644
index da7e000a3a7..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api_client.handlebars
+++ /dev/null
@@ -1,1509 +0,0 @@
-# coding: utf-8
-{{>partial_header}}
-
-from dataclasses import dataclass
-from decimal import Decimal
-import enum
-import email
-import json
-import os
-import io
-import atexit
-from multiprocessing.pool import ThreadPool
-import re
-import tempfile
-import typing
-import typing_extensions
-import urllib3
-from urllib3._collections import HTTPHeaderDict
-from urllib.parse import urlparse, quote
-from urllib3.fields import RequestField as RequestFieldBase
-
-{{#if tornado}}
-import tornado.gen
-{{/if}}
-import frozendict
-
-from {{packageName}} import rest
-from {{packageName}}.configuration import Configuration
-from {{packageName}}.exceptions import ApiTypeError, ApiValueError
-from {{packageName}}.schemas import (
- NoneClass,
- BoolClass,
- Schema,
- FileIO,
- BinarySchema,
- date,
- datetime,
- none_type,
- Unset,
- unset,
-)
-
-
-class RequestField(RequestFieldBase):
- def __eq__(self, other):
- if not isinstance(other, RequestField):
- return False
- return self.__dict__ == other.__dict__
-
-
-class JSONEncoder(json.JSONEncoder):
- compact_separators = (',', ':')
-
- def default(self, obj):
- if isinstance(obj, str):
- return str(obj)
- elif isinstance(obj, float):
- return float(obj)
- elif isinstance(obj, int):
- return int(obj)
- elif isinstance(obj, Decimal):
- if obj.as_tuple().exponent >= 0:
- return int(obj)
- return float(obj)
- elif isinstance(obj, NoneClass):
- return None
- elif isinstance(obj, BoolClass):
- return bool(obj)
- elif isinstance(obj, (dict, frozendict.frozendict)):
- return {key: self.default(val) for key, val in obj.items()}
- elif isinstance(obj, (list, tuple)):
- return [self.default(item) for item in obj]
- raise ApiValueError('Unable to prepare type {} for serialization'.format(obj.__class__.__name__))
-
-
-class ParameterInType(enum.Enum):
- QUERY = 'query'
- HEADER = 'header'
- PATH = 'path'
- COOKIE = 'cookie'
-
-
-class ParameterStyle(enum.Enum):
- MATRIX = 'matrix'
- LABEL = 'label'
- FORM = 'form'
- SIMPLE = 'simple'
- SPACE_DELIMITED = 'spaceDelimited'
- PIPE_DELIMITED = 'pipeDelimited'
- DEEP_OBJECT = 'deepObject'
-
-
-class PrefixSeparatorIterator:
- # A class to store prefixes and separators for rfc6570 expansions
-
- def __init__(self, prefix: str, separator: str):
- self.prefix = prefix
- self.separator = separator
- self.first = True
- if separator in {'.', '|', '%20'}:
- item_separator = separator
- else:
- item_separator = ','
- self.item_separator = item_separator
-
- def __iter__(self):
- return self
-
- def __next__(self):
- if self.first:
- self.first = False
- return self.prefix
- return self.separator
-
-
-class ParameterSerializerBase:
- @classmethod
- def _get_default_explode(cls, style: ParameterStyle) -> bool:
- return False
-
- @staticmethod
- def __ref6570_item_value(in_data: typing.Any, percent_encode: bool):
- """
- Get representation if str/float/int/None/items in list/ values in dict
- None is returned if an item is undefined, use cases are value=
- - None
- - []
- - {}
- - [None, None None]
- - {'a': None, 'b': None}
- """
- if type(in_data) in {str, float, int}:
- if percent_encode:
- return quote(str(in_data))
- return str(in_data)
- elif isinstance(in_data, none_type):
- # ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1
- return None
- elif isinstance(in_data, list) and not in_data:
- # ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1
- return None
- elif isinstance(in_data, dict) and not in_data:
- # ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1
- return None
- raise ApiValueError('Unable to generate a ref6570 item representation of {}'.format(in_data))
-
- @staticmethod
- def _to_dict(name: str, value: str):
- return {name: value}
-
- @classmethod
- def __ref6570_str_float_int_expansion(
- cls,
- variable_name: str,
- in_data: typing.Any,
- explode: bool,
- percent_encode: bool,
- prefix_separator_iterator: PrefixSeparatorIterator,
- var_name_piece: str,
- named_parameter_expansion: bool
- ) -> str:
- item_value = cls.__ref6570_item_value(in_data, percent_encode)
- if item_value is None or (item_value == '' and prefix_separator_iterator.separator == ';'):
- return next(prefix_separator_iterator) + var_name_piece
- value_pair_equals = '=' if named_parameter_expansion else ''
- return next(prefix_separator_iterator) + var_name_piece + value_pair_equals + item_value
-
- @classmethod
- def __ref6570_list_expansion(
- cls,
- variable_name: str,
- in_data: typing.Any,
- explode: bool,
- percent_encode: bool,
- prefix_separator_iterator: PrefixSeparatorIterator,
- var_name_piece: str,
- named_parameter_expansion: bool
- ) -> str:
- item_values = [cls.__ref6570_item_value(v, percent_encode) for v in in_data]
- item_values = [v for v in item_values if v is not None]
- if not item_values:
- # ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1
- return ""
- value_pair_equals = '=' if named_parameter_expansion else ''
- if not explode:
- return (
- next(prefix_separator_iterator) +
- var_name_piece +
- value_pair_equals +
- prefix_separator_iterator.item_separator.join(item_values)
- )
- # exploded
- return next(prefix_separator_iterator) + next(prefix_separator_iterator).join(
- [var_name_piece + value_pair_equals + val for val in item_values]
- )
-
- @classmethod
- def __ref6570_dict_expansion(
- cls,
- variable_name: str,
- in_data: typing.Any,
- explode: bool,
- percent_encode: bool,
- prefix_separator_iterator: PrefixSeparatorIterator,
- var_name_piece: str,
- named_parameter_expansion: bool
- ) -> str:
- in_data_transformed = {key: cls.__ref6570_item_value(val, percent_encode) for key, val in in_data.items()}
- in_data_transformed = {key: val for key, val in in_data_transformed.items() if val is not None}
- if not in_data_transformed:
- # ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1
- return ""
- value_pair_equals = '=' if named_parameter_expansion else ''
- if not explode:
- return (
- next(prefix_separator_iterator) +
- var_name_piece + value_pair_equals +
- prefix_separator_iterator.item_separator.join(
- prefix_separator_iterator.item_separator.join(
- item_pair
- ) for item_pair in in_data_transformed.items()
- )
- )
- # exploded
- return next(prefix_separator_iterator) + next(prefix_separator_iterator).join(
- [key + '=' + val for key, val in in_data_transformed.items()]
- )
-
- @classmethod
- def _ref6570_expansion(
- cls,
- variable_name: str,
- in_data: typing.Any,
- explode: bool,
- percent_encode: bool,
- prefix_separator_iterator: PrefixSeparatorIterator
- ) -> str:
- """
- Separator is for separate variables like dict with explode true, not for array item separation
- """
- named_parameter_expansion = prefix_separator_iterator.separator in {'&', ';'}
- var_name_piece = variable_name if named_parameter_expansion else ''
- if type(in_data) in {str, float, int}:
- return cls.__ref6570_str_float_int_expansion(
- variable_name,
- in_data,
- explode,
- percent_encode,
- prefix_separator_iterator,
- var_name_piece,
- named_parameter_expansion
- )
- elif isinstance(in_data, none_type):
- # ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1
- return ""
- elif isinstance(in_data, list):
- return cls.__ref6570_list_expansion(
- variable_name,
- in_data,
- explode,
- percent_encode,
- prefix_separator_iterator,
- var_name_piece,
- named_parameter_expansion
- )
- elif isinstance(in_data, dict):
- return cls.__ref6570_dict_expansion(
- variable_name,
- in_data,
- explode,
- percent_encode,
- prefix_separator_iterator,
- var_name_piece,
- named_parameter_expansion
- )
- # bool, bytes, etc
- raise ApiValueError('Unable to generate a ref6570 representation of {}'.format(in_data))
-
-
-class StyleFormSerializer(ParameterSerializerBase):
- @classmethod
- def _get_default_explode(cls, style: ParameterStyle) -> bool:
- if style is ParameterStyle.FORM:
- return True
- return super()._get_default_explode(style)
-
- def _serialize_form(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- name: str,
- explode: bool,
- percent_encode: bool,
- prefix_separator_iterator: typing.Optional[PrefixSeparatorIterator] = None
- ) -> str:
- if prefix_separator_iterator is None:
- prefix_separator_iterator = PrefixSeparatorIterator('', '&')
- return self._ref6570_expansion(
- variable_name=name,
- in_data=in_data,
- explode=explode,
- percent_encode=percent_encode,
- prefix_separator_iterator=prefix_separator_iterator
- )
-
-
-class StyleSimpleSerializer(ParameterSerializerBase):
-
- def _serialize_simple(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- name: str,
- explode: bool,
- percent_encode: bool
- ) -> str:
- prefix_separator_iterator = PrefixSeparatorIterator('', ',')
- return self._ref6570_expansion(
- variable_name=name,
- in_data=in_data,
- explode=explode,
- percent_encode=percent_encode,
- prefix_separator_iterator=prefix_separator_iterator
- )
-
-
-class JSONDetector:
- """
- Works for:
- application/json
- application/json; charset=UTF-8
- application/json-patch+json
- application/geo+json
- """
- __json_content_type_pattern = re.compile("application/[^+]*[+]?(json);?.*")
-
- @classmethod
- def _content_type_is_json(cls, content_type: str) -> bool:
- if cls.__json_content_type_pattern.match(content_type):
- return True
- return False
-
-
-@dataclass
-class ParameterBase(JSONDetector):
- name: str
- in_type: ParameterInType
- required: bool
- style: typing.Optional[ParameterStyle]
- explode: typing.Optional[bool]
- allow_reserved: typing.Optional[bool]
- schema: typing.Optional[typing.Type[Schema]]
- content: typing.Optional[typing.Dict[str, typing.Type[Schema]]]
-
- __style_to_in_type = {
- ParameterStyle.MATRIX: {ParameterInType.PATH},
- ParameterStyle.LABEL: {ParameterInType.PATH},
- ParameterStyle.FORM: {ParameterInType.QUERY, ParameterInType.COOKIE},
- ParameterStyle.SIMPLE: {ParameterInType.PATH, ParameterInType.HEADER},
- ParameterStyle.SPACE_DELIMITED: {ParameterInType.QUERY},
- ParameterStyle.PIPE_DELIMITED: {ParameterInType.QUERY},
- ParameterStyle.DEEP_OBJECT: {ParameterInType.QUERY},
- }
- __in_type_to_default_style = {
- ParameterInType.QUERY: ParameterStyle.FORM,
- ParameterInType.PATH: ParameterStyle.SIMPLE,
- ParameterInType.HEADER: ParameterStyle.SIMPLE,
- ParameterInType.COOKIE: ParameterStyle.FORM,
- }
- __disallowed_header_names = {'Accept', 'Content-Type', 'Authorization'}
- _json_encoder = JSONEncoder()
-
- @classmethod
- def __verify_style_to_in_type(cls, style: typing.Optional[ParameterStyle], in_type: ParameterInType):
- if style is None:
- return
- in_type_set = cls.__style_to_in_type[style]
- if in_type not in in_type_set:
- raise ValueError(
- 'Invalid style and in_type combination. For style={} only in_type={} are allowed'.format(
- style, in_type_set
- )
- )
-
- def __init__(
- self,
- name: str,
- in_type: ParameterInType,
- required: bool = False,
- style: typing.Optional[ParameterStyle] = None,
- explode: bool = False,
- allow_reserved: typing.Optional[bool] = None,
- schema: typing.Optional[typing.Type[Schema]] = None,
- content: typing.Optional[typing.Dict[str, typing.Type[Schema]]] = None
- ):
- if schema is None and content is None:
- raise ValueError('Value missing; Pass in either schema or content')
- if schema and content:
- raise ValueError('Too many values provided. Both schema and content were provided. Only one may be input')
- if name in self.__disallowed_header_names and in_type is ParameterInType.HEADER:
- raise ValueError('Invalid name, name may not be one of {}'.format(self.__disallowed_header_names))
- self.__verify_style_to_in_type(style, in_type)
- if content is None and style is None:
- style = self.__in_type_to_default_style[in_type]
- if content is not None and in_type in self.__in_type_to_default_style and len(content) != 1:
- raise ValueError('Invalid content length, content length must equal 1')
- self.in_type = in_type
- self.name = name
- self.required = required
- self.style = style
- self.explode = explode
- self.allow_reserved = allow_reserved
- self.schema = schema
- self.content = content
-
- def _serialize_json(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- eliminate_whitespace: bool = False
- ) -> str:
- if eliminate_whitespace:
- return json.dumps(in_data, separators=self._json_encoder.compact_separators)
- return json.dumps(in_data)
-
-
-class PathParameter(ParameterBase, StyleSimpleSerializer):
-
- def __init__(
- self,
- name: str,
- required: bool = False,
- style: typing.Optional[ParameterStyle] = None,
- explode: bool = False,
- allow_reserved: typing.Optional[bool] = None,
- schema: typing.Optional[typing.Type[Schema]] = None,
- content: typing.Optional[typing.Dict[str, typing.Type[Schema]]] = None
- ):
- super().__init__(
- name,
- in_type=ParameterInType.PATH,
- required=required,
- style=style,
- explode=explode,
- allow_reserved=allow_reserved,
- schema=schema,
- content=content
- )
-
- def __serialize_label(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list]
- ) -> typing.Dict[str, str]:
- prefix_separator_iterator = PrefixSeparatorIterator('.', '.')
- value = self._ref6570_expansion(
- variable_name=self.name,
- in_data=in_data,
- explode=self.explode,
- percent_encode=True,
- prefix_separator_iterator=prefix_separator_iterator
- )
- return self._to_dict(self.name, value)
-
- def __serialize_matrix(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list]
- ) -> typing.Dict[str, str]:
- prefix_separator_iterator = PrefixSeparatorIterator(';', ';')
- value = self._ref6570_expansion(
- variable_name=self.name,
- in_data=in_data,
- explode=self.explode,
- percent_encode=True,
- prefix_separator_iterator=prefix_separator_iterator
- )
- return self._to_dict(self.name, value)
-
- def __serialize_simple(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- ) -> typing.Dict[str, str]:
- value = self._serialize_simple(
- in_data=in_data,
- name=self.name,
- explode=self.explode,
- percent_encode=True
- )
- return self._to_dict(self.name, value)
-
- def serialize(
- self,
- in_data: typing.Union[
- Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict]
- ) -> typing.Dict[str, str]:
- if self.schema:
- cast_in_data = self.schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- """
- simple -> path
- path:
- returns path_params: dict
- label -> path
- returns path_params
- matrix -> path
- returns path_params
- """
- if self.style:
- if self.style is ParameterStyle.SIMPLE:
- return self.__serialize_simple(cast_in_data)
- elif self.style is ParameterStyle.LABEL:
- return self.__serialize_label(cast_in_data)
- elif self.style is ParameterStyle.MATRIX:
- return self.__serialize_matrix(cast_in_data)
- # self.content will be length one
- for content_type, schema in self.content.items():
- cast_in_data = schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- if self._content_type_is_json(content_type):
- value = self._serialize_json(cast_in_data)
- return self._to_dict(self.name, value)
- raise NotImplementedError('Serialization of {} has not yet been implemented'.format(content_type))
-
-
-class QueryParameter(ParameterBase, StyleFormSerializer):
-
- def __init__(
- self,
- name: str,
- required: bool = False,
- style: typing.Optional[ParameterStyle] = None,
- explode: typing.Optional[bool] = None,
- allow_reserved: typing.Optional[bool] = None,
- schema: typing.Optional[typing.Type[Schema]] = None,
- content: typing.Optional[typing.Dict[str, typing.Type[Schema]]] = None
- ):
- used_style = ParameterStyle.FORM if style is None else style
- used_explode = self._get_default_explode(used_style) if explode is None else explode
-
- super().__init__(
- name,
- in_type=ParameterInType.QUERY,
- required=required,
- style=used_style,
- explode=used_explode,
- allow_reserved=allow_reserved,
- schema=schema,
- content=content
- )
-
- def __serialize_space_delimited(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- prefix_separator_iterator: typing.Optional[PrefixSeparatorIterator]
- ) -> typing.Dict[str, str]:
- if prefix_separator_iterator is None:
- prefix_separator_iterator = self.get_prefix_separator_iterator()
- value = self._ref6570_expansion(
- variable_name=self.name,
- in_data=in_data,
- explode=self.explode,
- percent_encode=True,
- prefix_separator_iterator=prefix_separator_iterator
- )
- return self._to_dict(self.name, value)
-
- def __serialize_pipe_delimited(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- prefix_separator_iterator: typing.Optional[PrefixSeparatorIterator]
- ) -> typing.Dict[str, str]:
- if prefix_separator_iterator is None:
- prefix_separator_iterator = self.get_prefix_separator_iterator()
- value = self._ref6570_expansion(
- variable_name=self.name,
- in_data=in_data,
- explode=self.explode,
- percent_encode=True,
- prefix_separator_iterator=prefix_separator_iterator
- )
- return self._to_dict(self.name, value)
-
- def __serialize_form(
- self,
- in_data: typing.Union[None, int, float, str, bool, dict, list],
- prefix_separator_iterator: typing.Optional[PrefixSeparatorIterator]
- ) -> typing.Dict[str, str]:
- if prefix_separator_iterator is None:
- prefix_separator_iterator = self.get_prefix_separator_iterator()
- value = self._serialize_form(
- in_data,
- name=self.name,
- explode=self.explode,
- percent_encode=True,
- prefix_separator_iterator=prefix_separator_iterator
- )
- return self._to_dict(self.name, value)
-
- def get_prefix_separator_iterator(self) -> typing.Optional[PrefixSeparatorIterator]:
- if self.style is ParameterStyle.FORM:
- return PrefixSeparatorIterator('?', '&')
- elif self.style is ParameterStyle.SPACE_DELIMITED:
- return PrefixSeparatorIterator('', '%20')
- elif self.style is ParameterStyle.PIPE_DELIMITED:
- return PrefixSeparatorIterator('', '|')
-
- def serialize(
- self,
- in_data: typing.Union[
- Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict],
- prefix_separator_iterator: typing.Optional[PrefixSeparatorIterator] = None
- ) -> typing.Dict[str, str]:
- if self.schema:
- cast_in_data = self.schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- """
- form -> query
- query:
- - GET/HEAD/DELETE: could use fields
- - PUT/POST: must use urlencode to send parameters
- returns fields: tuple
- spaceDelimited -> query
- returns fields
- pipeDelimited -> query
- returns fields
- deepObject -> query, https://github.com/OAI/OpenAPI-Specification/issues/1706
- returns fields
- """
- if self.style:
- # TODO update query ones to omit setting values when [] {} or None is input
- if self.style is ParameterStyle.FORM:
- return self.__serialize_form(cast_in_data, prefix_separator_iterator)
- elif self.style is ParameterStyle.SPACE_DELIMITED:
- return self.__serialize_space_delimited(cast_in_data, prefix_separator_iterator)
- elif self.style is ParameterStyle.PIPE_DELIMITED:
- return self.__serialize_pipe_delimited(cast_in_data, prefix_separator_iterator)
- # self.content will be length one
- if prefix_separator_iterator is None:
- prefix_separator_iterator = self.get_prefix_separator_iterator()
- for content_type, schema in self.content.items():
- cast_in_data = schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- if self._content_type_is_json(content_type):
- value = self._serialize_json(cast_in_data, eliminate_whitespace=True)
- return self._to_dict(
- self.name,
- next(prefix_separator_iterator) + self.name + '=' + quote(value)
- )
- raise NotImplementedError('Serialization of {} has not yet been implemented'.format(content_type))
-
-
-class CookieParameter(ParameterBase, StyleFormSerializer):
-
- def __init__(
- self,
- name: str,
- required: bool = False,
- style: typing.Optional[ParameterStyle] = None,
- explode: typing.Optional[bool] = None,
- allow_reserved: typing.Optional[bool] = None,
- schema: typing.Optional[typing.Type[Schema]] = None,
- content: typing.Optional[typing.Dict[str, typing.Type[Schema]]] = None
- ):
- used_style = ParameterStyle.FORM if style is None and content is None and schema else style
- used_explode = self._get_default_explode(used_style) if explode is None else explode
-
- super().__init__(
- name,
- in_type=ParameterInType.COOKIE,
- required=required,
- style=used_style,
- explode=used_explode,
- allow_reserved=allow_reserved,
- schema=schema,
- content=content
- )
-
- def serialize(
- self,
- in_data: typing.Union[
- Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict]
- ) -> typing.Dict[str, str]:
- if self.schema:
- cast_in_data = self.schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- """
- form -> cookie
- returns fields: tuple
- """
- if self.style:
- """
- TODO add escaping of comma, space, equals
- or turn encoding on
- """
- value = self._serialize_form(
- cast_in_data,
- explode=self.explode,
- name=self.name,
- percent_encode=False,
- prefix_separator_iterator=PrefixSeparatorIterator('', '&')
- )
- return self._to_dict(self.name, value)
- # self.content will be length one
- for content_type, schema in self.content.items():
- cast_in_data = schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- if self._content_type_is_json(content_type):
- value = self._serialize_json(cast_in_data)
- return self._to_dict(self.name, value)
- raise NotImplementedError('Serialization of {} has not yet been implemented'.format(content_type))
-
-
-class HeaderParameter(ParameterBase, StyleSimpleSerializer):
- def __init__(
- self,
- name: str,
- required: bool = False,
- style: typing.Optional[ParameterStyle] = None,
- explode: bool = False,
- allow_reserved: typing.Optional[bool] = None,
- schema: typing.Optional[typing.Type[Schema]] = None,
- content: typing.Optional[typing.Dict[str, typing.Type[Schema]]] = None
- ):
- super().__init__(
- name,
- in_type=ParameterInType.HEADER,
- required=required,
- style=style,
- explode=explode,
- allow_reserved=allow_reserved,
- schema=schema,
- content=content
- )
-
- @staticmethod
- def __to_headers(in_data: typing.Tuple[typing.Tuple[str, str], ...]) -> HTTPHeaderDict:
- data = tuple(t for t in in_data if t)
- headers = HTTPHeaderDict()
- if not data:
- return headers
- headers.extend(data)
- return headers
-
- def serialize(
- self,
- in_data: typing.Union[
- Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict]
- ) -> HTTPHeaderDict:
- if self.schema:
- cast_in_data = self.schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- """
- simple -> header
- headers: PoolManager needs a mapping, tuple is close
- returns headers: dict
- """
- if self.style:
- value = self._serialize_simple(cast_in_data, self.name, self.explode, False)
- return self.__to_headers(((self.name, value),))
- # self.content will be length one
- for content_type, schema in self.content.items():
- cast_in_data = schema(in_data)
- cast_in_data = self._json_encoder.default(cast_in_data)
- if self._content_type_is_json(content_type):
- value = self._serialize_json(cast_in_data)
- return self.__to_headers(((self.name, value),))
- raise NotImplementedError('Serialization of {} has not yet been implemented'.format(content_type))
-
-
-class Encoding:
- def __init__(
- self,
- content_type: str,
- headers: typing.Optional[typing.Dict[str, HeaderParameter]] = None,
- style: typing.Optional[ParameterStyle] = None,
- explode: bool = False,
- allow_reserved: bool = False,
- ):
- self.content_type = content_type
- self.headers = headers
- self.style = style
- self.explode = explode
- self.allow_reserved = allow_reserved
-
-
-@dataclass
-class MediaType:
- """
- Used to store request and response body schema information
- encoding:
- A map between a property name and its encoding information.
- The key, being the property name, MUST exist in the schema as a property.
- The encoding object SHALL only apply to requestBody objects when the media type is
- multipart or application/x-www-form-urlencoded.
- """
- schema: typing.Optional[typing.Type[Schema]] = None
- encoding: typing.Optional[typing.Dict[str, Encoding]] = None
-
-
-@dataclass
-class ApiResponse:
- response: urllib3.HTTPResponse
- body: typing.Union[Unset, Schema] = unset
- headers: typing.Union[Unset, typing.Dict[str, Schema]] = unset
-
- def __init__(
- self,
- response: urllib3.HTTPResponse,
- body: typing.Union[Unset, Schema] = unset,
- headers: typing.Union[Unset, typing.Dict[str, Schema]] = unset
- ):
- """
- pycharm needs this to prevent 'Unexpected argument' warnings
- """
- self.response = response
- self.body = body
- self.headers = headers
-
-
-@dataclass
-class ApiResponseWithoutDeserialization(ApiResponse):
- response: urllib3.HTTPResponse
- body: typing.Union[Unset, typing.Type[Schema]] = unset
- headers: typing.Union[Unset, typing.List[HeaderParameter]] = unset
-
-
-class OpenApiResponse(JSONDetector):
- __filename_content_disposition_pattern = re.compile('filename="(.+?)"')
-
- def __init__(
- self,
- response_cls: typing.Type[ApiResponse] = ApiResponse,
- content: typing.Optional[typing.Dict[str, MediaType]] = None,
- headers: typing.Optional[typing.List[HeaderParameter]] = None,
- ):
- self.headers = headers
- if content is not None and len(content) == 0:
- raise ValueError('Invalid value for content, the content dict must have >= 1 entry')
- self.content = content
- self.response_cls = response_cls
-
- @staticmethod
- def __deserialize_json(response: urllib3.HTTPResponse) -> typing.Any:
- # python must be >= 3.9 so we can pass in bytes into json.loads
- return json.loads(response.data)
-
- @staticmethod
- def __file_name_from_response_url(response_url: typing.Optional[str]) -> typing.Optional[str]:
- if response_url is None:
- return None
- url_path = urlparse(response_url).path
- if url_path:
- path_basename = os.path.basename(url_path)
- if path_basename:
- _filename, ext = os.path.splitext(path_basename)
- if ext:
- return path_basename
- return None
-
- @classmethod
- def __file_name_from_content_disposition(cls, content_disposition: typing.Optional[str]) -> typing.Optional[str]:
- if content_disposition is None:
- return None
- match = cls.__filename_content_disposition_pattern.search(content_disposition)
- if not match:
- return None
- return match.group(1)
-
- def __deserialize_application_octet_stream(
- self, response: urllib3.HTTPResponse
- ) -> typing.Union[bytes, io.BufferedReader]:
- """
- urllib3 use cases:
- 1. when preload_content=True (stream=False) then supports_chunked_reads is False and bytes are returned
- 2. when preload_content=False (stream=True) then supports_chunked_reads is True and
- a file will be written and returned
- """
- if response.supports_chunked_reads():
- file_name = (
- self.__file_name_from_content_disposition(response.headers.get('content-disposition'))
- or self.__file_name_from_response_url(response.geturl())
- )
-
- if file_name is None:
- _fd, path = tempfile.mkstemp()
- else:
- path = os.path.join(tempfile.gettempdir(), file_name)
-
- with open(path, 'wb') as new_file:
- chunk_size = 1024
- while True:
- data = response.read(chunk_size)
- if not data:
- break
- new_file.write(data)
- # release_conn is needed for streaming connections only
- response.release_conn()
- new_file = open(path, 'rb')
- return new_file
- else:
- return response.data
-
- @staticmethod
- def __deserialize_multipart_form_data(
- response: urllib3.HTTPResponse
- ) -> typing.Dict[str, typing.Any]:
- msg = email.message_from_bytes(response.data)
- return {
- part.get_param("name", header="Content-Disposition"): part.get_payload(
- decode=True
- ).decode(part.get_content_charset())
- if part.get_content_charset()
- else part.get_payload()
- for part in msg.get_payload()
- }
-
- def deserialize(self, response: urllib3.HTTPResponse, configuration: Configuration) -> ApiResponse:
- content_type = response.getheader('content-type')
- deserialized_body = unset
- streamed = response.supports_chunked_reads()
-
- deserialized_headers = unset
- if self.headers is not None:
- # TODO add header deserialiation here
- pass
-
- if self.content is not None:
- if content_type not in self.content:
- raise ApiValueError(
- f"Invalid content_type returned. Content_type='{content_type}' was returned "
- f"when only {str(set(self.content))} are defined for status_code={str(response.status)}"
- )
- body_schema = self.content[content_type].schema
- if body_schema is None:
- # some specs do not define response content media type schemas
- return self.response_cls(
- response=response,
- headers=deserialized_headers,
- body=unset
- )
-
- if self._content_type_is_json(content_type):
- body_data = self.__deserialize_json(response)
- elif content_type == 'application/octet-stream':
- body_data = self.__deserialize_application_octet_stream(response)
- elif content_type.startswith('multipart/form-data'):
- body_data = self.__deserialize_multipart_form_data(response)
- content_type = 'multipart/form-data'
- else:
- raise NotImplementedError('Deserialization of {} has not yet been implemented'.format(content_type))
- deserialized_body = body_schema.from_openapi_data_oapg(
- body_data, _configuration=configuration)
- elif streamed:
- response.release_conn()
-
- return self.response_cls(
- response=response,
- headers=deserialized_headers,
- body=deserialized_body
- )
-
-
-class ApiClient:
- """Generic API client for OpenAPI client library builds.
-
- OpenAPI generic API client. This client handles the client-
- server communication, and is invariant across implementations. Specifics of
- the methods and models for each application are generated from the OpenAPI
- templates.
-
- NOTE: This class is auto generated by OpenAPI Generator.
- Ref: https://openapi-generator.tech
- Do not edit the class manually.
-
- :param configuration: .Configuration object for this client
- :param header_name: a header to pass when making calls to the API.
- :param header_value: a header value to pass when making calls to
- the API.
- :param cookie: a cookie to include in the header when making calls
- to the API
- :param pool_threads: The number of threads to use for async requests
- to the API. More threads means more concurrent API requests.
- """
-
- _pool = None
-
- def __init__(
- self,
- configuration: typing.Optional[Configuration] = None,
- header_name: typing.Optional[str] = None,
- header_value: typing.Optional[str] = None,
- cookie: typing.Optional[str] = None,
- pool_threads: int = 1
- ):
- if configuration is None:
- configuration = Configuration()
- self.configuration = configuration
- self.pool_threads = pool_threads
-
- self.rest_client = rest.RESTClientObject(configuration)
- self.default_headers = HTTPHeaderDict()
- if header_name is not None:
- self.default_headers[header_name] = header_value
- self.cookie = cookie
- # Set default User-Agent.
- self.user_agent = '{{#if httpUserAgent}}{{{httpUserAgent}}}{{/if}}{{#unless httpUserAgent}}OpenAPI-Generator/{{{packageVersion}}}/python{{/unless}}'
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, traceback):
- self.close()
-
- def close(self):
- if self._pool:
- self._pool.close()
- self._pool.join()
- self._pool = None
- if hasattr(atexit, 'unregister'):
- atexit.unregister(self.close)
-
- @property
- def pool(self):
- """Create thread pool on first request
- avoids instantiating unused threadpool for blocking clients.
- """
- if self._pool is None:
- atexit.register(self.close)
- self._pool = ThreadPool(self.pool_threads)
- return self._pool
-
- @property
- def user_agent(self):
- """User agent for this API client"""
- return self.default_headers['User-Agent']
-
- @user_agent.setter
- def user_agent(self, value):
- self.default_headers['User-Agent'] = value
-
- def set_default_header(self, header_name, header_value):
- self.default_headers[header_name] = header_value
-
- {{#if tornado}}
- @tornado.gen.coroutine
- {{/if}}
- {{#if asyncio}}async {{/if}}def __call_api(
- self,
- resource_path: str,
- method: str,
- headers: typing.Optional[HTTPHeaderDict] = None,
- body: typing.Optional[typing.Union[str, bytes]] = None,
- fields: typing.Optional[typing.Tuple[typing.Tuple[str, str], ...]] = None,
- auth_settings: typing.Optional[typing.List[str]] = None,
- stream: bool = False,
- timeout: typing.Optional[typing.Union[int, typing.Tuple]] = None,
- host: typing.Optional[str] = None,
- ) -> urllib3.HTTPResponse:
-
- # header parameters
- used_headers = HTTPHeaderDict(self.default_headers)
- if self.cookie:
- headers['Cookie'] = self.cookie
-
- # auth setting
- self.update_params_for_auth(used_headers,
- auth_settings, resource_path, method, body)
-
- # must happen after cookie setting and auth setting in case user is overriding those
- if headers:
- used_headers.update(headers)
-
- # request url
- if host is None:
- url = self.configuration.host + resource_path
- else:
- # use server/host defined in path or operation instead
- url = host + resource_path
-
- # perform request and return response
- response = {{#if asyncio}}await {{/if}}{{#if tornado}}yield {{/if}}self.request(
- method,
- url,
- headers=used_headers,
- fields=fields,
- body=body,
- stream=stream,
- timeout=timeout,
- )
- return response
-
- def call_api(
- self,
- resource_path: str,
- method: str,
- headers: typing.Optional[HTTPHeaderDict] = None,
- body: typing.Optional[typing.Union[str, bytes]] = None,
- fields: typing.Optional[typing.Tuple[typing.Tuple[str, str], ...]] = None,
- auth_settings: typing.Optional[typing.List[str]] = None,
- async_req: typing.Optional[bool] = None,
- stream: bool = False,
- timeout: typing.Optional[typing.Union[int, typing.Tuple]] = None,
- host: typing.Optional[str] = None,
- ) -> urllib3.HTTPResponse:
- """Makes the HTTP request (synchronous) and returns deserialized data.
-
- To make an async_req request, set the async_req parameter.
-
- :param resource_path: Path to method endpoint.
- :param method: Method to call.
- :param headers: Header parameters to be
- placed in the request header.
- :param body: Request body.
- :param fields: Request post form parameters,
- for `application/x-www-form-urlencoded`, `multipart/form-data`.
- :param auth_settings: Auth Settings names for the request.
- :param async_req: execute request asynchronously
- :type async_req: bool, optional TODO remove, unused
- :param stream: if True, the urllib3.HTTPResponse object will
- be returned without reading/decoding response
- data. Also when True, if the openapi spec describes a file download,
- the data will be written to a local filesystme file and the BinarySchema
- instance will also inherit from FileSchema and FileIO
- Default is False.
- :type stream: bool, optional
- :param timeout: timeout setting for this request. If one
- number provided, it will be total request
- timeout. It can also be a pair (tuple) of
- (connection, read) timeouts.
- :param host: api endpoint host
- :return:
- If async_req parameter is True,
- the request will be called asynchronously.
- The method will return the request thread.
- If parameter async_req is False or missing,
- then the method will return the response directly.
- """
-
- if not async_req:
- return self.__call_api(
- resource_path,
- method,
- headers,
- body,
- fields,
- auth_settings,
- stream,
- timeout,
- host,
- )
-
- return self.pool.apply_async(
- self.__call_api,
- (
- resource_path,
- method,
- headers,
- body,
- json,
- fields,
- auth_settings,
- stream,
- timeout,
- host,
- )
- )
-
- def request(
- self,
- method: str,
- url: str,
- headers: typing.Optional[HTTPHeaderDict] = None,
- fields: typing.Optional[typing.Tuple[typing.Tuple[str, str], ...]] = None,
- body: typing.Optional[typing.Union[str, bytes]] = None,
- stream: bool = False,
- timeout: typing.Optional[typing.Union[int, typing.Tuple]] = None,
- ) -> urllib3.HTTPResponse:
- """Makes the HTTP request using RESTClient."""
- if method == "GET":
- return self.rest_client.GET(url,
- stream=stream,
- timeout=timeout,
- headers=headers)
- elif method == "HEAD":
- return self.rest_client.HEAD(url,
- stream=stream,
- timeout=timeout,
- headers=headers)
- elif method == "OPTIONS":
- return self.rest_client.OPTIONS(url,
- headers=headers,
- fields=fields,
- stream=stream,
- timeout=timeout,
- body=body)
- elif method == "POST":
- return self.rest_client.POST(url,
- headers=headers,
- fields=fields,
- stream=stream,
- timeout=timeout,
- body=body)
- elif method == "PUT":
- return self.rest_client.PUT(url,
- headers=headers,
- fields=fields,
- stream=stream,
- timeout=timeout,
- body=body)
- elif method == "PATCH":
- return self.rest_client.PATCH(url,
- headers=headers,
- fields=fields,
- stream=stream,
- timeout=timeout,
- body=body)
- elif method == "DELETE":
- return self.rest_client.DELETE(url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- body=body)
- else:
- raise ApiValueError(
- "http method must be `GET`, `HEAD`, `OPTIONS`,"
- " `POST`, `PATCH`, `PUT` or `DELETE`."
- )
-
- def update_params_for_auth(self, headers, auth_settings,
- resource_path, method, body):
- """Updates header and query params based on authentication setting.
-
- :param headers: Header parameters dict to be updated.
- :param auth_settings: Authentication setting identifiers list.
- :param resource_path: A string representation of the HTTP request resource path.
- :param method: A string representation of the HTTP request method.
- :param body: A object representing the body of the HTTP request.
- The object type is the return value of _encoder.default().
- """
- if not auth_settings:
- return
-
- for auth in auth_settings:
- auth_setting = self.configuration.auth_settings().get(auth)
- if not auth_setting:
- continue
- if auth_setting['in'] == 'cookie':
- headers.add('Cookie', auth_setting['value'])
- elif auth_setting['in'] == 'header':
- if auth_setting['type'] != 'http-signature':
- headers.add(auth_setting['key'], auth_setting['value'])
-{{#if hasHttpSignatureMethods}}
- else:
- # The HTTP signature scheme requires multiple HTTP headers
- # that are calculated dynamically.
- signing_info = self.configuration.signing_info
- queries = tuple()
- auth_headers = signing_info.get_http_signature_headers(
- resource_path, method, headers, body, queries)
- for key, value in auth_headers.items():
- headers.add(key, value)
-{{/if}}
- elif auth_setting['in'] == 'query':
- """ TODO implement auth in query
- need to pass in prefix_separator_iterator
- and need to output resource_path with query params added
- """
- raise ApiValueError("Auth in query not yet implemented")
- else:
- raise ApiValueError(
- 'Authentication token must be in `query` or `header`'
- )
-
-
-class Api:
- """NOTE: This class is auto generated by OpenAPI Generator
- Ref: https://openapi-generator.tech
-
- Do not edit the class manually.
- """
-
- def __init__(self, api_client: typing.Optional[ApiClient] = None):
- if api_client is None:
- api_client = ApiClient()
- self.api_client = api_client
-
- @staticmethod
- def _verify_typed_dict_inputs_oapg(cls: typing.Type[typing_extensions.TypedDict], data: typing.Dict[str, typing.Any]):
- """
- Ensures that:
- - required keys are present
- - additional properties are not input
- - value stored under required keys do not have the value unset
- Note: detailed value checking is done in schema classes
- """
- missing_required_keys = []
- required_keys_with_unset_values = []
- for required_key in cls.__required_keys__:
- if required_key not in data:
- missing_required_keys.append(required_key)
- continue
- value = data[required_key]
- if value is unset:
- required_keys_with_unset_values.append(required_key)
- if missing_required_keys:
- raise ApiTypeError(
- '{} missing {} required arguments: {}'.format(
- cls.__name__, len(missing_required_keys), missing_required_keys
- )
- )
- if required_keys_with_unset_values:
- raise ApiValueError(
- '{} contains invalid unset values for {} required keys: {}'.format(
- cls.__name__, len(required_keys_with_unset_values), required_keys_with_unset_values
- )
- )
-
- disallowed_additional_keys = []
- for key in data:
- if key in cls.__required_keys__ or key in cls.__optional_keys__:
- continue
- disallowed_additional_keys.append(key)
- if disallowed_additional_keys:
- raise ApiTypeError(
- '{} got {} unexpected keyword arguments: {}'.format(
- cls.__name__, len(disallowed_additional_keys), disallowed_additional_keys
- )
- )
-
- def _get_host_oapg(
- self,
- operation_id: str,
- servers: typing.Tuple[typing.Dict[str, str], ...] = tuple(),
- host_index: typing.Optional[int] = None
- ) -> typing.Optional[str]:
- configuration = self.api_client.configuration
- try:
- if host_index is None:
- index = configuration.server_operation_index.get(
- operation_id, configuration.server_index
- )
- else:
- index = host_index
- server_variables = configuration.server_operation_variables.get(
- operation_id, configuration.server_variables
- )
- host = configuration.get_host_from_settings(
- index, variables=server_variables, servers=servers
- )
- except IndexError:
- if servers:
- raise ApiValueError(
- "Invalid host index. Must be 0 <= index < %s" %
- len(servers)
- )
- host = None
- return host
-
-
-class SerializedRequestBody(typing_extensions.TypedDict, total=False):
- body: typing.Union[str, bytes]
- fields: typing.Tuple[typing.Union[RequestField, typing.Tuple[str, str]], ...]
-
-
-class RequestBody(StyleFormSerializer, JSONDetector):
- """
- A request body parameter
- content: content_type to MediaType Schema info
- """
- __json_encoder = JSONEncoder()
-
- def __init__(
- self,
- content: typing.Dict[str, MediaType],
- required: bool = False,
- ):
- self.required = required
- if len(content) == 0:
- raise ValueError('Invalid value for content, the content dict must have >= 1 entry')
- self.content = content
-
- def __serialize_json(
- self,
- in_data: typing.Any
- ) -> typing.Dict[str, bytes]:
- in_data = self.__json_encoder.default(in_data)
- json_str = json.dumps(in_data, separators=(",", ":"), ensure_ascii=False).encode(
- "utf-8"
- )
- return dict(body=json_str)
-
- @staticmethod
- def __serialize_text_plain(in_data: typing.Any) -> typing.Dict[str, str]:
- if isinstance(in_data, frozendict.frozendict):
- raise ValueError('Unable to serialize type frozendict.frozendict to text/plain')
- elif isinstance(in_data, tuple):
- raise ValueError('Unable to serialize type tuple to text/plain')
- elif isinstance(in_data, NoneClass):
- raise ValueError('Unable to serialize type NoneClass to text/plain')
- elif isinstance(in_data, BoolClass):
- raise ValueError('Unable to serialize type BoolClass to text/plain')
- return dict(body=str(in_data))
-
- def __multipart_json_item(self, key: str, value: Schema) -> RequestField:
- json_value = self.__json_encoder.default(value)
- request_field = RequestField(name=key, data=json.dumps(json_value))
- request_field.make_multipart(content_type='application/json')
- return request_field
-
- def __multipart_form_item(self, key: str, value: Schema) -> RequestField:
- if isinstance(value, str):
- request_field = RequestField(name=key, data=str(value))
- request_field.make_multipart(content_type='text/plain')
- elif isinstance(value, bytes):
- request_field = RequestField(name=key, data=value)
- request_field.make_multipart(content_type='application/octet-stream')
- elif isinstance(value, FileIO):
- # TODO use content.encoding to limit allowed content types if they are present
- request_field = RequestField.from_tuples(key, (os.path.basename(value.name), value.read()))
- value.close()
- else:
- request_field = self.__multipart_json_item(key=key, value=value)
- return request_field
-
- def __serialize_multipart_form_data(
- self, in_data: Schema
- ) -> typing.Dict[str, typing.Tuple[RequestField, ...]]:
- if not isinstance(in_data, frozendict.frozendict):
- raise ValueError(f'Unable to serialize {in_data} to multipart/form-data because it is not a dict of data')
- """
- In a multipart/form-data request body, each schema property, or each element of a schema array property,
- takes a section in the payload with an internal header as defined by RFC7578. The serialization strategy
- for each property of a multipart/form-data request body can be specified in an associated Encoding Object.
-
- When passing in multipart types, boundaries MAY be used to separate sections of the content being
- transferred – thus, the following default Content-Types are defined for multipart:
-
- If the (object) property is a primitive, or an array of primitive values, the default Content-Type is text/plain
- If the property is complex, or an array of complex values, the default Content-Type is application/json
- Question: how is the array of primitives encoded?
- If the property is a type: string with a contentEncoding, the default Content-Type is application/octet-stream
- """
- fields = []
- for key, value in in_data.items():
- if isinstance(value, tuple):
- if value:
- # values use explode = True, so the code makes a RequestField for each item with name=key
- for item in value:
- request_field = self.__multipart_form_item(key=key, value=item)
- fields.append(request_field)
- else:
- # send an empty array as json because exploding will not send it
- request_field = self.__multipart_json_item(key=key, value=value)
- fields.append(request_field)
- else:
- request_field = self.__multipart_form_item(key=key, value=value)
- fields.append(request_field)
-
- return dict(fields=tuple(fields))
-
- def __serialize_application_octet_stream(self, in_data: BinarySchema) -> typing.Dict[str, bytes]:
- if isinstance(in_data, bytes):
- return dict(body=in_data)
- # FileIO type
- result = dict(body=in_data.read())
- in_data.close()
- return result
-
- def __serialize_application_x_www_form_data(
- self, in_data: typing.Any
- ) -> SerializedRequestBody:
- """
- POST submission of form data in body
- """
- if not isinstance(in_data, frozendict.frozendict):
- raise ValueError(
- f'Unable to serialize {in_data} to application/x-www-form-urlencoded because it is not a dict of data')
- cast_in_data = self.__json_encoder.default(in_data)
- value = self._serialize_form(cast_in_data, name='', explode=True, percent_encode=True)
- return dict(body=value)
-
- def serialize(
- self, in_data: typing.Any, content_type: str
- ) -> SerializedRequestBody:
- """
- If a str is returned then the result will be assigned to data when making the request
- If a tuple is returned then the result will be used as fields input in encode_multipart_formdata
- Return a tuple of
-
- The key of the return dict is
- - body for application/json
- - encode_multipart and fields for multipart/form-data
- """
- media_type = self.content[content_type]
- if isinstance(in_data, media_type.schema):
- cast_in_data = in_data
- elif isinstance(in_data, (dict, frozendict.frozendict)) and in_data:
- cast_in_data = media_type.schema(**in_data)
- else:
- cast_in_data = media_type.schema(in_data)
- # TODO check for and use encoding if it exists
- # and content_type is multipart or application/x-www-form-urlencoded
- if self._content_type_is_json(content_type):
- return self.__serialize_json(cast_in_data)
- elif content_type == 'text/plain':
- return self.__serialize_text_plain(cast_in_data)
- elif content_type == 'multipart/form-data':
- return self.__serialize_multipart_form_data(cast_in_data)
- elif content_type == 'application/x-www-form-urlencoded':
- return self.__serialize_application_x_www_form_data(cast_in_data)
- elif content_type == 'application/octet-stream':
- return self.__serialize_application_octet_stream(cast_in_data)
- raise NotImplementedError('Serialization has not yet been implemented for {}'.format(content_type))
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/api_client.mustache b/modules/openapi-generator/src/main/resources/python/api_client.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/api_client.mustache
rename to modules/openapi-generator/src/main/resources/python/api_client.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/api_doc.handlebars b/modules/openapi-generator/src/main/resources/python/api_doc.handlebars
deleted file mode 100644
index 258110fbf03..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api_doc.handlebars
+++ /dev/null
@@ -1,211 +0,0 @@
-
-# {{packageName}}.{{apiPackage}}.tags.{{classFilename}}.{{classname}}{{#if description}}
-{{description}}{{/if}}
-
-All URIs are relative to *{{basePath}}*
-
-Method | HTTP request | Description
-------------- | ------------- | -------------
-{{#with operations}}{{#each operation}}[**{{operationId}}**](#{{operationId}}) | **{{httpMethod}}** {{path}} | {{#if summary}}{{summary}}{{/if}}
-{{/each}}{{/with}}
-
-{{#with operations}}
-{{#each operation}}
-# **{{{operationId}}}**
-
-> {{#if returnType}}{{{returnType}}} {{/if}}{{{operationId}}}({{#each requiredParams}}{{#unless defaultValue}}{{paramName}}{{#if hasMore}}, {{/if}}{{/unless}}{{/each}})
-
-{{#if summary}}{{{summary}}}{{/if}}{{#if notes}}
-
-{{{notes}}}{{/if}}
-
-### Example
-
-{{#if hasAuthMethods}}
-{{#each authMethods}}
-{{#if isBasic}}
-{{#if isBasicBasic}}
-* Basic Authentication ({{name}}):
-{{/if}}
-{{#if isBasicBearer}}
-* Bearer{{#if bearerFormat}} ({{{bearerFormat}}}){{/if}} Authentication ({{name}}):
-{{/if}}
-{{/if}}
-{{#if isApiKey}}
-* Api Key Authentication ({{name}}):
-{{/if}}
-{{#if isOAuth}}
-* OAuth Authentication ({{name}}):
-{{/if}}
-{{/each}}
-{{/if}}
-{{> api_doc_example }}
-### Parameters
-{{#if allParams}}
-
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
- {{#with bodyParam}}
-{{baseName}} | typing.Union[{{#each content}}{{#unless @first}}, {{/unless}}{{this.schema.baseName}}{{/each}}{{#unless required}}, Unset]{{else}}]{{/unless}} | {{#if required}}required{{else}}optional, default is unset{{/if}} |
- {{/with}}
- {{#if queryParams}}
-query_params | RequestQueryParams | |
- {{/if}}
- {{#if headerParams}}
-header_params | RequestHeaderParams | |
- {{/if}}
- {{#if pathParams}}
-path_params | RequestPathParams | |
- {{/if}}
- {{#if cookieParams}}
-cookie_params | RequestCookieParams | |
- {{/if}}
- {{#with bodyParam}}
- {{#each content}}
- {{#if @first}}
-content_type | str | optional, default is '{{@key}}' | Selects the schema and serialization of the request body
- {{/if}}
- {{/each}}
- {{/with}}
- {{#if produces}}
-accept_content_types | typing.Tuple[str] | default is ({{#each produces}}'{{this.mediaType}}', {{/each}}) | Tells the server the content type(s) that are accepted by the client
- {{/if}}
- {{#if servers}}
-host_index | typing.Optional[int] | default is None | Allows one to select a different host
- {{/if}}
-stream | bool | default is False | if True then the response.content will be streamed and loaded from a file like object. When downloading a file, set this to True to force the code to deserialize the content to a FileSchema file
-timeout | typing.Optional[typing.Union[int, typing.Tuple]] | default is None | the timeout used by the rest client
-skip_deserialization | bool | default is False | when True, headers and body will be unset and an instance of api_client.ApiResponseWithoutDeserialization will be returned
- {{#with bodyParam}}
-
-### body
- {{#each content}}
- {{#with this.schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
- {{/with}}
- {{/each}}
- {{/with}}
- {{#if queryParams}}
-
-### query_params
-#### RequestQueryParams
-
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
- {{#each queryParams}}
-{{baseName}} | {{#with schema}}{{baseName}}{{/with}} | | {{#unless required}}optional{{/unless}}
- {{/each}}
-
- {{#each queryParams}}
- {{#with schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
- {{/with}}
- {{/each}}
- {{/if}}
- {{#if headerParams}}
-
-### header_params
-#### RequestHeaderParams
-
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
- {{#each headerParams}}
-{{baseName}} | {{#with schema}}{{baseName}}{{/with}} | | {{#unless required}}optional{{/unless}}
- {{/each}}
- {{#each headerParams}}
- {{#with schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
- {{/with}}
- {{/each}}
- {{/if}}
- {{#if pathParams}}
-
-### path_params
-#### RequestPathParams
-
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
- {{#each pathParams}}
-{{baseName}} | {{#with schema}}{{baseName}}{{/with}} | | {{#unless required}}optional{{/unless}}
- {{/each}}
- {{#each pathParams}}
- {{#with schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
- {{/with}}
- {{/each}}
- {{/if}}
- {{#if cookieParams}}
-
-### cookie_params
-#### RequestCookieParams
-
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
- {{#each cookieParams}}
-{{baseName}} | {{#with schema}}{{baseName}}{{/with}} | | {{#unless required}}optional{{/unless}}
- {{/each}}
- {{#each cookieParams}}
- {{#with schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
- {{/with}}
- {{/each}}
- {{/if}}
-{{else}}
-This endpoint does not need any parameter.
-{{/if}}
-
-### Return Types, Responses
-
-Code | Class | Description
-------------- | ------------- | -------------
-n/a | api_client.ApiResponseWithoutDeserialization | When skip_deserialization is True this response is returned
-{{#each responses}}
-{{#if isDefault}}
-default | [ApiResponseForDefault](#{{operationId}}.ApiResponseForDefault) | {{message}}
-{{else}}
-{{code}} | [ApiResponseFor{{code}}](#{{operationId}}.ApiResponseFor{{code}}) | {{message}}
-{{/if}}
-{{/each}}
-{{#each responses}}
-{{#if isDefault}}
-
-#### {{operationId}}.ApiResponseForDefault
-{{else}}
-
-#### {{operationId}}.ApiResponseFor{{code}}
-{{/if}}
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
-response | urllib3.HTTPResponse | Raw response |
-body | {{#unless content}}Unset{{else}}typing.Union[{{#each content}}{{#if this.schema}}{{this.schema.baseName}}{{else}}Unset{{/if}}, {{/each}}]{{/unless}} | {{#unless content}}body was not defined{{/unless}} |
-headers | {{#unless responseHeaders}}Unset{{else}}ResponseHeadersFor{{code}}{{/unless}} | {{#unless responseHeaders}}headers were not defined{{/unless}} |
-{{#each content}}
-{{#with this.schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
-{{/with}}
-{{/each}}
-{{#if responseHeaders}}
-#### ResponseHeadersFor{{code}}
-
-Name | Type | Description | Notes
-------------- | ------------- | ------------- | -------------
- {{#each responseHeaders}}
-{{baseName}} | {{#with schema}}{{baseName}}{{/with}} | | {{#unless required}}optional{{/unless}}
- {{/each}}
- {{#each responseHeaders}}
- {{#with schema}}
-{{> api_doc_schema_type_hint complexTypePrefix="../../models/" }}
- {{/with}}
- {{/each}}
-
-{{/if}}
-{{/each}}
-
-### Authorization
-
-{{#unless authMethods}}No authorization required{{/unless}}{{#each authMethods}}[{{{name}}}](../../../README.md#{{{name}}}){{#unless @last}}, {{/unless}}{{/each}}
-
-[[Back to top]](#__pageTop) [[Back to API list]](../../../README.md#documentation-for-api-endpoints) [[Back to Model list]](../../../README.md#documentation-for-models) [[Back to README]](../../../README.md)
-
-{{/each}}
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/api_doc.mustache b/modules/openapi-generator/src/main/resources/python/api_doc.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/api_doc.mustache
rename to modules/openapi-generator/src/main/resources/python/api_doc.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/api_doc_example.handlebars b/modules/openapi-generator/src/main/resources/python/api_doc_example.handlebars
deleted file mode 100644
index 10661156ce6..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api_doc_example.handlebars
+++ /dev/null
@@ -1,163 +0,0 @@
-```python
-import {{{packageName}}}
-from {{packageName}}.{{apiPackage}}.tags import {{classFilename}}
-{{#each imports}}
-{{{.}}}
-{{/each}}
-from pprint import pprint
-{{> doc_auth_partial}}
-# Enter a context with an instance of the API client
-with {{{packageName}}}.ApiClient(configuration) as api_client:
- # Create an instance of the API class
- api_instance = {{classFilename}}.{{{classname}}}(api_client)
-{{#if requiredParams}}
-
- # example passing only required values which don't have defaults set
-{{#if pathParams}}
- path_params = {
- {{#each pathParams}}
- {{#if required}}
- '{{baseName}}': {{{example}}},
- {{/if}}
- {{/each}}
- }
-{{/if}}
-{{#if queryParams}}
- query_params = {
- {{#each queryParams}}
- {{#if required}}
- '{{baseName}}': {{{example}}},
- {{/if}}
- {{/each}}
- }
-{{/if}}
-{{#if cookieParams}}
- cookie_params = {
- {{#each cookieParams}}
- {{#if required}}
- '{{baseName}}': {{{example}}},
- {{/if}}
- {{/each}}
- }
-{{/if}}
-{{#if headerParams}}
- header_params = {
- {{#each headerParams}}
- {{#if required}}
- '{{baseName}}': {{{example}}},
- {{/if}}
- {{/each}}
- }
-{{/if}}
-{{#with bodyParam}}
- {{#if required}}
- body = {{{example}}}
- {{/if}}
-{{/with}}
- try:
-{{#if summary}}
- # {{{summary}}}
-{{/if}}
- api_response = api_instance.{{{operationId}}}(
- {{#if pathParams}}
- path_params=path_params,
- {{/if}}
- {{#if queryParams}}
- query_params=query_params,
- {{/if}}
- {{#if headerParams}}
- header_params=header_params,
- {{/if}}
- {{#if cookieParams}}
- cookie_params=cookie_params,
- {{/if}}
- {{#with bodyParam}}
- {{#if required}}
- body=body,
- {{/if}}
- {{/with}}
- )
-{{#if returnType}}
- pprint(api_response)
-{{/if}}
- except {{{packageName}}}.ApiException as e:
- print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e)
-{{/if}}
-{{#if optionalParams}}
-
- # example passing only optional values
-{{#if pathParams}}
- path_params = {
- {{#each pathParams}}
- '{{baseName}}': {{{example}}},
- {{/each}}
- }
-{{/if}}
-{{#if queryParams}}
- query_params = {
- {{#each queryParams}}
- '{{baseName}}': {{{example}}},
- {{/each}}
- }
-{{/if}}
-{{#if cookieParams}}
- cookie_params = {
- {{#each cookieParams}}
- '{{baseName}}': {{{example}}},
- {{/each}}
- }
-{{/if}}
-{{#if headerParams}}
- header_params = {
- {{#each headerParams}}
- '{{baseName}}': {{{example}}},
- {{/each}}
- }
-{{/if}}
-{{#with bodyParam}}
- body = {{{example}}}
-{{/with}}
- try:
-{{#if summary}}
- # {{{summary}}}
-{{/if}}
- api_response = api_instance.{{{operationId}}}(
- {{#if pathParams}}
- path_params=path_params,
- {{/if}}
- {{#if queryParams}}
- query_params=query_params,
- {{/if}}
- {{#if headerParams}}
- header_params=header_params,
- {{/if}}
- {{#if cookieParams}}
- cookie_params=cookie_params,
- {{/if}}
- {{#if bodyParam}}
- body=body,
- {{/if}}
- )
-{{#if returnType}}
- pprint(api_response)
-{{/if}}
- except {{{packageName}}}.ApiException as e:
- print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e)
-{{/if}}
-{{#unless requiredParams}}
-{{#unless optionalParams}}
-
- # example, this endpoint has no required or optional parameters
- try:
-{{#if summary}}
- # {{{summary}}}
-{{/if}}
- api_response = api_instance.{{{operationId}}}()
-{{#if returnType}}
- pprint(api_response)
-{{/if}}
- except {{{packageName}}}.ApiException as e:
- print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e)
-{{/unless}}
-{{/unless}}
-```
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/api_doc_example.mustache b/modules/openapi-generator/src/main/resources/python/api_doc_example.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/api_doc_example.mustache
rename to modules/openapi-generator/src/main/resources/python/api_doc_example.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/api_doc_schema_type_hint.handlebars b/modules/openapi-generator/src/main/resources/python/api_doc_schema_type_hint.handlebars
deleted file mode 100644
index 27aa7a499b7..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api_doc_schema_type_hint.handlebars
+++ /dev/null
@@ -1,10 +0,0 @@
-
-# {{baseName}}
-{{#if complexType}}
-Type | Description | Notes
-------------- | ------------- | -------------
-[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md) | {{#if description}}{{description}}{{/if}} | {{#if isReadOnly}}[readonly] {{/if}}
-
-{{else}}
-{{> schema_doc complexTypePrefix="{{complexTypePrefix}}" }}
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/api_response.mustache b/modules/openapi-generator/src/main/resources/python/api_response.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/api_response.mustache
rename to modules/openapi-generator/src/main/resources/python/api_response.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/api_test.handlebars b/modules/openapi-generator/src/main/resources/python/api_test.handlebars
deleted file mode 100644
index 142ec8b435a..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api_test.handlebars
+++ /dev/null
@@ -1,143 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-import unittest
-from unittest.mock import patch
-
-import urllib3
-
-import {{packageName}}
-from {{packageName}}.paths.{{operation.nickname}} import {{operation.httpMethod}} # noqa: E501
-from {{packageName}} import configuration, schemas, api_client
-
-from .. import ApiTestMixin
-
-
-{{#with operation}}
-class Test{{operationIdSnakeCase}}(ApiTestMixin, unittest.TestCase):
- """
- {{operationIdSnakeCase}} unit test stubs
-{{#if summary}}
- {{{summary}}} # noqa: E501
-{{/if}}
- """
- _configuration = configuration.Configuration()
-
- def setUp(self):
- used_api_client = api_client.ApiClient(configuration=self._configuration)
- self.api = {{httpMethod}}.ApiFor{{httpMethod}}(api_client=used_api_client) # noqa: E501
-
- def tearDown(self):
- pass
-
-{{#each responses}}
- {{#if @first}}
- response_status = {{code}}
-{{#if content}}
-{{#each content}}
-
-{{#if this.testCases}}
-{{#each testCases}}
-{{#with this }}
- def test_{{@key}}_{{#if valid}}passes{{else}}fails{{/if}}(self):
- # {{description}}
- accept_content_type = '{{{../@key}}}'
-
- with patch.object(urllib3.PoolManager, 'request') as mock_request:
- payload = (
-{{#with data}}
- {{> model_templates/payload_renderer endChar='' }}
-{{/with}}
- )
- mock_request.return_value = self.response(
- self.json_bytes(payload),
- status=self.response_status
- )
-{{#if valid}}
- {{> api_test_partial }}
-
- assert isinstance(api_response.response, urllib3.HTTPResponse)
- assert isinstance(api_response.body, {{httpMethod}}.{{schema.baseName}})
- deserialized_response_body = {{httpMethod}}.{{schema.baseName}}.from_openapi_data_oapg(
- payload,
- _configuration=self._configuration
- )
- assert api_response.body == deserialized_response_body
-{{else}}
- with self.assertRaises(({{packageName}}.ApiValueError, {{packageName}}.ApiTypeError)):
- self.api.{{httpMethod}}(
- accept_content_types=(accept_content_type,)
- )
- self.assert_pool_manager_request_called_with(
- mock_request,
- self._configuration.host + '{{{path}}}',
- method='{{httpMethod}}'.upper(),
- content_type=None,
- accept_content_type=accept_content_type,
- )
-{{/if}}
-{{/with}}
-
-{{/each}}
-
-{{/if}}
-{{/each}}
-{{else}}
- response_body = ''
-{{/if}}
-{{/if}}
-{{/each}}
-{{#if bodyParam}}
-{{#with bodyParam}}
-{{#if required}}
-{{#each content}}
-{{#if this.testCases}}
-
-{{#each testCases}}
-{{#with this }}
- def test_{{@key}}_{{#if valid}}passes{{else}}fails{{/if}}(self):
- content_type = '{{{../@key}}}'
- # {{description}}
- with patch.object(urllib3.PoolManager, 'request') as mock_request:
- payload = (
-{{#with data}}
- {{> model_templates/payload_renderer endChar='' }}
-{{/with}}
- )
-{{#if valid}}
- body = {{httpMethod}}.{{schema.baseName}}.from_openapi_data_oapg(
- payload,
- _configuration=self._configuration
- )
- mock_request.return_value = self.response(
- self.json_bytes(self.response_body),
- status=self.response_status
- )
- {{> api_test_partial }}
-
- assert isinstance(api_response.response, urllib3.HTTPResponse)
- assert isinstance(api_response.body, schemas.Unset)
-{{else}}
- with self.assertRaises(({{packageName}}.ApiValueError, {{packageName}}.ApiTypeError)):
- body = {{httpMethod}}.{{schema.baseName}}.from_openapi_data_oapg(
- payload,
- _configuration=self._configuration
- )
- self.api.{{httpMethod}}(body=body)
-{{/if}}
-{{/with}}
-
-{{/each}}
-
-{{/if}}
-{{/each}}
-{{/if}}
-{{/with}}
-{{else}}
- {{/if}}
-
-{{/with}}
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/api_test.mustache b/modules/openapi-generator/src/main/resources/python/api_test.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/api_test.mustache
rename to modules/openapi-generator/src/main/resources/python/api_test.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/api_test_partial.handlebars b/modules/openapi-generator/src/main/resources/python/api_test_partial.handlebars
deleted file mode 100644
index e129e34d85a..00000000000
--- a/modules/openapi-generator/src/main/resources/python/api_test_partial.handlebars
+++ /dev/null
@@ -1,21 +0,0 @@
-api_response = self.api.{{httpMethod}}(
-{{#if bodyParam}}
- body=body,
- content_type=content_type
-{{/if}}
-{{#if produces}}
- accept_content_types=(accept_content_type,)
-{{/if}}
-)
-self.assert_pool_manager_request_called_with(
- mock_request,
- self._configuration.host + '{{{path}}}',
- method='{{httpMethod}}'.upper(),
-{{#if bodyParam}}
- body=self.json_bytes(payload),
- content_type=content_type,
-{{/if}}
-{{#if produces}}
- accept_content_type=accept_content_type,
-{{/if}}
-)
diff --git a/modules/openapi-generator/src/main/resources/python/apis_path_module.handlebars b/modules/openapi-generator/src/main/resources/python/apis_path_module.handlebars
deleted file mode 100644
index 226894c62b2..00000000000
--- a/modules/openapi-generator/src/main/resources/python/apis_path_module.handlebars
+++ /dev/null
@@ -1,52 +0,0 @@
-{{#if pathItem.get}}
-from {{packageName}}.paths.{{pathModule}}.get import ApiForget
-{{/if}}
-{{#if pathItem.put}}
-from {{packageName}}.paths.{{pathModule}}.put import ApiForput
-{{/if}}
-{{#if pathItem.post}}
-from {{packageName}}.paths.{{pathModule}}.post import ApiForpost
-{{/if}}
-{{#if pathItem.delete}}
-from {{packageName}}.paths.{{pathModule}}.delete import ApiFordelete
-{{/if}}
-{{#if pathItem.options}}
-from {{packageName}}.paths.{{pathModule}}.options import ApiForoptions
-{{/if}}
-{{#if pathItem.head}}
-from {{packageName}}.paths.{{pathModule}}.head import ApiForhead
-{{/if}}
-{{#if pathItem.patch}}
-from {{packageName}}.paths.{{pathModule}}.patch import ApiForpatch
-{{/if}}
-{{#if pathItem.trace}}
-from {{packageName}}.paths.{{pathModule}}.trace import ApiFortrace
-{{/if}}
-
-
-class {{apiClassName}}(
-{{#if pathItem.get}}
- ApiForget,
-{{/if}}
-{{#if pathItem.put}}
- ApiForput,
-{{/if}}
-{{#if pathItem.post}}
- ApiForpost,
-{{/if}}
-{{#if pathItem.delete}}
- ApiFordelete,
-{{/if}}
-{{#if pathItem.options}}
- ApiForoptions,
-{{/if}}
-{{#if pathItem.head}}
- ApiForhead,
-{{/if}}
-{{#if pathItem.patch}}
- ApiForpatch,
-{{/if}}
-{{#if pathItem.trace}}
- ApiFortrace,
-{{/if}}):
- pass
diff --git a/modules/openapi-generator/src/main/resources/python/apis_path_to_api.handlebars b/modules/openapi-generator/src/main/resources/python/apis_path_to_api.handlebars
deleted file mode 100644
index a52df9cf152..00000000000
--- a/modules/openapi-generator/src/main/resources/python/apis_path_to_api.handlebars
+++ /dev/null
@@ -1,23 +0,0 @@
-import typing_extensions
-
-from {{packageName}}.paths import PathValues
-{{#each pathModuleToApiClassname}}
-from {{packageName}}.apis.paths.{{@key}} import {{this}}
-{{/each}}
-
-PathToApi = typing_extensions.TypedDict(
- 'PathToApi',
- {
-{{#each pathEnumToApiClassname}}
- PathValues.{{@key}}: {{this}},
-{{/each}}
- }
-)
-
-path_to_api = PathToApi(
- {
-{{#each pathEnumToApiClassname}}
- PathValues.{{@key}}: {{this}},
-{{/each}}
- }
-)
diff --git a/modules/openapi-generator/src/main/resources/python/apis_tag_to_api.handlebars b/modules/openapi-generator/src/main/resources/python/apis_tag_to_api.handlebars
deleted file mode 100644
index dacbc478aab..00000000000
--- a/modules/openapi-generator/src/main/resources/python/apis_tag_to_api.handlebars
+++ /dev/null
@@ -1,23 +0,0 @@
-import typing_extensions
-
-from {{packageName}}.apis.tags import TagValues
-{{#each tagModuleNameToApiClassname}}
-from {{packageName}}.apis.tags.{{@key}} import {{this}}
-{{/each}}
-
-TagToApi = typing_extensions.TypedDict(
- 'TagToApi',
- {
-{{#each tagEnumToApiClassname}}
- TagValues.{{@key}}: {{this}},
-{{/each}}
- }
-)
-
-tag_to_api = TagToApi(
- {
-{{#each tagEnumToApiClassname}}
- TagValues.{{@key}}: {{this}},
-{{/each}}
- }
-)
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/asyncio/rest.mustache b/modules/openapi-generator/src/main/resources/python/asyncio/rest.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/asyncio/rest.mustache
rename to modules/openapi-generator/src/main/resources/python/asyncio/rest.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/comma.handlebars b/modules/openapi-generator/src/main/resources/python/comma.handlebars
deleted file mode 100644
index 41622b47209..00000000000
--- a/modules/openapi-generator/src/main/resources/python/comma.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-,
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/common_README.mustache b/modules/openapi-generator/src/main/resources/python/common_README.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/common_README.mustache
rename to modules/openapi-generator/src/main/resources/python/common_README.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/configuration.handlebars b/modules/openapi-generator/src/main/resources/python/configuration.handlebars
deleted file mode 100644
index c0bfef37807..00000000000
--- a/modules/openapi-generator/src/main/resources/python/configuration.handlebars
+++ /dev/null
@@ -1,650 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-import copy
-import logging
-{{#unless asyncio}}
-import multiprocessing
-{{/unless}}
-import sys
-import urllib3
-
-from http import client as http_client
-from {{packageName}}.exceptions import ApiValueError
-
-
-JSON_SCHEMA_VALIDATION_KEYWORDS = {
- 'multipleOf', 'maximum', 'exclusiveMaximum',
- 'minimum', 'exclusiveMinimum', 'maxLength',
- 'minLength', 'pattern', 'maxItems', 'minItems',
- 'uniqueItems', 'maxProperties', 'minProperties',
-}
-
-class Configuration(object):
- """NOTE: This class is auto generated by OpenAPI Generator
-
- Ref: https://openapi-generator.tech
- Do not edit the class manually.
-
- :param host: Base url
- :param api_key: Dict to store API key(s).
- Each entry in the dict specifies an API key.
- The dict key is the name of the security scheme in the OAS specification.
- The dict value is the API key secret.
- :param api_key_prefix: Dict to store API prefix (e.g. Bearer)
- The dict key is the name of the security scheme in the OAS specification.
- The dict value is an API key prefix when generating the auth data.
- :param username: Username for HTTP basic authentication
- :param password: Password for HTTP basic authentication
- :param discard_unknown_keys: Boolean value indicating whether to discard
- unknown properties. A server may send a response that includes additional
- properties that are not known by the client in the following scenarios:
- 1. The OpenAPI document is incomplete, i.e. it does not match the server
- implementation.
- 2. The client was generated using an older version of the OpenAPI document
- and the server has been upgraded since then.
- If a schema in the OpenAPI document defines the additionalProperties attribute,
- then all undeclared properties received by the server are injected into the
- additional properties map. In that case, there are undeclared properties, and
- nothing to discard.
- :param disabled_client_side_validations (string): Comma-separated list of
- JSON schema validation keywords to disable JSON schema structural validation
- rules. The following keywords may be specified: multipleOf, maximum,
- exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
- maxItems, minItems.
- By default, the validation is performed for data generated locally by the client
- and data received from the server, independent of any validation performed by
- the server side. If the input data does not satisfy the JSON schema validation
- rules specified in the OpenAPI document, an exception is raised.
- If disabled_client_side_validations is set, structural validation is
- disabled. This can be useful to troubleshoot data validation problem, such as
- when the OpenAPI document validation rules do not match the actual API data
- received by the server.
-{{#if hasHttpSignatureMethods}}
- :param signing_info: Configuration parameters for the HTTP signature security scheme.
- Must be an instance of {{{packageName}}}.signing.HttpSigningConfiguration
-{{/if}}
- :param server_index: Index to servers configuration.
- :param server_variables: Mapping with string values to replace variables in
- templated server configuration. The validation of enums is performed for
- variables with defined enum values before.
- :param server_operation_index: Mapping from operation ID to an index to server
- configuration.
- :param server_operation_variables: Mapping from operation ID to a mapping with
- string values to replace variables in templated server configuration.
- The validation of enums is performed for variables with defined enum values before.
-
-{{#if hasAuthMethods}}
- :Example:
-{{#if hasApiKeyMethods}}
-
- API Key Authentication Example.
- Given the following security scheme in the OpenAPI specification:
- components:
- securitySchemes:
- cookieAuth: # name for the security scheme
- type: apiKey
- in: cookie
- name: JSESSIONID # cookie name
-
- You can programmatically set the cookie:
-
-conf = {{{packageName}}}.Configuration(
- api_key={'cookieAuth': 'abc123'}
- api_key_prefix={'cookieAuth': 'JSESSIONID'}
-)
-
- The following cookie will be added to the HTTP request:
- Cookie: JSESSIONID abc123
-{{/if}}
-{{#if hasHttpBasicMethods}}
-
- HTTP Basic Authentication Example.
- Given the following security scheme in the OpenAPI specification:
- components:
- securitySchemes:
- http_basic_auth:
- type: http
- scheme: basic
-
- Configure API client with HTTP basic authentication:
-
-conf = {{{packageName}}}.Configuration(
- username='the-user',
- password='the-password',
-)
-
-{{/if}}
-{{#if hasHttpSignatureMethods}}
-
- HTTP Signature Authentication Example.
- Given the following security scheme in the OpenAPI specification:
- components:
- securitySchemes:
- http_basic_auth:
- type: http
- scheme: signature
-
- Configure API client with HTTP signature authentication. Use the 'hs2019' signature scheme,
- sign the HTTP requests with the RSA-SSA-PSS signature algorithm, and set the expiration time
- of the signature to 5 minutes after the signature has been created.
- Note you can use the constants defined in the {{{packageName}}}.signing module, and you can
- also specify arbitrary HTTP headers to be included in the HTTP signature, except for the
- 'Authorization' header, which is used to carry the signature.
-
- One may be tempted to sign all headers by default, but in practice it rarely works.
- This is because explicit proxies, transparent proxies, TLS termination endpoints or
- load balancers may add/modify/remove headers. Include the HTTP headers that you know
- are not going to be modified in transit.
-
-conf = {{{packageName}}}.Configuration(
- signing_info = {{{packageName}}}.signing.HttpSigningConfiguration(
- key_id = 'my-key-id',
- private_key_path = 'rsa.pem',
- signing_scheme = {{{packageName}}}.signing.SCHEME_HS2019,
- signing_algorithm = {{{packageName}}}.signing.ALGORITHM_RSASSA_PSS,
- signed_headers = [{{{packageName}}}.signing.HEADER_REQUEST_TARGET,
- {{{packageName}}}.signing.HEADER_CREATED,
- {{{packageName}}}.signing.HEADER_EXPIRES,
- {{{packageName}}}.signing.HEADER_HOST,
- {{{packageName}}}.signing.HEADER_DATE,
- {{{packageName}}}.signing.HEADER_DIGEST,
- 'Content-Type',
- 'User-Agent'
- ],
- signature_max_validity = datetime.timedelta(minutes=5)
- )
-)
-{{/if}}
-{{/if}}
- """
-
- _default = None
-
- def __init__(
- self,
- host=None,
-{{#if hasApiKeyMethods}}
- api_key=None,
- api_key_prefix=None,
-{{/if}}
-{{#if hasHttpBasicMethods}}
- username=None,
- password=None,
-{{/if}}
- discard_unknown_keys=False,
- disabled_client_side_validations="",
-{{#if hasHttpSignatureMethods}}
- signing_info=None,
-{{/if}}
- server_index=None,
- server_variables=None,
- server_operation_index=None,
- server_operation_variables=None,
-{{#or hasOAuthMethods hasHttpBearerMethods}}
- access_token=None,
-{{/or}}
- ):
- """Constructor
- """
- self._base_path = "{{{basePath}}}" if host is None else host
- """Default Base url
- """
- self.server_index = 0 if server_index is None and host is None else server_index
- self.server_operation_index = server_operation_index or {}
- """Default server index
- """
- self.server_variables = server_variables or {}
- self.server_operation_variables = server_operation_variables or {}
- """Default server variables
- """
- self.temp_folder_path = None
- """Temp file folder for downloading files
- """
- # Authentication Settings
-{{#if hasApiKeyMethods}}
- self.api_key = {}
- if api_key:
- self.api_key = api_key
- """dict to store API key(s)
- """
- self.api_key_prefix = {}
- if api_key_prefix:
- self.api_key_prefix = api_key_prefix
- """dict to store API prefix (e.g. Bearer)
- """
- self.refresh_api_key_hook = None
- """function hook to refresh API key if expired
- """
-{{/if}}
-{{#if hasHttpBasicMethods}}
- self.username = username
- """Username for HTTP basic authentication
- """
- self.password = password
- """Password for HTTP basic authentication
- """
- self.discard_unknown_keys = discard_unknown_keys
-{{/if}}
- self.disabled_client_side_validations = disabled_client_side_validations
-{{#if hasHttpSignatureMethods}}
- if signing_info is not None:
- signing_info.host = host
- self.signing_info = signing_info
- """The HTTP signing configuration
- """
-{{/if}}
-{{#or hasOAuthMethods hasHttpBearerMethods}}
- self.access_token = None
- """access token for OAuth/Bearer
- """
-{{/or}}
- self.logger = {}
- """Logging Settings
- """
- self.logger["package_logger"] = logging.getLogger("{{packageName}}")
- self.logger["urllib3_logger"] = logging.getLogger("urllib3")
- self.logger_format = '%(asctime)s %(levelname)s %(message)s'
- """Log format
- """
- self.logger_stream_handler = None
- """Log stream handler
- """
- self.logger_file_handler = None
- """Log file handler
- """
- self.logger_file = None
- """Debug file location
- """
- self.debug = False
- """Debug switch
- """
-
- self.verify_ssl = True
- """SSL/TLS verification
- Set this to false to skip verifying SSL certificate when calling API
- from https server.
- """
- self.ssl_ca_cert = None
- """Set this to customize the certificate file to verify the peer.
- """
- self.cert_file = None
- """client certificate file
- """
- self.key_file = None
- """client key file
- """
- self.assert_hostname = None
- """Set this to True/False to enable/disable SSL hostname verification.
- """
- self.tls_server_name = None
- """SSL/TLS Server Name Indication (SNI)
- Set this to the SNI value expected by the server.
- """
-
- {{#if asyncio}}
- self.connection_pool_maxsize = 100
- """This value is passed to the aiohttp to limit simultaneous connections.
- Default values is 100, None means no-limit.
- """
- {{/if}}
- {{#unless asyncio}}
- self.connection_pool_maxsize = multiprocessing.cpu_count() * 5
- """urllib3 connection pool's maximum number of connections saved
- per pool. urllib3 uses 1 connection as default value, but this is
- not the best value when you are making a lot of possibly parallel
- requests to the same host, which is often the case here.
- cpu_count * 5 is used as default value to increase performance.
- """
- {{/unless}}
-
- self.proxy = None
- """Proxy URL
- """
- self.proxy_headers = None
- """Proxy headers
- """
- self.safe_chars_for_path_param = ''
- """Safe chars for path_param
- """
- self.retries = None
- """Adding retries to override urllib3 default value 3
- """
- # Enable client side validation
- self.client_side_validation = True
-
- # Options to pass down to the underlying urllib3 socket
- self.socket_options = None
-
- def __deepcopy__(self, memo):
- cls = self.__class__
- result = cls.__new__(cls)
- memo[id(self)] = result
- for k, v in self.__dict__.items():
- if k not in ('logger', 'logger_file_handler'):
- setattr(result, k, copy.deepcopy(v, memo))
- # shallow copy of loggers
- result.logger = copy.copy(self.logger)
- # use setters to configure loggers
- result.logger_file = self.logger_file
- result.debug = self.debug
- return result
-
- def __setattr__(self, name, value):
- object.__setattr__(self, name, value)
- if name == 'disabled_client_side_validations':
- s = set(filter(None, value.split(',')))
- for v in s:
- if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
- raise ApiValueError(
- "Invalid keyword: '{0}''".format(v))
- self._disabled_client_side_validations = s
-{{#if hasHttpSignatureMethods}}
- if name == "signing_info" and value is not None:
- # Ensure the host parameter from signing info is the same as
- # Configuration.host.
- value.host = self.host
-{{/if}}
-
- @classmethod
- def set_default(cls, default):
- """Set default instance of configuration.
-
- It stores default configuration, which can be
- returned by get_default_copy method.
-
- :param default: object of Configuration
- """
- cls._default = copy.deepcopy(default)
-
- @classmethod
- def get_default_copy(cls):
- """Return new instance of configuration.
-
- This method returns newly created, based on default constructor,
- object of Configuration class or returns a copy of default
- configuration passed by the set_default method.
-
- :return: The configuration object.
- """
- if cls._default is not None:
- return copy.deepcopy(cls._default)
- return Configuration()
-
- @property
- def logger_file(self):
- """The logger file.
-
- If the logger_file is None, then add stream handler and remove file
- handler. Otherwise, add file handler and remove stream handler.
-
- :param value: The logger_file path.
- :type: str
- """
- return self.__logger_file
-
- @logger_file.setter
- def logger_file(self, value):
- """The logger file.
-
- If the logger_file is None, then add stream handler and remove file
- handler. Otherwise, add file handler and remove stream handler.
-
- :param value: The logger_file path.
- :type: str
- """
- self.__logger_file = value
- if self.__logger_file:
- # If set logging file,
- # then add file handler and remove stream handler.
- self.logger_file_handler = logging.FileHandler(self.__logger_file)
- self.logger_file_handler.setFormatter(self.logger_formatter)
- for _, logger in self.logger.items():
- logger.addHandler(self.logger_file_handler)
-
- @property
- def debug(self):
- """Debug status
-
- :param value: The debug status, True or False.
- :type: bool
- """
- return self.__debug
-
- @debug.setter
- def debug(self, value):
- """Debug status
-
- :param value: The debug status, True or False.
- :type: bool
- """
- self.__debug = value
- if self.__debug:
- # if debug status is True, turn on debug logging
- for _, logger in self.logger.items():
- logger.setLevel(logging.DEBUG)
- # turn on http_client debug
- http_client.HTTPConnection.debuglevel = 1
- else:
- # if debug status is False, turn off debug logging,
- # setting log level to default `logging.WARNING`
- for _, logger in self.logger.items():
- logger.setLevel(logging.WARNING)
- # turn off http_client debug
- http_client.HTTPConnection.debuglevel = 0
-
- @property
- def logger_format(self):
- """The logger format.
-
- The logger_formatter will be updated when sets logger_format.
-
- :param value: The format string.
- :type: str
- """
- return self.__logger_format
-
- @logger_format.setter
- def logger_format(self, value):
- """The logger format.
-
- The logger_formatter will be updated when sets logger_format.
-
- :param value: The format string.
- :type: str
- """
- self.__logger_format = value
- self.logger_formatter = logging.Formatter(self.__logger_format)
-
- def get_api_key_with_prefix(self, identifier, alias=None):
- """Gets API key (with prefix if set).
-
- :param identifier: The identifier of apiKey.
- :param alias: The alternative identifier of apiKey.
- :return: The token for api key authentication.
- """
- if self.refresh_api_key_hook is not None:
- self.refresh_api_key_hook(self)
- key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
- if key:
- prefix = self.api_key_prefix.get(identifier)
- if prefix:
- return "%s %s" % (prefix, key)
- else:
- return key
-
- def get_basic_auth_token(self):
- """Gets HTTP basic authentication header (string).
-
- :return: The token for basic HTTP authentication.
- """
- username = ""
- if self.username is not None:
- username = self.username
- password = ""
- if self.password is not None:
- password = self.password
- return urllib3.util.make_headers(
- basic_auth=username + ':' + password
- ).get('authorization')
-
- def auth_settings(self):
- """Gets Auth Settings dict for api client.
-
- :return: The Auth Settings information dict.
- """
- auth = {}
-{{#each authMethods}}
-{{#if isApiKey}}
- if '{{name}}' in self.api_key{{#each vendorExtensions.x-auth-id-alias}} or '{{.}}' in self.api_key{{/each}}:
- auth['{{name}}'] = {
- 'type': 'api_key',
- 'in': {{#if isKeyInCookie}}'cookie'{{/if}}{{#if isKeyInHeader}}'header'{{/if}}{{#if isKeyInQuery}}'query'{{/if}},
- 'key': '{{keyParamName}}',
- 'value': self.get_api_key_with_prefix(
- '{{name}}',{{#each vendorExtensions.x-auth-id-alias}}
- alias='{{.}}',{{/each}}
- ),
- }
-{{/if}}
-{{#if isBasic}}
- {{#if isBasicBasic}}
- if self.username is not None and self.password is not None:
- auth['{{name}}'] = {
- 'type': 'basic',
- 'in': 'header',
- 'key': 'Authorization',
- 'value': self.get_basic_auth_token()
- }
- {{/if}}
- {{#if isBasicBearer}}
- if self.access_token is not None:
- auth['{{name}}'] = {
- 'type': 'bearer',
- 'in': 'header',
- {{#if bearerFormat}}
- 'format': '{{{bearerFormat}}}',
- {{/if}}
- 'key': 'Authorization',
- 'value': 'Bearer ' + self.access_token
- }
- {{/if}}
- {{#if isHttpSignature}}
- if self.signing_info is not None:
- auth['{{name}}'] = {
- 'type': 'http-signature',
- 'in': 'header',
- 'key': 'Authorization',
- 'value': None # Signature headers are calculated for every HTTP request
- }
- {{/if}}
-{{/if}}
-{{#if isOAuth}}
- if self.access_token is not None:
- auth['{{name}}'] = {
- 'type': 'oauth2',
- 'in': 'header',
- 'key': 'Authorization',
- 'value': 'Bearer ' + self.access_token
- }
-{{/if}}
-{{/each}}
- return auth
-
- def to_debug_report(self):
- """Gets the essential information for debugging.
-
- :return: The report for debugging.
- """
- return "Python SDK Debug Report:\n"\
- "OS: {env}\n"\
- "Python Version: {pyversion}\n"\
- "Version of the API: {{version}}\n"\
- "SDK Package Version: {{packageVersion}}".\
- format(env=sys.platform, pyversion=sys.version)
-
- def get_host_settings(self):
- """Gets an array of host settings
-
- :return: An array of host settings
- """
- return [
- {{#each servers}}
- {
- 'url': "{{{url}}}",
- 'description': "{{#unless description}}No description provided{{else}}{{{description}}}{{/unless}}",
- {{#each variables}}
- {{#if @first}}
- 'variables': {
- {{/if}}
- '{{{name}}}': {
- 'description': "{{#unless description}}No description provided{{else}}{{{description}}}{{/unless}}",
- 'default_value': "{{{defaultValue}}}",
- {{#each enumValues}}
- {{#if @first}}
- 'enum_values': [
- {{/if}}
- "{{{.}}}"{{#unless @last}},{{/unless}}
- {{#if @last}}
- ]
- {{/if}}
- {{/each}}
- }{{#unless @last}},{{/unless}}
- {{#if @last}}
- }
- {{/if}}
- {{/each}}
- }{{#unless @last}},{{/unless}}
- {{/each}}
- ]
-
- def get_host_from_settings(self, index, variables=None, servers=None):
- """Gets host URL based on the index and variables
- :param index: array index of the host settings
- :param variables: hash of variable and the corresponding value
- :param servers: an array of host settings or None
- :return: URL based on host settings
- """
- if index is None:
- return self._base_path
-
- variables = {} if variables is None else variables
- servers = self.get_host_settings() if servers is None else servers
-
- try:
- server = servers[index]
- except IndexError:
- raise ValueError(
- "Invalid index {0} when selecting the host settings. "
- "Must be less than {1}".format(index, len(servers)))
-
- url = server['url']
-
- # go through variables and replace placeholders
- for variable_name, variable in server.get('variables', {}).items():
- used_value = variables.get(
- variable_name, variable['default_value'])
-
- if 'enum_values' in variable \
- and used_value not in variable['enum_values']:
- raise ValueError(
- "The variable `{0}` in the host URL has invalid value "
- "{1}. Must be {2}.".format(
- variable_name, variables[variable_name],
- variable['enum_values']))
-
- url = url.replace("{" + variable_name + "}", used_value)
-
- return url
-
- @property
- def host(self):
- """Return generated host."""
- return self.get_host_from_settings(self.server_index, variables=self.server_variables)
-
- @host.setter
- def host(self, value):
- """Fix base path."""
- self._base_path = value
- self.server_index = None
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/configuration.mustache b/modules/openapi-generator/src/main/resources/python/configuration.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/configuration.mustache
rename to modules/openapi-generator/src/main/resources/python/configuration.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/doc_auth_partial.handlebars b/modules/openapi-generator/src/main/resources/python/doc_auth_partial.handlebars
deleted file mode 100644
index f5d61321c35..00000000000
--- a/modules/openapi-generator/src/main/resources/python/doc_auth_partial.handlebars
+++ /dev/null
@@ -1,109 +0,0 @@
-# Defining the host is optional and defaults to {{{basePath}}}
-# See configuration.py for a list of all supported configuration parameters.
-configuration = {{{packageName}}}.Configuration(
- host = "{{{basePath}}}"
-)
-
-{{#if hasAuthMethods}}
-# The client must configure the authentication and authorization parameters
-# in accordance with the API server security policy.
-# Examples for each auth method are provided below, use the example that
-# satisfies your auth use case.
-{{#each authMethods}}
-{{#if isBasic}}
-{{#if isBasicBasic}}
-
-# Configure HTTP basic authorization: {{{name}}}
-configuration = {{{packageName}}}.Configuration(
- username = 'YOUR_USERNAME',
- password = 'YOUR_PASSWORD'
-)
-{{/if}}
-{{#if isBasicBearer}}
-
-# Configure Bearer authorization{{#if bearerFormat}} ({{{bearerFormat}}}){{/if}}: {{{name}}}
-configuration = {{{packageName}}}.Configuration(
- access_token = 'YOUR_BEARER_TOKEN'
-)
-{{/if}}
-{{#if isHttpSignature}}
-
-# Configure HTTP message signature: {{{name}}}
-# The HTTP Signature Header mechanism that can be used by a client to
-# authenticate the sender of a message and ensure that particular headers
-# have not been modified in transit.
-#
-# You can specify the signing key-id, private key path, signing scheme,
-# signing algorithm, list of signed headers and signature max validity.
-# The 'key_id' parameter is an opaque string that the API server can use
-# to lookup the client and validate the signature.
-# The 'private_key_path' parameter should be the path to a file that
-# contains a DER or base-64 encoded private key.
-# The 'private_key_passphrase' parameter is optional. Set the passphrase
-# if the private key is encrypted.
-# The 'signed_headers' parameter is used to specify the list of
-# HTTP headers included when generating the signature for the message.
-# You can specify HTTP headers that you want to protect with a cryptographic
-# signature. Note that proxies may add, modify or remove HTTP headers
-# for legitimate reasons, so you should only add headers that you know
-# will not be modified. For example, if you want to protect the HTTP request
-# body, you can specify the Digest header. In that case, the client calculates
-# the digest of the HTTP request body and includes the digest in the message
-# signature.
-# The 'signature_max_validity' parameter is optional. It is configured as a
-# duration to express when the signature ceases to be valid. The client calculates
-# the expiration date every time it generates the cryptographic signature
-# of an HTTP request. The API server may have its own security policy
-# that controls the maximum validity of the signature. The client max validity
-# must be lower than the server max validity.
-# The time on the client and server must be synchronized, otherwise the
-# server may reject the client signature.
-#
-# The client must use a combination of private key, signing scheme,
-# signing algorithm and hash algorithm that matches the security policy of
-# the API server.
-#
-# See {{{packageName}}}.signing for a list of all supported parameters.
-configuration = {{{packageName}}}.Configuration(
- host = "{{{basePath}}}",
- signing_info = {{{packageName}}}.signing.HttpSigningConfiguration(
- key_id = 'my-key-id',
- private_key_path = 'private_key.pem',
- private_key_passphrase = 'YOUR_PASSPHRASE',
- signing_scheme = {{{packageName}}}.signing.SCHEME_HS2019,
- signing_algorithm = {{{packageName}}}.signing.ALGORITHM_ECDSA_MODE_FIPS_186_3,
- hash_algorithm = {{{packageName}}}.signing.SCHEME_RSA_SHA256,
- signed_headers = [
- {{{packageName}}}.signing.HEADER_REQUEST_TARGET,
- {{{packageName}}}.signing.HEADER_CREATED,
- {{{packageName}}}.signing.HEADER_EXPIRES,
- {{{packageName}}}.signing.HEADER_HOST,
- {{{packageName}}}.signing.HEADER_DATE,
- {{{packageName}}}.signing.HEADER_DIGEST,
- 'Content-Type',
- 'Content-Length',
- 'User-Agent'
- ],
- signature_max_validity = datetime.timedelta(minutes=5)
- )
-)
-{{/if}}
-{{/if}}
-{{#if isApiKey}}
-
-# Configure API key authorization: {{{name}}}
-configuration.api_key['{{{name}}}'] = 'YOUR_API_KEY'
-
-# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
-# configuration.api_key_prefix['{{name}}'] = 'Bearer'
-{{/if}}
-{{#if isOAuth}}
-
-# Configure OAuth2 access token for authorization: {{{name}}}
-configuration = {{{packageName}}}.Configuration(
- host = "{{{basePath}}}",
- access_token = 'YOUR_ACCESS_TOKEN'
-)
-{{/if}}
-{{/each}}
-{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint.handlebars
deleted file mode 100644
index 2ddc2e3042b..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint.handlebars
+++ /dev/null
@@ -1,467 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-from dataclasses import dataclass
-import typing_extensions
-import urllib3
-{{#with operation}}
-{{#or headerParams bodyParam produces}}
-from urllib3._collections import HTTPHeaderDict
-{{/or}}
-{{/with}}
-
-from {{packageName}} import api_client, exceptions
-{{> model_templates/imports_schema_types }}
-{{> model_templates/imports_schemas }}
-
-{{#unless isStub}}
-from . import path
-
-{{/unless}}
-{{#with operation}}
-{{#if queryParams}}
-{{> endpoint_parameter_schema_and_def xParams=queryParams xParamsName="Query" }}
-{{/if}}
-{{#if headerParams}}
-{{> endpoint_parameter_schema_and_def xParams=headerParams xParamsName="Header" }}
-{{/if}}
-{{#if pathParams}}
-{{> endpoint_parameter_schema_and_def xParams=pathParams xParamsName="Path" }}
-{{/if}}
-{{#if cookieParams}}
-{{> endpoint_parameter_schema_and_def xParams=cookieParams xParamsName="Cookie" }}
-{{/if}}
-{{#with bodyParam}}
-# body param
-{{#each content}}
-{{#with this.schema}}
-{{> model_templates/schema }}
-{{/with}}
-{{/each}}
-
-
-request_body_{{paramName}} = api_client.RequestBody(
- content={
-{{#each content}}
- '{{{@key}}}': api_client.MediaType({{#if this.schema}}
- schema={{this.schema.baseName}}{{/if}}),
-{{/each}}
- },
-{{#if required}}
- required=True,
-{{/if}}
-)
-{{/with}}
-{{#unless isStub}}
-{{#each authMethods}}
-{{#if @first}}
-_auth = [
-{{/if}}
- '{{name}}',
-{{#if @last}}
-]
-{{/if}}
-{{/each}}
-{{#each servers}}
-{{#if @first}}
-_servers = (
-{{/if}}
- {
- 'url': "{{{url}}}",
- 'description': "{{#unless description}}No description provided{{else}}{{{description}}}{{/unless}}",
- {{#each variables}}
- {{#if @first}}
- 'variables': {
- {{/if}}
- '{{{name}}}': {
- 'description': "{{#unless description}}No description provided{{else}}{{{description}}}{{/unless}}",
- 'default_value': "{{{defaultValue}}}",
- {{#each enumValues}}
- {{#if @first}}
- 'enum_values': [
- {{/if}}
- "{{{.}}}"{{#unless @last}},{{/unless}}
- {{#if @last}}
- ]
- {{/if}}
- {{/each}}
- }{{#unless @last}},{{/unless}}
- {{#if @last}}
- }
- {{/if}}
- {{/each}}
- },
-{{#if @last}}
-)
-{{/if}}
-{{/each}}
-{{/unless}}
-{{#each responses}}
-{{#each responseHeaders}}
-{{#with schema}}
-{{> model_templates/schema }}
-{{/with}}
-{{#unless isStub}}
-{{paramName}}_parameter = api_client.HeaderParameter(
- name="{{baseName}}",
-{{#if style}}
- style=api_client.ParameterStyle.{{style}},
-{{/if}}
-{{#if schema}}
-{{#with schema}}
- schema={{baseName}},
-{{/with}}
-{{/if}}
-{{#if required}}
- required=True,
-{{/if}}
-{{#if isExplode}}
- explode=True,
-{{/if}}
-)
-{{/unless}}
-{{/each}}
-{{#each content}}
-{{#with this.schema}}
-{{> model_templates/schema }}
-{{/with}}
-{{/each}}
-{{#if responseHeaders}}
-ResponseHeadersFor{{code}} = typing_extensions.TypedDict(
- 'ResponseHeadersFor{{code}}',
- {
-{{#each responseHeaders}}
- '{{baseName}}': {{#with schema}}{{baseName}},{{/with}}
-{{/each}}
- }
-)
-{{/if}}
-
-
-@dataclass
-{{#if isDefault}}
-class ApiResponseForDefault(api_client.ApiResponse):
-{{else}}
-class ApiResponseFor{{code}}(api_client.ApiResponse):
-{{/if}}
- response: urllib3.HTTPResponse
-{{#and responseHeaders content}}
- body: typing.Union[
-{{#each content}}
-{{#if this.schema}}
- {{this.schema.baseName}},
-{{else}}
- schemas.Unset,
-{{/if}}
-{{/each}}
- ]
- headers: ResponseHeadersFor{{code}}
-{{else}}
-{{#or responseHeaders content}}
-{{#if responseHeaders}}
- headers: ResponseHeadersFor{{code}}
- body: schemas.Unset = schemas.unset
-{{else}}
- body: typing.Union[
-{{#each content}}
-{{#if this.schema}}
- {{this.schema.baseName}},
-{{else}}
- schemas.Unset,
-{{/if}}
-{{/each}}
- ]
- headers: schemas.Unset = schemas.unset
-{{/if}}
-{{/or}}
-{{/and}}
-{{#unless responseHeaders}}
-{{#unless content}}
- body: schemas.Unset = schemas.unset
- headers: schemas.Unset = schemas.unset
-{{/unless}}
-{{/unless}}
-
-
-{{#if isDefault}}
-_response_for_default = api_client.OpenApiResponse(
- response_cls=ApiResponseForDefault,
-{{else}}
-_response_for_{{code}} = api_client.OpenApiResponse(
- response_cls=ApiResponseFor{{code}},
-{{/if}}
-{{#each content}}
-{{#if @first}}
- content={
-{{/if}}
- '{{{@key}}}': api_client.MediaType({{#if this.schema}}
- schema={{this.schema.baseName}}{{/if}}),
-{{#if @last}}
- },
-{{/if}}
-{{/each}}
-{{#if responseHeaders}}
- headers=[
-{{#each responseHeaders}}
- {{paramName}}_parameter,
-{{/each}}
- ]
-{{/if}}
-)
-{{/each}}
-{{#unless isStub}}
-_status_code_to_response = {
-{{#each responses}}
-{{#if isDefault}}
- 'default': _response_for_default,
-{{else}}
- '{{code}}': _response_for_{{code}},
-{{/if}}
-{{/each}}
-}
-{{/unless}}
-{{#each produces}}
-{{#if @first}}
-_all_accept_content_types = (
-{{/if}}
- '{{{this.mediaType}}}',
-{{#if @last}}
-)
-{{/if}}
-{{/each}}
-
-
-class BaseApi(api_client.Api):
-{{#if bodyParam}}
- {{#each contentTypeToOperation}}
- {{> endpoint_args_baseapi_wrapper contentType=@key this=this}}
-
- {{/each}}
- {{> endpoint_args_baseapi_wrapper contentType="null" this=this}}
-
-{{else}}
- @typing.overload
- def _{{operationId}}_oapg(
- {{> endpoint_args isOverload=true skipDeserialization="False" contentType="null"}}
-{{/if}}
-
- @typing.overload
- def _{{operationId}}_oapg(
- {{> endpoint_args isOverload=true skipDeserialization="True" contentType="null"}}
-
- @typing.overload
- def _{{operationId}}_oapg(
- {{> endpoint_args isOverload=true skipDeserialization="null" contentType="null"}}
-
- def _{{operationId}}_oapg(
- {{> endpoint_args isOverload=false skipDeserialization="null" contentType="null"}}
- """
- {{#if summary}}
- {{summary}}
- {{/if}}
- :param skip_deserialization: If true then api_response.response will be set but
- api_response.body and api_response.headers will not be deserialized into schema
- class instances
- """
- {{#if queryParams}}
- self._verify_typed_dict_inputs_oapg(RequestQueryParams, query_params)
- {{/if}}
- {{#if headerParams}}
- self._verify_typed_dict_inputs_oapg(RequestHeaderParams, header_params)
- {{/if}}
- {{#if pathParams}}
- self._verify_typed_dict_inputs_oapg(RequestPathParams, path_params)
- {{/if}}
- {{#if cookieParams}}
- self._verify_typed_dict_inputs_oapg(RequestCookieParams, cookie_params)
- {{/if}}
- used_path = path.value
- {{#if pathParams}}
-
- _path_params = {}
- for parameter in (
- {{#each pathParams}}
- request_path_{{paramName}},
- {{/each}}
- ):
- parameter_data = path_params.get(parameter.name, schemas.unset)
- if parameter_data is schemas.unset:
- continue
- serialized_data = parameter.serialize(parameter_data)
- _path_params.update(serialized_data)
-
- for k, v in _path_params.items():
- used_path = used_path.replace('{%s}' % k, v)
- {{/if}}
- {{#if queryParams}}
-
- prefix_separator_iterator = None
- for parameter in (
- {{#each queryParams}}
- request_query_{{paramName}},
- {{/each}}
- ):
- parameter_data = query_params.get(parameter.name, schemas.unset)
- if parameter_data is schemas.unset:
- continue
- if prefix_separator_iterator is None:
- prefix_separator_iterator = parameter.get_prefix_separator_iterator()
- serialized_data = parameter.serialize(parameter_data, prefix_separator_iterator)
- for serialized_value in serialized_data.values():
- used_path += serialized_value
- {{/if}}
- {{#or headerParams bodyParam produces}}
-
- _headers = HTTPHeaderDict()
- {{else}}
- {{/or}}
- {{#if headerParams}}
- for parameter in (
- {{#each headerParams}}
- request_header_{{paramName}},
- {{/each}}
- ):
- parameter_data = header_params.get(parameter.name, schemas.unset)
- if parameter_data is schemas.unset:
- continue
- serialized_data = parameter.serialize(parameter_data)
- _headers.extend(serialized_data)
- {{/if}}
- # TODO add cookie handling
- {{#if produces}}
- if accept_content_types:
- for accept_content_type in accept_content_types:
- _headers.add('Accept', accept_content_type)
- {{/if}}
- {{#with bodyParam}}
-
- {{#if required}}
- if body is schemas.unset:
- raise exceptions.ApiValueError(
- 'The required body parameter has an invalid value of: unset. Set a valid value instead')
- {{/if}}
- _fields = None
- _body = None
- {{#if required}}
- {{> endpoint_body_serialization }}
- {{else}}
- if body is not schemas.unset:
- {{> endpoint_body_serialization }}
- {{/if}}
- {{/with}}
- {{#if servers}}
-
- host = self._get_host_oapg('{{operationId}}', _servers, host_index)
- {{/if}}
-
- response = self.api_client.call_api(
- resource_path=used_path,
- method='{{httpMethod}}'.upper(),
- {{#or headerParams bodyParam produces}}
- headers=_headers,
- {{/or}}
- {{#if bodyParam}}
- fields=_fields,
- body=_body,
- {{/if}}
- {{#if hasAuthMethods}}
- auth_settings=_auth,
- {{/if}}
- {{#if servers}}
- host=host,
- {{/if}}
- stream=stream,
- timeout=timeout,
- )
-
- if skip_deserialization:
- api_response = api_client.ApiResponseWithoutDeserialization(response=response)
- else:
- response_for_status = _status_code_to_response.get(str(response.status))
- if response_for_status:
- api_response = response_for_status.deserialize(response, self.api_client.configuration)
- else:
- {{#if hasDefaultResponse}}
- default_response = _status_code_to_response.get('default')
- if default_response:
- api_response = default_response.deserialize(response, self.api_client.configuration)
- else:
- api_response = api_client.ApiResponseWithoutDeserialization(response=response)
- {{else}}
- api_response = api_client.ApiResponseWithoutDeserialization(response=response)
- {{/if}}
-
- if not 200 <= response.status <= 299:
- raise exceptions.ApiException(
- status=response.status,
- reason=response.reason,
- api_response=api_response
- )
-
- return api_response
-
-
-class {{operationIdCamelCase}}(BaseApi):
- # this class is used by api classes that refer to endpoints with operationId fn names
-
-{{#if bodyParam}}
- {{#each contentTypeToOperation}}
- {{> endpoint_args_operationid_wrapper contentType=@key this=this}}
-
- {{/each}}
- {{> endpoint_args_operationid_wrapper contentType="null" this=this}}
-
-{{else}}
- @typing.overload
- def {{operationId}}(
- {{> endpoint_args isOverload=true skipDeserialization="False" contentType="null"}}
-{{/if}}
-
- @typing.overload
- def {{operationId}}(
- {{> endpoint_args isOverload=true skipDeserialization="True" contentType="null"}}
-
- @typing.overload
- def {{operationId}}(
- {{> endpoint_args isOverload=true skipDeserialization="null" contentType="null"}}
-
- def {{operationId}}(
- {{> endpoint_args isOverload=false skipDeserialization="null" contentType="null"}}
- return self._{{operationId}}_oapg(
- {{> endpoint_args_passed }}
- )
-
-
-class ApiFor{{httpMethod}}(BaseApi):
- # this class is used by api classes that refer to endpoints by path and http method names
-
-{{#if bodyParam}}
- {{#each contentTypeToOperation}}
- {{> endpoint_args_httpmethod_wrapper contentType=@key this=this}}
-
- {{/each}}
- {{> endpoint_args_httpmethod_wrapper contentType="null" this=this}}
-
-{{else}}
- @typing.overload
- def {{httpMethod}}(
- {{> endpoint_args isOverload=true skipDeserialization="False" contentType="null"}}
-{{/if}}
-
- @typing.overload
- def {{httpMethod}}(
- {{> endpoint_args isOverload=true skipDeserialization="True" contentType="null"}}
-
- @typing.overload
- def {{httpMethod}}(
- {{> endpoint_args isOverload=true skipDeserialization="null" contentType="null"}}
-
- def {{httpMethod}}(
- {{> endpoint_args isOverload=false skipDeserialization="null" contentType="null"}}
- return self._{{operationId}}_oapg(
- {{> endpoint_args_passed }}
- )
-
-
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_args.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_args.handlebars
deleted file mode 100644
index 1eceaf34ad3..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_args.handlebars
+++ /dev/null
@@ -1,147 +0,0 @@
- self,
-{{#if bodyParam}}
- {{#if bodyParam.required}}
- {{#with bodyParam}}
- {{#eq ../contentType "null"}}
- body: typing.Union[{{#each getContent}}{{#with this.schema}}{{baseName}},{{> model_templates/schema_python_types }}{{/with}}{{/each}}],
- {{else}}
- body: typing.Union[{{#each getContent}}{{#eq @key ../../contentType }}{{#with this.schema}}{{baseName}},{{> model_templates/schema_python_types }}{{/with}}{{/eq}}{{/each}}],
- {{/eq}}
- {{/with}}
- {{#if isOverload}}
- {{#eq skipDeserialization "True"}}
- skip_deserialization: typing_extensions.Literal[True],
- {{/eq}}
- {{#neq contentType "null"}}
- {{#with bodyParam}}
- {{#each content}}
- {{#eq @key ../../contentType}}
- {{#if @first}}
- content_type: typing_extensions.Literal["{{{@key}}}"] = ...,
- {{else}}
- content_type: typing_extensions.Literal["{{{@key}}}"],
- {{/if}}
- {{/eq}}
- {{/each}}
- {{/with}}
- {{else}}
- content_type: str = ...,
- {{/neq}}
- {{else}}
- {{#with bodyParam}}
- {{#each getContent}}
- {{#if @first}}
- content_type: str = '{{{@key}}}',
- {{/if}}
- {{/each}}
- {{/with}}
- {{/if}}
- {{else}}
- {{#if isOverload}}
- {{#eq skipDeserialization "True"}}
- skip_deserialization: typing_extensions.Literal[True],
- {{/eq}}
- {{#neq contentType "null"}}
- {{#with bodyParam}}
- {{#each getContent}}
- {{#eq @key ../../contentType}}
- {{#if @first}}
- content_type: typing_extensions.Literal["{{{@key}}}"] = ...,
- {{else}}
- content_type: typing_extensions.Literal["{{{@key}}}"],
- {{/if}}
- {{/eq}}
- {{/each}}
- {{/with}}
- {{else}}
- content_type: str = ...,
- {{/neq}}
- {{else}}
- {{#with bodyParam}}
- {{#each getContent}}
- {{#if @first}}
- content_type: str = '{{{@key}}}',
- {{/if}}
- {{/each}}
- {{/with}}
- {{/if}}
- {{#with bodyParam}}
- {{#eq ../contentType "null"}}
- body: typing.Union[{{#each getContent}}{{#with this.schema}}{{baseName}}, {{> model_templates/schema_python_types }}{{/with}}{{/each}}schemas.Unset] = schemas.unset,
- {{else}}
- body: typing.Union[{{#each getContent}}{{#eq @key ../../contentType }}{{#with this.schema}}{{baseName}}, {{> model_templates/schema_python_types }}{{/with}}{{/eq}}{{/each}}schemas.Unset] = schemas.unset,
- {{/eq}}
- {{/with}}
- {{/if}}
-{{else}}
- {{#if isOverload}}
- {{#eq skipDeserialization "True"}}
- skip_deserialization: typing_extensions.Literal[True],
- {{/eq}}
- {{/if}}
-{{/if}}
-{{#if queryParams}}
- query_params: RequestQueryParams = frozendict.frozendict(),
-{{/if}}
-{{#if headerParams}}
- header_params: RequestHeaderParams = frozendict.frozendict(),
-{{/if}}
-{{#if pathParams}}
- path_params: RequestPathParams = frozendict.frozendict(),
-{{/if}}
-{{#if cookieParams}}
- cookie_params: RequestCookieParams = frozendict.frozendict(),
-{{/if}}
-{{#if produces}}
- accept_content_types: typing.Tuple[str] = _all_accept_content_types,
-{{/if}}
-{{#if servers}}
- host_index: typing.Optional[int] = None,
-{{/if}}
- stream: bool = False,
- timeout: typing.Optional[typing.Union[int, typing.Tuple]] = None,
- {{#if isOverload}}
- {{#eq skipDeserialization "False"}}
- skip_deserialization: typing_extensions.Literal[False] = ...,
- {{/eq}}
- {{#eq skipDeserialization "null"}}
- skip_deserialization: bool = ...,
- {{/eq}}
- {{else}}
- skip_deserialization: bool = False,
- {{/if}}
-{{#eq skipDeserialization "True"}}
-) -> api_client.ApiResponseWithoutDeserialization: ...
-{{/eq}}
-{{#eq skipDeserialization "False"}}
-) -> {{#if getAllResponsesAreErrors}}api_client.ApiResponseWithoutDeserialization: ...{{else}}typing.Union[
- {{#each responses}}
- {{#if isDefault}}
- ApiResponseForDefault,
- {{else}}
- {{#if is2xx}}
- ApiResponseFor{{code}},
- {{/if}}
- {{/if}}
- {{/each}}
-]: ...
- {{/if}}
-{{/eq}}
-{{#eq skipDeserialization "null"}}
-{{#if isOverload}}
-) -> typing.Union[
- {{#each responses}}
- {{#if isDefault}}
- ApiResponseForDefault,
- {{else}}
- {{#if is2xx}}
- ApiResponseFor{{code}},
- {{/if}}
- {{/if}}
- {{/each}}
- api_client.ApiResponseWithoutDeserialization,
-]: ...
-{{else}}
-):
-{{/if}}
-{{/eq}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_args_baseapi_wrapper.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_args_baseapi_wrapper.handlebars
deleted file mode 100644
index cd73d02e9c8..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_args_baseapi_wrapper.handlebars
+++ /dev/null
@@ -1,5 +0,0 @@
-@typing.overload
-{{#with this}}
-def _{{operationId}}_oapg(
-{{> endpoint_args isOverload=true skipDeserialization="False" contentType=contentType}}
-{{/with}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_args_httpmethod_wrapper.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_args_httpmethod_wrapper.handlebars
deleted file mode 100644
index f28bd735a54..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_args_httpmethod_wrapper.handlebars
+++ /dev/null
@@ -1,5 +0,0 @@
-@typing.overload
-{{#with this}}
-def {{httpMethod}}(
-{{> endpoint_args isOverload=true skipDeserialization="False" contentType=contentType}}
-{{/with}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_args_operationid_wrapper.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_args_operationid_wrapper.handlebars
deleted file mode 100644
index 47b5ea64ca5..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_args_operationid_wrapper.handlebars
+++ /dev/null
@@ -1,5 +0,0 @@
-@typing.overload
-{{#with this}}
-def {{operationId}}(
-{{> endpoint_args isOverload=true skipDeserialization="False" contentType=contentType}}
-{{/with}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_args_passed.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_args_passed.handlebars
deleted file mode 100644
index 8deb2cd260f..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_args_passed.handlebars
+++ /dev/null
@@ -1,33 +0,0 @@
-{{#if bodyParam}}
-{{#with bodyParam}}
-body=body,
-{{/with}}
-{{/if}}
-{{#if queryParams}}
-query_params=query_params,
-{{/if}}
-{{#if headerParams}}
-header_params=header_params,
-{{/if}}
-{{#if pathParams}}
-path_params=path_params,
-{{/if}}
-{{#if cookieParams}}
-cookie_params=cookie_params,
-{{/if}}
-{{#with bodyParam}}
-{{#each content}}
-{{#if @first}}
-content_type=content_type,
-{{/if}}
-{{/each}}
-{{/with}}
-{{#if produces}}
-accept_content_types=accept_content_types,
-{{/if}}
-{{#if servers}}
-host_index=host_index,
-{{/if}}
-stream=stream,
-timeout=timeout,
-skip_deserialization=skip_deserialization
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_body_serialization.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_body_serialization.handlebars
deleted file mode 100644
index f00d9f05d27..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_body_serialization.handlebars
+++ /dev/null
@@ -1,6 +0,0 @@
-serialized_data = request_body_{{paramName}}.serialize(body, content_type)
-_headers.add('Content-Type', content_type)
-if 'fields' in serialized_data:
- _fields = serialized_data['fields']
-elif 'body' in serialized_data:
- _body = serialized_data['body']
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_parameter.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_parameter.handlebars
deleted file mode 100644
index 8c18c997e35..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_parameter.handlebars
+++ /dev/null
@@ -1,24 +0,0 @@
-request_{{#if isQueryParam}}query{{/if}}{{#if isPathParam}}path{{/if}}{{#if isHeaderParam}}header{{/if}}{{#if isCookieParam}}cookie{{/if}}_{{paramName}} = api_client.{{#if isQueryParam}}Query{{/if}}{{#if isPathParam}}Path{{/if}}{{#if isHeaderParam}}Header{{/if}}{{#if isCookieParam}}Cookie{{/if}}Parameter(
- name="{{baseName}}",
-{{#if style}}
- style=api_client.ParameterStyle.{{style}},
-{{/if}}
-{{#if schema}}
- {{#with schema}}
- schema={{baseName}},
- {{/with}}
-{{/if}}
-{{#if getContent}}
- content={
-{{#each getContent}}
- "{{@key}}": {{#with this}}{{#with schema}}{{baseName}}{{/with}}{{/with}},
-{{/each}}
- },
-{{/if}}
-{{#if required}}
- required=True,
-{{/if}}
-{{#if isExplode}}
- explode=True,
-{{/if}}
-)
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_parameter_schema_and_def.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_parameter_schema_and_def.handlebars
deleted file mode 100644
index 313a64dc200..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_parameter_schema_and_def.handlebars
+++ /dev/null
@@ -1,56 +0,0 @@
-# {{xParamsName}} params
-{{#each xParams}}
- {{#if schema}}
- {{#with schema}}
-{{> model_templates/schema }}
- {{/with}}
- {{else}}
- {{#if getContent}}
- {{#each getContent}}
- {{#with this}}
- {{#with schema}}
-{{> model_templates/schema }}
- {{/with}}
- {{/with}}
- {{/each}}
- {{/if}}
- {{/if}}
-{{/each}}
-RequestRequired{{xParamsName}}Params = typing_extensions.TypedDict(
- 'RequestRequired{{xParamsName}}Params',
- {
-{{#each xParams}}
-{{#if required}}
-{{#if schema}}
- '{{baseName}}': {{#with schema}}typing.Union[{{baseName}}, {{> model_templates/schema_python_types }}],{{/with}}
-{{else}}
- '{{baseName}}': {{#each getContent}}{{#with this}}{{#with schema}}typing.Union[{{baseName}}, {{> model_templates/schema_python_types }}],{{/with}}{{/with}}{{/each}}
-{{/if}}
-{{/if}}
-{{/each}}
- }
-)
-RequestOptional{{xParamsName}}Params = typing_extensions.TypedDict(
- 'RequestOptional{{xParamsName}}Params',
- {
-{{#each xParams}}
-{{#unless required}}
-{{#if schema}}
- '{{baseName}}': {{#with schema}}typing.Union[{{baseName}}, {{> model_templates/schema_python_types }}],{{/with}}
-{{else}}
- '{{baseName}}': {{#each getContent}}{{#with this}}{{#with schema}}typing.Union[{{baseName}}, {{> model_templates/schema_python_types }}],{{/with}}{{/with}}{{/each}}
-{{/if}}
-{{/unless}}
-{{/each}}
- },
- total=False
-)
-
-
-class Request{{xParamsName}}Params(RequestRequired{{xParamsName}}Params, RequestOptional{{xParamsName}}Params):
- pass
-
-
-{{#each xParams}}
-{{> endpoint_parameter }}
-{{/each}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/endpoint_stub.handlebars b/modules/openapi-generator/src/main/resources/python/endpoint_stub.handlebars
deleted file mode 100644
index b84c7698d36..00000000000
--- a/modules/openapi-generator/src/main/resources/python/endpoint_stub.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{> endpoint isStub=true }}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/exceptions.handlebars b/modules/openapi-generator/src/main/resources/python/exceptions.handlebars
deleted file mode 100644
index 68306577b35..00000000000
--- a/modules/openapi-generator/src/main/resources/python/exceptions.handlebars
+++ /dev/null
@@ -1,140 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-import dataclasses
-import typing
-
-from urllib3._collections import HTTPHeaderDict
-
-
-class OpenApiException(Exception):
- """The base exception class for all OpenAPIExceptions"""
-
-
-class ApiTypeError(OpenApiException, TypeError):
- def __init__(self, msg, path_to_item=None, valid_classes=None,
- key_type=None):
- """ Raises an exception for TypeErrors
-
- Args:
- msg (str): the exception message
-
- Keyword Args:
- path_to_item (list): a list of keys an indices to get to the
- current_item
- None if unset
- valid_classes (tuple): the primitive classes that current item
- should be an instance of
- None if unset
- key_type (bool): False if our value is a value in a dict
- True if it is a key in a dict
- False if our item is an item in a list
- None if unset
- """
- self.path_to_item = path_to_item
- self.valid_classes = valid_classes
- self.key_type = key_type
- full_msg = msg
- if path_to_item:
- full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
- super(ApiTypeError, self).__init__(full_msg)
-
-
-class ApiValueError(OpenApiException, ValueError):
- def __init__(self, msg, path_to_item=None):
- """
- Args:
- msg (str): the exception message
-
- Keyword Args:
- path_to_item (list) the path to the exception in the
- received_data dict. None if unset
- """
-
- self.path_to_item = path_to_item
- full_msg = msg
- if path_to_item:
- full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
- super(ApiValueError, self).__init__(full_msg)
-
-
-class ApiAttributeError(OpenApiException, AttributeError):
- def __init__(self, msg, path_to_item=None):
- """
- Raised when an attribute reference or assignment fails.
-
- Args:
- msg (str): the exception message
-
- Keyword Args:
- path_to_item (None/list) the path to the exception in the
- received_data dict
- """
- self.path_to_item = path_to_item
- full_msg = msg
- if path_to_item:
- full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
- super(ApiAttributeError, self).__init__(full_msg)
-
-
-class ApiKeyError(OpenApiException, KeyError):
- def __init__(self, msg, path_to_item=None):
- """
- Args:
- msg (str): the exception message
-
- Keyword Args:
- path_to_item (None/list) the path to the exception in the
- received_data dict
- """
- self.path_to_item = path_to_item
- full_msg = msg
- if path_to_item:
- full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
- super(ApiKeyError, self).__init__(full_msg)
-
-
-T = typing.TypeVar("T")
-
-
-@dataclasses.dataclass
-class ApiException(OpenApiException, typing.Generic[T]):
- status: int
- reason: str
- api_response: typing.Optional[T] = None
-
- @property
- def body(self) -> typing.Union[str, bytes, None]:
- if not self.api_response:
- return None
- return self.api_response.response.data
-
- @property
- def headers(self) -> typing.Optional[HTTPHeaderDict]:
- if not self.api_response:
- return None
- return self.api_response.response.getheaders()
-
- def __str__(self):
- """Custom error messages for exception"""
- error_message = "({0})\n"\
- "Reason: {1}\n".format(self.status, self.reason)
- if self.headers:
- error_message += "HTTP response headers: {0}\n".format(
- self.headers)
-
- if self.body:
- error_message += "HTTP response body: {0}\n".format(self.body)
-
- return error_message
-
-
-def render_path(path_to_item):
- """Returns a string representation of a path"""
- result = ""
- for pth in path_to_item:
- if isinstance(pth, int):
- result += "[{0}]".format(pth)
- else:
- result += "['{0}']".format(pth)
- return result
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/exceptions.mustache b/modules/openapi-generator/src/main/resources/python/exceptions.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/exceptions.mustache
rename to modules/openapi-generator/src/main/resources/python/exceptions.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/git_push.sh.handlebars b/modules/openapi-generator/src/main/resources/python/git_push.sh.handlebars
deleted file mode 100644
index 228d338ebdb..00000000000
--- a/modules/openapi-generator/src/main/resources/python/git_push.sh.handlebars
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
-#
-# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
-
-git_user_id=$1
-git_repo_id=$2
-release_note=$3
-git_host=$4
-
-if [ "$git_host" = "" ]; then
- git_host="{{{gitHost}}}"
- echo "[INFO] No command line input provided. Set \$git_host to $git_host"
-fi
-
-if [ "$git_user_id" = "" ]; then
- git_user_id="{{{gitUserId}}}"
- echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
-fi
-
-if [ "$git_repo_id" = "" ]; then
- git_repo_id="{{{gitRepoId}}}"
- echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
-fi
-
-if [ "$release_note" = "" ]; then
- release_note="{{{releaseNote}}}"
- echo "[INFO] No command line input provided. Set \$release_note to $release_note"
-fi
-
-# Initialize the local directory as a Git repository
-git init
-
-# Adds the files in the local repository and stages them for commit.
-git add .
-
-# Commits the tracked changes and prepares them to be pushed to a remote repository.
-git commit -m "$release_note"
-
-# Sets the new remote
-git_remote=`git remote`
-if [ "$git_remote" = "" ]; then # git remote not defined
-
- if [ "$GIT_TOKEN" = "" ]; then
- echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
- git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
- else
- git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_host}/${git_user_id}/${git_repo_id}.git
- fi
-
-fi
-
-git pull origin master
-
-# Pushes (Forces) the changes in the local repository up to the remote repository
-echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
-git push origin master 2>&1 | grep -v 'To https'
-
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/git_push.sh.mustache b/modules/openapi-generator/src/main/resources/python/git_push.sh.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/git_push.sh.mustache
rename to modules/openapi-generator/src/main/resources/python/git_push.sh.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/github-workflow.mustache b/modules/openapi-generator/src/main/resources/python/github-workflow.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/github-workflow.mustache
rename to modules/openapi-generator/src/main/resources/python/github-workflow.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/gitignore.handlebars b/modules/openapi-generator/src/main/resources/python/gitignore.handlebars
deleted file mode 100644
index a62e8aba43f..00000000000
--- a/modules/openapi-generator/src/main/resources/python/gitignore.handlebars
+++ /dev/null
@@ -1,67 +0,0 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-dev-requirements.txt.log
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*,cover
-.hypothesis/
-venv/
-.venv/
-.python-version
-.pytest_cache
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-#Ipython Notebook
-.ipynb_checkpoints
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/gitignore.mustache b/modules/openapi-generator/src/main/resources/python/gitignore.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/gitignore.mustache
rename to modules/openapi-generator/src/main/resources/python/gitignore.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/gitlab-ci.handlebars b/modules/openapi-generator/src/main/resources/python/gitlab-ci.handlebars
deleted file mode 100644
index 0cfe8f74ecf..00000000000
--- a/modules/openapi-generator/src/main/resources/python/gitlab-ci.handlebars
+++ /dev/null
@@ -1,29 +0,0 @@
-# ref: https://docs.gitlab.com/ee/ci/README.html
-
-stages:
- - test
-
-.tests:
- stage: test
- script:
- - pip install -r requirements.txt
- - pip install -r test-requirements.txt
- {{#if useNose}}
- - nosetests
- {{/if}}
- {{#unless useNose}}
- - pytest --cov={{{packageName}}}
- {{/unless}}
-
-test-3.5:
- extends: .tests
- image: python:3.5-alpine
-test-3.6:
- extends: .tests
- image: python:3.6-alpine
-test-3.7:
- extends: .tests
- image: python:3.7-alpine
-test-3.8:
- extends: .tests
- image: python:3.8-alpine
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/gitlab-ci.mustache b/modules/openapi-generator/src/main/resources/python/gitlab-ci.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/gitlab-ci.mustache
rename to modules/openapi-generator/src/main/resources/python/gitlab-ci.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/model.handlebars b/modules/openapi-generator/src/main/resources/python/model.handlebars
deleted file mode 100644
index 54827ce8891..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model.handlebars
+++ /dev/null
@@ -1,11 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-{{#each models}}
-{{#with model}}
-{{> model_templates/imports_schema_types }}
-{{> model_templates/schema }}
-{{> model_templates/imports_schemas }}
-{{/with}}
-{{/each}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model.mustache b/modules/openapi-generator/src/main/resources/python/model.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model.mustache
rename to modules/openapi-generator/src/main/resources/python/model.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model_anyof.mustache b/modules/openapi-generator/src/main/resources/python/model_anyof.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model_anyof.mustache
rename to modules/openapi-generator/src/main/resources/python/model_anyof.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/model_doc.handlebars b/modules/openapi-generator/src/main/resources/python/model_doc.handlebars
deleted file mode 100644
index ae96a37f429..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_doc.handlebars
+++ /dev/null
@@ -1,9 +0,0 @@
-{{#each models}}
-{{#with model}}
-# {{packageName}}.{{modelPackage}}.{{classFilename}}.{{classname}}
-{{> schema_doc complexTypePrefix="" }}
-{{/with}}
-{{/each}}
-
-[[Back to Model list]](../../README.md#documentation-for-models) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to README]](../../README.md)
-
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model_doc.mustache b/modules/openapi-generator/src/main/resources/python/model_doc.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model_doc.mustache
rename to modules/openapi-generator/src/main/resources/python/model_doc.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model_enum.mustache b/modules/openapi-generator/src/main/resources/python/model_enum.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model_enum.mustache
rename to modules/openapi-generator/src/main/resources/python/model_enum.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model_generic.mustache b/modules/openapi-generator/src/main/resources/python/model_generic.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model_generic.mustache
rename to modules/openapi-generator/src/main/resources/python/model_generic.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model_oneof.mustache b/modules/openapi-generator/src/main/resources/python/model_oneof.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model_oneof.mustache
rename to modules/openapi-generator/src/main/resources/python/model_oneof.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/model_stub.handlebars b/modules/openapi-generator/src/main/resources/python/model_stub.handlebars
deleted file mode 100644
index 50700cf72d0..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_stub.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{> model isStub=true }}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/classname.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/classname.handlebars
deleted file mode 100644
index fbde863faed..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/classname.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/composed_schemas.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/composed_schemas.handlebars
deleted file mode 100644
index 9deb056577d..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/composed_schemas.handlebars
+++ /dev/null
@@ -1,109 +0,0 @@
-{{#with composedSchemas}}
-{{#each allOf}}
-{{#unless complexType}}
-{{> model_templates/schema }}
-{{/unless}}
-{{/each}}
-{{#each oneOf}}
-{{#unless complexType}}
-{{> model_templates/schema }}
-{{/unless}}
-{{/each}}
-{{#each anyOf}}
-{{#unless complexType}}
-{{> model_templates/schema }}
-{{/unless}}
-{{/each}}
-{{/with}}
-{{#with composedSchemas}}
-{{#if allOf}}
-
-@classmethod
-@functools.lru_cache()
-def all_of(cls):
- # 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
- return [
-{{#each allOf}}
-{{#if complexType}}
- {{complexType}},
-{{else}}
- {{#if nameInSnakeCase}}
- cls.{{name}},
- {{else}}
- cls.{{baseName}},
- {{/if}}
-{{/if}}
-{{/each}}
- ]
-{{/if}}
-{{#if oneOf}}
-
-@classmethod
-@functools.lru_cache()
-def one_of(cls):
- # 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
- return [
-{{#each oneOf}}
-{{#if complexType}}
- {{complexType}},
-{{else}}
- {{#if nameInSnakeCase}}
- cls.{{name}},
- {{else}}
- cls.{{baseName}},
- {{/if}}
-{{/if}}
-{{/each}}
- ]
-{{/if}}
-{{#if anyOf}}
-
-@classmethod
-@functools.lru_cache()
-def any_of(cls):
- # 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
- return [
-{{#each anyOf}}
-{{#if complexType}}
- {{complexType}},
-{{else}}
- {{#if nameInSnakeCase}}
- cls.{{name}},
- {{else}}
- cls.{{baseName}},
- {{/if}}
-{{/if}}
-{{/each}}
- ]
-{{/if}}
-{{#if not}}
-{{#with not}}
-{{#if complexType}}
-
-@staticmethod
-def {{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}() -> typing.Type['{{complexType}}']:
- return {{complexType}}
-{{else}}
-{{> model_templates/schema }}
-{{/if}}
-{{/with}}
-{{/if}}
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/dict_partial.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/dict_partial.handlebars
deleted file mode 100644
index 9ff3e7c37ea..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/dict_partial.handlebars
+++ /dev/null
@@ -1,58 +0,0 @@
-{{#if getRequiredVarsMap}}
-required = {
-{{#each getRequiredVarsMap}}
- "{{{@key}}}",
-{{/each}}
-}
-{{/if}}
-{{#if getHasDiscriminatorWithNonEmptyMapping}}
-{{#with discriminator}}
-{{#each mappedModels}}
-{{#if @first}}
-
-@staticmethod
-def discriminator():
- return {
- '{{{propertyBaseName}}}': {
-{{/if}}
- '{{mappingName}}': {{{modelName}}},
-{{#if @last}}
- }
- }
-{{/if}}
-{{/each}}
-{{/with}}
-{{/if}}
-{{#if vars}}
-
-class properties:
-{{#each vars}}
-{{#if complexType}}
-
- @staticmethod
- def {{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}() -> typing.Type['{{complexType}}']:
- return {{complexType}}
-{{else}}
- {{> model_templates/schema }}
-{{/if}}
-{{/each}}
- __annotations__ = {
-{{#each vars}}
-{{#if nameInSnakeCase}}
- "{{{baseName}}}": {{name}},
-{{else}}
- "{{{baseName}}}": {{baseName}},
-{{/if}}
-{{/each}}
- }
-{{/if}}
-{{#with additionalProperties}}
-{{#if complexType}}
-
-@staticmethod
-def {{baseName}}() -> typing.Type['{{complexType}}']:
- return {{complexType}}
-{{else}}
-{{> model_templates/schema }}
-{{/if}}
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/enums.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/enums.handlebars
deleted file mode 100644
index 8c3108e4257..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/enums.handlebars
+++ /dev/null
@@ -1,20 +0,0 @@
-{{#with allowableValues}}
-{{#each enumVars}}
-
-@schemas.classproperty
-def {{name}}(cls):
- {{#eq value "schemas.NoneClass.NONE"}}
- return cls(None)
- {{else}}
- {{#eq value "schemas.BoolClass.TRUE"}}
- return cls(True)
- {{else}}
- {{#eq value "schemas.BoolClass.FALSE"}}
- return cls(False)
- {{else}}
- return cls({{{value}}})
- {{/eq}}
- {{/eq}}
- {{/eq}}
-{{/each}}
-{{/with}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/format_base.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/format_base.handlebars
deleted file mode 100644
index 9bbd87d8c8b..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/format_base.handlebars
+++ /dev/null
@@ -1,27 +0,0 @@
-{{#eq getFormat "uuid"}}
-schemas.UUIDBase,
-{{/eq}}
-{{#eq getFormat "date"}}
-schemas.DateBase,
-{{/eq}}
-{{#eq getFormat "date-time"}}
-schemas.DateTimeBase,
-{{/eq}}
-{{#eq getFormat "number"}}
-schemas.DecimalBase,
-{{/eq}}
-{{#eq getFormat "binary"}}
-schemas.BinaryBase,
-{{/eq}}
-{{#eq getFormat "int32"}}
-schemas.Int32Base,
-{{/eq}}
-{{#eq getFormat "int64"}}
-schemas.Int64Base,
-{{/eq}}
-{{#eq getFormat "float"}}
-schemas.Float32Base,
-{{/eq}}
-{{#eq getFormat "double"}}
-schemas.Float64Base,
-{{/eq}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/imports_schema_types.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/imports_schema_types.handlebars
deleted file mode 100644
index 522c8f2c93b..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/imports_schema_types.handlebars
+++ /dev/null
@@ -1,12 +0,0 @@
-from datetime import date, datetime # noqa: F401
-import decimal # noqa: F401
-import functools # noqa: F401
-import io # noqa: F401
-import re # noqa: F401
-import typing # noqa: F401
-import typing_extensions # noqa: F401
-import uuid # noqa: F401
-
-import frozendict # noqa: F401
-
-from {{packageName}} import schemas # noqa: F401
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/imports_schemas.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/imports_schemas.handlebars
deleted file mode 100644
index b925cf92c69..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/imports_schemas.handlebars
+++ /dev/null
@@ -1,6 +0,0 @@
-{{#each imports}}
-{{#if @first}}
-
-{{/if}}
-{{{.}}}
-{{/each}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/list_partial.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/list_partial.handlebars
deleted file mode 100644
index 97c4003fe9b..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/list_partial.handlebars
+++ /dev/null
@@ -1,10 +0,0 @@
-{{#with items}}
-{{#if complexType}}
-
-@staticmethod
-def {{baseName}}() -> typing.Type['{{complexType}}']:
- return {{complexType}}
-{{else}}
-{{> model_templates/schema }}
-{{/if}}
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/new.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/new.handlebars
deleted file mode 100644
index 955d6395ec1..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/new.handlebars
+++ /dev/null
@@ -1,100 +0,0 @@
-def __new__(
- cls,
-{{#if getHasMultipleTypes}}
- *_args: typing.Union[{{> model_templates/schema_python_types }}],
-{{else}}
-{{#if isArray }}
- _arg: typing.Union[typing.Tuple[{{#with items}}{{#if complexType}}'{{complexType}}'{{else}}typing.Union[MetaOapg.{{baseName}}, {{> model_templates/schema_python_types }}]{{/if}}{{/with}}], typing.List[{{#with items}}{{#if complexType}}'{{complexType}}'{{else}}typing.Union[MetaOapg.{{baseName}}, {{> model_templates/schema_python_types }}]{{/if}}{{/with}}]],
-{{else}}
- *_args: typing.Union[{{> model_templates/schema_python_types }}],
-{{/if}}
-{{/if}}
-{{#unless isNull}}
-{{#if getHasRequired}}
-{{#each getRequiredVarsMap}}
-{{#with this}}
-{{#unless nameInSnakeCase}}
-{{#if complexType}}
- {{baseName}}: '{{complexType}}',
-{{else}}
- {{#if getSchemaIsFromAdditionalProperties}}
- {{#if addPropsUnset}}
- {{baseName}}: typing.Union[schemas.AnyTypeSchema, {{> model_templates/schema_python_types }}],
- {{else}}
- {{baseName}}: typing.Union[MetaOapg.additional_properties, {{> model_templates/schema_python_types }}],
- {{/if}}
- {{else}}
- {{baseName}}: typing.Union[MetaOapg.properties.{{baseName}}, {{> model_templates/schema_python_types }}],
- {{/if}}
-{{/if}}
-{{/unless}}
-{{/with}}
-{{/each}}
-{{/if}}
-{{/unless}}
-{{#each vars}}
-{{#unless nameInSnakeCase}}
-{{#unless getRequired}}
-{{#if complexType}}
- {{baseName}}: typing.Union['{{complexType}}', schemas.Unset] = schemas.unset,
-{{else}}
- {{baseName}}: typing.Union[MetaOapg.properties.{{baseName}}, {{> model_templates/schema_python_types }}schemas.Unset] = schemas.unset,
-{{/if}}
-{{/unless}}
-{{/unless}}
-{{/each}}
- _configuration: typing.Optional[schemas.Configuration] = None,
-{{#with additionalProperties}}
-{{#unless getIsBooleanSchemaFalse}}
-{{#if complexType}}
- **kwargs: '{{complexType}}',
-{{else}}
- **kwargs: typing.Union[MetaOapg.additional_properties, {{> model_templates/schema_python_types }}],
-{{/if}}
-{{/unless}}
-{{else}}
-{{#or isMap isAnyType}}
- **kwargs: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, None, list, tuple, bytes],
-{{/or}}
-{{/with}}
-) -> '{{> model_templates/classname }}':
- return super().__new__(
- cls,
-{{#if getHasMultipleTypes}}
- *_args,
-{{else}}
-{{#if isArray }}
- _arg,
-{{else}}
- *_args,
-{{/if}}
-{{/if}}
-{{#unless isNull}}
-{{#if getHasRequired}}
-{{#each getRequiredVarsMap}}
-{{#with this}}
-{{#unless nameInSnakeCase}}
- {{baseName}}={{baseName}},
-{{/unless}}
-{{/with}}
-{{/each}}
-{{/if}}
-{{/unless}}
-{{#each vars}}
-{{#unless getRequired}}
-{{#unless nameInSnakeCase}}
- {{baseName}}={{baseName}},
-{{/unless}}
-{{/unless}}
-{{/each}}
- _configuration=_configuration,
-{{#with additionalProperties}}
-{{#unless getIsBooleanSchemaFalse}}
- **kwargs,
-{{/unless}}
-{{else}}
-{{#or isMap isAnyType}}
- **kwargs,
-{{/or}}
-{{/with}}
- )
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/notes_msg.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/notes_msg.handlebars
deleted file mode 100644
index 43d1163b5c0..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/notes_msg.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{#unless isArray}}{{#unless complexType}}{{#with allowableValues}}must be one of [{{#each enumVars}}{{#eq value "schemas.NoneClass.NONE"}}None{{else}}{{#eq value "schemas.BoolClass.TRUE"}}True{{else}}{{#eq value "schemas.BoolClass.FALSE"}}False{{else}}{{{value}}}{{/eq}}{{/eq}}{{/eq}}, {{/each}}] {{/with}}{{#if defaultValue}}{{#unless hasRequired}}if omitted the server will use the default value of {{{defaultValue}}}{{/unless}}{{/if}}{{#eq getFormat "uuid"}}value must be a uuid{{/eq}}{{#eq getFormat "date"}}value must conform to RFC-3339 full-date YYYY-MM-DD{{/eq}}{{#eq getFormat "date-time"}}value must conform to RFC-3339 date-time{{/eq}}{{#eq getFormat "number"}}value must be numeric and storable in decimal.Decimal{{/eq}}{{#eq getFormat "int32"}}value must be a 32 bit integer{{/eq}}{{#eq getFormat "int64"}}value must be a 64 bit integer{{/eq}}{{#eq getFormat "double"}}value must be a 64 bit float{{/eq}}{{#eq getFormat "float"}}value must be a 32 bit float{{/eq}}{{/unless}}{{/unless}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/payload_renderer.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/payload_renderer.handlebars
deleted file mode 100644
index cc5451785b0..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/payload_renderer.handlebars
+++ /dev/null
@@ -1,35 +0,0 @@
-{{#if isMap}}
-{
-{{#each value}}
-{{#with @key}}
- {{> model_templates/payload_renderer endChar=':'}}
-{{/with}}
-{{#with this}}
- {{> model_templates/payload_renderer endChar=','}}
-{{/with}}
-{{/each}}
-}{{endChar}}
-{{/if}}
-{{#if isArray}}
-[
-{{#each value}}
- {{> model_templates/payload_renderer endChar=','}}
-{{/each}}
-]{{endChar}}
-{{/if}}
-{{#or isNumber isUnboundedInteger}}
-{{value}}{{endChar}}
-{{/or}}
-{{#if isBoolean}}
-{{#if value}}
-True{{endChar}}
-{{else}}
-False{{endChar}}
-{{/if}}
-{{/if}}
-{{#if isNull}}
-None{{endChar}}
-{{/if}}
-{{#if isString}}
-"{{{value}}}"{{endChar}}
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_with_addprops.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_with_addprops.handlebars
deleted file mode 100644
index 6fd1d8a3a37..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_with_addprops.handlebars
+++ /dev/null
@@ -1,108 +0,0 @@
-{{#if getRequiredVarsMap}}
-{{#each getRequiredVarsMap}}
-{{#with this}}
-
-@typing.overload
-{{#if complexType}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> '{{complexType}}': ...
-{{else}}
-{{#if schemaIsFromAdditionalProperties}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.additional_properties: ...
-{{else}}
-{{#if nameInSnakeCase}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{name}}: ...
-{{else}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{baseName}}: ...
-{{/if}}
-{{/if}}
-{{/if}}
-{{/with}}
-{{/each}}
-{{/if}}
-{{#if vars}}
-{{#each vars}}
-{{#unless required}}
-
-@typing.overload
-{{#if complexType}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> '{{complexType}}': ...
-{{else}}
-{{#if nameInSnakeCase}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{name}}: ...
-{{else}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{baseName}}: ...
-{{/if}}
-{{/if}}
-{{/unless}}
-{{/each}}
-{{/if}}
-{{#or vars getRequiredVarsMap}}
-{{#with additionalProperties}}
-{{#unless getIsBooleanSchemaFalse}}
-
-@typing.overload
-def __getitem__(self, name: str) -> {{#if complexType}}'{{complexType}}'{{else}}MetaOapg.{{baseName}}{{/if}}: ...
-{{/unless}}
-{{/with}}
-
-{{> model_templates/property_getitems_with_addprops_getitem methodName="__getitem__" }}
-{{else}}
-{{#not additionalProperties.getIsBooleanSchemaFalse}}
-
-{{> model_templates/property_getitems_with_addprops_getitem methodName="__getitem__" }}
-{{/not}}
-{{/or}}
-{{#if getRequiredVarsMap}}
-{{#each getRequiredVarsMap}}
-{{#with this}}
-
-@typing.overload
-{{#if complexType}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> '{{complexType}}': ...
-{{else}}
-{{#if schemaIsFromAdditionalProperties}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.additional_properties: ...
-{{else}}
-{{#if nameInSnakeCase}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{name}}: ...
-{{else}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{baseName}}: ...
-{{/if}}
-{{/if}}
-{{/if}}
-{{/with}}
-{{/each}}
-{{/if}}
-{{#if vars}}
-{{#each vars}}
-{{#unless required}}
-
-@typing.overload
-{{#if complexType}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> typing.Union['{{complexType}}', schemas.Unset]: ...
-{{else}}
-{{#if nameInSnakeCase}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> typing.Union[MetaOapg.properties.{{name}}, schemas.Unset]: ...
-{{else}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> typing.Union[MetaOapg.properties.{{baseName}}, schemas.Unset]: ...
-{{/if}}
-{{/if}}
-{{/unless}}
-{{/each}}
-{{/if}}
-{{#or vars getRequiredVarsMap}}
-{{#with additionalProperties}}
-{{#unless getIsBooleanSchemaFalse}}
-
-@typing.overload
-def get_item_oapg(self, name: str) -> typing.Union[{{#if complexType}}'{{complexType}}'{{else}}MetaOapg.{{baseName}}{{/if}}, schemas.Unset]: ...
-{{/unless}}
-{{/with}}
-
-{{> model_templates/property_getitems_with_addprops_getitem methodName="get_item_oapg" }}
-{{else}}
-{{#not additionalProperties.getIsBooleanSchemaFalse}}
-
-{{> model_templates/property_getitems_with_addprops_getitem methodName="get_item_oapg" }}
-{{/not}}
-{{/or}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_with_addprops_getitem.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_with_addprops_getitem.handlebars
deleted file mode 100644
index f35667373fc..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_with_addprops_getitem.handlebars
+++ /dev/null
@@ -1,5 +0,0 @@
-def {{methodName}}(self, name: typing.Union[{{#each getRequiredVarsMap}}{{#with this}}typing_extensions.Literal["{{{baseName}}}"], {{/with}}{{/each}}{{#each vars}}{{#unless required}}typing_extensions.Literal["{{{baseName}}}"], {{/unless}}{{/each}}{{#with additionalProperties}}{{#unless getIsBooleanSchemaFalse}}str, {{/unless}}{{/with}}]){{#not vars}}{{#not getRequiredVarsMap}}{{#with additionalProperties}}{{#unless getIsBooleanSchemaFalse}} -> {{#if complexType}}'{{complexType}}'{{else}}MetaOapg.{{baseName}}{{/if}}{{/unless}}{{/with}}{{/not}}{{/not}}:
-{{#eq methodName "__getitem__"}}
- # dict_instance[name] accessor
-{{/eq}}
- return super().{{methodName}}(name)
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_without_addprops.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_without_addprops.handlebars
deleted file mode 100644
index efb37d4ca18..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/property_getitems_without_addprops.handlebars
+++ /dev/null
@@ -1,45 +0,0 @@
-{{#if vars}}
-{{#each vars}}
-
-@typing.overload
-{{#if complexType}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> '{{complexType}}': ...
-{{else}}
-{{#if nameInSnakeCase}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{name}}: ...
-{{else}}
-def __getitem__(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> MetaOapg.properties.{{baseName}}: ...
-{{/if}}
-{{/if}}
-{{/each}}
-
-@typing.overload
-def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
-
-def __getitem__(self, name: typing.Union[typing_extensions.Literal[{{#each vars}}"{{{baseName}}}", {{/each}}], str]):
- # dict_instance[name] accessor
- return super().__getitem__(name)
-
-{{/if}}
-{{#if vars}}
-{{#each vars}}
-
-@typing.overload
-{{#if complexType}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> {{#unless required}}typing.Union[{{/unless}}'{{complexType}}'{{#unless required}}, schemas.Unset]{{/unless}}: ...
-{{else}}
-{{#if nameInSnakeCase}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> {{#unless required}}typing.Union[{{/unless}}MetaOapg.properties.{{name}}{{#unless required}}, schemas.Unset]{{/unless}}: ...
-{{else}}
-def get_item_oapg(self, name: typing_extensions.Literal["{{{baseName}}}"]) -> {{#unless required}}typing.Union[{{/unless}}MetaOapg.properties.{{baseName}}{{#unless required}}, schemas.Unset]{{/unless}}: ...
-{{/if}}
-{{/if}}
-{{/each}}
-
-@typing.overload
-def get_item_oapg(self, name: str) -> typing.Union[schemas.UnsetAnyTypeSchema, schemas.Unset]: ...
-
-def get_item_oapg(self, name: typing.Union[typing_extensions.Literal[{{#each vars}}"{{{baseName}}}", {{/each}}], str]):
- return super().get_item_oapg(name)
-
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/property_type_hints.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/property_type_hints.handlebars
deleted file mode 100644
index 395c6e2aea1..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/property_type_hints.handlebars
+++ /dev/null
@@ -1,13 +0,0 @@
-{{#if getRequiredVarsMap}}
-
-{{#if additionalProperties}}
-{{> model_templates/property_type_hints_required }}
-{{else}}
-{{> model_templates/property_type_hints_required addPropsUnset=true }}
-{{/if}}
-{{/if}}
-{{#if additionalProperties}}
-{{> model_templates/property_getitems_with_addprops }}
-{{else}}
-{{> model_templates/property_getitems_without_addprops }}
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/property_type_hints_required.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/property_type_hints_required.handlebars
deleted file mode 100644
index 2a265d61d77..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/property_type_hints_required.handlebars
+++ /dev/null
@@ -1,19 +0,0 @@
-{{#each getRequiredVarsMap}}
-{{#with this}}
-{{#unless nameInSnakeCase}}
-{{#if complexType}}
-{{baseName}}: '{{complexType}}'
-{{else}}
-{{#if schemaIsFromAdditionalProperties}}
-{{#if addPropsUnset}}
-{{baseName}}: schemas.AnyTypeSchema
-{{else}}
-{{baseName}}: MetaOapg.additional_properties
-{{/if}}
-{{else}}
-{{baseName}}: MetaOapg.properties.{{baseName}}
-{{/if}}
-{{/if}}
-{{/unless}}
-{{/with}}
-{{/each}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema.handlebars
deleted file mode 100644
index 6f9d565ada3..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema.handlebars
+++ /dev/null
@@ -1,42 +0,0 @@
-{{#if composedSchemas}}
- {{#if getIsBooleanSchemaFalse}}
-{{> model_templates/var_equals_cls }}
- {{else}}
-{{> model_templates/schema_composed_or_anytype }}
- {{/if}}
-{{/if}}
-{{#unless composedSchemas}}
- {{#if getHasMultipleTypes}}
-{{> model_templates/schema_composed_or_anytype }}
- {{else}}
- {{#or isMap isArray isAnyType}}
- {{#if isMap}}
- {{#or hasVars hasValidation getRequiredVarsMap getHasDiscriminatorWithNonEmptyMapping additionalProperties }}
-{{> model_templates/schema_dict }}
- {{else}}
-{{> model_templates/var_equals_cls }}
- {{/or}}
- {{/if}}
- {{#if isArray}}
- {{#or hasItems hasValidation}}
-{{> model_templates/schema_list }}
- {{else}}
-{{> model_templates/var_equals_cls }}
- {{/or}}
- {{/if}}
- {{#if isAnyType}}
- {{#or isEnum hasVars hasValidation getRequiredVarsMap getHasDiscriminatorWithNonEmptyMapping items getFormat}}
-{{> model_templates/schema_composed_or_anytype }}
- {{else}}
-{{> model_templates/var_equals_cls }}
- {{/or}}
- {{/if}}
- {{else}}
- {{#or isEnum hasValidation}}
-{{> model_templates/schema_simple }}
- {{else}}
-{{> model_templates/var_equals_cls }}
- {{/or}}
- {{/or}}
- {{/if}}
-{{/unless}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema_accessed_types.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema_accessed_types.handlebars
deleted file mode 100644
index 8d0dcc0f4bd..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema_accessed_types.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{#if isAnyType}}frozendict.frozendict, str, decimal.Decimal, BoolClass, NoneClass, tuple, bytes, FileIO{{/if}}{{#if isArray}}tuple, {{/if}}{{#if isMap}}frozendict.frozendict, {{/if}}{{#if isNull}}NoneClass, {{/if}}{{#if isString }}{{#neq format "binary"}}str, {{/neq}}{{#eq format "binary"}}bytes, FileIO, {{/eq}}{{/if}}{{#or isInteger isNumber}}decimal.Decimal, {{/or}}{{#if isBoolean}}BoolClass, {{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema_composed_or_anytype.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema_composed_or_anytype.handlebars
deleted file mode 100644
index 7f97830dcf7..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema_composed_or_anytype.handlebars
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}(
-{{#if getIsAnyType}}
- {{#if getFormat}}
- {{> model_templates/format_base }}
- {{/if}}
- {{#if composedSchemas}}
- schemas.ComposedSchema,
- {{else}}
- schemas.AnyTypeSchema,
- {{/if}}
-{{else}}
- {{#if composedSchemas}}
- schemas.ComposedBase,
- {{/if}}
- {{#if isEnum}}
- schemas.EnumBase,
- {{/if}}
- {{> model_templates/xbase_schema }}
-{{/if}}
-):
-{{#if this.classname}}
- """NOTE: This class is auto generated by OpenAPI Generator.
- Ref: https://openapi-generator.tech
-
- Do not edit the class manually.
-{{#if description}}
-
- {{{unescapedDescription}}}
-{{/if}}
- """
-{{/if}}
-{{#or hasValidation composedSchemas getItems additionalProperties getRequiredVarsMap getHasDiscriminatorWithNonEmptyMapping vars getFormat isEnum}}
-
-
- class MetaOapg:
-{{#if getFormat}}
- format = '{{getFormat}}'
-{{/if}}
-{{#if isEnum}}
-{{#with allowableValues}}
- enum_value_to_name = {
-{{#each enumVars}}
- {{{value}}}: "{{name}}",
-{{/each}}
- }
-{{/with}}
-{{/if}}
-{{#if getItems}}
- {{> model_templates/list_partial }}
-{{/if}}
-{{#or additionalProperties getRequiredVarsMap getHasDiscriminatorWithNonEmptyMapping vars}}
- {{> model_templates/dict_partial }}
-{{/or}}
-{{#unless isStub}}
-{{#if hasValidation}}
- {{> model_templates/validations }}
-{{/if}}
-{{/unless}}
-{{#if composedSchemas}}
- {{> model_templates/composed_schemas }}
-{{/if}}
-{{/or}}
-{{#if isEnum}}
- {{> model_templates/enums }}
-{{/if}}
-
- {{> model_templates/property_type_hints }}
-
-{{#if additionalProperties}}
- {{> model_templates/new }}
-{{else}}
- {{> model_templates/new addPropsUnset=true }}
-{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema_dict.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema_dict.handlebars
deleted file mode 100644
index 284590644f7..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema_dict.handlebars
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-class {{> model_templates/classname }}(
- schemas.DictSchema
-):
-{{#if this.classname}}
- """NOTE: This class is auto generated by OpenAPI Generator.
- Ref: https://openapi-generator.tech
-
- Do not edit the class manually.
-{{#if description}}
-
- {{{unescapedDescription}}}
-{{/if}}
- """
-{{/if}}
-{{#if isStub}}
-{{#or additionalProperties getRequiredVarsMap getHasDiscriminatorWithNonEmptyMapping vars}}
-
-
- class MetaOapg:
- {{> model_templates/dict_partial }}
-{{/or}}
-{{else}}
-{{#or additionalProperties getRequiredVarsMap getHasDiscriminatorWithNonEmptyMapping vars hasValidation}}
-
-
- class MetaOapg:
- {{> model_templates/dict_partial }}
- {{> model_templates/validations }}
-{{/or}}
-{{/if}}
- {{> model_templates/property_type_hints }}
-
-{{#if additionalProperties}}
- {{> model_templates/new }}
-{{else}}
- {{> model_templates/new addPropsUnset=true }}
-{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema_list.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema_list.handlebars
deleted file mode 100644
index ae52b3e923f..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema_list.handlebars
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-class {{> model_templates/classname }}(
- schemas.ListSchema
-):
-{{#if this.classname}}
- """NOTE: This class is auto generated by OpenAPI Generator.
- Ref: https://openapi-generator.tech
-
- Do not edit the class manually.
-{{#if description}}
-
- {{{unescapedDescription}}}
-{{/if}}
- """
-{{/if}}
-{{#if isStub}}
-{{#if items}}
-
-
- class MetaOapg:
- {{> model_templates/list_partial }}
-{{/if}}
-{{else}}
-{{#or getItems hasValidation}}
-
-
- class MetaOapg:
-{{#if hasValidation}}
- {{> model_templates/validations }}
-{{/if}}
- {{> model_templates/list_partial }}
-{{/or}}
-{{/if}}
-
- {{> model_templates/new }}
-
- def __getitem__(self, i: int) -> {{#with items}}{{#if complexType}}'{{complexType}}'{{else}}MetaOapg.items{{/if}}{{/with}}:
- return super().__getitem__(i)
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema_python_types.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema_python_types.handlebars
deleted file mode 100644
index 613e5861302..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema_python_types.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{#if isAnyType}}dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, {{/if}}{{#if isArray}}list, tuple, {{/if}}{{#if isMap}}dict, frozendict.frozendict, {{/if}}{{#if isNull}}None, {{/if}}{{#if isString }}{{#neq format "binary"}}str, {{/neq}}{{#eq format "date"}}date, {{/eq}}{{#eq format "date-time"}}datetime, {{/eq}}{{#eq format "uuid"}}uuid.UUID, {{/eq}}{{#eq format "binary"}}bytes, io.FileIO, io.BufferedReader, {{/eq}}{{/if}}{{#if isInteger}}decimal.Decimal, int, {{/if}}{{#if isNumber}}decimal.Decimal, int, float, {{/if}}{{#if isBoolean}}bool, {{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/schema_simple.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/schema_simple.handlebars
deleted file mode 100644
index 0d880043e4f..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/schema_simple.handlebars
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}(
-{{#if isEnum}}
- schemas.EnumBase,
-{{/if}}
- {{> model_templates/xbase_schema }}
-):
-{{#if this.classname}}
- """NOTE: This class is auto generated by OpenAPI Generator.
- Ref: https://openapi-generator.tech
-
- Do not edit the class manually.
-{{#if description}}
-
- {{{unescapedDescription}}}
-{{/if}}
- """
-{{/if}}
-{{#unless isStub}}
-{{#or hasValidation isEnum getFormat}}
-
-
- class MetaOapg:
-{{#if getFormat}}
- format = '{{getFormat}}'
-{{/if}}
- {{> model_templates/validations }}
-{{#if isEnum}}
-{{#with allowableValues}}
- enum_value_to_name = {
-{{#each enumVars}}
- {{{value}}}: "{{name}}",
-{{/each}}
- }
-{{/with}}
-{{/if}}
-{{/or}}
-{{/unless}}
-{{#if isEnum}}
- {{> model_templates/enums }}
-{{/if}}
-{{#if isStub}}
-{{#if hasValidation}}
-{{#unless isEnum}}
- pass
-{{/unless}}
-{{/if}}
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/validations.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/validations.handlebars
deleted file mode 100644
index 7e4909e1d94..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/validations.handlebars
+++ /dev/null
@@ -1,48 +0,0 @@
-{{#neq getUniqueItemsBoolean null}}
-unique_items = {{#if getUniqueItemsBoolean}}True{{else}}False{{/if}}
-{{/neq}}
-{{#neq maxLength null}}
-max_length = {{maxLength}}
-{{/neq}}
-{{#neq minLength null}}
-min_length = {{minLength}}
-{{/neq}}
-{{#neq maxItems null}}
-max_items = {{maxItems}}
-{{/neq}}
-{{#neq minItems null}}
-min_items = {{minItems}}
-{{/neq}}
-{{#neq maxProperties null }}
-max_properties = {{maxProperties}}
-{{/neq}}
-{{#neq minProperties null}}
-min_properties = {{minProperties}}
-{{/neq}}
-{{#neq maximum null}}
-{{#if exclusiveMaximum}}exclusive_maximum{{/if}}inclusive_maximum{{#unless exclusiveMaximum}}{{/unless}} = {{maximum}}
-{{/neq}}
-{{#neq minimum null}}
-{{#if exclusiveMinimum}}exclusive_minimum{{/if}}inclusive_minimum{{#unless exclusiveMinimum}}{{/unless}} = {{minimum}}
-{{/neq}}
-{{#neq pattern null}}
-regex=[{
-{{#if vendorExtensions.x-regex}}
- 'pattern': r'{{{vendorExtensions.x-regex}}}', # noqa: E501
-{{else}}
- 'pattern': r'{{{pattern}}}', # noqa: E501
-{{/if}}
-{{#each vendorExtensions.x-modifiers}}
-{{#if @first}}
- 'flags': (
-{{/if}}
- {{#unless @first}}| {{/unless}}re.{{.}}
-{{#if @last}}
- )
-{{/if}}
-{{/each}}
-}]
-{{/neq}}
-{{#neq multipleOf null}}
-multiple_of = {{multipleOf}}
-{{/neq}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/var_equals_cls.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/var_equals_cls.handlebars
deleted file mode 100644
index 4e1177d37ba..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/var_equals_cls.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}} = {{#or getIsBooleanSchemaTrue getIsBooleanSchemaFalse}}{{#if getIsBooleanSchemaTrue}}schemas.AnyTypeSchema{{else}}schemas.NotAnyTypeSchema{{/if}}{{else}}{{#if complexType}}{{complexType}}{{else}}schemas.{{#if isNullable}}Nullable{{/if}}{{#if getIsNull}}None{{/if}}{{#if isAnyType}}AnyType{{/if}}{{#if isMap}}Dict{{/if}}{{#if isArray}}List{{/if}}{{#if isString}}{{#eq format "date"}}Date{{/eq}}{{#eq format "date-time"}}DateTime{{/eq}}{{#eq format "uuid"}}UUID{{/eq}}{{#eq format "number"}}Decimal{{/eq}}{{#eq format "binary"}}Binary{{/eq}}{{#neq format "date"}}{{#neq format "date-time"}}{{#neq format "uuid"}}{{#neq format "number"}}{{#neq format "binary"}}Str{{/neq}}{{/neq}}{{/neq}}{{/neq}}{{/neq}}{{/if}}{{#if isInteger}}{{#eq format "int32"}}Int32{{/eq}}{{#eq format "int64"}}Int64{{/eq}}{{#neq format "int32"}}{{#neq format "int64"}}Int{{/neq}}{{/neq}}{{/if}}{{#if isNumber}}{{#eq format "float"}}Float32{{/eq}}{{#eq format "double"}}Float64{{/eq}}{{#neq format "float"}}{{#neq format "double"}}Number{{/neq}}{{/neq}}{{/if}}{{#if isBoolean}}Bool{{/if}}Schema{{/if}}{{/or}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_templates/xbase_schema.handlebars b/modules/openapi-generator/src/main/resources/python/model_templates/xbase_schema.handlebars
deleted file mode 100644
index d9543507d79..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_templates/xbase_schema.handlebars
+++ /dev/null
@@ -1,109 +0,0 @@
-{{#if isArray}}
-schemas.List{{#if getHasMultipleTypes}}Base,{{else}}Schema{{/if}}
-{{/if}}
-{{#if isMap}}
-schemas.Dict{{#if getHasMultipleTypes}}Base,{{else}}Schema{{/if}}
-{{/if}}
-{{#if isString}}
-{{#if getHasMultipleTypes}}
-{{#eq format "date"}}
-schemas.DateBase,
-{{/eq}}
-{{#eq format "date-time"}}
-schemas.DateTimeBase,
-{{/eq}}
-{{#eq format "uuid"}}
-schemas.UUIDBase,
-{{/eq}}
-{{#eq format "number"}}
-schemas.DecimalBase,
-{{/eq}}
-{{#eq format "binary"}}
-schemas.BinaryBase,
-{{/eq}}
-schemas.StrBase,
-{{else}}
-{{#eq format "date"}}
-schemas.DateSchema
-{{/eq}}
-{{#eq format "date-time"}}
-schemas.DateTimeSchema
-{{/eq}}
-{{#eq format "uuid"}}
-schemas.UUIDSchema
-{{/eq}}
-{{#eq format "number"}}
-schemas.DecimalSchema
-{{/eq}}
-{{#eq format "binary"}}
-schemas.BinarySchema
-{{/eq}}
-{{#neq format "date"}}
-{{#neq format "date-time"}}
-{{#neq format "uuid"}}
-{{#neq format "number"}}
-{{#neq format "binary"}}
-schemas.StrSchema
-{{/neq}}
-{{/neq}}
-{{/neq}}
-{{/neq}}
-{{/neq}}
-{{/if}}
-{{/if}}
-{{#if isNumber}}
-{{#if getHasMultipleTypes}}
-{{#eq format "float"}}
-schemas.Float32Base,
-{{/eq}}
-{{#eq format "double"}}
-schemas.Float64Base,
-{{/eq}}
-schemas.NumberBase,
-{{else}}
-{{#eq format "float"}}
-schemas.Float32Schema
-{{/eq}}
-{{#eq format "double"}}
-schemas.Float64Schema
-{{/eq}}
-{{#neq format "float"}}
-{{#neq format "double"}}
-schemas.NumberSchema
-{{/neq}}
-{{/neq}}
-{{/if}}
-{{/if}}
-{{#if isInteger}}
-{{#if getHasMultipleTypes}}
-{{#eq format "int32"}}
-schemas.Int32Base,
-{{/eq}}
-{{#eq format "int64"}}
-schemas.Int64Base,
-{{/eq}}
-schemas.IntBase,
-{{else}}
-{{#eq format "int32"}}
-schemas.Int32Schema
-{{/eq}}
-{{#eq format "int64"}}
-schemas.Int64Schema
-{{/eq}}
-{{#neq format "int32"}}
-{{#neq format "int64"}}
-schemas.IntSchema
-{{/neq}}
-{{/neq}}
-{{/if}}
-{{/if}}
-{{#if isBoolean}}
-schemas.Bool{{#if getHasMultipleTypes}}Base,{{else}}Schema{{/if}}
-{{/if}}
-{{#if isNull}}
-schemas.None{{#if getHasMultipleTypes}}Base,{{else}}Schema{{/if}}
-{{/if}}
-{{#if getHasMultipleTypes}}
-schemas.Schema,
-schemas.{{#if isNull}}None{{/if}}{{#if isMap}}FrozenDict{{/if}}{{#if isArray}}Tuple{{/if}}{{#if isString }}Str{{/if}}{{#or isInteger isNumber}}Decimal{{/or}}{{#if isBoolean}}Bool{{/if}}Mixin
-{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python/model_test.handlebars b/modules/openapi-generator/src/main/resources/python/model_test.handlebars
deleted file mode 100644
index 9f6de3a8352..00000000000
--- a/modules/openapi-generator/src/main/resources/python/model_test.handlebars
+++ /dev/null
@@ -1,45 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-import unittest
-
-import {{packageName}}
-{{#each models}}
-{{#with model}}
-from {{packageName}}.{{modelPackage}}.{{classFilename}} import {{classname}}
-from {{packageName}} import configuration
-
-
-class Test{{classname}}(unittest.TestCase):
- """{{classname}} unit test stubs"""
- _configuration = configuration.Configuration()
-
-{{#each testCases}}
-{{#with this }}
- def test_{{@key}}_{{#if valid}}passes{{else}}fails{{/if}}(self):
- # {{description}}
-{{#if valid}}
- {{classname}}.from_openapi_data_oapg(
-{{#with data}}
- {{> model_templates/payload_renderer endChar=',' }}
-{{/with}}
- _configuration=self._configuration
- )
-{{else}}
- with self.assertRaises(({{packageName}}.ApiValueError, {{packageName}}.ApiTypeError)):
- {{classname}}.from_openapi_data_oapg(
-{{#with data}}
- {{> model_templates/payload_renderer endChar=','}}
-{{/with}}
- _configuration=self._configuration
- )
-{{/if}}
-{{/with}}
-
-{{/each}}
-{{/with}}
-{{/each}}
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/model_test.mustache b/modules/openapi-generator/src/main/resources/python/model_test.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/model_test.mustache
rename to modules/openapi-generator/src/main/resources/python/model_test.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/partial_header.handlebars b/modules/openapi-generator/src/main/resources/python/partial_header.handlebars
deleted file mode 100644
index 19b633be257..00000000000
--- a/modules/openapi-generator/src/main/resources/python/partial_header.handlebars
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-{{#if appName}}
- {{{appName}}}
-{{/if}}
-
-{{#if appDescription}}
- {{{appDescription}}} # noqa: E501
-{{/if}}
-
- {{#if version}}
- The version of the OpenAPI document: {{{version}}}
- {{/if}}
- {{#if infoEmail}}
- Contact: {{{infoEmail}}}
- {{/if}}
- Generated by: https://openapi-generator.tech
-"""
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/partial_header.mustache b/modules/openapi-generator/src/main/resources/python/partial_header.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/partial_header.mustache
rename to modules/openapi-generator/src/main/resources/python/partial_header.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/pyproject.mustache b/modules/openapi-generator/src/main/resources/python/pyproject.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/pyproject.mustache
rename to modules/openapi-generator/src/main/resources/python/pyproject.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/python_doc_auth_partial.mustache b/modules/openapi-generator/src/main/resources/python/python_doc_auth_partial.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/python_doc_auth_partial.mustache
rename to modules/openapi-generator/src/main/resources/python/python_doc_auth_partial.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/required_libraries.handlebars b/modules/openapi-generator/src/main/resources/python/required_libraries.handlebars
deleted file mode 100644
index f8395307a86..00000000000
--- a/modules/openapi-generator/src/main/resources/python/required_libraries.handlebars
+++ /dev/null
@@ -1,16 +0,0 @@
-{{#if asyncio}}
-{{#if quoted}}"{{/if}}aiohttp >= 3.0.0{{#if quoted}}",{{/if}}
-{{/if}}
-{{#if quoted}}"{{/if}}certifi >= 14.5.14{{#if quoted}}",{{/if}}
-{{#if quoted}}"{{/if}}frozendict ~= 2.3.4{{#if quoted}}",{{/if}}
-{{#if hasHttpSignatureMethods}}
-{{#if quoted}}"{{/if}}pem >= 19.3.0{{#if quoted}}",{{/if}}
-{{#if quoted}}"{{/if}}pycryptodome >= 3.9.0{{#if quoted}}",{{/if}}
-{{/if}}
-{{#if quoted}}"{{/if}}python-dateutil ~= 2.7.0{{#if quoted}}",{{/if}}
-{{#if quoted}}"{{/if}}setuptools >= 21.0.0{{#if quoted}}",{{/if}}
-{{#if tornado}}
-{{#if quoted}}"{{/if}}tornado >= 4.2{{#if quoted}}",{{/if}}
-{{/if}}
-{{#if quoted}}"{{/if}}typing_extensions ~= 4.3.0{{#if quoted}}",{{/if}}
-{{#if quoted}}"{{/if}}urllib3 ~= 1.26.7{{#if quoted}}",{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python/requirements.handlebars b/modules/openapi-generator/src/main/resources/python/requirements.handlebars
deleted file mode 100644
index b1f24de150a..00000000000
--- a/modules/openapi-generator/src/main/resources/python/requirements.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-{{> required_libraries quoted=false }}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/requirements.mustache b/modules/openapi-generator/src/main/resources/python/requirements.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/requirements.mustache
rename to modules/openapi-generator/src/main/resources/python/requirements.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/rest.handlebars b/modules/openapi-generator/src/main/resources/python/rest.handlebars
deleted file mode 100644
index e5e5b8d19b4..00000000000
--- a/modules/openapi-generator/src/main/resources/python/rest.handlebars
+++ /dev/null
@@ -1,250 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-import logging
-import ssl
-from urllib.parse import urlencode
-import typing
-
-import certifi
-import urllib3
-from urllib3._collections import HTTPHeaderDict
-
-from {{packageName}}.exceptions import ApiException, ApiValueError
-
-
-logger = logging.getLogger(__name__)
-
-
-class RESTClientObject(object):
-
- def __init__(self, configuration, pools_size=4, maxsize=None):
- # urllib3.PoolManager will pass all kw parameters to connectionpool
- # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501
- # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501
- # maxsize is the number of requests to host that are allowed in parallel # noqa: E501
- # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501
-
- # cert_reqs
- if configuration.verify_ssl:
- cert_reqs = ssl.CERT_REQUIRED
- else:
- cert_reqs = ssl.CERT_NONE
-
- # ca_certs
- if configuration.ssl_ca_cert:
- ca_certs = configuration.ssl_ca_cert
- else:
- # if not set certificate file, use Mozilla's root certificates.
- ca_certs = certifi.where()
-
- addition_pool_args = {}
- if configuration.assert_hostname is not None:
- addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501
-
- if configuration.retries is not None:
- addition_pool_args['retries'] = configuration.retries
-
- if configuration.tls_server_name:
- addition_pool_args['server_hostname'] = configuration.tls_server_name
-
- if configuration.socket_options is not None:
- addition_pool_args['socket_options'] = configuration.socket_options
-
- if maxsize is None:
- if configuration.connection_pool_maxsize is not None:
- maxsize = configuration.connection_pool_maxsize
- else:
- maxsize = 4
-
- # https pool manager
- if configuration.proxy:
- self.pool_manager = urllib3.ProxyManager(
- num_pools=pools_size,
- maxsize=maxsize,
- cert_reqs=cert_reqs,
- ca_certs=ca_certs,
- cert_file=configuration.cert_file,
- key_file=configuration.key_file,
- proxy_url=configuration.proxy,
- proxy_headers=configuration.proxy_headers,
- **addition_pool_args
- )
- else:
- self.pool_manager = urllib3.PoolManager(
- num_pools=pools_size,
- maxsize=maxsize,
- cert_reqs=cert_reqs,
- ca_certs=ca_certs,
- cert_file=configuration.cert_file,
- key_file=configuration.key_file,
- **addition_pool_args
- )
-
- def request(
- self,
- method: str,
- url: str,
- headers: typing.Optional[HTTPHeaderDict] = None,
- fields: typing.Optional[typing.Tuple[typing.Tuple[str, typing.Any], ...]] = None,
- body: typing.Optional[typing.Union[str, bytes]] = None,
- stream: bool = False,
- timeout: typing.Optional[typing.Union[int, typing.Tuple]] = None,
- ) -> urllib3.HTTPResponse:
- """Perform requests.
-
- :param method: http request method
- :param url: http request url
- :param headers: http request headers
- :param body: request body, for other types
- :param fields: request parameters for
- `application/x-www-form-urlencoded`
- or `multipart/form-data`
- :param stream: if True, the urllib3.HTTPResponse object will
- be returned without reading/decoding response
- data. Default is False.
- :param timeout: timeout setting for this request. If one
- number provided, it will be total request
- timeout. It can also be a pair (tuple) of
- (connection, read) timeouts.
- """
- method = method.upper()
- assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT',
- 'PATCH', 'OPTIONS']
-
- if fields and body:
- raise ApiValueError(
- "body parameter cannot be used with fields parameter."
- )
-
- fields = fields or {}
- headers = headers or {}
-
- if timeout:
- if isinstance(timeout, (int, float)): # noqa: E501,F821
- timeout = urllib3.Timeout(total=timeout)
- elif (isinstance(timeout, tuple) and
- len(timeout) == 2):
- timeout = urllib3.Timeout(connect=timeout[0], read=timeout[1])
-
- try:
- # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
- if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
- if 'Content-Type' not in headers and body is None:
- r = self.pool_manager.request(
- method,
- url,
- preload_content=not stream,
- timeout=timeout,
- headers=headers
- )
- elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501
- r = self.pool_manager.request(
- method, url,
- body=body,
- fields=fields,
- encode_multipart=False,
- preload_content=not stream,
- timeout=timeout,
- headers=headers)
- elif headers['Content-Type'] == 'multipart/form-data':
- # must del headers['Content-Type'], or the correct
- # Content-Type which generated by urllib3 will be
- # overwritten.
- del headers['Content-Type']
- r = self.pool_manager.request(
- method, url,
- fields=fields,
- encode_multipart=True,
- preload_content=not stream,
- timeout=timeout,
- headers=headers)
- # Pass a `string` parameter directly in the body to support
- # other content types than Json when `body` argument is
- # provided in serialized form
- elif isinstance(body, str) or isinstance(body, bytes):
- request_body = body
- r = self.pool_manager.request(
- method, url,
- body=request_body,
- preload_content=not stream,
- timeout=timeout,
- headers=headers)
- else:
- # Cannot generate the request from given parameters
- msg = """Cannot prepare a request message for provided
- arguments. Please check that your arguments match
- declared content type."""
- raise ApiException(status=0, reason=msg)
- # For `GET`, `HEAD`
- else:
- r = self.pool_manager.request(method, url,
- preload_content=not stream,
- timeout=timeout,
- headers=headers)
- except urllib3.exceptions.SSLError as e:
- msg = "{0}\n{1}".format(type(e).__name__, str(e))
- raise ApiException(status=0, reason=msg)
-
- if not stream:
- # log response body
- logger.debug("response body: %s", r.data)
-
- return r
-
- def GET(self, url, headers=None, stream=False,
- timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("GET", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- fields=fields)
-
- def HEAD(self, url, headers=None, stream=False,
- timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("HEAD", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- fields=fields)
-
- def OPTIONS(self, url, headers=None,
- body=None, stream=False, timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("OPTIONS", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- body=body, fields=fields)
-
- def DELETE(self, url, headers=None, body=None,
- stream=False, timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("DELETE", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- body=body, fields=fields)
-
- def POST(self, url, headers=None,
- body=None, stream=False, timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("POST", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- body=body, fields=fields)
-
- def PUT(self, url, headers=None,
- body=None, stream=False, timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("PUT", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- body=body, fields=fields)
-
- def PATCH(self, url, headers=None,
- body=None, stream=False, timeout=None, fields=None) -> urllib3.HTTPResponse:
- return self.request("PATCH", url,
- headers=headers,
- stream=stream,
- timeout=timeout,
- body=body, fields=fields)
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/rest.mustache b/modules/openapi-generator/src/main/resources/python/rest.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/rest.mustache
rename to modules/openapi-generator/src/main/resources/python/rest.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/schema_doc.handlebars b/modules/openapi-generator/src/main/resources/python/schema_doc.handlebars
deleted file mode 100644
index 8e67813ed6e..00000000000
--- a/modules/openapi-generator/src/main/resources/python/schema_doc.handlebars
+++ /dev/null
@@ -1,136 +0,0 @@
-
-{{#if description}}
-{{&description}}
-
-{{/if}}
-## Model Type Info
-Input Type | Accessed Type | Description | Notes
------------- | ------------- | ------------- | -------------
-{{> model_templates/schema_python_types }} | {{> model_templates/schema_accessed_types }} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}
-{{#or vars additionalProperties}}
-
-### Dictionary Keys
-Key | Input Type | Accessed Type | Description | Notes
------------- | ------------- | ------------- | ------------- | -------------
- {{#each getRequiredVarsMap}}
-**{{#with this}}{{#unless complexType}}{{#or isArray isMap composedSchemas}}[{{/or}}{{/unless}}{{/with}}{{{@key}}}{{#with this}}{{#unless complexType}}{{#or isArray isMap composedSchemas}}](#{{baseName}}){{/or}}{{/unless}}{{/with}}** | {{#with this}}{{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}{{/with}}
- {{/each}}
- {{#each vars}}
- {{#unless required}}
-**{{#unless complexType}}{{#or isArray isMap composedSchemas}}[{{/or}}{{/unless}}{{baseName}}{{#unless complexType}}{{#or isArray isMap composedSchemas}}](#{{baseName}}){{/or}}{{/unless}}** | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | [optional] {{> model_templates/notes_msg }}
- {{/unless}}
- {{/each}}
- {{#with additionalProperties}}
- {{#unless getIsBooleanSchemaFalse}}
- {{#if getIsBooleanSchemaTrue}}
-**any_string_name** | {{> model_templates/schema_python_types }} | {{> model_templates/schema_accessed_types }} | any string name can be used but the value must be the correct type{{#if description}} {{description}}{{/if}} | [optional]
- {{else}}
-**{{#unless complexType}}{{#or isArray isMap composedSchemas}}[{{/or}}{{/unless}}any_string_name{{#unless complexType}}{{#or isArray isMap composedSchemas}}](#any_string_name){{/or}}{{/unless}}** | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | any string name can be used but the value must be the correct type{{#if description}} {{description}}{{/if}} | [optional] {{> model_templates/notes_msg }}
- {{/if}}
- {{/unless}}
- {{else}}
-**any_string_name** | dict, frozendict.frozendict, str, date, datetime, int, float, bool, decimal.Decimal, None, list, tuple, bytes, io.FileIO, io.BufferedReader | frozendict.frozendict, str, BoolClass, decimal.Decimal, NoneClass, tuple, bytes, FileIO | any string name can be used but the value must be the correct type | [optional]
- {{/with}}
-{{/or}}
-{{#each vars}}
-{{#unless complexType}}
-{{#or isArray isMap composedSchemas}}
-
-# {{baseName}}
-{{> schema_doc }}
-{{/or}}
-{{/unless}}
-{{/each}}
-{{#with additionalProperties}}
-{{#unless getIsBooleanSchemaFalse}}
-{{#unless getIsBooleanSchemaTrue}}
-{{#unless complexType}}
-{{#or isArray isMap composedSchemas}}
-
-# any_string_name
-{{> schema_doc }}
-{{/or}}
-{{/unless}}
-{{/unless}}
-{{/unless}}
-{{/with}}
-{{#if items}}
-
-### Tuple Items
-Class Name | Input Type | Accessed Type | Description | Notes
-------------- | ------------- | ------------- | ------------- | -------------
-{{#with items}}
-{{#unless complexType}}{{#or isArray isMap composedSchemas}}[{{/or}}{{baseName}}{{#or isArray isMap composedSchemas}}](#{{baseName}}){{/or}}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}
-{{#unless complexType}}
-{{#or isArray isMap composedSchemas}}
-
-# {{baseName}}
-{{> schema_doc }}
-{{/or}}
-{{/unless}}
-{{/with}}
-{{/if}}
-{{#if composedSchemas}}
-{{#with composedSchemas}}
-
-### Composed Schemas (allOf/anyOf/oneOf/not)
-{{#if allOf}}
-#### allOf
-Class Name | Input Type | Accessed Type | Description | Notes
-------------- | ------------- | ------------- | ------------- | -------------
-{{#each allOf}}
-{{#if complexType}}[{{dataType}}]({{complexTypePrefix}}{{complexType}}.md){{else}}[{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}](#{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}){{/if}} | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}
-{{/each}}
-{{#each allOf}}
-{{#unless complexType}}
-
-# {{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}
-{{> schema_doc }}
-{{/unless}}
-{{/each}}
-{{/if}}
-{{#if anyOf}}
-#### anyOf
-Class Name | Input Type | Accessed Type | Description | Notes
-------------- | ------------- | ------------- | ------------- | -------------
-{{#each anyOf}}
-{{#if complexType}}[{{dataType}}]({{complexTypePrefix}}{{complexType}}.md){{else}}[{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}](#{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}){{/if}} | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}
-{{/each}}
-{{#each anyOf}}
-{{#unless complexType}}
-
-# {{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}
-{{> schema_doc }}
-{{/unless}}
-{{/each}}
-{{/if}}
-{{#if oneOf}}
-#### oneOf
-Class Name | Input Type | Accessed Type | Description | Notes
-------------- | ------------- | ------------- | ------------- | -------------
-{{#each oneOf}}
-{{#if complexType}}[{{dataType}}]({{complexTypePrefix}}{{complexType}}.md){{else}}[{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}](#{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}){{/if}} | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}
-{{/each}}
-{{#each oneOf}}
-{{#unless complexType}}
-
-# {{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}
-{{> schema_doc }}
-{{/unless}}
-{{/each}}
-{{/if}}
-{{#if not}}
-#### not
-Class Name | Input Type | Accessed Type | Description | Notes
-------------- | ------------- | ------------- | ------------- | -------------
-{{#with not}}
-{{#if complexType}}[{{dataType}}]({{complexTypePrefix}}{{complexType}}.md){{else}}[{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}](#{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}){{/if}} | {{#unless complexType}}{{> model_templates/schema_python_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#unless complexType}}{{> model_templates/schema_accessed_types }}{{/unless}}{{#if complexType}}[**{{dataType}}**]({{complexTypePrefix}}{{complexType}}.md){{/if}} | {{#if description}}{{description}}{{/if}} | {{> model_templates/notes_msg }}
-{{#unless complexType}}
-
-# {{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}
-{{> schema_doc }}
-{{/unless}}
-{{/with}}
-{{/if}}
-{{/with}}
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/schemas.handlebars b/modules/openapi-generator/src/main/resources/python/schemas.handlebars
deleted file mode 100644
index f06267b4045..00000000000
--- a/modules/openapi-generator/src/main/resources/python/schemas.handlebars
+++ /dev/null
@@ -1,2508 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-from collections import defaultdict
-from datetime import date, datetime, timedelta # noqa: F401
-import functools
-import decimal
-import io
-import re
-import types
-import typing
-import uuid
-
-from dateutil.parser.isoparser import isoparser, _takes_ascii
-import frozendict
-
-from {{packageName}}.exceptions import (
- ApiTypeError,
- ApiValueError,
-)
-from {{packageName}}.configuration import (
- Configuration,
-)
-
-
-class Unset(object):
- """
- An instance of this class is set as the default value for object type(dict) properties that are optional
- When a property has an unset value, that property will not be assigned in the dict
- """
- pass
-
-unset = Unset()
-
-none_type = type(None)
-file_type = io.IOBase
-
-
-class FileIO(io.FileIO):
- """
- A class for storing files
- Note: this class is not immutable
- """
-
- def __new__(cls, _arg: typing.Union[io.FileIO, io.BufferedReader]):
- if isinstance(_arg, (io.FileIO, io.BufferedReader)):
- if _arg.closed:
- raise ApiValueError('Invalid file state; file is closed and must be open')
- _arg.close()
- inst = super(FileIO, cls).__new__(cls, _arg.name)
- super(FileIO, inst).__init__(_arg.name)
- return inst
- raise ApiValueError('FileIO must be passed _arg which contains the open file')
-
- def __init__(self, _arg: typing.Union[io.FileIO, io.BufferedReader]):
- pass
-
-
-def update(d: dict, u: dict):
- """
- Adds u to d
- Where each dict is defaultdict(set)
- """
- if not u:
- return d
- for k, v in u.items():
- if k not in d:
- d[k] = v
- else:
- d[k] = d[k] | v
-
-
-class ValidationMetadata(frozendict.frozendict):
- """
- A class storing metadata that is needed to validate OpenApi Schema payloads
- """
- def __new__(
- cls,
- path_to_item: typing.Tuple[typing.Union[str, int], ...] = tuple(['args[0]']),
- from_server: bool = False,
- configuration: typing.Optional[Configuration] = None,
- seen_classes: typing.FrozenSet[typing.Type] = frozenset(),
- validated_path_to_schemas: typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Type]] = frozendict.frozendict()
- ):
- """
- Args:
- path_to_item: the path to the current data being instantiated.
- For {'a': [1]} if the code is handling, 1, then the path is ('args[0]', 'a', 0)
- This changes from location to location
- from_server: whether or not this data came form the server
- True when receiving server data
- False when instantiating model with client side data not form the server
- This does not change from location to location
- configuration: the Configuration instance to use
- This is needed because in Configuration:
- - one can disable validation checking
- This does not change from location to location
- seen_classes: when deserializing data that matches multiple schemas, this is used to store
- the schemas that have been traversed. This is used to stop processing when a cycle is seen.
- This changes from location to location
- validated_path_to_schemas: stores the already validated schema classes for a given path location
- This does not change from location to location
- """
- return super().__new__(
- cls,
- path_to_item=path_to_item,
- from_server=from_server,
- configuration=configuration,
- seen_classes=seen_classes,
- validated_path_to_schemas=validated_path_to_schemas
- )
-
- def validation_ran_earlier(self, cls: type) -> bool:
- validated_schemas = self.validated_path_to_schemas.get(self.path_to_item, set())
- validation_ran_earlier = validated_schemas and cls in validated_schemas
- if validation_ran_earlier:
- return True
- if cls in self.seen_classes:
- return True
- return False
-
- @property
- def path_to_item(self) -> typing.Tuple[typing.Union[str, int], ...]:
- return self.get('path_to_item')
-
- @property
- def from_server(self) -> bool:
- return self.get('from_server')
-
- @property
- def configuration(self) -> typing.Optional[Configuration]:
- return self.get('configuration')
-
- @property
- def seen_classes(self) -> typing.FrozenSet[typing.Type]:
- return self.get('seen_classes')
-
- @property
- def validated_path_to_schemas(self) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Type]]:
- return self.get('validated_path_to_schemas')
-
-
-def add_deeper_validated_schemas(validation_metadata: ValidationMetadata, path_to_schemas: dict):
- # this is called if validation_ran_earlier and current and deeper locations need to be added
- current_path_to_item = validation_metadata.path_to_item
- other_path_to_schemas = {}
- for path_to_item, schemas in validation_metadata.validated_path_to_schemas.items():
- if len(path_to_item) < len(current_path_to_item):
- continue
- path_begins_with_current_path = path_to_item[:len(current_path_to_item)] == current_path_to_item
- if path_begins_with_current_path:
- other_path_to_schemas[path_to_item] = schemas
- update(path_to_schemas, other_path_to_schemas)
-
-
-class Singleton:
- """
- Enums and singletons are the same
- The same instance is returned for a given key of (cls, _arg)
- """
- _instances = {}
-
- def __new__(cls, _arg: typing.Any, **kwargs):
- """
- cls base classes: BoolClass, NoneClass, str, decimal.Decimal
- The 3rd key is used in the tuple below for a corner case where an enum contains integer 1
- However 1.0 can also be ingested into that enum schema because 1.0 == 1 and
- Decimal('1.0') == Decimal('1')
- But if we omitted the 3rd value in the key, then Decimal('1.0') would be stored as Decimal('1')
- and json serializing that instance would be '1' rather than the expected '1.0'
- Adding the 3rd value, the str of _arg ensures that 1.0 -> Decimal('1.0') which is serialized as 1.0
- """
- key = (cls, _arg, str(_arg))
- if key not in cls._instances:
- if isinstance(_arg, (none_type, bool, BoolClass, NoneClass)):
- inst = super().__new__(cls)
- cls._instances[key] = inst
- else:
- cls._instances[key] = super().__new__(cls, _arg)
- return cls._instances[key]
-
- def __repr__(self):
- if isinstance(self, NoneClass):
- return f'<{self.__class__.__name__}: None>'
- elif isinstance(self, BoolClass):
- if bool(self):
- return f'<{self.__class__.__name__}: True>'
- return f'<{self.__class__.__name__}: False>'
- return f'<{self.__class__.__name__}: {super().__repr__()}>'
-
-
-class classproperty:
-
- def __init__(self, fget):
- self.fget = fget
-
- def __get__(self, owner_self, owner_cls):
- return self.fget(owner_cls)
-
-
-class NoneClass(Singleton):
- @classproperty
- def NONE(cls):
- return cls(None)
-
- def __bool__(self) -> bool:
- return False
-
-
-class BoolClass(Singleton):
- @classproperty
- def TRUE(cls):
- return cls(True)
-
- @classproperty
- def FALSE(cls):
- return cls(False)
-
- @functools.lru_cache()
- def __bool__(self) -> bool:
- for key, instance in self._instances.items():
- if self is instance:
- return bool(key[1])
- raise ValueError('Unable to find the boolean value of this instance')
-
-
-class MetaOapgTyped:
- exclusive_maximum: typing.Union[int, float]
- inclusive_maximum: typing.Union[int, float]
- exclusive_minimum: typing.Union[int, float]
- inclusive_minimum: typing.Union[int, float]
- max_items: int
- min_items: int
- discriminator: typing.Dict[str, typing.Dict[str, typing.Type['Schema']]]
-
-
- class properties:
- # to hold object properties
- pass
-
- additional_properties: typing.Optional[typing.Type['Schema']]
- max_properties: int
- min_properties: int
- all_of: typing.List[typing.Type['Schema']]
- one_of: typing.List[typing.Type['Schema']]
- any_of: typing.List[typing.Type['Schema']]
- not_schema: typing.Type['Schema']
- max_length: int
- min_length: int
- items: typing.Type['Schema']
-
-
-class Schema:
- """
- the base class of all swagger/openapi schemas/models
- """
- __inheritable_primitive_types_set = {decimal.Decimal, str, tuple, frozendict.frozendict, FileIO, bytes, BoolClass, NoneClass}
- _types: typing.Set[typing.Type]
- MetaOapg = MetaOapgTyped
-
- @staticmethod
- def __get_valid_classes_phrase(input_classes):
- """Returns a string phrase describing what types are allowed"""
- all_classes = list(input_classes)
- all_classes = sorted(all_classes, key=lambda cls: cls.__name__)
- all_class_names = [cls.__name__ for cls in all_classes]
- if len(all_class_names) == 1:
- return "is {0}".format(all_class_names[0])
- return "is one of [{0}]".format(", ".join(all_class_names))
-
- @staticmethod
- def _get_class_oapg(item_cls: typing.Union[types.FunctionType, staticmethod, typing.Type['Schema']]) -> typing.Type['Schema']:
- if isinstance(item_cls, types.FunctionType):
- # referenced schema
- return item_cls()
- elif isinstance(item_cls, staticmethod):
- # referenced schema
- return item_cls.__func__()
- return item_cls
-
- @classmethod
- def __type_error_message(
- cls, var_value=None, var_name=None, valid_classes=None, key_type=None
- ):
- """
- Keyword Args:
- var_value (any): the variable which has the type_error
- var_name (str): the name of the variable which has the typ error
- valid_classes (tuple): the accepted classes for current_item's
- value
- key_type (bool): False if our value is a value in a dict
- True if it is a key in a dict
- False if our item is an item in a tuple
- """
- key_or_value = "value"
- if key_type:
- key_or_value = "key"
- valid_classes_phrase = cls.__get_valid_classes_phrase(valid_classes)
- msg = "Invalid type. Required {1} type {2} and " "passed type was {3}".format(
- var_name,
- key_or_value,
- valid_classes_phrase,
- type(var_value).__name__,
- )
- return msg
-
- @classmethod
- def __get_type_error(cls, var_value, path_to_item, valid_classes, key_type=False):
- error_msg = cls.__type_error_message(
- var_name=path_to_item[-1],
- var_value=var_value,
- valid_classes=valid_classes,
- key_type=key_type,
- )
- return ApiTypeError(
- error_msg,
- path_to_item=path_to_item,
- valid_classes=valid_classes,
- key_type=key_type,
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]]:
- """
- Schema _validate_oapg
- All keyword validation except for type checking was done in calling stack frames
- If those validations passed, the validated classes are collected in path_to_schemas
-
- Returns:
- path_to_schemas: a map of path to schemas
-
- Raises:
- ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes
- ApiTypeError: when the input type is not in the list of allowed spec types
- """
- base_class = type(arg)
- if base_class not in cls._types:
- raise cls.__get_type_error(
- arg,
- validation_metadata.path_to_item,
- cls._types,
- key_type=False,
- )
-
- path_to_schemas = {validation_metadata.path_to_item: set()}
- path_to_schemas[validation_metadata.path_to_item].add(cls)
- path_to_schemas[validation_metadata.path_to_item].add(base_class)
- return path_to_schemas
-
- @staticmethod
- def _process_schema_classes_oapg(
- schema_classes: typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]
- ):
- """
- Processes and mutates schema_classes
- If a SomeSchema is a subclass of DictSchema then remove DictSchema because it is already included
- """
- if len(schema_classes) < 2:
- return
- if len(schema_classes) > 2 and UnsetAnyTypeSchema in schema_classes:
- schema_classes.remove(UnsetAnyTypeSchema)
- x_schema = schema_type_classes & schema_classes
- if not x_schema:
- return
- x_schema = x_schema.pop()
- if any(c is not x_schema and issubclass(c, x_schema) for c in schema_classes):
- # needed to not have a mro error in get_new_class
- schema_classes.remove(x_schema)
-
- @classmethod
- def __get_new_cls(
- cls,
- arg,
- validation_metadata: ValidationMetadata
- ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Type['Schema']]:
- """
- Make a new dynamic class and return an instance of that class
- We are making an instance of cls, but instead of making cls
- make a new class, new_cls
- which includes dynamic bases including cls
- return an instance of that new class
-
- Dict property + List Item Assignment Use cases:
- 1. value is NOT an instance of the required schema class
- the value is validated by _validate_oapg
- _validate_oapg returns a key value pair
- where the key is the path to the item, and the value will be the required manufactured class
- made out of the matching schemas
- 2. value is an instance of the correct schema type
- the value is NOT validated by _validate_oapg, _validate_oapg only checks that the instance is of the correct schema type
- for this value, _validate_oapg does NOT return an entry for it in _path_to_schemas
- and in list/dict _get_items_oapg,_get_properties_oapg the value will be directly assigned
- because value is of the correct type, and validation was run earlier when the instance was created
- """
- _path_to_schemas = {}
- if validation_metadata.validation_ran_earlier(cls):
- add_deeper_validated_schemas(validation_metadata, _path_to_schemas)
- else:
- other_path_to_schemas = cls._validate_oapg(arg, validation_metadata=validation_metadata)
- update(_path_to_schemas, other_path_to_schemas)
- # loop through it make a new class for each entry
- # do not modify the returned result because it is cached and we would be modifying the cached value
- path_to_schemas = {}
- for path, schema_classes in _path_to_schemas.items():
- """
- Use cases
- 1. N number of schema classes + enum + type != bool/None, classes in path_to_schemas: tuple/frozendict.frozendict/str/Decimal/bytes/FileIo
- needs Singleton added
- 2. N number of schema classes + enum + type == bool/None, classes in path_to_schemas: BoolClass/NoneClass
- Singleton already added
- 3. N number of schema classes, classes in path_to_schemas: BoolClass/NoneClass/tuple/frozendict.frozendict/str/Decimal/bytes/FileIo
- """
- cls._process_schema_classes_oapg(schema_classes)
- enum_schema = any(
- issubclass(this_cls, EnumBase) for this_cls in schema_classes)
- inheritable_primitive_type = schema_classes.intersection(cls.__inheritable_primitive_types_set)
- chosen_schema_classes = schema_classes - inheritable_primitive_type
- suffix = tuple(inheritable_primitive_type)
- if enum_schema and suffix[0] not in {NoneClass, BoolClass}:
- suffix = (Singleton,) + suffix
-
- used_classes = tuple(sorted(chosen_schema_classes, key=lambda a_cls: a_cls.__name__)) + suffix
- mfg_cls = get_new_class(class_name='DynamicSchema', bases=used_classes)
- path_to_schemas[path] = mfg_cls
-
- return path_to_schemas
-
- @classmethod
- def _get_new_instance_without_conversion_oapg(
- cls,
- arg: typing.Any,
- path_to_item: typing.Tuple[typing.Union[str, int], ...],
- path_to_schemas: typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Type['Schema']]
- ):
- # We have a Dynamic class and we are making an instance of it
- if issubclass(cls, frozendict.frozendict) and issubclass(cls, DictBase):
- properties = cls._get_properties_oapg(arg, path_to_item, path_to_schemas)
- return super(Schema, cls).__new__(cls, properties)
- elif issubclass(cls, tuple) and issubclass(cls, ListBase):
- items = cls._get_items_oapg(arg, path_to_item, path_to_schemas)
- return super(Schema, cls).__new__(cls, items)
- """
- str = openapi str, date, and datetime
- decimal.Decimal = openapi int and float
- FileIO = openapi binary type and the user inputs a file
- bytes = openapi binary type and the user inputs bytes
- """
- return super(Schema, cls).__new__(cls, arg)
-
- @classmethod
- def from_openapi_data_oapg(
- cls,
- arg: typing.Union[
- str,
- date,
- datetime,
- int,
- float,
- decimal.Decimal,
- bool,
- None,
- 'Schema',
- dict,
- frozendict.frozendict,
- tuple,
- list,
- io.FileIO,
- io.BufferedReader,
- bytes
- ],
- _configuration: typing.Optional[Configuration]
- ):
- """
- Schema from_openapi_data_oapg
- """
- from_server = True
- validated_path_to_schemas = {}
- arg = cast_to_allowed_types(arg, from_server, validated_path_to_schemas)
- validation_metadata = ValidationMetadata(
- from_server=from_server, configuration=_configuration, validated_path_to_schemas=validated_path_to_schemas)
- path_to_schemas = cls.__get_new_cls(arg, validation_metadata)
- new_cls = path_to_schemas[validation_metadata.path_to_item]
- new_inst = new_cls._get_new_instance_without_conversion_oapg(
- arg,
- validation_metadata.path_to_item,
- path_to_schemas
- )
- return new_inst
-
- @staticmethod
- def __get_input_dict(*args, **kwargs) -> frozendict.frozendict:
- input_dict = {}
- if args and isinstance(args[0], (dict, frozendict.frozendict)):
- input_dict.update(args[0])
- if kwargs:
- input_dict.update(kwargs)
- return frozendict.frozendict(input_dict)
-
- @staticmethod
- def __remove_unsets(kwargs):
- return {key: val for key, val in kwargs.items() if val is not unset}
-
- def __new__(cls, *_args: typing.Union[dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, 'Schema'], _configuration: typing.Optional[Configuration] = None, **kwargs: typing.Union[dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, 'Schema', Unset]):
- """
- Schema __new__
-
- Args:
- _args (int/float/decimal.Decimal/str/list/tuple/dict/frozendict.frozendict/bool/None): the value
- kwargs (str, int/float/decimal.Decimal/str/list/tuple/dict/frozendict.frozendict/bool/None): dict values
- _configuration: contains the Configuration that enables json schema validation keywords
- like minItems, minLength etc
-
- Note: double underscores are used here because pycharm thinks that these variables
- are instance properties if they are named normally :(
- """
- __kwargs = cls.__remove_unsets(kwargs)
- if not _args and not __kwargs:
- raise TypeError(
- 'No input given. args or kwargs must be given.'
- )
- if not __kwargs and _args and not isinstance(_args[0], dict):
- __arg = _args[0]
- else:
- __arg = cls.__get_input_dict(*_args, **__kwargs)
- __from_server = False
- __validated_path_to_schemas = {}
- __arg = cast_to_allowed_types(
- __arg, __from_server, __validated_path_to_schemas)
- __validation_metadata = ValidationMetadata(
- configuration=_configuration, from_server=__from_server, validated_path_to_schemas=__validated_path_to_schemas)
- __path_to_schemas = cls.__get_new_cls(__arg, __validation_metadata)
- __new_cls = __path_to_schemas[__validation_metadata.path_to_item]
- return __new_cls._get_new_instance_without_conversion_oapg(
- __arg,
- __validation_metadata.path_to_item,
- __path_to_schemas
- )
-
- def __init__(
- self,
- *_args: typing.Union[
- dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, 'Schema'],
- _configuration: typing.Optional[Configuration] = None,
- **kwargs: typing.Union[
- dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, 'Schema', Unset
- ]
- ):
- """
- this is needed to fix 'Unexpected argument' warning in pycharm
- this code does nothing because all Schema instances are immutable
- this means that all input data is passed into and used in new, and after the new instance is made
- no new attributes are assigned and init is not used
- """
- pass
-
-"""
-import itertools
-data_types = ('None', 'FrozenDict', 'Tuple', 'Str', 'Decimal', 'Bool')
-type_to_cls = {
- 'None': 'NoneClass',
- 'FrozenDict': 'frozendict.frozendict',
- 'Tuple': 'tuple',
- 'Str': 'str',
- 'Decimal': 'decimal.Decimal',
- 'Bool': 'BoolClass'
-}
-cls_tuples = [v for v in itertools.combinations(data_types, 5)]
-typed_classes = [f"class {''.join(cls_tuple)}Mixin({', '.join(type_to_cls[typ] for typ in cls_tuple)}):\n pass" for cls_tuple in cls_tuples]
-for cls in typed_classes:
- print(cls)
-object_classes = [f"{''.join(cls_tuple)}Mixin = object" for cls_tuple in cls_tuples]
-for cls in object_classes:
- print(cls)
-"""
-if typing.TYPE_CHECKING:
- # qty 1
- NoneMixin = NoneClass
- FrozenDictMixin = frozendict.frozendict
- TupleMixin = tuple
- StrMixin = str
- DecimalMixin = decimal.Decimal
- BoolMixin = BoolClass
- BytesMixin = bytes
- FileMixin = FileIO
- # qty 2
- class BinaryMixin(bytes, FileIO):
- pass
- class NoneFrozenDictMixin(NoneClass, frozendict.frozendict):
- pass
- class NoneTupleMixin(NoneClass, tuple):
- pass
- class NoneStrMixin(NoneClass, str):
- pass
- class NoneDecimalMixin(NoneClass, decimal.Decimal):
- pass
- class NoneBoolMixin(NoneClass, BoolClass):
- pass
- class FrozenDictTupleMixin(frozendict.frozendict, tuple):
- pass
- class FrozenDictStrMixin(frozendict.frozendict, str):
- pass
- class FrozenDictDecimalMixin(frozendict.frozendict, decimal.Decimal):
- pass
- class FrozenDictBoolMixin(frozendict.frozendict, BoolClass):
- pass
- class TupleStrMixin(tuple, str):
- pass
- class TupleDecimalMixin(tuple, decimal.Decimal):
- pass
- class TupleBoolMixin(tuple, BoolClass):
- pass
- class StrDecimalMixin(str, decimal.Decimal):
- pass
- class StrBoolMixin(str, BoolClass):
- pass
- class DecimalBoolMixin(decimal.Decimal, BoolClass):
- pass
- # qty 3
- class NoneFrozenDictTupleMixin(NoneClass, frozendict.frozendict, tuple):
- pass
- class NoneFrozenDictStrMixin(NoneClass, frozendict.frozendict, str):
- pass
- class NoneFrozenDictDecimalMixin(NoneClass, frozendict.frozendict, decimal.Decimal):
- pass
- class NoneFrozenDictBoolMixin(NoneClass, frozendict.frozendict, BoolClass):
- pass
- class NoneTupleStrMixin(NoneClass, tuple, str):
- pass
- class NoneTupleDecimalMixin(NoneClass, tuple, decimal.Decimal):
- pass
- class NoneTupleBoolMixin(NoneClass, tuple, BoolClass):
- pass
- class NoneStrDecimalMixin(NoneClass, str, decimal.Decimal):
- pass
- class NoneStrBoolMixin(NoneClass, str, BoolClass):
- pass
- class NoneDecimalBoolMixin(NoneClass, decimal.Decimal, BoolClass):
- pass
- class FrozenDictTupleStrMixin(frozendict.frozendict, tuple, str):
- pass
- class FrozenDictTupleDecimalMixin(frozendict.frozendict, tuple, decimal.Decimal):
- pass
- class FrozenDictTupleBoolMixin(frozendict.frozendict, tuple, BoolClass):
- pass
- class FrozenDictStrDecimalMixin(frozendict.frozendict, str, decimal.Decimal):
- pass
- class FrozenDictStrBoolMixin(frozendict.frozendict, str, BoolClass):
- pass
- class FrozenDictDecimalBoolMixin(frozendict.frozendict, decimal.Decimal, BoolClass):
- pass
- class TupleStrDecimalMixin(tuple, str, decimal.Decimal):
- pass
- class TupleStrBoolMixin(tuple, str, BoolClass):
- pass
- class TupleDecimalBoolMixin(tuple, decimal.Decimal, BoolClass):
- pass
- class StrDecimalBoolMixin(str, decimal.Decimal, BoolClass):
- pass
- # qty 4
- class NoneFrozenDictTupleStrMixin(NoneClass, frozendict.frozendict, tuple, str):
- pass
- class NoneFrozenDictTupleDecimalMixin(NoneClass, frozendict.frozendict, tuple, decimal.Decimal):
- pass
- class NoneFrozenDictTupleBoolMixin(NoneClass, frozendict.frozendict, tuple, BoolClass):
- pass
- class NoneFrozenDictStrDecimalMixin(NoneClass, frozendict.frozendict, str, decimal.Decimal):
- pass
- class NoneFrozenDictStrBoolMixin(NoneClass, frozendict.frozendict, str, BoolClass):
- pass
- class NoneFrozenDictDecimalBoolMixin(NoneClass, frozendict.frozendict, decimal.Decimal, BoolClass):
- pass
- class NoneTupleStrDecimalMixin(NoneClass, tuple, str, decimal.Decimal):
- pass
- class NoneTupleStrBoolMixin(NoneClass, tuple, str, BoolClass):
- pass
- class NoneTupleDecimalBoolMixin(NoneClass, tuple, decimal.Decimal, BoolClass):
- pass
- class NoneStrDecimalBoolMixin(NoneClass, str, decimal.Decimal, BoolClass):
- pass
- class FrozenDictTupleStrDecimalMixin(frozendict.frozendict, tuple, str, decimal.Decimal):
- pass
- class FrozenDictTupleStrBoolMixin(frozendict.frozendict, tuple, str, BoolClass):
- pass
- class FrozenDictTupleDecimalBoolMixin(frozendict.frozendict, tuple, decimal.Decimal, BoolClass):
- pass
- class FrozenDictStrDecimalBoolMixin(frozendict.frozendict, str, decimal.Decimal, BoolClass):
- pass
- class TupleStrDecimalBoolMixin(tuple, str, decimal.Decimal, BoolClass):
- pass
- # qty 5
- class NoneFrozenDictTupleStrDecimalMixin(NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal):
- pass
- class NoneFrozenDictTupleStrBoolMixin(NoneClass, frozendict.frozendict, tuple, str, BoolClass):
- pass
- class NoneFrozenDictTupleDecimalBoolMixin(NoneClass, frozendict.frozendict, tuple, decimal.Decimal, BoolClass):
- pass
- class NoneFrozenDictStrDecimalBoolMixin(NoneClass, frozendict.frozendict, str, decimal.Decimal, BoolClass):
- pass
- class NoneTupleStrDecimalBoolMixin(NoneClass, tuple, str, decimal.Decimal, BoolClass):
- pass
- class FrozenDictTupleStrDecimalBoolMixin(frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass):
- pass
- # qty 6
- class NoneFrozenDictTupleStrDecimalBoolMixin(NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass):
- pass
- # qty 8
- class NoneFrozenDictTupleStrDecimalBoolFileBytesMixin(NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass, FileIO, bytes):
- pass
-else:
- # qty 1
- class NoneMixin:
- _types = {NoneClass}
- class FrozenDictMixin:
- _types = {frozendict.frozendict}
- class TupleMixin:
- _types = {tuple}
- class StrMixin:
- _types = {str}
- class DecimalMixin:
- _types = {decimal.Decimal}
- class BoolMixin:
- _types = {BoolClass}
- class BytesMixin:
- _types = {bytes}
- class FileMixin:
- _types = {FileIO}
- # qty 2
- class BinaryMixin:
- _types = {bytes, FileIO}
- class NoneFrozenDictMixin:
- _types = {NoneClass, frozendict.frozendict}
- class NoneTupleMixin:
- _types = {NoneClass, tuple}
- class NoneStrMixin:
- _types = {NoneClass, str}
- class NoneDecimalMixin:
- _types = {NoneClass, decimal.Decimal}
- class NoneBoolMixin:
- _types = {NoneClass, BoolClass}
- class FrozenDictTupleMixin:
- _types = {frozendict.frozendict, tuple}
- class FrozenDictStrMixin:
- _types = {frozendict.frozendict, str}
- class FrozenDictDecimalMixin:
- _types = {frozendict.frozendict, decimal.Decimal}
- class FrozenDictBoolMixin:
- _types = {frozendict.frozendict, BoolClass}
- class TupleStrMixin:
- _types = {tuple, str}
- class TupleDecimalMixin:
- _types = {tuple, decimal.Decimal}
- class TupleBoolMixin:
- _types = {tuple, BoolClass}
- class StrDecimalMixin:
- _types = {str, decimal.Decimal}
- class StrBoolMixin:
- _types = {str, BoolClass}
- class DecimalBoolMixin:
- _types = {decimal.Decimal, BoolClass}
- # qty 3
- class NoneFrozenDictTupleMixin:
- _types = {NoneClass, frozendict.frozendict, tuple}
- class NoneFrozenDictStrMixin:
- _types = {NoneClass, frozendict.frozendict, str}
- class NoneFrozenDictDecimalMixin:
- _types = {NoneClass, frozendict.frozendict, decimal.Decimal}
- class NoneFrozenDictBoolMixin:
- _types = {NoneClass, frozendict.frozendict, BoolClass}
- class NoneTupleStrMixin:
- _types = {NoneClass, tuple, str}
- class NoneTupleDecimalMixin:
- _types = {NoneClass, tuple, decimal.Decimal}
- class NoneTupleBoolMixin:
- _types = {NoneClass, tuple, BoolClass}
- class NoneStrDecimalMixin:
- _types = {NoneClass, str, decimal.Decimal}
- class NoneStrBoolMixin:
- _types = {NoneClass, str, BoolClass}
- class NoneDecimalBoolMixin:
- _types = {NoneClass, decimal.Decimal, BoolClass}
- class FrozenDictTupleStrMixin:
- _types = {frozendict.frozendict, tuple, str}
- class FrozenDictTupleDecimalMixin:
- _types = {frozendict.frozendict, tuple, decimal.Decimal}
- class FrozenDictTupleBoolMixin:
- _types = {frozendict.frozendict, tuple, BoolClass}
- class FrozenDictStrDecimalMixin:
- _types = {frozendict.frozendict, str, decimal.Decimal}
- class FrozenDictStrBoolMixin:
- _types = {frozendict.frozendict, str, BoolClass}
- class FrozenDictDecimalBoolMixin:
- _types = {frozendict.frozendict, decimal.Decimal, BoolClass}
- class TupleStrDecimalMixin:
- _types = {tuple, str, decimal.Decimal}
- class TupleStrBoolMixin:
- _types = {tuple, str, BoolClass}
- class TupleDecimalBoolMixin:
- _types = {tuple, decimal.Decimal, BoolClass}
- class StrDecimalBoolMixin:
- _types = {str, decimal.Decimal, BoolClass}
- # qty 4
- class NoneFrozenDictTupleStrMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, str}
- class NoneFrozenDictTupleDecimalMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, decimal.Decimal}
- class NoneFrozenDictTupleBoolMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, BoolClass}
- class NoneFrozenDictStrDecimalMixin:
- _types = {NoneClass, frozendict.frozendict, str, decimal.Decimal}
- class NoneFrozenDictStrBoolMixin:
- _types = {NoneClass, frozendict.frozendict, str, BoolClass}
- class NoneFrozenDictDecimalBoolMixin:
- _types = {NoneClass, frozendict.frozendict, decimal.Decimal, BoolClass}
- class NoneTupleStrDecimalMixin:
- _types = {NoneClass, tuple, str, decimal.Decimal}
- class NoneTupleStrBoolMixin:
- _types = {NoneClass, tuple, str, BoolClass}
- class NoneTupleDecimalBoolMixin:
- _types = {NoneClass, tuple, decimal.Decimal, BoolClass}
- class NoneStrDecimalBoolMixin:
- _types = {NoneClass, str, decimal.Decimal, BoolClass}
- class FrozenDictTupleStrDecimalMixin:
- _types = {frozendict.frozendict, tuple, str, decimal.Decimal}
- class FrozenDictTupleStrBoolMixin:
- _types = {frozendict.frozendict, tuple, str, BoolClass}
- class FrozenDictTupleDecimalBoolMixin:
- _types = {frozendict.frozendict, tuple, decimal.Decimal, BoolClass}
- class FrozenDictStrDecimalBoolMixin:
- _types = {frozendict.frozendict, str, decimal.Decimal, BoolClass}
- class TupleStrDecimalBoolMixin:
- _types = {tuple, str, decimal.Decimal, BoolClass}
- # qty 5
- class NoneFrozenDictTupleStrDecimalMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal}
- class NoneFrozenDictTupleStrBoolMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, str, BoolClass}
- class NoneFrozenDictTupleDecimalBoolMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, decimal.Decimal, BoolClass}
- class NoneFrozenDictStrDecimalBoolMixin:
- _types = {NoneClass, frozendict.frozendict, str, decimal.Decimal, BoolClass}
- class NoneTupleStrDecimalBoolMixin:
- _types = {NoneClass, tuple, str, decimal.Decimal, BoolClass}
- class FrozenDictTupleStrDecimalBoolMixin:
- _types = {frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass}
- # qty 6
- class NoneFrozenDictTupleStrDecimalBoolMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass}
- # qty 8
- class NoneFrozenDictTupleStrDecimalBoolFileBytesMixin:
- _types = {NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass, FileIO, bytes}
-
-
-class ValidatorBase:
- @staticmethod
- def _is_json_validation_enabled_oapg(schema_keyword, configuration=None):
- """Returns true if JSON schema validation is enabled for the specified
- validation keyword. This can be used to skip JSON schema structural validation
- as requested in the configuration.
- Note: the suffix _oapg stands for openapi python (experimental) generator and
- it has been added to prevent collisions with other methods and properties
-
- Args:
- schema_keyword (string): the name of a JSON schema validation keyword.
- configuration (Configuration): the configuration class.
- """
-
- return (configuration is None or
- not hasattr(configuration, '_disabled_client_side_validations') or
- schema_keyword not in configuration._disabled_client_side_validations)
-
- @staticmethod
- def _raise_validation_error_message_oapg(value, constraint_msg, constraint_value, path_to_item, additional_txt=""):
- raise ApiValueError(
- "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format(
- value=value,
- constraint_msg=constraint_msg,
- constraint_value=constraint_value,
- additional_txt=additional_txt,
- path_to_item=path_to_item,
- )
- )
-
-
-class EnumBase:
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]]:
- """
- EnumBase _validate_oapg
- Validates that arg is in the enum's allowed values
- """
- try:
- cls.MetaOapg.enum_value_to_name[arg]
- except KeyError:
- raise ApiValueError("Invalid value {} passed in to {}, allowed_values={}".format(arg, cls, cls.MetaOapg.enum_value_to_name.keys()))
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class BoolBase:
- def is_true_oapg(self) -> bool:
- """
- A replacement for x is True
- True if the instance is a BoolClass True Singleton
- """
- if not issubclass(self.__class__, BoolClass):
- return False
- return bool(self)
-
- def is_false_oapg(self) -> bool:
- """
- A replacement for x is False
- True if the instance is a BoolClass False Singleton
- """
- if not issubclass(self.__class__, BoolClass):
- return False
- return bool(self) is False
-
-
-class NoneBase:
- def is_none_oapg(self) -> bool:
- """
- A replacement for x is None
- True if the instance is a NoneClass None Singleton
- """
- if issubclass(self.__class__, NoneClass):
- return True
- return False
-
-
-class StrBase(ValidatorBase):
- MetaOapg: MetaOapgTyped
-
- @property
- def as_str_oapg(self) -> str:
- return self
-
- @property
- def as_date_oapg(self) -> date:
- raise Exception('not implemented')
-
- @property
- def as_datetime_oapg(self) -> datetime:
- raise Exception('not implemented')
-
- @property
- def as_decimal_oapg(self) -> decimal.Decimal:
- raise Exception('not implemented')
-
- @property
- def as_uuid_oapg(self) -> uuid.UUID:
- raise Exception('not implemented')
-
- @classmethod
- def __check_str_validations(
- cls,
- arg: str,
- validation_metadata: ValidationMetadata
- ):
- if not hasattr(cls, 'MetaOapg'):
- return
- if (cls._is_json_validation_enabled_oapg('maxLength', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'max_length') and
- len(arg) > cls.MetaOapg.max_length):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="length must be less than or equal to",
- constraint_value=cls.MetaOapg.max_length,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('minLength', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'min_length') and
- len(arg) < cls.MetaOapg.min_length):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="length must be greater than or equal to",
- constraint_value=cls.MetaOapg.min_length,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('pattern', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'regex')):
- for regex_dict in cls.MetaOapg.regex:
- flags = regex_dict.get('flags', 0)
- if not re.search(regex_dict['pattern'], arg, flags=flags):
- if flags != 0:
- # Don't print the regex flags if the flags are not
- # specified in the OAS document.
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="must match regular expression",
- constraint_value=regex_dict['pattern'],
- path_to_item=validation_metadata.path_to_item,
- additional_txt=" with flags=`{}`".format(flags)
- )
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="must match regular expression",
- constraint_value=regex_dict['pattern'],
- path_to_item=validation_metadata.path_to_item
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]]:
- """
- StrBase _validate_oapg
- Validates that validations pass
- """
- if isinstance(arg, str):
- cls.__check_str_validations(arg, validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class UUIDBase:
- @property
- @functools.lru_cache()
- def as_uuid_oapg(self) -> uuid.UUID:
- return uuid.UUID(self)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[str], validation_metadata: ValidationMetadata):
- if isinstance(arg, str):
- try:
- uuid.UUID(arg)
- return True
- except ValueError:
- raise ApiValueError(
- "Invalid value '{}' for type UUID at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: typing.Optional[ValidationMetadata] = None,
- ):
- """
- UUIDBase _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class CustomIsoparser(isoparser):
-
- @_takes_ascii
- def parse_isodatetime(self, dt_str):
- components, pos = self._parse_isodate(dt_str)
- if len(dt_str) > pos:
- if self._sep is None or dt_str[pos:pos + 1] == self._sep:
- components += self._parse_isotime(dt_str[pos + 1:])
- else:
- raise ValueError('String contains unknown ISO components')
-
- if len(components) > 3 and components[3] == 24:
- components[3] = 0
- return datetime(*components) + timedelta(days=1)
-
- if len(components) <= 3:
- raise ValueError('Value is not a datetime')
-
- return datetime(*components)
-
- @_takes_ascii
- def parse_isodate(self, datestr):
- components, pos = self._parse_isodate(datestr)
-
- if len(datestr) > pos:
- raise ValueError('String contains invalid time components')
-
- if len(components) > 3:
- raise ValueError('String contains invalid time components')
-
- return date(*components)
-
-
-DEFAULT_ISOPARSER = CustomIsoparser()
-
-
-class DateBase:
- @property
- @functools.lru_cache()
- def as_date_oapg(self) -> date:
- return DEFAULT_ISOPARSER.parse_isodate(self)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[str], validation_metadata: ValidationMetadata):
- if isinstance(arg, str):
- try:
- DEFAULT_ISOPARSER.parse_isodate(arg)
- return True
- except ValueError:
- raise ApiValueError(
- "Value does not conform to the required ISO-8601 date format. "
- "Invalid value '{}' for type date at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: typing.Optional[ValidationMetadata] = None,
- ):
- """
- DateBase _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class DateTimeBase:
- @property
- @functools.lru_cache()
- def as_datetime_oapg(self) -> datetime:
- return DEFAULT_ISOPARSER.parse_isodatetime(self)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[str], validation_metadata: ValidationMetadata):
- if isinstance(arg, str):
- try:
- DEFAULT_ISOPARSER.parse_isodatetime(arg)
- return True
- except ValueError:
- raise ApiValueError(
- "Value does not conform to the required ISO-8601 datetime format. "
- "Invalid value '{}' for type datetime at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- DateTimeBase _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class DecimalBase:
- """
- A class for storing decimals that are sent over the wire as strings
- These schemas must remain based on StrBase rather than NumberBase
- because picking base classes must be deterministic
- """
-
- @property
- @functools.lru_cache()
- def as_decimal_oapg(self) -> decimal.Decimal:
- return decimal.Decimal(self)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[str], validation_metadata: ValidationMetadata):
- if isinstance(arg, str):
- try:
- decimal.Decimal(arg)
- return True
- except decimal.InvalidOperation:
- raise ApiValueError(
- "Value cannot be converted to a decimal. "
- "Invalid value '{}' for type decimal at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- DecimalBase _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class NumberBase(ValidatorBase):
- MetaOapg: MetaOapgTyped
-
- @property
- def as_int_oapg(self) -> int:
- try:
- return self._as_int
- except AttributeError:
- """
- Note: for some numbers like 9.0 they could be represented as an
- integer but our code chooses to store them as
- >>> Decimal('9.0').as_tuple()
- DecimalTuple(sign=0, digits=(9, 0), exponent=-1)
- so we can tell that the value came from a float and convert it back to a float
- during later serialization
- """
- if self.as_tuple().exponent < 0:
- # this could be represented as an integer but should be represented as a float
- # because that's what it was serialized from
- raise ApiValueError(f'{self} is not an integer')
- self._as_int = int(self)
- return self._as_int
-
- @property
- def as_float_oapg(self) -> float:
- try:
- return self._as_float
- except AttributeError:
- if self.as_tuple().exponent >= 0:
- raise ApiValueError(f'{self} is not a float')
- self._as_float = float(self)
- return self._as_float
-
- @classmethod
- def __check_numeric_validations(
- cls,
- arg,
- validation_metadata: ValidationMetadata
- ):
- if not hasattr(cls, 'MetaOapg'):
- return
- if cls._is_json_validation_enabled_oapg('multipleOf',
- validation_metadata.configuration) and hasattr(cls.MetaOapg, 'multiple_of'):
- multiple_of_value = cls.MetaOapg.multiple_of
- if (not (float(arg) / multiple_of_value).is_integer()):
- # Note 'multipleOf' will be as good as the floating point arithmetic.
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="value must be a multiple of",
- constraint_value=multiple_of_value,
- path_to_item=validation_metadata.path_to_item
- )
-
- checking_max_or_min_values = any(
- hasattr(cls.MetaOapg, validation_key) for validation_key in {
- 'exclusive_maximum',
- 'inclusive_maximum',
- 'exclusive_minimum',
- 'inclusive_minimum',
- }
- )
- if not checking_max_or_min_values:
- return
-
- if (cls._is_json_validation_enabled_oapg('exclusiveMaximum', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'exclusive_maximum') and
- arg >= cls.MetaOapg.exclusive_maximum):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="must be a value less than",
- constraint_value=cls.MetaOapg.exclusive_maximum,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('maximum', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'inclusive_maximum') and
- arg > cls.MetaOapg.inclusive_maximum):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="must be a value less than or equal to",
- constraint_value=cls.MetaOapg.inclusive_maximum,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('exclusiveMinimum', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'exclusive_minimum') and
- arg <= cls.MetaOapg.exclusive_minimum):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="must be a value greater than",
- constraint_value=cls.MetaOapg.exclusive_maximum,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('minimum', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'inclusive_minimum') and
- arg < cls.MetaOapg.inclusive_minimum):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="must be a value greater than or equal to",
- constraint_value=cls.MetaOapg.inclusive_minimum,
- path_to_item=validation_metadata.path_to_item
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]]:
- """
- NumberBase _validate_oapg
- Validates that validations pass
- """
- if isinstance(arg, decimal.Decimal):
- cls.__check_numeric_validations(arg, validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class ListBase(ValidatorBase):
- MetaOapg: MetaOapgTyped
-
- @classmethod
- def __validate_items(cls, list_items, validation_metadata: ValidationMetadata):
- """
- Ensures that:
- - values passed in for items are valid
- Exceptions will be raised if:
- - invalid arguments were passed in
-
- Args:
- list_items: the input list of items
-
- Raises:
- ApiTypeError - for missing required arguments, or for invalid properties
- """
-
- # if we have definitions for an items schema, use it
- # otherwise accept anything
- item_cls = getattr(cls.MetaOapg, 'items', UnsetAnyTypeSchema)
- item_cls = cls._get_class_oapg(item_cls)
- path_to_schemas = {}
- for i, value in enumerate(list_items):
- item_validation_metadata = ValidationMetadata(
- from_server=validation_metadata.from_server,
- configuration=validation_metadata.configuration,
- path_to_item=validation_metadata.path_to_item+(i,),
- validated_path_to_schemas=validation_metadata.validated_path_to_schemas
- )
- if item_validation_metadata.validation_ran_earlier(item_cls):
- add_deeper_validated_schemas(item_validation_metadata, path_to_schemas)
- continue
- other_path_to_schemas = item_cls._validate_oapg(
- value, validation_metadata=item_validation_metadata)
- update(path_to_schemas, other_path_to_schemas)
- return path_to_schemas
-
- @classmethod
- def __check_tuple_validations(
- cls, arg,
- validation_metadata: ValidationMetadata):
- if not hasattr(cls, 'MetaOapg'):
- return
- if (cls._is_json_validation_enabled_oapg('maxItems', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'max_items') and
- len(arg) > cls.MetaOapg.max_items):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="number of items must be less than or equal to",
- constraint_value=cls.MetaOapg.max_items,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('minItems', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'min_items') and
- len(arg) < cls.MetaOapg.min_items):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="number of items must be greater than or equal to",
- constraint_value=cls.MetaOapg.min_items,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('uniqueItems', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'unique_items') and cls.MetaOapg.unique_items and arg):
- unique_items = set(arg)
- if len(arg) > len(unique_items):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="duplicate items were found, and the tuple must not contain duplicates because",
- constraint_value='unique_items==True',
- path_to_item=validation_metadata.path_to_item
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- ListBase _validate_oapg
- We return dynamic classes of different bases depending upon the inputs
- This makes it so:
- - the returned instance is always a subclass of our defining schema
- - this allows us to check type based on whether an instance is a subclass of a schema
- - the returned instance is a serializable type (except for None, True, and False) which are enums
-
- Returns:
- new_cls (type): the new class
-
- Raises:
- ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes
- ApiTypeError: when the input type is not in the list of allowed spec types
- """
- if isinstance(arg, tuple):
- cls.__check_tuple_validations(arg, validation_metadata)
- _path_to_schemas = super()._validate_oapg(arg, validation_metadata=validation_metadata)
- if not isinstance(arg, tuple):
- return _path_to_schemas
- updated_vm = ValidationMetadata(
- configuration=validation_metadata.configuration,
- from_server=validation_metadata.from_server,
- path_to_item=validation_metadata.path_to_item,
- seen_classes=validation_metadata.seen_classes | frozenset({cls}),
- validated_path_to_schemas=validation_metadata.validated_path_to_schemas
- )
- other_path_to_schemas = cls.__validate_items(arg, validation_metadata=updated_vm)
- update(_path_to_schemas, other_path_to_schemas)
- return _path_to_schemas
-
- @classmethod
- def _get_items_oapg(
- cls: 'Schema',
- arg: typing.List[typing.Any],
- path_to_item: typing.Tuple[typing.Union[str, int], ...],
- path_to_schemas: typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Type['Schema']]
- ):
- '''
- ListBase _get_items_oapg
- '''
- cast_items = []
-
- for i, value in enumerate(arg):
- item_path_to_item = path_to_item + (i,)
- item_cls = path_to_schemas[item_path_to_item]
- new_value = item_cls._get_new_instance_without_conversion_oapg(
- value,
- item_path_to_item,
- path_to_schemas
- )
- cast_items.append(new_value)
-
- return cast_items
-
-
-class Discriminable:
- MetaOapg: MetaOapgTyped
-
- @classmethod
- def _ensure_discriminator_value_present_oapg(cls, disc_property_name: str, validation_metadata: ValidationMetadata, *args):
- if not args or args and disc_property_name not in args[0]:
- # The input data does not contain the discriminator property
- raise ApiValueError(
- "Cannot deserialize input data due to missing discriminator. "
- "The discriminator property '{}' is missing at path: {}".format(disc_property_name, validation_metadata.path_to_item)
- )
-
- @classmethod
- def get_discriminated_class_oapg(cls, disc_property_name: str, disc_payload_value: str):
- """
- Used in schemas with discriminators
- """
- if not hasattr(cls.MetaOapg, 'discriminator'):
- return None
- disc = cls.MetaOapg.discriminator()
- if disc_property_name not in disc:
- return None
- discriminated_cls = disc[disc_property_name].get(disc_payload_value)
- if discriminated_cls is not None:
- return discriminated_cls
- if not hasattr(cls, 'MetaOapg'):
- return None
- elif not (
- hasattr(cls.MetaOapg, 'all_of') or
- hasattr(cls.MetaOapg, 'one_of') or
- hasattr(cls.MetaOapg, 'any_of')
- ):
- return None
- # TODO stop traveling if a cycle is hit
- if hasattr(cls.MetaOapg, 'all_of'):
- for allof_cls in cls.MetaOapg.all_of():
- discriminated_cls = allof_cls.get_discriminated_class_oapg(
- disc_property_name=disc_property_name, disc_payload_value=disc_payload_value)
- if discriminated_cls is not None:
- return discriminated_cls
- if hasattr(cls.MetaOapg, 'one_of'):
- for oneof_cls in cls.MetaOapg.one_of():
- discriminated_cls = oneof_cls.get_discriminated_class_oapg(
- disc_property_name=disc_property_name, disc_payload_value=disc_payload_value)
- if discriminated_cls is not None:
- return discriminated_cls
- if hasattr(cls.MetaOapg, 'any_of'):
- for anyof_cls in cls.MetaOapg.any_of():
- discriminated_cls = anyof_cls.get_discriminated_class_oapg(
- disc_property_name=disc_property_name, disc_payload_value=disc_payload_value)
- if discriminated_cls is not None:
- return discriminated_cls
- return None
-
-
-class DictBase(Discriminable, ValidatorBase):
-
- @classmethod
- def __validate_arg_presence(cls, arg):
- """
- Ensures that:
- - all required arguments are passed in
- - the input variable names are valid
- - present in properties or
- - accepted because additionalProperties exists
- Exceptions will be raised if:
- - invalid arguments were passed in
- - a var_name is invalid if additional_properties == NotAnyTypeSchema
- and var_name not in properties.__annotations__
- - required properties were not passed in
-
- Args:
- arg: the input dict
-
- Raises:
- ApiTypeError - for missing required arguments, or for invalid properties
- """
- seen_required_properties = set()
- invalid_arguments = []
- required_property_names = getattr(cls.MetaOapg, 'required', set())
- additional_properties = getattr(cls.MetaOapg, 'additional_properties', UnsetAnyTypeSchema)
- properties = getattr(cls.MetaOapg, 'properties', {})
- property_annotations = getattr(properties, '__annotations__', {})
- for property_name in arg:
- if property_name in required_property_names:
- seen_required_properties.add(property_name)
- elif property_name in property_annotations:
- continue
- elif additional_properties is not NotAnyTypeSchema:
- continue
- else:
- invalid_arguments.append(property_name)
- missing_required_arguments = list(required_property_names - seen_required_properties)
- if missing_required_arguments:
- missing_required_arguments.sort()
- raise ApiTypeError(
- "{} is missing {} required argument{}: {}".format(
- cls.__name__,
- len(missing_required_arguments),
- "s" if len(missing_required_arguments) > 1 else "",
- missing_required_arguments
- )
- )
- if invalid_arguments:
- invalid_arguments.sort()
- raise ApiTypeError(
- "{} was passed {} invalid argument{}: {}".format(
- cls.__name__,
- len(invalid_arguments),
- "s" if len(invalid_arguments) > 1 else "",
- invalid_arguments
- )
- )
-
- @classmethod
- def __validate_args(cls, arg, validation_metadata: ValidationMetadata):
- """
- Ensures that:
- - values passed in for properties are valid
- Exceptions will be raised if:
- - invalid arguments were passed in
-
- Args:
- arg: the input dict
-
- Raises:
- ApiTypeError - for missing required arguments, or for invalid properties
- """
- path_to_schemas = {}
- additional_properties = getattr(cls.MetaOapg, 'additional_properties', UnsetAnyTypeSchema)
- properties = getattr(cls.MetaOapg, 'properties', {})
- property_annotations = getattr(properties, '__annotations__', {})
- for property_name, value in arg.items():
- path_to_item = validation_metadata.path_to_item+(property_name,)
- if property_name in property_annotations:
- schema = property_annotations[property_name]
- elif additional_properties is not NotAnyTypeSchema:
- if additional_properties is UnsetAnyTypeSchema:
- """
- If additionalProperties is unset and this path_to_item does not yet have
- any validations on it, validate it.
- If it already has validations on it, skip this validation.
- """
- if path_to_item in path_to_schemas:
- continue
- schema = additional_properties
- else:
- raise ApiTypeError('Unable to find schema for value={} in class={} at path_to_item={}'.format(
- value, cls, validation_metadata.path_to_item+(property_name,)
- ))
- schema = cls._get_class_oapg(schema)
- arg_validation_metadata = ValidationMetadata(
- from_server=validation_metadata.from_server,
- configuration=validation_metadata.configuration,
- path_to_item=path_to_item,
- validated_path_to_schemas=validation_metadata.validated_path_to_schemas
- )
- if arg_validation_metadata.validation_ran_earlier(schema):
- add_deeper_validated_schemas(arg_validation_metadata, path_to_schemas)
- continue
- other_path_to_schemas = schema._validate_oapg(value, validation_metadata=arg_validation_metadata)
- update(path_to_schemas, other_path_to_schemas)
- return path_to_schemas
-
- @classmethod
- def __check_dict_validations(
- cls,
- arg,
- validation_metadata: ValidationMetadata
- ):
- if not hasattr(cls, 'MetaOapg'):
- return
- if (cls._is_json_validation_enabled_oapg('maxProperties', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'max_properties') and
- len(arg) > cls.MetaOapg.max_properties):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="number of properties must be less than or equal to",
- constraint_value=cls.MetaOapg.max_properties,
- path_to_item=validation_metadata.path_to_item
- )
-
- if (cls._is_json_validation_enabled_oapg('minProperties', validation_metadata.configuration) and
- hasattr(cls.MetaOapg, 'min_properties') and
- len(arg) < cls.MetaOapg.min_properties):
- cls._raise_validation_error_message_oapg(
- value=arg,
- constraint_msg="number of properties must be greater than or equal to",
- constraint_value=cls.MetaOapg.min_properties,
- path_to_item=validation_metadata.path_to_item
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- DictBase _validate_oapg
- We return dynamic classes of different bases depending upon the inputs
- This makes it so:
- - the returned instance is always a subclass of our defining schema
- - this allows us to check type based on whether an instance is a subclass of a schema
- - the returned instance is a serializable type (except for None, True, and False) which are enums
-
- Returns:
- new_cls (type): the new class
-
- Raises:
- ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes
- ApiTypeError: when the input type is not in the list of allowed spec types
- """
- if isinstance(arg, frozendict.frozendict):
- cls.__check_dict_validations(arg, validation_metadata)
- _path_to_schemas = super()._validate_oapg(arg, validation_metadata=validation_metadata)
- if not isinstance(arg, frozendict.frozendict):
- return _path_to_schemas
- cls.__validate_arg_presence(arg)
- other_path_to_schemas = cls.__validate_args(arg, validation_metadata=validation_metadata)
- update(_path_to_schemas, other_path_to_schemas)
- try:
- discriminator = cls.MetaOapg.discriminator()
- except AttributeError:
- return _path_to_schemas
- # discriminator exists
- disc_prop_name = list(discriminator.keys())[0]
- cls._ensure_discriminator_value_present_oapg(disc_prop_name, validation_metadata, arg)
- discriminated_cls = cls.get_discriminated_class_oapg(
- disc_property_name=disc_prop_name, disc_payload_value=arg[disc_prop_name])
- if discriminated_cls is None:
- raise ApiValueError(
- "Invalid discriminator value was passed in to {}.{} Only the values {} are allowed at {}".format(
- cls.__name__,
- disc_prop_name,
- list(discriminator[disc_prop_name].keys()),
- validation_metadata.path_to_item + (disc_prop_name,)
- )
- )
- updated_vm = ValidationMetadata(
- configuration=validation_metadata.configuration,
- from_server=validation_metadata.from_server,
- path_to_item=validation_metadata.path_to_item,
- seen_classes=validation_metadata.seen_classes | frozenset({cls}),
- validated_path_to_schemas=validation_metadata.validated_path_to_schemas
- )
- if updated_vm.validation_ran_earlier(discriminated_cls):
- add_deeper_validated_schemas(updated_vm, _path_to_schemas)
- return _path_to_schemas
- other_path_to_schemas = discriminated_cls._validate_oapg(arg, validation_metadata=updated_vm)
- update(_path_to_schemas, other_path_to_schemas)
- return _path_to_schemas
-
- @classmethod
- def _get_properties_oapg(
- cls,
- arg: typing.Dict[str, typing.Any],
- path_to_item: typing.Tuple[typing.Union[str, int], ...],
- path_to_schemas: typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Type['Schema']]
- ):
- """
- DictBase _get_properties_oapg, this is how properties are set
- These values already passed validation
- """
- dict_items = {}
-
- for property_name_js, value in arg.items():
- property_path_to_item = path_to_item + (property_name_js,)
- property_cls = path_to_schemas[property_path_to_item]
- new_value = property_cls._get_new_instance_without_conversion_oapg(
- value,
- property_path_to_item,
- path_to_schemas
- )
- dict_items[property_name_js] = new_value
-
- return dict_items
-
- def __setattr__(self, name: str, value: typing.Any):
- if not isinstance(self, FileIO):
- raise AttributeError('property setting not supported on immutable instances')
-
- def __getattr__(self, name: str):
- """
- for instance.name access
- Properties are only type hinted for required properties
- so that hasattr(instance, 'optionalProp') is False when that key is not present
- """
- if not isinstance(self, frozendict.frozendict):
- return super().__getattr__(name)
- if name not in self.__class__.__annotations__:
- raise AttributeError(f"{self} has no attribute '{name}'")
- try:
- value = self[name]
- return value
- except KeyError as ex:
- raise AttributeError(str(ex))
-
- def __getitem__(self, name: str):
- """
- dict_instance[name] accessor
- key errors thrown
- """
- if not isinstance(self, frozendict.frozendict):
- return super().__getattr__(name)
- return super().__getitem__(name)
-
- def get_item_oapg(self, name: str) -> typing.Union['AnyTypeSchema', Unset]:
- # dict_instance[name] accessor
- if not isinstance(self, frozendict.frozendict):
- raise NotImplementedError()
- try:
- return super().__getitem__(name)
- except KeyError:
- return unset
-
-
-def cast_to_allowed_types(
- arg: typing.Union[str, date, datetime, uuid.UUID, decimal.Decimal, int, float, None, dict, frozendict.frozendict, list, tuple, bytes, Schema, io.FileIO, io.BufferedReader],
- from_server: bool,
- validated_path_to_schemas: typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]],
- path_to_item: typing.Tuple[typing.Union[str, int], ...] = tuple(['args[0]']),
-) -> typing.Union[frozendict.frozendict, tuple, decimal.Decimal, str, bytes, BoolClass, NoneClass, FileIO]:
- """
- Casts the input payload arg into the allowed types
- The input validated_path_to_schemas is mutated by running this function
-
- When from_server is False then
- - date/datetime is cast to str
- - int/float is cast to Decimal
-
- If a Schema instance is passed in it is converted back to a primitive instance because
- One may need to validate that data to the original Schema class AND additional different classes
- those additional classes will need to be added to the new manufactured class for that payload
- If the code didn't do this and kept the payload as a Schema instance it would fail to validate to other
- Schema classes and the code wouldn't be able to mfg a new class that includes all valid schemas
- TODO: store the validated schema classes in validation_metadata
-
- Args:
- arg: the payload
- from_server: whether this payload came from the server or not
- validated_path_to_schemas: a dict that stores the validated classes at any path location in the payload
- """
- if isinstance(arg, Schema):
- # store the already run validations
- schema_classes = set()
- for cls in arg.__class__.__bases__:
- if cls is Singleton:
- # Skip Singleton
- continue
- schema_classes.add(cls)
- validated_path_to_schemas[path_to_item] = schema_classes
-
- type_error = ApiTypeError(f"Invalid type. Required value type is str and passed type was {type(arg)} at {path_to_item}")
- if isinstance(arg, str):
- return str(arg)
- elif isinstance(arg, (dict, frozendict.frozendict)):
- return frozendict.frozendict({key: cast_to_allowed_types(val, from_server, validated_path_to_schemas, path_to_item + (key,)) for key, val in arg.items()})
- elif isinstance(arg, (bool, BoolClass)):
- """
- this check must come before isinstance(arg, (int, float))
- because isinstance(True, int) is True
- """
- if arg:
- return BoolClass.TRUE
- return BoolClass.FALSE
- elif isinstance(arg, int):
- return decimal.Decimal(arg)
- elif isinstance(arg, float):
- decimal_from_float = decimal.Decimal(arg)
- if decimal_from_float.as_integer_ratio()[1] == 1:
- # 9.0 -> Decimal('9.0')
- # 3.4028234663852886e+38 -> Decimal('340282346638528859811704183484516925440.0')
- return decimal.Decimal(str(decimal_from_float)+'.0')
- return decimal_from_float
- elif isinstance(arg, (tuple, list)):
- return tuple([cast_to_allowed_types(item, from_server, validated_path_to_schemas, path_to_item + (i,)) for i, item in enumerate(arg)])
- elif isinstance(arg, (none_type, NoneClass)):
- return NoneClass.NONE
- elif isinstance(arg, (date, datetime)):
- if not from_server:
- return arg.isoformat()
- raise type_error
- elif isinstance(arg, uuid.UUID):
- if not from_server:
- return str(arg)
- raise type_error
- elif isinstance(arg, decimal.Decimal):
- return decimal.Decimal(arg)
- elif isinstance(arg, bytes):
- return bytes(arg)
- elif isinstance(arg, (io.FileIO, io.BufferedReader)):
- return FileIO(arg)
- raise ValueError('Invalid type passed in got input={} type={}'.format(arg, type(arg)))
-
-
-class ComposedBase(Discriminable):
-
- @classmethod
- def __get_allof_classes(cls, arg, validation_metadata: ValidationMetadata):
- path_to_schemas = defaultdict(set)
- for allof_cls in cls.MetaOapg.all_of():
- if validation_metadata.validation_ran_earlier(allof_cls):
- add_deeper_validated_schemas(validation_metadata, path_to_schemas)
- continue
- other_path_to_schemas = allof_cls._validate_oapg(arg, validation_metadata=validation_metadata)
- update(path_to_schemas, other_path_to_schemas)
- return path_to_schemas
-
- @classmethod
- def __get_oneof_class(
- cls,
- arg,
- discriminated_cls,
- validation_metadata: ValidationMetadata,
- ):
- oneof_classes = []
- path_to_schemas = defaultdict(set)
- for oneof_cls in cls.MetaOapg.one_of():
- if oneof_cls in path_to_schemas[validation_metadata.path_to_item]:
- oneof_classes.append(oneof_cls)
- continue
- if validation_metadata.validation_ran_earlier(oneof_cls):
- oneof_classes.append(oneof_cls)
- add_deeper_validated_schemas(validation_metadata, path_to_schemas)
- continue
- try:
- path_to_schemas = oneof_cls._validate_oapg(arg, validation_metadata=validation_metadata)
- except (ApiValueError, ApiTypeError) as ex:
- if discriminated_cls is not None and oneof_cls is discriminated_cls:
- {{#if nonCompliantUseDiscriminatorIfCompositionFails}}
- """
- suppress exception because code was generated with
- nonCompliantUseDiscriminatorIfCompositionFails=true
- """
- pass
- {{else}}
- raise ex
- {{/if}}
- continue
- oneof_classes.append(oneof_cls)
- if not oneof_classes:
- {{#if nonCompliantUseDiscriminatorIfCompositionFails}}
- if discriminated_cls:
- """
- return without exception because code was generated with
- nonCompliantUseDiscriminatorIfCompositionFails=true
- """
- return {}
- {{/if}}
- raise ApiValueError(
- "Invalid inputs given to generate an instance of {}. None "
- "of the oneOf schemas matched the input data.".format(cls)
- )
- elif len(oneof_classes) > 1:
- {{#if nonCompliantUseDiscriminatorIfCompositionFails}}
- if discriminated_cls:
- """
- return without exception because code was generated with
- nonCompliantUseDiscriminatorIfCompositionFails=true
- """
- return {}
- {{/if}}
- raise ApiValueError(
- "Invalid inputs given to generate an instance of {}. Multiple "
- "oneOf schemas {} matched the inputs, but a max of one is allowed.".format(cls, oneof_classes)
- )
- # exactly one class matches
- return path_to_schemas
-
- @classmethod
- def __get_anyof_classes(
- cls,
- arg,
- discriminated_cls,
- validation_metadata: ValidationMetadata
- ):
- anyof_classes = []
- path_to_schemas = defaultdict(set)
- for anyof_cls in cls.MetaOapg.any_of():
- if validation_metadata.validation_ran_earlier(anyof_cls):
- anyof_classes.append(anyof_cls)
- add_deeper_validated_schemas(validation_metadata, path_to_schemas)
- continue
-
- try:
- other_path_to_schemas = anyof_cls._validate_oapg(arg, validation_metadata=validation_metadata)
- except (ApiValueError, ApiTypeError) as ex:
- if discriminated_cls is not None and anyof_cls is discriminated_cls:
- {{#if nonCompliantUseDiscriminatorIfCompositionFails}}
- """
- suppress exception because code was generated with
- nonCompliantUseDiscriminatorIfCompositionFails=true
- """
- pass
- {{else}}
- raise ex
- {{/if}}
- continue
- anyof_classes.append(anyof_cls)
- update(path_to_schemas, other_path_to_schemas)
- if not anyof_classes:
- {{#if nonCompliantUseDiscriminatorIfCompositionFails}}
- if discriminated_cls:
- """
- return without exception because code was generated with
- nonCompliantUseDiscriminatorIfCompositionFails=true
- """
- return {}
- {{/if}}
- raise ApiValueError(
- "Invalid inputs given to generate an instance of {}. None "
- "of the anyOf schemas matched the input data.".format(cls)
- )
- return path_to_schemas
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict.frozendict, tuple]]]:
- """
- ComposedBase _validate_oapg
- We return dynamic classes of different bases depending upon the inputs
- This makes it so:
- - the returned instance is always a subclass of our defining schema
- - this allows us to check type based on whether an instance is a subclass of a schema
- - the returned instance is a serializable type (except for None, True, and False) which are enums
-
- Returns:
- new_cls (type): the new class
-
- Raises:
- ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes
- ApiTypeError: when the input type is not in the list of allowed spec types
- """
- # validation checking on types, validations, and enums
- path_to_schemas = super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
- updated_vm = ValidationMetadata(
- configuration=validation_metadata.configuration,
- from_server=validation_metadata.from_server,
- path_to_item=validation_metadata.path_to_item,
- seen_classes=validation_metadata.seen_classes | frozenset({cls}),
- validated_path_to_schemas=validation_metadata.validated_path_to_schemas
- )
-
- # process composed schema
- discriminator = None
- if hasattr(cls, 'MetaOapg') and hasattr(cls.MetaOapg, 'discriminator'):
- discriminator = cls.MetaOapg.discriminator()
- discriminated_cls = None
- if discriminator and arg and isinstance(arg, frozendict.frozendict):
- disc_property_name = list(discriminator.keys())[0]
- cls._ensure_discriminator_value_present_oapg(disc_property_name, updated_vm, arg)
- # get discriminated_cls by looking at the dict in the current class
- discriminated_cls = cls.get_discriminated_class_oapg(
- disc_property_name=disc_property_name, disc_payload_value=arg[disc_property_name])
- if discriminated_cls is None:
- raise ApiValueError(
- "Invalid discriminator value '{}' was passed in to {}.{} Only the values {} are allowed at {}".format(
- arg[disc_property_name],
- cls.__name__,
- disc_property_name,
- list(discriminator[disc_property_name].keys()),
- updated_vm.path_to_item + (disc_property_name,)
- )
- )
-
- if hasattr(cls, 'MetaOapg') and hasattr(cls.MetaOapg, 'all_of'):
- other_path_to_schemas = cls.__get_allof_classes(arg, validation_metadata=updated_vm)
- update(path_to_schemas, other_path_to_schemas)
- if hasattr(cls, 'MetaOapg') and hasattr(cls.MetaOapg, 'one_of'):
- other_path_to_schemas = cls.__get_oneof_class(
- arg,
- discriminated_cls=discriminated_cls,
- validation_metadata=updated_vm
- )
- update(path_to_schemas, other_path_to_schemas)
- if hasattr(cls, 'MetaOapg') and hasattr(cls.MetaOapg, 'any_of'):
- other_path_to_schemas = cls.__get_anyof_classes(
- arg,
- discriminated_cls=discriminated_cls,
- validation_metadata=updated_vm
- )
- update(path_to_schemas, other_path_to_schemas)
- not_cls = None
- if hasattr(cls, 'MetaOapg') and hasattr(cls.MetaOapg, 'not_schema'):
- not_cls = cls.MetaOapg.not_schema
- not_cls = cls._get_class_oapg(not_cls)
- if not_cls:
- other_path_to_schemas = None
- not_exception = ApiValueError(
- "Invalid value '{}' was passed in to {}. Value is invalid because it is disallowed by {}".format(
- arg,
- cls.__name__,
- not_cls.__name__,
- )
- )
- if updated_vm.validation_ran_earlier(not_cls):
- raise not_exception
-
- try:
- other_path_to_schemas = not_cls._validate_oapg(arg, validation_metadata=updated_vm)
- except (ApiValueError, ApiTypeError):
- pass
- if other_path_to_schemas:
- raise not_exception
-
- if discriminated_cls is not None and not updated_vm.validation_ran_earlier(discriminated_cls):
- # TODO use an exception from this package here
- add_deeper_validated_schemas(updated_vm, path_to_schemas)
- assert discriminated_cls in path_to_schemas[updated_vm.path_to_item]
- return path_to_schemas
-
-
-# DictBase, ListBase, NumberBase, StrBase, BoolBase, NoneBase
-class ComposedSchema(
- ComposedBase,
- DictBase,
- ListBase,
- NumberBase,
- StrBase,
- BoolBase,
- NoneBase,
- Schema,
- NoneFrozenDictTupleStrDecimalBoolMixin
-):
- @classmethod
- def from_openapi_data_oapg(cls, *args: typing.Any, _configuration: typing.Optional[Configuration] = None, **kwargs):
- if not args:
- if not kwargs:
- raise ApiTypeError('{} is missing required input data in args or kwargs'.format(cls.__name__))
- args = (kwargs, )
- return super().from_openapi_data_oapg(args[0], _configuration=_configuration)
-
-
-class ListSchema(
- ListBase,
- Schema,
- TupleMixin
-):
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: typing.List[typing.Any], _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, _arg: typing.Union[typing.List[typing.Any], typing.Tuple[typing.Any]], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class NoneSchema(
- NoneBase,
- Schema,
- NoneMixin
-):
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: None, _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, _arg: None, **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class NumberSchema(
- NumberBase,
- Schema,
- DecimalMixin
-):
- """
- This is used for type: number with no format
- Both integers AND floats are accepted
- """
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: typing.Union[int, float], _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, _arg: typing.Union[decimal.Decimal, int, float], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class IntBase:
- @property
- def as_int_oapg(self) -> int:
- try:
- return self._as_int
- except AttributeError:
- self._as_int = int(self)
- return self._as_int
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[decimal.Decimal], validation_metadata: ValidationMetadata):
- if isinstance(arg, decimal.Decimal):
-
- denominator = arg.as_integer_ratio()[-1]
- if denominator != 1:
- raise ApiValueError(
- "Invalid value '{}' for type integer at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- IntBase _validate_oapg
- TODO what about types = (int, number) -> IntBase, NumberBase? We could drop int and keep number only
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class IntSchema(IntBase, NumberSchema):
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: int, _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, _arg: typing.Union[decimal.Decimal, int], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class Int32Base:
- __inclusive_minimum = decimal.Decimal(-2147483648)
- __inclusive_maximum = decimal.Decimal(2147483647)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[decimal.Decimal], validation_metadata: ValidationMetadata):
- if isinstance(arg, decimal.Decimal) and arg.as_tuple().exponent == 0:
- if not cls.__inclusive_minimum <= arg <= cls.__inclusive_maximum:
- raise ApiValueError(
- "Invalid value '{}' for type int32 at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- Int32Base _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class Int32Schema(
- Int32Base,
- IntSchema
-):
- pass
-
-
-class Int64Base:
- __inclusive_minimum = decimal.Decimal(-9223372036854775808)
- __inclusive_maximum = decimal.Decimal(9223372036854775807)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[decimal.Decimal], validation_metadata: ValidationMetadata):
- if isinstance(arg, decimal.Decimal) and arg.as_tuple().exponent == 0:
- if not cls.__inclusive_minimum <= arg <= cls.__inclusive_maximum:
- raise ApiValueError(
- "Invalid value '{}' for type int64 at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- Int64Base _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class Int64Schema(
- Int64Base,
- IntSchema
-):
- pass
-
-
-class Float32Base:
- __inclusive_minimum = decimal.Decimal(-3.4028234663852886e+38)
- __inclusive_maximum = decimal.Decimal(3.4028234663852886e+38)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[decimal.Decimal], validation_metadata: ValidationMetadata):
- if isinstance(arg, decimal.Decimal):
- if not cls.__inclusive_minimum <= arg <= cls.__inclusive_maximum:
- raise ApiValueError(
- "Invalid value '{}' for type float at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- Float32Base _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-
-class Float32Schema(
- Float32Base,
- NumberSchema
-):
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: float, _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
-
-class Float64Base:
- __inclusive_minimum = decimal.Decimal(-1.7976931348623157E+308)
- __inclusive_maximum = decimal.Decimal(1.7976931348623157E+308)
-
- @classmethod
- def __validate_format(cls, arg: typing.Optional[decimal.Decimal], validation_metadata: ValidationMetadata):
- if isinstance(arg, decimal.Decimal):
- if not cls.__inclusive_minimum <= arg <= cls.__inclusive_maximum:
- raise ApiValueError(
- "Invalid value '{}' for type double at {}".format(arg, validation_metadata.path_to_item)
- )
-
- @classmethod
- def _validate_oapg(
- cls,
- arg,
- validation_metadata: ValidationMetadata,
- ):
- """
- Float64Base _validate_oapg
- """
- cls.__validate_format(arg, validation_metadata=validation_metadata)
- return super()._validate_oapg(arg, validation_metadata=validation_metadata)
-
-class Float64Schema(
- Float64Base,
- NumberSchema
-):
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: float, _configuration: typing.Optional[Configuration] = None):
- # todo check format
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
-
-class StrSchema(
- StrBase,
- Schema,
- StrMixin
-):
- """
- date + datetime string types must inherit from this class
- That is because one can validate a str payload as both:
- - type: string (format unset)
- - type: string, format: date
- """
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: str, _configuration: typing.Optional[Configuration] = None) -> 'StrSchema':
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, _arg: typing.Union[str, date, datetime, uuid.UUID], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class UUIDSchema(UUIDBase, StrSchema):
-
- def __new__(cls, _arg: typing.Union[str, uuid.UUID], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class DateSchema(DateBase, StrSchema):
-
- def __new__(cls, _arg: typing.Union[str, date], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class DateTimeSchema(DateTimeBase, StrSchema):
-
- def __new__(cls, _arg: typing.Union[str, datetime], **kwargs: Configuration):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class DecimalSchema(DecimalBase, StrSchema):
-
- def __new__(cls, _arg: str, **kwargs: Configuration):
- """
- Note: Decimals may not be passed in because cast_to_allowed_types is only invoked once for payloads
- which can be simple (str) or complex (dicts or lists with nested values)
- Because casting is only done once and recursively casts all values prior to validation then for a potential
- client side Decimal input if Decimal was accepted as an input in DecimalSchema then one would not know
- if one was using it for a StrSchema (where it should be cast to str) or one is using it for NumberSchema
- where it should stay as Decimal.
- """
- return super().__new__(cls, _arg, **kwargs)
-
-
-class BytesSchema(
- Schema,
- BytesMixin
-):
- """
- this class will subclass bytes and is immutable
- """
- def __new__(cls, _arg: bytes, **kwargs: Configuration):
- return super(Schema, cls).__new__(cls, _arg)
-
-
-class FileSchema(
- Schema,
- FileMixin
-):
- """
- This class is NOT immutable
- Dynamic classes are built using it for example when AnyType allows in binary data
- Al other schema classes ARE immutable
- If one wanted to make this immutable one could make this a DictSchema with required properties:
- - data = BytesSchema (which would be an immutable bytes based schema)
- - file_name = StrSchema
- and cast_to_allowed_types would convert bytes and file instances into dicts containing data + file_name
- The downside would be that data would be stored in memory which one may not want to do for very large files
-
- The developer is responsible for closing this file and deleting it
-
- This class was kept as mutable:
- - to allow file reading and writing to disk
- - to be able to preserve file name info
- """
-
- def __new__(cls, _arg: typing.Union[io.FileIO, io.BufferedReader], **kwargs: Configuration):
- return super(Schema, cls).__new__(cls, _arg)
-
-
-class BinaryBase:
- pass
-
-
-class BinarySchema(
- ComposedBase,
- BinaryBase,
- Schema,
- BinaryMixin
-):
- class MetaOapg:
- @staticmethod
- def one_of():
- return [
- BytesSchema,
- FileSchema,
- ]
-
- def __new__(cls, _arg: typing.Union[io.FileIO, io.BufferedReader, bytes], **kwargs: Configuration):
- return super().__new__(cls, _arg)
-
-
-class BoolSchema(
- BoolBase,
- Schema,
- BoolMixin
-):
-
- @classmethod
- def from_openapi_data_oapg(cls, arg: bool, _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, _arg: bool, **kwargs: ValidationMetadata):
- return super().__new__(cls, _arg, **kwargs)
-
-
-class AnyTypeSchema(
- DictBase,
- ListBase,
- NumberBase,
- StrBase,
- BoolBase,
- NoneBase,
- Schema,
- NoneFrozenDictTupleStrDecimalBoolFileBytesMixin
-):
- # Python representation of a schema defined as true or {}
- pass
-
-
-class UnsetAnyTypeSchema(AnyTypeSchema):
- # Used when additionalProperties/items was not explicitly defined and a defining schema is needed
- pass
-
-
-class NotAnyTypeSchema(
- ComposedSchema,
-):
- """
- Python representation of a schema defined as false or {'not': {}}
- Does not allow inputs in of AnyType
- Note: validations on this class are never run because the code knows that no inputs will ever validate
- """
-
- class MetaOapg:
- not_schema = AnyTypeSchema
-
- def __new__(
- cls,
- *_args,
- _configuration: typing.Optional[Configuration] = None,
- ) -> 'NotAnyTypeSchema':
- return super().__new__(
- cls,
- *_args,
- _configuration=_configuration,
- )
-
-
-class DictSchema(
- DictBase,
- Schema,
- FrozenDictMixin
-):
- @classmethod
- def from_openapi_data_oapg(cls, arg: typing.Dict[str, typing.Any], _configuration: typing.Optional[Configuration] = None):
- return super().from_openapi_data_oapg(arg, _configuration=_configuration)
-
- def __new__(cls, *_args: typing.Union[dict, frozendict.frozendict], **kwargs: typing.Union[dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, bytes, Schema, Unset, ValidationMetadata]):
- return super().__new__(cls, *_args, **kwargs)
-
-
-schema_type_classes = {NoneSchema, DictSchema, ListSchema, NumberSchema, StrSchema, BoolSchema, AnyTypeSchema}
-
-
-@functools.lru_cache()
-def get_new_class(
- class_name: str,
- bases: typing.Tuple[typing.Type[typing.Union[Schema, typing.Any]], ...]
-) -> typing.Type[Schema]:
- """
- Returns a new class that is made with the subclass bases
- """
- new_cls: typing.Type[Schema] = type(class_name, bases, {})
- return new_cls
-
-
-LOG_CACHE_USAGE = False
-
-
-def log_cache_usage(cache_fn):
- if LOG_CACHE_USAGE:
- print(cache_fn.__name__, cache_fn.cache_info())
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python/setup.handlebars b/modules/openapi-generator/src/main/resources/python/setup.handlebars
deleted file mode 100644
index 5cb64ff1e61..00000000000
--- a/modules/openapi-generator/src/main/resources/python/setup.handlebars
+++ /dev/null
@@ -1,38 +0,0 @@
-# coding: utf-8
-
-{{>partial_header}}
-
-from setuptools import setup, find_packages # noqa: H301
-
-NAME = "{{{projectName}}}"
-VERSION = "{{packageVersion}}"
-{{#with apiInfo}}
-# To install the library, run the following
-#
-# python setup.py install
-#
-# prerequisite: setuptools
-# http://pypi.python.org/pypi/setuptools
-
-REQUIRES = [
- {{> required_libraries quoted=true }}
-]
-
-setup(
- name=NAME,
- version=VERSION,
- description="{{appName}}",
- author="{{#if infoName}}{{infoName}}{{/if}}{{#unless infoName}}OpenAPI Generator community{{/unless}}",
- author_email="{{#if infoEmail}}{{infoEmail}}{{/if}}{{#unless infoEmail}}team@openapitools.org{{/unless}}",
- url="{{#if packageUrl}}{{packageUrl}}{{/if}}",
- keywords=["OpenAPI", "OpenAPI-Generator", "{{{appName}}}"],
- python_requires="{{{generatorLanguageVersion}}}",
- install_requires=REQUIRES,
- packages=find_packages(exclude=["test", "tests"]),
- include_package_data=True,
- {{#if licenseInfo}}license="{{licenseInfo}}",
- {{/if}}long_description="""\
- {{appDescription}} # noqa: E501
- """
-)
-{{/with}}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/setup.mustache b/modules/openapi-generator/src/main/resources/python/setup.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/setup.mustache
rename to modules/openapi-generator/src/main/resources/python/setup.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/setup_cfg.handlebars b/modules/openapi-generator/src/main/resources/python/setup_cfg.handlebars
deleted file mode 100644
index 8cb28d8c285..00000000000
--- a/modules/openapi-generator/src/main/resources/python/setup_cfg.handlebars
+++ /dev/null
@@ -1,13 +0,0 @@
-{{#if useNose}}
-[nosetests]
-logging-clear-handlers=true
-verbosity=2
-randomize=true
-exe=true
-with-coverage=true
-cover-package={{{packageName}}}
-cover-erase=true
-
-{{/if}}
-[flake8]
-max-line-length=99
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/setup_cfg.mustache b/modules/openapi-generator/src/main/resources/python/setup_cfg.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/setup_cfg.mustache
rename to modules/openapi-generator/src/main/resources/python/setup_cfg.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/signing.handlebars b/modules/openapi-generator/src/main/resources/python/signing.handlebars
deleted file mode 100644
index a853a998ef4..00000000000
--- a/modules/openapi-generator/src/main/resources/python/signing.handlebars
+++ /dev/null
@@ -1,409 +0,0 @@
-# coding: utf-8
-{{>partial_header}}
-
-from base64 import b64encode
-from Crypto.IO import PEM, PKCS8
-from Crypto.Hash import SHA256, SHA512
-from Crypto.PublicKey import RSA, ECC
-from Crypto.Signature import PKCS1_v1_5, pss, DSS
-from email.utils import formatdate
-import json
-import os
-import re
-from time import time
-from urllib.parse import urlencode, urlparse
-
-# The constants below define a subset of HTTP headers that can be included in the
-# HTTP signature scheme. Additional headers may be included in the signature.
-
-# The '(request-target)' header is a calculated field that includes the HTTP verb,
-# the URL path and the URL query.
-HEADER_REQUEST_TARGET = '(request-target)'
-# The time when the HTTP signature was generated.
-HEADER_CREATED = '(created)'
-# The time when the HTTP signature expires. The API server should reject HTTP requests
-# that have expired.
-HEADER_EXPIRES = '(expires)'
-# The 'Host' header.
-HEADER_HOST = 'Host'
-# The 'Date' header.
-HEADER_DATE = 'Date'
-# When the 'Digest' header is included in the HTTP signature, the client automatically
-# computes the digest of the HTTP request body, per RFC 3230.
-HEADER_DIGEST = 'Digest'
-# The 'Authorization' header is automatically generated by the client. It includes
-# the list of signed headers and a base64-encoded signature.
-HEADER_AUTHORIZATION = 'Authorization'
-
-# The constants below define the cryptographic schemes for the HTTP signature scheme.
-SCHEME_HS2019 = 'hs2019'
-SCHEME_RSA_SHA256 = 'rsa-sha256'
-SCHEME_RSA_SHA512 = 'rsa-sha512'
-
-# The constants below define the signature algorithms that can be used for the HTTP
-# signature scheme.
-ALGORITHM_RSASSA_PSS = 'RSASSA-PSS'
-ALGORITHM_RSASSA_PKCS1v15 = 'RSASSA-PKCS1-v1_5'
-
-ALGORITHM_ECDSA_MODE_FIPS_186_3 = 'fips-186-3'
-ALGORITHM_ECDSA_MODE_DETERMINISTIC_RFC6979 = 'deterministic-rfc6979'
-ALGORITHM_ECDSA_KEY_SIGNING_ALGORITHMS = {
- ALGORITHM_ECDSA_MODE_FIPS_186_3,
- ALGORITHM_ECDSA_MODE_DETERMINISTIC_RFC6979
-}
-
-# The cryptographic hash algorithm for the message signature.
-HASH_SHA256 = 'sha256'
-HASH_SHA512 = 'sha512'
-
-
-class HttpSigningConfiguration(object):
- """The configuration parameters for the HTTP signature security scheme.
- The HTTP signature security scheme is used to sign HTTP requests with a private key
- which is in possession of the API client.
- An 'Authorization' header is calculated by creating a hash of select headers,
- and optionally the body of the HTTP request, then signing the hash value using
- a private key. The 'Authorization' header is added to outbound HTTP requests.
-
- NOTE: This class is auto generated by OpenAPI Generator
-
- Ref: https://openapi-generator.tech
- Do not edit the class manually.
-
- :param key_id: A string value specifying the identifier of the cryptographic key,
- when signing HTTP requests.
- :param signing_scheme: A string value specifying the signature scheme, when
- signing HTTP requests.
- Supported value are hs2019, rsa-sha256, rsa-sha512.
- Avoid using rsa-sha256, rsa-sha512 as they are deprecated. These values are
- available for server-side applications that only support the older
- HTTP signature algorithms.
- :param private_key_path: A string value specifying the path of the file containing
- a private key. The private key is used to sign HTTP requests.
- :param private_key_passphrase: A string value specifying the passphrase to decrypt
- the private key.
- :param signed_headers: A list of strings. Each value is the name of a HTTP header
- that must be included in the HTTP signature calculation.
- The two special signature headers '(request-target)' and '(created)' SHOULD be
- included in SignedHeaders.
- The '(created)' header expresses when the signature was created.
- The '(request-target)' header is a concatenation of the lowercased :method, an
- ASCII space, and the :path pseudo-headers.
- When signed_headers is not specified, the client defaults to a single value,
- '(created)', in the list of HTTP headers.
- When SignedHeaders contains the 'Digest' value, the client performs the
- following operations:
- 1. Calculate a digest of request body, as specified in RFC3230, section 4.3.2.
- 2. Set the 'Digest' header in the request body.
- 3. Include the 'Digest' header and value in the HTTP signature.
- :param signing_algorithm: A string value specifying the signature algorithm, when
- signing HTTP requests.
- Supported values are:
- 1. For RSA keys: RSASSA-PSS, RSASSA-PKCS1-v1_5.
- 2. For ECDSA keys: fips-186-3, deterministic-rfc6979.
- If None, the signing algorithm is inferred from the private key.
- The default signing algorithm for RSA keys is RSASSA-PSS.
- The default signing algorithm for ECDSA keys is fips-186-3.
- :param hash_algorithm: The hash algorithm for the signature. Supported values are
- sha256 and sha512.
- If the signing_scheme is rsa-sha256, the hash algorithm must be set
- to None or sha256.
- If the signing_scheme is rsa-sha512, the hash algorithm must be set
- to None or sha512.
- :param signature_max_validity: The signature max validity, expressed as
- a datetime.timedelta value. It must be a positive value.
- """
- def __init__(self, key_id, signing_scheme, private_key_path,
- private_key_passphrase=None,
- signed_headers=None,
- signing_algorithm=None,
- hash_algorithm=None,
- signature_max_validity=None):
- self.key_id = key_id
- if signing_scheme not in {SCHEME_HS2019, SCHEME_RSA_SHA256, SCHEME_RSA_SHA512}:
- raise Exception("Unsupported security scheme: {0}".format(signing_scheme))
- self.signing_scheme = signing_scheme
- if not os.path.exists(private_key_path):
- raise Exception("Private key file does not exist")
- self.private_key_path = private_key_path
- self.private_key_passphrase = private_key_passphrase
- self.signing_algorithm = signing_algorithm
- self.hash_algorithm = hash_algorithm
- if signing_scheme == SCHEME_RSA_SHA256:
- if self.hash_algorithm is None:
- self.hash_algorithm = HASH_SHA256
- elif self.hash_algorithm != HASH_SHA256:
- raise Exception("Hash algorithm must be sha256 when security scheme is %s" %
- SCHEME_RSA_SHA256)
- elif signing_scheme == SCHEME_RSA_SHA512:
- if self.hash_algorithm is None:
- self.hash_algorithm = HASH_SHA512
- elif self.hash_algorithm != HASH_SHA512:
- raise Exception("Hash algorithm must be sha512 when security scheme is %s" %
- SCHEME_RSA_SHA512)
- elif signing_scheme == SCHEME_HS2019:
- if self.hash_algorithm is None:
- self.hash_algorithm = HASH_SHA256
- elif self.hash_algorithm not in {HASH_SHA256, HASH_SHA512}:
- raise Exception("Invalid hash algorithm")
- if signature_max_validity is not None and signature_max_validity.total_seconds() < 0:
- raise Exception("The signature max validity must be a positive value")
- self.signature_max_validity = signature_max_validity
- # If the user has not provided any signed_headers, the default must be set to '(created)',
- # as specified in the 'HTTP signature' standard.
- if signed_headers is None or len(signed_headers) == 0:
- signed_headers = [HEADER_CREATED]
- if self.signature_max_validity is None and HEADER_EXPIRES in signed_headers:
- raise Exception(
- "Signature max validity must be set when "
- "'(expires)' signature parameter is specified")
- if len(signed_headers) != len(set(signed_headers)):
- raise Exception("Cannot have duplicates in the signed_headers parameter")
- if HEADER_AUTHORIZATION in signed_headers:
- raise Exception("'Authorization' header cannot be included in signed headers")
- self.signed_headers = signed_headers
- self.private_key = None
- """The private key used to sign HTTP requests.
- Initialized when the PEM-encoded private key is loaded from a file.
- """
- self.host = None
- """The host name, optionally followed by a colon and TCP port number.
- """
- self._load_private_key()
-
- def get_http_signature_headers(self, resource_path, method, headers, body, query_params):
- """Create a cryptographic message signature for the HTTP request and add the signed headers.
-
- :param resource_path : A string representation of the HTTP request resource path.
- :param method: A string representation of the HTTP request method, e.g. GET, POST.
- :param headers: A dict containing the HTTP request headers.
- :param body: The object representing the HTTP request body.
- :param query_params: A string representing the HTTP request query parameters.
- :return: A dict of HTTP headers that must be added to the outbound HTTP request.
- """
- if method is None:
- raise Exception("HTTP method must be set")
- if resource_path is None:
- raise Exception("Resource path must be set")
-
- signed_headers_list, request_headers_dict = self._get_signed_header_info(
- resource_path, method, headers, body, query_params)
-
- header_items = [
- "{0}: {1}".format(key.lower(), value) for key, value in signed_headers_list]
- string_to_sign = "\n".join(header_items)
-
- digest, digest_prefix = self._get_message_digest(string_to_sign.encode())
- b64_signed_msg = self._sign_digest(digest)
-
- request_headers_dict[HEADER_AUTHORIZATION] = self._get_authorization_header(
- signed_headers_list, b64_signed_msg)
-
- return request_headers_dict
-
- def get_public_key(self):
- """Returns the public key object associated with the private key.
- """
- pubkey = None
- if isinstance(self.private_key, RSA.RsaKey):
- pubkey = self.private_key.publickey()
- elif isinstance(self.private_key, ECC.EccKey):
- pubkey = self.private_key.public_key()
- return pubkey
-
- def _load_private_key(self):
- """Load the private key used to sign HTTP requests.
- The private key is used to sign HTTP requests as defined in
- https://datatracker.ietf.org/doc/draft-cavage-http-signatures/.
- """
- if self.private_key is not None:
- return
- with open(self.private_key_path, 'r') as f:
- pem_data = f.read()
- # Verify PEM Pre-Encapsulation Boundary
- r = re.compile(r"\s*-----BEGIN (.*)-----\s+")
- m = r.match(pem_data)
- if not m:
- raise ValueError("Not a valid PEM pre boundary")
- pem_header = m.group(1)
- if pem_header == 'RSA PRIVATE KEY':
- self.private_key = RSA.importKey(pem_data, self.private_key_passphrase)
- elif pem_header == 'EC PRIVATE KEY':
- self.private_key = ECC.import_key(pem_data, self.private_key_passphrase)
- elif pem_header in {'PRIVATE KEY', 'ENCRYPTED PRIVATE KEY'}:
- # Key is in PKCS8 format, which is capable of holding many different
- # types of private keys, not just EC keys.
- (key_binary, pem_header, is_encrypted) = \
- PEM.decode(pem_data, self.private_key_passphrase)
- (oid, privkey, params) = \
- PKCS8.unwrap(key_binary, passphrase=self.private_key_passphrase)
- if oid == '1.2.840.10045.2.1':
- self.private_key = ECC.import_key(pem_data, self.private_key_passphrase)
- else:
- raise Exception("Unsupported key: {0}. OID: {1}".format(pem_header, oid))
- else:
- raise Exception("Unsupported key: {0}".format(pem_header))
- # Validate the specified signature algorithm is compatible with the private key.
- if self.signing_algorithm is not None:
- supported_algs = None
- if isinstance(self.private_key, RSA.RsaKey):
- supported_algs = {ALGORITHM_RSASSA_PSS, ALGORITHM_RSASSA_PKCS1v15}
- elif isinstance(self.private_key, ECC.EccKey):
- supported_algs = ALGORITHM_ECDSA_KEY_SIGNING_ALGORITHMS
- if supported_algs is not None and self.signing_algorithm not in supported_algs:
- raise Exception(
- "Signing algorithm {0} is not compatible with private key".format(
- self.signing_algorithm))
-
- def _get_signed_header_info(self, resource_path, method, headers, body, query_params):
- """Build the HTTP headers (name, value) that need to be included in
- the HTTP signature scheme.
-
- :param resource_path : A string representation of the HTTP request resource path.
- :param method: A string representation of the HTTP request method, e.g. GET, POST.
- :param headers: A dict containing the HTTP request headers.
- :param body: The object (e.g. a dict) representing the HTTP request body.
- :param query_params: A string representing the HTTP request query parameters.
- :return: A tuple containing two dict objects:
- The first dict contains the HTTP headers that are used to calculate
- the HTTP signature.
- The second dict contains the HTTP headers that must be added to
- the outbound HTTP request.
- """
-
- if body is None:
- body = ''
- else:
- body = json.dumps(body)
-
- # Build the '(request-target)' HTTP signature parameter.
- target_host = urlparse(self.host).netloc
- target_path = urlparse(self.host).path
- request_target = method.lower() + " " + target_path + resource_path
- if query_params:
- request_target += "?" + urlencode(query_params)
-
- # Get UNIX time, e.g. seconds since epoch, not including leap seconds.
- now = time()
- # Format date per RFC 7231 section-7.1.1.2. An example is:
- # Date: Wed, 21 Oct 2015 07:28:00 GMT
- cdate = formatdate(timeval=now, localtime=False, usegmt=True)
- # The '(created)' value MUST be a Unix timestamp integer value.
- # Subsecond precision is not supported.
- created = int(now)
- if self.signature_max_validity is not None:
- expires = now + self.signature_max_validity.total_seconds()
-
- signed_headers_list = []
- request_headers_dict = {}
- for hdr_key in self.signed_headers:
- hdr_key = hdr_key.lower()
- if hdr_key == HEADER_REQUEST_TARGET:
- value = request_target
- elif hdr_key == HEADER_CREATED:
- value = '{0}'.format(created)
- elif hdr_key == HEADER_EXPIRES:
- value = '{0}'.format(expires)
- elif hdr_key == HEADER_DATE.lower():
- value = cdate
- request_headers_dict[HEADER_DATE] = '{0}'.format(cdate)
- elif hdr_key == HEADER_DIGEST.lower():
- request_body = body.encode()
- body_digest, digest_prefix = self._get_message_digest(request_body)
- b64_body_digest = b64encode(body_digest.digest())
- value = digest_prefix + b64_body_digest.decode('ascii')
- request_headers_dict[HEADER_DIGEST] = '{0}{1}'.format(
- digest_prefix, b64_body_digest.decode('ascii'))
- elif hdr_key == HEADER_HOST.lower():
- value = target_host
- request_headers_dict[HEADER_HOST] = '{0}'.format(target_host)
- else:
- value = next((v for k, v in headers.items() if k.lower() == hdr_key), None)
- if value is None:
- raise Exception(
- "Cannot sign HTTP request. "
- "Request does not contain the '{0}' header".format(hdr_key))
- signed_headers_list.append((hdr_key, value))
-
- return signed_headers_list, request_headers_dict
-
- def _get_message_digest(self, data):
- """Calculates and returns a cryptographic digest of a specified HTTP request.
-
- :param data: The string representation of the date to be hashed with a cryptographic hash.
- :return: A tuple of (digest, prefix).
- The digest is a hashing object that contains the cryptographic digest of
- the HTTP request.
- The prefix is a string that identifies the cryptographic hash. It is used
- to generate the 'Digest' header as specified in RFC 3230.
- """
- if self.hash_algorithm == HASH_SHA512:
- digest = SHA512.new()
- prefix = 'SHA-512='
- elif self.hash_algorithm == HASH_SHA256:
- digest = SHA256.new()
- prefix = 'SHA-256='
- else:
- raise Exception("Unsupported hash algorithm: {0}".format(self.hash_algorithm))
- digest.update(data)
- return digest, prefix
-
- def _sign_digest(self, digest):
- """Signs a message digest with a private key specified in the signing_info.
-
- :param digest: A hashing object that contains the cryptographic digest of the HTTP request.
- :return: A base-64 string representing the cryptographic signature of the input digest.
- """
- sig_alg = self.signing_algorithm
- if isinstance(self.private_key, RSA.RsaKey):
- if sig_alg is None or sig_alg == ALGORITHM_RSASSA_PSS:
- # RSASSA-PSS in Section 8.1 of RFC8017.
- signature = pss.new(self.private_key).sign(digest)
- elif sig_alg == ALGORITHM_RSASSA_PKCS1v15:
- # RSASSA-PKCS1-v1_5 in Section 8.2 of RFC8017.
- signature = PKCS1_v1_5.new(self.private_key).sign(digest)
- else:
- raise Exception("Unsupported signature algorithm: {0}".format(sig_alg))
- elif isinstance(self.private_key, ECC.EccKey):
- if sig_alg is None:
- sig_alg = ALGORITHM_ECDSA_MODE_FIPS_186_3
- if sig_alg in ALGORITHM_ECDSA_KEY_SIGNING_ALGORITHMS:
- # draft-ietf-httpbis-message-signatures-00 does not specify the ECDSA encoding.
- # Issue: https://github.com/w3c-ccg/http-signatures/issues/107
- signature = DSS.new(key=self.private_key, mode=sig_alg,
- encoding='der').sign(digest)
- else:
- raise Exception("Unsupported signature algorithm: {0}".format(sig_alg))
- else:
- raise Exception("Unsupported private key: {0}".format(type(self.private_key)))
- return b64encode(signature)
-
- def _get_authorization_header(self, signed_headers, signed_msg):
- """Calculates and returns the value of the 'Authorization' header when signing HTTP requests.
-
- :param signed_headers : A list of tuples. Each value is the name of a HTTP header that
- must be included in the HTTP signature calculation.
- :param signed_msg: A base-64 encoded string representation of the signature.
- :return: The string value of the 'Authorization' header, representing the signature
- of the HTTP request.
- """
- created_ts = None
- expires_ts = None
- for k, v in signed_headers:
- if k == HEADER_CREATED:
- created_ts = v
- elif k == HEADER_EXPIRES:
- expires_ts = v
- lower_keys = [k.lower() for k, v in signed_headers]
- headers_value = " ".join(lower_keys)
-
- auth_str = "Signature keyId=\"{0}\",algorithm=\"{1}\",".format(
- self.key_id, self.signing_scheme)
- if created_ts is not None:
- auth_str = auth_str + "created={0},".format(created_ts)
- if expires_ts is not None:
- auth_str = auth_str + "expires={0},".format(expires_ts)
- auth_str = auth_str + "headers=\"{0}\",signature=\"{1}\"".format(
- headers_value, signed_msg.decode('ascii'))
-
- return auth_str
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/signing.mustache b/modules/openapi-generator/src/main/resources/python/signing.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/signing.mustache
rename to modules/openapi-generator/src/main/resources/python/signing.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/test-requirements.handlebars b/modules/openapi-generator/src/main/resources/python/test-requirements.handlebars
deleted file mode 100644
index 3529726b16d..00000000000
--- a/modules/openapi-generator/src/main/resources/python/test-requirements.handlebars
+++ /dev/null
@@ -1,15 +0,0 @@
-{{#if useNose}}
-coverage>=4.0.3
-nose>=1.3.7
-pluggy>=0.3.1
-py>=1.4.31
-randomize>=0.13
-{{/if}}
-{{#unless useNose}}
-pytest~=4.6.7 # needed for python 3.4
-pytest-cov>=2.8.1
-pytest-randomly==1.2.3 # needed for python 3.4
-{{/unless}}
-{{#if hasHttpSignatureMethods}}
-pycryptodome>=3.9.0
-{{/if}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/test-requirements.mustache b/modules/openapi-generator/src/main/resources/python/test-requirements.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/test-requirements.mustache
rename to modules/openapi-generator/src/main/resources/python/test-requirements.mustache
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/tornado/rest.mustache b/modules/openapi-generator/src/main/resources/python/tornado/rest.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/tornado/rest.mustache
rename to modules/openapi-generator/src/main/resources/python/tornado/rest.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/tox.handlebars b/modules/openapi-generator/src/main/resources/python/tox.handlebars
deleted file mode 100644
index b2544b81d41..00000000000
--- a/modules/openapi-generator/src/main/resources/python/tox.handlebars
+++ /dev/null
@@ -1,10 +0,0 @@
-[tox]
-envlist = py37
-
-[testenv]
-passenv = PYTHON_VERSION
-deps=-r{toxinidir}/requirements.txt
- -r{toxinidir}/test-requirements.txt
-
-commands=
- {{#unless useNose}}pytest --cov={{{packageName}}}{{/unless}}{{#if useNose}}nosetests{{/if}}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/tox.mustache b/modules/openapi-generator/src/main/resources/python/tox.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/tox.mustache
rename to modules/openapi-generator/src/main/resources/python/tox.mustache
diff --git a/modules/openapi-generator/src/main/resources/python/travis.handlebars b/modules/openapi-generator/src/main/resources/python/travis.handlebars
deleted file mode 100644
index 5e4e1f0cc09..00000000000
--- a/modules/openapi-generator/src/main/resources/python/travis.handlebars
+++ /dev/null
@@ -1,18 +0,0 @@
-# ref: https://docs.travis-ci.com/user/languages/python
-language: python
-python:
- - "3.5"
- - "3.6"
- - "3.7"
- - "3.8"
-# command to install dependencies
-install:
- - "pip install -r requirements.txt"
- - "pip install -r test-requirements.txt"
-# command to run tests
-{{#if useNose}}
-script: nosetests
-{{/if}}
-{{#unless useNose}}
-script: pytest --cov={{{packageName}}}
-{{/unless}}
diff --git a/modules/openapi-generator/src/main/resources/python-nextgen/travis.mustache b/modules/openapi-generator/src/main/resources/python/travis.mustache
similarity index 100%
rename from modules/openapi-generator/src/main/resources/python-nextgen/travis.mustache
rename to modules/openapi-generator/src/main/resources/python/travis.mustache
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java
index d15eedc4264..71bc8275419 100644
--- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java
@@ -708,7 +708,7 @@ public class DefaultGeneratorTest {
StandardOpenOption.CREATE);
final CodegenConfigurator configurator = new CodegenConfigurator()
- .setGeneratorName("python-nextgen")
+ .setGeneratorName("python")
.setInputSpec("src/test/resources/3_0/petstore.yaml")
.setPackageName("io.something")
.setTemplateDir(templates.toAbsolutePath().toString())
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonNextgenClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientCodegenTest.java
similarity index 93%
rename from modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonNextgenClientCodegenTest.java
rename to modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientCodegenTest.java
index d3a53938860..edb7b101366 100644
--- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonNextgenClientCodegenTest.java
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientCodegenTest.java
@@ -25,7 +25,7 @@ import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.parser.core.models.ParseOptions;
import io.swagger.v3.parser.util.SchemaTypeUtil;
import org.openapitools.codegen.*;
-import org.openapitools.codegen.languages.PythonNextgenClientCodegen;
+import org.openapitools.codegen.languages.PythonClientCodegen;
import org.openapitools.codegen.languages.features.CXFServerFeatures;
import static org.openapitools.codegen.TestUtils.assertFileContains;
import static org.openapitools.codegen.TestUtils.assertFileExists;
@@ -41,11 +41,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-public class PythonNextgenClientCodegenTest {
+public class PythonClientCodegenTest {
@Test
public void testInitialConfigValues() throws Exception {
- final PythonNextgenClientCodegen codegen = new PythonNextgenClientCodegen();
+ final PythonClientCodegen codegen = new PythonClientCodegen();
codegen.processOpts();
Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.HIDE_GENERATION_TIMESTAMP), Boolean.TRUE);
@@ -54,7 +54,7 @@ public class PythonNextgenClientCodegenTest {
@Test
public void testSettersForConfigValues() throws Exception {
- final PythonNextgenClientCodegen codegen = new PythonNextgenClientCodegen();
+ final PythonClientCodegen codegen = new PythonClientCodegen();
codegen.setHideGenerationTimestamp(false);
codegen.processOpts();
@@ -64,7 +64,7 @@ public class PythonNextgenClientCodegenTest {
@Test
public void testAdditionalPropertiesPutForConfigValues() throws Exception {
- final PythonNextgenClientCodegen codegen = new PythonNextgenClientCodegen();
+ final PythonClientCodegen codegen = new PythonClientCodegen();
codegen.additionalProperties().put(CodegenConstants.HIDE_GENERATION_TIMESTAMP, false);
codegen.processOpts();
@@ -85,7 +85,7 @@ public class PythonNextgenClientCodegenTest {
@Test(description = "test regex patterns")
public void testRegularExpressionOpenAPISchemaVersion3() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue_1517.yaml");
- final PythonNextgenClientCodegen codegen = new PythonNextgenClientCodegen();
+ final PythonClientCodegen codegen = new PythonClientCodegen();
codegen.setOpenAPI(openAPI);
final String path = "/ping";
final Operation p = openAPI.getPaths().get(path).getGet();
@@ -113,7 +113,7 @@ public class PythonNextgenClientCodegenTest {
@Test(description = "test generated example values for string properties")
public void testGeneratedExampleValues() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");
- final PythonNextgenClientCodegen codegen = new PythonNextgenClientCodegen();
+ final PythonClientCodegen codegen = new PythonClientCodegen();
codegen.setOpenAPI(openAPI);
final Schema dummyUserSchema = openAPI.getComponents().getSchemas().get("DummyUser");
final Schema nameSchema = (Schema) dummyUserSchema.getProperties().get("name");
@@ -129,7 +129,7 @@ public class PythonNextgenClientCodegenTest {
@Test(description = "test single quotes escape")
public void testSingleQuotes() {
- final PythonNextgenClientCodegen codegen = new PythonNextgenClientCodegen();
+ final PythonClientCodegen codegen = new PythonClientCodegen();
StringSchema schema = new StringSchema();
schema.setDefault("Text containing 'single' quote");
String defaultValue = codegen.toDefaultValue(schema);
@@ -139,7 +139,7 @@ public class PythonNextgenClientCodegenTest {
@Test(description = "convert a python model with dots")
public void modelTest() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/v1beta3.yaml");
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
codegen.setOpenAPI(openAPI);
codegen.setOpenAPI(openAPI);
@@ -170,7 +170,7 @@ public class PythonNextgenClientCodegenTest {
.addProperties("createdAt", new DateTimeSchema())
.addRequiredItem("id")
.addRequiredItem("name");
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", schema);
@@ -215,7 +215,7 @@ public class PythonNextgenClientCodegenTest {
.addProperties("urls", new ArraySchema()
.items(new StringSchema()))
.addRequiredItem("id");
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -253,7 +253,7 @@ public class PythonNextgenClientCodegenTest {
.addProperties("translations", new MapSchema()
.additionalProperties(new StringSchema()))
.addRequiredItem("id");
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -279,7 +279,7 @@ public class PythonNextgenClientCodegenTest {
final Schema model = new Schema()
.description("a sample model")
.addProperties("children", new Schema().$ref("#/definitions/Children"));
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -304,7 +304,7 @@ public class PythonNextgenClientCodegenTest {
.description("a sample model")
.addProperties("children", new ArraySchema()
.items(new Schema().$ref("#/definitions/Children")));
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -331,7 +331,7 @@ public class PythonNextgenClientCodegenTest {
.description("a sample model")
.addProperties("children", new MapSchema()
.additionalProperties(new Schema().$ref("#/definitions/Children")));
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -361,7 +361,7 @@ public class PythonNextgenClientCodegenTest {
//.description()
.items(new Schema().$ref("#/definitions/Children"))
.description("an array model");
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -381,7 +381,7 @@ public class PythonNextgenClientCodegenTest {
final Schema model = new Schema()
.description("a map model")
.additionalProperties(new Schema().$ref("#/definitions/Children"));
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
final CodegenModel cm = codegen.fromModel("sample", model);
@@ -395,7 +395,7 @@ public class PythonNextgenClientCodegenTest {
}
@Test(description ="check API example has input param(configuration) when it creates api_client")
public void apiExampleDocTest() throws Exception {
- final DefaultCodegen codegen = new PythonNextgenClientCodegen();
+ final DefaultCodegen codegen = new PythonClientCodegen();
final String outputPath = generateFiles(codegen, "src/test/resources/3_0/generic.yaml");
final Path p = Paths.get(outputPath + "docs/DefaultApi.md");
diff --git a/pom.xml b/pom.xml
index 52c3154d573..2cb910c8541 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1204,8 +1204,8 @@
- samples/openapi3/client/petstore/python-nextgen
- samples/openapi3/client/petstore/python-nextgen-aiohttp
+ samples/openapi3/client/petstore/python
+ samples/openapi3/client/petstore/python-aiohttp