Skip to content

Commit 77ab467

Browse files
authored
Merge pull request #4 from dotX12/dev-1.0
Big update 1.0.0.0!
2 parents 25bced2 + 84ce6b0 commit 77ab467

11 files changed

+485
-184
lines changed

examples/main.py

+20-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
from fastapi import FastAPI
1+
from fastapi import FastAPI, Header
22
from fastapi import File
33
from fastapi import UploadFile
44

5-
from examples.models import PostContractBodySchema
5+
from examples.models import PostContractBodySchema, ExampleSchemaForHeader
66
from examples.models import PostContractJSONSchema
77
from examples.models import PostContractSmallDoubleBodySchema
88
from examples.models import PostContractSmallDoubleQuerySchema
9-
from pyfa_converter import FormBody
10-
from pyfa_converter.depends import QueryBody
9+
from pyfa_converter.depends import QueryDepends, FormDepends, PyFaDepends
1110

1211
app = FastAPI()
1312

@@ -22,25 +21,28 @@ async def example_json_body_handler(
2221
}
2322

2423

24+
#
25+
26+
2527
@app.post("/form-data-body")
2628
async def example_foo_body_handler(
27-
data: PostContractBodySchema = FormBody(PostContractBodySchema),
29+
data: PostContractBodySchema = FormDepends(PostContractBodySchema),
2830
document: UploadFile = File(...),
2931
):
3032
return {"title": data.title, "date": data.date, "file_name": document.filename}
3133

3234

3335
@app.post("/form-data-body-two")
3436
async def example_foo_body_handler(
35-
data: PostContractBodySchema = FormBody(PostContractBodySchema),
37+
data: PostContractBodySchema = FormDepends(PostContractBodySchema),
3638
document: UploadFile = File(...),
3739
):
3840
return {"title": data.title, "date": data.date, "file_name": document.filename}
3941

4042

4143
@app.post("/test")
4244
async def foo(
43-
data: PostContractSmallDoubleBodySchema = FormBody(
45+
data: PostContractSmallDoubleBodySchema = FormDepends(
4446
PostContractSmallDoubleBodySchema
4547
),
4648
):
@@ -49,8 +51,18 @@ async def foo(
4951

5052
@app.post("/test_query_list")
5153
async def test_list_form(
52-
data: PostContractSmallDoubleQuerySchema = QueryBody(
54+
data: PostContractSmallDoubleQuerySchema = QueryDepends(
5355
PostContractSmallDoubleQuerySchema
5456
),
5557
):
5658
return {"data": data}
59+
60+
61+
@app.post("/test_header_list")
62+
async def test_list_form(
63+
data: ExampleSchemaForHeader = PyFaDepends(
64+
model=ExampleSchemaForHeader, _type=Header
65+
),
66+
):
67+
print(data.strange_header)
68+
return {"data": data}

examples/models.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
from pydantic import Field
88
from pydantic import validator
99

10-
from pyfa_converter import PydanticConverter
11-
1210

1311
class PostContractJSONSchema(BaseModel):
1412
title: str = Field(..., description="Description title")
@@ -30,25 +28,28 @@ class PostContractSmallJSONSchema(BaseModel):
3028
)
3129

3230

33-
@PydanticConverter.body
3431
class PostContractBodySchema(PostContractJSONSchema):
3532
pass
3633

3734

38-
@PydanticConverter.body
3935
class PostContractSmallBodySchema(PostContractSmallJSONSchema):
4036
pass
4137

4238

43-
@PydanticConverter.body
4439
class PostContractSmallDoubleBodySchema(BaseModel):
4540
id: Optional[int] = Field(None, description="gwa")
4641
title: Optional[str] = Field(None)
4742
data: Optional[List[int]]
4843

4944

50-
@PydanticConverter.query
5145
class PostContractSmallDoubleQuerySchema(BaseModel):
5246
id: Optional[int] = Field(None, description="gwa")
5347
title: Optional[str] = Field(None)
5448
data: Optional[List[int]] = Field(default=[1, 2, 3])
49+
50+
51+
class ExampleSchemaForHeader(BaseModel):
52+
strange_header: Optional[str] = Field(None, convert_underscores=True)
53+
query: str = Field(...)
54+
form: str = Field(...)
55+
body: str = Field(...)

poetry.lock

+83
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyfa_converter/__init__.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from .utils import PydanticConverter
2-
from .depends import FormBody, QueryBody
1+
from .main import PydanticConverter
2+
from .depends import FormDepends, QueryDepends
33

44
__all__ = (
55
"PydanticConverter",
6-
"FormBody",
7-
"QueryBody",
6+
"FormDepends",
7+
"QueryDepends",
88
)

pyfa_converter/depends.py

+39-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,49 @@
1+
from typing import Callable
12
from typing import Type
2-
from fastapi import Depends
3+
from fastapi import Form, Query, Body, Depends
34
from pydantic import BaseModel
5+
from pydantic.fields import FieldInfo
46

57
from pyfa_converter import PydanticConverter
68

79

8-
class FormBody:
10+
class PyFaDepends:
11+
def __new__(
12+
cls,
13+
model: Type[BaseModel | PydanticConverter],
14+
_type: Callable[..., FieldInfo],
15+
):
16+
return cls.generate(model=model, _type=_type)
17+
18+
@classmethod
19+
def generate(
20+
cls,
21+
model: Type[BaseModel | PydanticConverter],
22+
_type: Callable[..., FieldInfo],
23+
):
24+
obj = PydanticConverter.reformat_model_signature(
25+
model_cls=model, _type=_type
26+
)
27+
attr = getattr(obj, str(_type.__name__).lower())
28+
return Depends(attr)
29+
30+
31+
class BodyDepends(PyFaDepends):
32+
_TYPE = Body
33+
934
def __new__(cls, model_type: Type[BaseModel | PydanticConverter]):
10-
return Depends(model_type.body)
35+
return super().generate(model=model_type, _type=cls._TYPE)
36+
37+
38+
class FormDepends(PyFaDepends):
39+
_TYPE = Form
40+
41+
def __new__(cls, model_type: Type[BaseModel | PydanticConverter]):
42+
return super().generate(model=model_type, _type=cls._TYPE)
43+
1144

45+
class QueryDepends(PyFaDepends):
46+
_TYPE = Query
1247

13-
class QueryBody:
1448
def __new__(cls, model_type: Type[BaseModel | PydanticConverter]):
15-
return Depends(model_type.query)
49+
return super().generate(model=model_type, _type=cls._TYPE)

0 commit comments

Comments
 (0)