Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,6 @@ dmypy.json
/coverage.xml
/.coverage
htmlcov/

# Generated end to end test data
my-test-api-client
14 changes: 12 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0


## 0.4.0 - Unreleased
### Breaking Changes
- Classes generated to be included within lists will now be named like <ListName>Item. For example, if a property
named "statuses" is an array of enum values, previously the `Enum` class declared would be called "Statuses". Now it
will be called "StatusesItem". If a "title" attribute was used in the OpenAPI document, that should still be respected
and used instead of the generated name.

### Additions
- Add support for binary format strings (file payloads)
- Add support for multipart/form bodies
- Support for binary format strings (file payloads)
- Support for multipart/form bodies
- Support for any supported property within a list (array), including other lists.

### Changes
- The way most imports are handled was changed which *should* lead to fewer unused imports in generated files.

## 0.3.0 - 2020-04-25
### Additions
Expand Down
8 changes: 4 additions & 4 deletions end_to_end_tests/fastapi_app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,15 @@ class AModel(BaseModel):
""" A Model for testing all the ways custom objects can be used """

an_enum_value: AnEnum
a_list_of_enums: List[AnEnum]
a_list_of_strings: List[str]
a_list_of_objects: List[OtherModel]
nested_list_of_enums: List[List[AnEnum]]
aCamelDateTime: datetime
a_date: date


@test_router.get("/", response_model=List[AModel], operation_id="getUserList")
def get_list(statuses: List[AnEnum] = Query(...), some_date: date = Query(...), some_datetime: datetime = Query(...)):
def get_list(
an_enum_value: List[AnEnum] = Query(...), some_date: date = Query(...), some_datetime: datetime = Query(...)
):
""" Get a list of things """
return

