Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit aa1446f

Browse files
committed
Uses datetime import, adds types templates
1 parent e82ba0c commit aa1446f

12 files changed

+67
-58
lines changed

modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ public AbstractPythonCodegen() {
6161
"assert", "else", "if", "pass", "yield", "break", "except", "import",
6262
"print", "class", "exec", "in", "raise", "continue", "finally", "is",
6363
"return", "def", "for", "lambda", "try", "self", "nonlocal", "None", "True",
64-
"False", "async", "await"));
64+
"False", "async", "await",
65+
// imports, imports_schema_types.handlebars, include these to prevent name collision
66+
"datetime", "decimal", "functools", "io", "re",
67+
"typing", "typing_extensions", "uuid", "frozendict", "schemas"
68+
));
6569

6670
languageSpecificPrimitives.clear();
6771
languageSpecificPrimitives.add("int");

modules/openapi-json-schema-generator/src/main/resources/python/api_client.handlebars

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# coding: utf-8
22
{{>partial_header}}
33

4+
import datetime
45
import dataclasses
5-
from decimal import Decimal
6+
import decimal
67
import enum
78
import email
89
import json
@@ -33,8 +34,6 @@ from {{packageName}}.schemas import (
3334
Schema,
3435
FileIO,
3536
BinarySchema,
36-
date,
37-
datetime,
3837
none_type,
3938
Unset,
4039
unset,
@@ -58,7 +57,7 @@ class JSONEncoder(json.JSONEncoder):
5857
return float(obj)
5958
elif isinstance(obj, int):
6059
return int(obj)
61-
elif isinstance(obj, Decimal):
60+
elif isinstance(obj, decimal.Decimal):
6261
if obj.as_tuple().exponent >= 0:
6362
return int(obj)
6463
return float(obj)
@@ -431,7 +430,7 @@ class PathParameter(ParameterBase, StyleSimpleSerializer):
431430
def serialize(
432431
cls,
433432
in_data: typing.Union[
434-
Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict]
433+
Schema, decimal.Decimal, int, float, str, datetime.date, datetime.datetime, None, bool, list, tuple, dict, frozendict.frozendict]
435434
) -> typing.Dict[str, str]:
436435
if cls.schema:
437436
cast_in_data = cls.schema(in_data)
@@ -536,7 +535,7 @@ class QueryParameter(ParameterBase, StyleFormSerializer):
536535
def serialize(
537536
cls,
538537
in_data: typing.Union[
539-
Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict],
538+
Schema, decimal.Decimal, int, float, str, datetime.date, datetime.datetime, None, bool, list, tuple, dict, frozendict.frozendict],
540539
prefix_separator_iterator: typing.Optional[PrefixSeparatorIterator] = None
541540
) -> typing.Dict[str, str]:
542541
if cls.schema:
@@ -592,7 +591,7 @@ class CookieParameter(ParameterBase, StyleFormSerializer):
592591
def serialize(
593592
cls,
594593
in_data: typing.Union[
595-
Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict]
594+
Schema, decimal.Decimal, int, float, str, datetime.date, datetime.datetime, None, bool, list, tuple, dict, frozendict.frozendict]
596595
) -> typing.Dict[str, str]:
597596
if cls.schema:
598597
cast_in_data = cls.schema(in_data)
@@ -646,7 +645,7 @@ class HeaderParameterWithoutName(ParameterBase, StyleSimpleSerializer):
646645
def serialize(
647646
cls,
648647
in_data: typing.Union[
649-
Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict],
648+
Schema, decimal.Decimal, int, float, str, datetime.date, datetime.datetime, None, bool, list, tuple, dict, frozendict.frozendict],
650649
name: str
651650
) -> HTTPHeaderDict:
652651
if cls.schema:
@@ -699,7 +698,7 @@ class HeaderParameter(HeaderParameterWithoutName):
699698
def serialize(
700699
cls,
701700
in_data: typing.Union[
702-
Schema, Decimal, int, float, str, date, datetime, None, bool, list, tuple, dict, frozendict.frozendict]
701+
Schema, decimal.Decimal, int, float, str, datetime.date, datetime.datetime, None, bool, list, tuple, dict, frozendict.frozendict]
703702
) -> HTTPHeaderDict:
704703
return super().serialize(
705704
in_data,

modules/openapi-json-schema-generator/src/main/resources/python/model_templates/imports_schema_types.handlebars

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import date, datetime # noqa: F401
1+
import datetime # noqa: F401
22
import decimal # noqa: F401
33
import functools # noqa: F401
44
import io # noqa: F401

modules/openapi-json-schema-generator/src/main/resources/python/model_templates/new.handlebars

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def __new__(
5252
{{/unless}}
5353
{{else}}
5454
{{#or isMap isAnyType}}
55-
**kwargs: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, None, list, tuple, bytes],
55+
**kwargs: typing.Union[{{> types_all_incl_schema_oneline }}],
5656
{{/or}}
5757
{{/with}}
5858
) -> '{{name.getCamelCaseName}}':
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#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}}
1+
{{#if isAnyType}}dict, frozendict.frozendict, str, datetime.date, datetime.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"}}datetime.date, {{/eq}}{{#eq format "date-time"}}datetime.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}}

modules/openapi-json-schema-generator/src/main/resources/python/response.handlebars

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import dataclasses
2-
from datetime import date, datetime
2+
import datetime
33
import decimal
44
import io
55
import typing

modules/openapi-json-schema-generator/src/main/resources/python/schema_doc.handlebars

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Key | Input Type | Accessed Type | Description | Notes
2727
{{/if}}
2828
{{/unless}}
2929
{{else}}
30-
**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]
30+
**any_string_name** | {{> types_all_incl_schema_oneline }} | {{> types_all_accessed }} | any string name can be used but the value must be the correct type | [optional]
3131
{{/with}}
3232
{{/or}}
3333
{{#each requiredProperties}}

modules/openapi-json-schema-generator/src/main/resources/python/schemas.handlebars

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
{{>partial_header}}
44

55
from collections import defaultdict
6-
from datetime import date, datetime, timedelta # noqa: F401
6+
import datetime
77
import functools
88
import decimal
99
import io
@@ -687,12 +687,12 @@ class CustomIsoparser(isoparser):
687687

688688
if len(components) > 3 and components[3] == 24:
689689
components[3] = 0
690-
return datetime(*components) + timedelta(days=1)
690+
return datetime.datetime(*components) + datetime.timedelta(days=1)
691691

692692
if len(components) <= 3:
693693
raise ValueError('Value is not a datetime')
694694

695-
return datetime(*components)
695+
return datetime.datetime(*components)
696696

697697
@_takes_ascii
698698
def parse_isodate(self, datestr):
@@ -704,7 +704,7 @@ class CustomIsoparser(isoparser):
704704
if len(components) > 3:
705705
raise ValueError('String contains invalid time components')
706706

707-
return date(*components)
707+
return datetime.date(*components)
708708

709709

710710
DEFAULT_ISOPARSER = CustomIsoparser()
@@ -1422,7 +1422,7 @@ class Schema:
14221422
items = cls._get_items_oapg(arg, path_to_item, path_to_schemas)
14231423
return super(Schema, cls).__new__(cls, items)
14241424
"""
1425-
str = openapi str, date, and datetime
1425+
str = openapi str, datetime.date, and datetime.datetime
14261426
decimal.Decimal = openapi int and float
14271427
FileIO = openapi binary type and the user inputs a file
14281428
bytes = openapi binary type and the user inputs bytes
@@ -1483,35 +1483,11 @@ class Schema:
14831483
def __new__(
14841484
cls,
14851485
*_args: typing.Union[
1486-
dict,
1487-
frozendict.frozendict,
1488-
list,
1489-
tuple,
1490-
decimal.Decimal,
1491-
float,
1492-
int,
1493-
str,
1494-
date,
1495-
datetime,
1496-
bool,
1497-
None,
1498-
'Schema'
1486+
{{> types_all_incl_schema }}
14991487
],
15001488
_configuration: typing.Optional[Configuration] = None,
15011489
**kwargs: typing.Union[
1502-
dict,
1503-
frozendict.frozendict,
1504-
list,
1505-
tuple,
1506-
decimal.Decimal,
1507-
float,
1508-
int,
1509-
str,
1510-
date,
1511-
datetime,
1512-
bool,
1513-
None,
1514-
'Schema',
1490+
{{> types_all_incl_schema }}
15151491
Unset
15161492
]
15171493
):
@@ -1557,10 +1533,10 @@ class Schema:
15571533
def __init__(
15581534
self,
15591535
*_args: typing.Union[
1560-
dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, 'Schema'],
1536+
dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, datetime.date, datetime.datetime, bool, None, 'Schema'],
15611537
_configuration: typing.Optional[Configuration] = None,
15621538
**kwargs: typing.Union[
1563-
dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date, datetime, bool, None, 'Schema', Unset
1539+
dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, datetime.date, datetime.datetime, bool, None, 'Schema', Unset
15641540
]
15651541
):
15661542
"""
@@ -1907,11 +1883,11 @@ class StrBase:
19071883
return self
19081884

19091885
@property
1910-
def as_date_oapg(self) -> date:
1886+
def as_date_oapg(self) -> datetime.date:
19111887
raise Exception('not implemented')
19121888

19131889
@property
1914-
def as_datetime_oapg(self) -> datetime:
1890+
def as_datetime_oapg(self) -> datetime.datetime:
19151891
raise Exception('not implemented')
19161892

19171893
@property
@@ -1933,14 +1909,14 @@ class UUIDBase:
19331909
class DateBase:
19341910
@property
19351911
@functools.lru_cache()
1936-
def as_date_oapg(self) -> date:
1912+
def as_date_oapg(self) -> datetime.date:
19371913
return DEFAULT_ISOPARSER.parse_isodate(self)
19381914

19391915

19401916
class DateTimeBase:
19411917
@property
19421918
@functools.lru_cache()
1943-
def as_datetime_oapg(self) -> datetime:
1919+
def as_datetime_oapg(self) -> datetime.datetime:
19441920
return DEFAULT_ISOPARSER.parse_isodatetime(self)
19451921

19461922

@@ -2076,12 +2052,16 @@ class DictBase:
20762052

20772053

20782054
def cast_to_allowed_types(
2079-
arg: typing.Union[str, date, datetime, uuid.UUID, decimal.Decimal, int, float, None, dict, frozendict.frozendict, list, tuple, bytes, Schema, io.FileIO, io.BufferedReader],
2055+
arg: typing.Union[
2056+
{{> types_all_incl_schema }}
2057+
],
20802058
from_server: bool,
20812059
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]]],
20822060
path_to_item: typing.Tuple[typing.Union[str, int], ...],
20832061
path_to_type: typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Type]
2084-
) -> typing.Union[frozendict.frozendict, tuple, decimal.Decimal, str, bytes, BoolClass, NoneClass, FileIO]:
2062+
) -> typing.Union[
2063+
{{> types_all_accessed }}
2064+
]:
20852065
"""
20862066
Casts the input payload arg into the allowed types
20872067
The input validated_path_to_schemas is mutated by running this function
@@ -2170,7 +2150,7 @@ def cast_to_allowed_types(
21702150
elif isinstance(arg, (none_type, NoneClass)):
21712151
path_to_type[path_to_item] = NoneClass
21722152
return NoneClass.NONE
2173-
elif isinstance(arg, (date, datetime)):
2153+
elif isinstance(arg, (datetime.date, datetime.datetime)):
21742154
path_to_type[path_to_item] = str
21752155
if not from_server:
21762156
return arg.isoformat()
@@ -2325,7 +2305,7 @@ class StrSchema(
23252305
def from_openapi_data_oapg(cls, arg: str, _configuration: typing.Optional[Configuration] = None) -> 'StrSchema':
23262306
return super().from_openapi_data_oapg(arg, _configuration=_configuration)
23272307

2328-
def __new__(cls, _arg: typing.Union[str, date, datetime, uuid.UUID], **kwargs: Configuration):
2308+
def __new__(cls, _arg: typing.Union[str, datetime.date, datetime.datetime, uuid.UUID], **kwargs: Configuration):
23292309
return super().__new__(cls, _arg, **kwargs)
23302310

23312311

@@ -2352,7 +2332,7 @@ class DateTimeSchema(DateTimeBase, StrSchema):
23522332
types = {str}
23532333
format = 'date-time'
23542334

2355-
def __new__(cls, _arg: typing.Union[str, datetime], **kwargs: Configuration):
2335+
def __new__(cls, _arg: typing.Union[str, datetime.datetime], **kwargs: Configuration):
23562336
return super().__new__(cls, _arg, **kwargs)
23572337

23582338

@@ -2502,7 +2482,7 @@ class DictSchema(
25022482
def from_openapi_data_oapg(cls, arg: typing.Dict[str, typing.Any], _configuration: typing.Optional[Configuration] = None):
25032483
return super().from_openapi_data_oapg(arg, _configuration=_configuration)
25042484

2505-
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]):
2485+
def __new__(cls, *_args: typing.Union[dict, frozendict.frozendict], **kwargs: typing.Union[dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, date.datetime, datetime.datetime, bool, None, bytes, Schema, Unset, ValidationMetadata]):
25062486
return super().__new__(cls, *_args, **kwargs)
25072487

25082488

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
frozendict.frozendict,
2+
tuple,
3+
decimal.Decimal,
4+
str,
5+
bytes,
6+
BoolClass,
7+
NoneClass,
8+
FileIO
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
frozendict.frozendict, tuple, decimal.Decimal, str, bytes, BoolClass, NoneClass, FileIO
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
dict,
2+
frozendict.frozendict,
3+
list,
4+
tuple,
5+
decimal.Decimal,
6+
float,
7+
int,
8+
str,
9+
datetime.date,
10+
datetime.datetime,
11+
uuid.UUID,
12+
bool,
13+
None,
14+
io.FileIO,
15+
io.BufferedReader,
16+
'Schema',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
dict, frozendict.frozendict, list, tuple, decimal.Decimal, float, int, str, datetime.date, datetime.datetime, uuid.UUID, bool, None, io.FileIO, io.BufferedReader, schemas.Schema

0 commit comments

Comments
 (0)