Expand Down
51 changes: 12 additions & 39 deletions end_to_end_tests/fastapi_app/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
{
"required": true,
"schema": {
"title": "Statuses",
"title": "An Enum Value",
"type": "array",
"items": {
"enum": [
Expand All @@ -46,7 +46,7 @@
]
}
},
"name": "statuses",
"name": "an_enum_value",
"in": "query"
},
{
Expand Down Expand Up @@ -145,9 +145,7 @@
"title": "AModel",
"required": [
"an_enum_value",
"a_list_of_enums",
"a_list_of_strings",
"a_list_of_objects",
"nested_list_of_enums",
"aCamelDateTime",
"a_date"
],
Expand All @@ -160,28 +158,17 @@
"SECOND_VALUE"
]
},
"a_list_of_enums": {
"title": "A List Of Enums",
"nested_list_of_enums": {
"title": "Nested List Of Enums",
"type": "array",
"items": {
"enum": [
"FIRST_VALUE",
"SECOND_VALUE"
]
}
},
"a_list_of_strings": {
"title": "A List Of Strings",
"type": "array",
"items": {
"type": "string"
}
},
"a_list_of_objects": {
"title": "A List Of Objects",
"type": "array",
"items": {
"$ref": "#/components/schemas/OtherModel"
"type": "array",
"items": {
"enum": [
"FIRST_VALUE",
"SECOND_VALUE"
]
}
}
},
"aCamelDateTime": {
Expand Down Expand Up @@ -224,20 +211,6 @@
}
}
},
"OtherModel": {
"title": "OtherModel",
"required": [
"a_value"
],
"type": "object",
"properties": {
"a_value": {
"title": "A Value",
"type": "string"
}
},
"description": "A different model for calling from TestModel "
},
"ValidationError": {
"title": "ValidationError",
"required": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@
from ..client import AuthenticatedClient, Client
from ..errors import ApiResponseError
from ..models.a_model import AModel
from ..models.an_enum_value_item import AnEnumValueItem
from ..models.body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost
from ..models.http_validation_error import HTTPValidationError
from ..models.statuses import Statuses


def get_user_list(
*, client: Client, statuses: List[Statuses], some_date: date, some_datetime: datetime,
*, client: Client, an_enum_value: List[AnEnumValueItem], some_date: date, some_datetime: datetime,
) -> Union[
List[AModel], HTTPValidationError,
]:
""" Get a list of things """
url = "{}/tests/".format(client.base_url)

params = {
"statuses": statuses,
"an_enum_value": an_enum_value,
"some_date": some_date.isoformat(),
"some_datetime": some_datetime.isoformat(),
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@
from ..client import AuthenticatedClient, Client
from ..errors import ApiResponseError
from ..models.a_model import AModel
from ..models.an_enum_value_item import AnEnumValueItem
from ..models.body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost
from ..models.http_validation_error import HTTPValidationError
from ..models.statuses import Statuses


async def get_user_list(
*, client: Client, statuses: List[Statuses], some_date: date, some_datetime: datetime,
*, client: Client, an_enum_value: List[AnEnumValueItem], some_date: date, some_datetime: datetime,
) -> Union[
List[AModel], HTTPValidationError,
]:
""" Get a list of things """
url = "{}/tests/".format(client.base_url)

params = {
"statuses": statuses,
"an_enum_value": an_enum_value,
"some_date": some_date.isoformat(),
"some_datetime": some_datetime.isoformat(),
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
""" Contains all the data models used in inputs/outputs """

from .a_list_of_enums import AListOfEnums
from .a_model import AModel
from .abc_response import ABCResponse
from .an_enum_value import AnEnumValue
from .an_enum_value_item import AnEnumValueItem
from .body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost
from .http_validation_error import HTTPValidationError
from .other_model import OtherModel
from .statuses import Statuses
from .nested_list_of_enums_item_item import NestedListOfEnumsItemItem
from .types import *
from .validation_error import ValidationError
35 changes: 13 additions & 22 deletions end_to_end_tests/golden-master/my_test_api_client/models/a_model.py
Original file line number Diff line number Diff line change
@@ -1,60 +1,51 @@
from __future__ import annotations

from dataclasses import astuple, dataclass
from dataclasses import dataclass
from datetime import date, datetime
from typing import Any, Dict, List, Optional, cast
from typing import Any, Dict, List, cast

from .a_list_of_enums import AListOfEnums
from .an_enum_value import AnEnumValue
from .other_model import OtherModel
from .types import *
from .nested_list_of_enums_item_item import NestedListOfEnumsItemItem


@dataclass
class AModel:
""" A Model for testing all the ways custom objects can be used """

an_enum_value: AnEnumValue
a_list_of_enums: List[AListOfEnums]
a_list_of_strings: List[str]
a_list_of_objects: List[OtherModel]
nested_list_of_enums: List[List[NestedListOfEnumsItemItem]]
a_camel_date_time: datetime
a_date: date

def to_dict(self) -> Dict[str, Any]:
return {
"an_enum_value": self.an_enum_value.value,
"a_list_of_enums": self.a_list_of_enums,
"a_list_of_strings": self.a_list_of_strings,
"a_list_of_objects": self.a_list_of_objects,
"nested_list_of_enums": self.nested_list_of_enums,
"aCamelDateTime": self.a_camel_date_time.isoformat(),
"a_date": self.a_date.isoformat(),
}

@staticmethod
def from_dict(d: Dict[str, Any]) -> AModel:

an_enum_value = AnEnumValue(d["an_enum_value"])

a_list_of_enums = []
for a_list_of_enums_item in d.get("a_list_of_enums", []):
a_list_of_enums.append(AListOfEnums(a_list_of_enums_item))
nested_list_of_enums = []
for nested_list_of_enums_item_data in d["nested_list_of_enums"]:
nested_list_of_enums_item = []
for nested_list_of_enums_item_item_data in nested_list_of_enums_item_data:
nested_list_of_enums_item_item = NestedListOfEnumsItemItem(nested_list_of_enums_item_item_data)

a_list_of_strings = d.get("a_list_of_strings", [])
nested_list_of_enums_item.append(nested_list_of_enums_item_item)

a_list_of_objects = []
for a_list_of_objects_item in d.get("a_list_of_objects", []):
a_list_of_objects.append(OtherModel.from_dict(a_list_of_objects_item))
nested_list_of_enums.append(nested_list_of_enums_item)

a_camel_date_time = datetime.fromisoformat(d["aCamelDateTime"])

a_date = date.fromisoformat(d["a_date"])

return AModel(
an_enum_value=an_enum_value,
a_list_of_enums=a_list_of_enums,
a_list_of_strings=a_list_of_strings,
a_list_of_objects=a_list_of_objects,
nested_list_of_enums=nested_list_of_enums,
a_camel_date_time=a_camel_date_time,
a_date=a_date,
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
from __future__ import annotations

from dataclasses import astuple, dataclass
from typing import Any, Dict, List, Optional, cast

from .types import *
from dataclasses import dataclass
from typing import Any, Dict


@dataclass
Expand All @@ -19,7 +17,6 @@ def to_dict(self) -> Dict[str, Any]:

@staticmethod
def from_dict(d: Dict[str, Any]) -> ABCResponse:

success = d["success"]

return ABCResponse(success=success,)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from enum import Enum


class AListOfEnums(str, Enum):
class AnEnumValueItem(str, Enum):
FIRST_VALUE = "FIRST_VALUE"
SECOND_VALUE = "SECOND_VALUE"
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from __future__ import annotations

from dataclasses import astuple, dataclass
from typing import Any, Dict, List, Optional, cast
from typing import Any, Dict

from .types import *
from .types import File


@dataclass
Expand All @@ -19,7 +19,6 @@ def to_dict(self) -> Dict[str, Any]:

@staticmethod
def from_dict(d: Dict[str, Any]) -> BodyUploadFileTestsUploadPost:

some_file = d["some_file"]

return BodyUploadFileTestsUploadPost(some_file=some_file,)
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
from __future__ import annotations

from dataclasses import astuple, dataclass
from dataclasses import dataclass
from typing import Any, Dict, List, Optional, cast

from .types import *
from .validation_error import ValidationError


Expand All @@ -20,8 +19,10 @@ def to_dict(self) -> Dict[str, Any]:

@staticmethod
def from_dict(d: Dict[str, Any]) -> HTTPValidationError:

detail = []
for detail_item in d.get("detail", []):
detail.append(ValidationError.from_dict(detail_item))
for detail_item_data in d.get("detail") or []:
detail_item = ValidationError.from_dict(detail_item_data)

detail.append(detail_item)

return HTTPValidationError(detail=detail,)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from enum import Enum


class Statuses(str, Enum):
class NestedListOfEnumsItemItem(str, Enum):
FIRST_VALUE = "FIRST_VALUE"
SECOND_VALUE = "SECOND_VALUE"

This file was deleted.

Loading