Skip to content

Commit 0b66fbf

Browse files
committed
Finish
1 parent f68d290 commit 0b66fbf

4 files changed

Lines changed: 128 additions & 126 deletions

File tree

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
from uuid import uuid4
2+
3+
from pydantic import BaseModel
4+
5+
from fastapi_forge.enums import FieldDataType
6+
7+
8+
class DataTypeInfo(BaseModel):
9+
sqlalchemy_type: str
10+
sqlalchemy_prefix: bool
11+
python_type: str
12+
faker_field_value: str
13+
value: str
14+
test_value: str
15+
test_func: str = ""
16+
17+
18+
class DataTypeInfoRegistry:
19+
def __init__(self):
20+
self._registry: dict[FieldDataType, DataTypeInfo] = {}
21+
22+
def register(self, field_data_type: FieldDataType, data_type: DataTypeInfo):
23+
if field_data_type in self._registry:
24+
raise ValueError(f"Data type '{field_data_type}' is already registered.")
25+
self._registry[field_data_type] = data_type
26+
27+
def get(self, field_data_type: FieldDataType) -> DataTypeInfo:
28+
if field_data_type not in self._registry:
29+
raise ValueError(f"Data type '{field_data_type}' not found.")
30+
return self._registry[field_data_type]
31+
32+
def all(self) -> list[DataTypeInfo]:
33+
return list(self._registry.values())
34+
35+
36+
registry = DataTypeInfoRegistry()
37+
faker_placeholder = "factory.Faker({placeholder})"
38+
39+
40+
registry.register(
41+
FieldDataType.STRING,
42+
DataTypeInfo(
43+
sqlalchemy_type="String",
44+
sqlalchemy_prefix=True,
45+
python_type="str",
46+
faker_field_value=faker_placeholder.format(placeholder='"text"'),
47+
value="hello",
48+
test_value="'world'",
49+
),
50+
)
51+
52+
registry.register(
53+
FieldDataType.INTEGER,
54+
DataTypeInfo(
55+
sqlalchemy_type="Integer",
56+
sqlalchemy_prefix=True,
57+
python_type="int",
58+
faker_field_value=faker_placeholder.format(placeholder='"random_int"'),
59+
value="1",
60+
test_value="2",
61+
),
62+
)
63+
64+
registry.register(
65+
FieldDataType.FLOAT,
66+
DataTypeInfo(
67+
sqlalchemy_type="Float",
68+
sqlalchemy_prefix=True,
69+
python_type="float",
70+
faker_field_value=faker_placeholder.format(
71+
placeholder='"pyfloat", positive=True, min_value=0.1, max_value=100'
72+
),
73+
value="1.0",
74+
test_value="2.0",
75+
),
76+
)
77+
78+
registry.register(
79+
FieldDataType.BOOLEAN,
80+
DataTypeInfo(
81+
sqlalchemy_type="Boolean",
82+
sqlalchemy_prefix=True,
83+
python_type="bool",
84+
faker_field_value=faker_placeholder.format(placeholder='"boolean"'),
85+
value="True",
86+
test_value="False",
87+
),
88+
)
89+
90+
registry.register(
91+
FieldDataType.DATETIME,
92+
DataTypeInfo(
93+
sqlalchemy_type="DateTime(timezone=True)",
94+
sqlalchemy_prefix=True,
95+
python_type="datetime",
96+
faker_field_value=faker_placeholder.format(placeholder='"date_time"'),
97+
value="datetime.now(timezone.utc)",
98+
test_value="datetime.now(timezone.utc)",
99+
test_func=".isoformat()",
100+
),
101+
)
102+
103+
registry.register(
104+
FieldDataType.UUID,
105+
DataTypeInfo(
106+
sqlalchemy_type="UUID(as_uuid=True)",
107+
sqlalchemy_prefix=True,
108+
python_type="UUID",
109+
faker_field_value=str(uuid4()),
110+
value=str(uuid4()),
111+
test_value=str(uuid4()),
112+
),
113+
)
114+
115+
registry.register(
116+
FieldDataType.JSONB,
117+
DataTypeInfo(
118+
sqlalchemy_type="JSONB",
119+
sqlalchemy_prefix=False,
120+
python_type="dict[str, Any]",
121+
faker_field_value="{}",
122+
value="{}",
123+
test_value='{"another_key": 123}',
124+
),
125+
)

fastapi_forge/dtos.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
model_validator,
1010
)
1111

12-
from fastapi_forge.enums import DataTypeInfo, FieldDataType, registry
12+
from fastapi_forge.data_type_registry import DataTypeInfo, registry
13+
from fastapi_forge.enums import FieldDataType
1314
from fastapi_forge.string_utils import camel_to_snake_hyphen, snake_to_camel
1415

1516
BoundedStr = Annotated[str, Field(..., min_length=1, max_length=100)]

fastapi_forge/enums.py

Lines changed: 0 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
from enum import StrEnum
2-
from uuid import uuid4
3-
from pydantic import BaseModel
42

53

64
class HTTPMethod(StrEnum):
@@ -19,125 +17,3 @@ class FieldDataType(StrEnum):
1917
DATETIME = "DateTime"
2018
UUID = "UUID"
2119
JSONB = "JSONB"
22-
23-
24-
# register a DataTypeInfo with a FieldDataType to make it easier to support types
25-
class DataTypeInfo(BaseModel):
26-
27-
sqlalchemy_type: str
28-
sqlalchemy_prefix: bool
29-
python_type: str
30-
faker_field_value: str
31-
value: str
32-
test_value: str
33-
test_func: str = ""
34-
35-
36-
class DataTypeInfoRegistry:
37-
def __init__(self):
38-
self._registry: dict[FieldDataType, DataTypeInfo] = {}
39-
40-
def register(self, field_data_type: FieldDataType, data_type: DataTypeInfo):
41-
if field_data_type in self._registry:
42-
raise ValueError(f"Data type '{field_data_type}' is already registered.")
43-
self._registry[field_data_type] = data_type
44-
45-
def get(self, field_data_type: FieldDataType) -> DataTypeInfo:
46-
if field_data_type not in self._registry:
47-
raise ValueError(f"Data type '{field_data_type}' not found.")
48-
return self._registry[field_data_type]
49-
50-
def all(self) -> list[DataTypeInfo]:
51-
return list(self._registry.values())
52-
53-
54-
registry = DataTypeInfoRegistry()
55-
faker_placeholder = "factory.Faker({placeholder})"
56-
57-
58-
registry.register(
59-
FieldDataType.STRING,
60-
DataTypeInfo(
61-
sqlalchemy_type="String",
62-
sqlalchemy_prefix=True,
63-
python_type="str",
64-
faker_field_value=faker_placeholder.format(placeholder='"text"'),
65-
value="hello",
66-
test_value="'world'",
67-
),
68-
)
69-
70-
registry.register(
71-
FieldDataType.INTEGER,
72-
DataTypeInfo(
73-
sqlalchemy_type="Integer",
74-
sqlalchemy_prefix=True,
75-
python_type="int",
76-
faker_field_value=faker_placeholder.format(placeholder='"random_int"'),
77-
value="1",
78-
test_value="2",
79-
),
80-
)
81-
82-
registry.register(
83-
FieldDataType.FLOAT,
84-
DataTypeInfo(
85-
sqlalchemy_type="Float",
86-
sqlalchemy_prefix=True,
87-
python_type="float",
88-
faker_field_value=faker_placeholder.format(
89-
placeholder='"pyfloat", positive=True, min_value=0.1, max_value=100'
90-
),
91-
value="1.0",
92-
test_value="2.0",
93-
),
94-
)
95-
96-
registry.register(
97-
FieldDataType.BOOLEAN,
98-
DataTypeInfo(
99-
sqlalchemy_type="Boolean",
100-
sqlalchemy_prefix=True,
101-
python_type="bool",
102-
faker_field_value=faker_placeholder.format(placeholder='"boolean"'),
103-
value="True",
104-
test_value="False",
105-
),
106-
)
107-
108-
registry.register(
109-
FieldDataType.DATETIME,
110-
DataTypeInfo(
111-
sqlalchemy_type="DateTime(timezone=True)",
112-
sqlalchemy_prefix=True,
113-
python_type="datetime",
114-
faker_field_value=faker_placeholder.format(placeholder='"date_time"'),
115-
value="datetime.now(timezone.utc)",
116-
test_value="datetime.now(timezone.utc)",
117-
test_func=".isoformat()",
118-
),
119-
)
120-
121-
registry.register(
122-
FieldDataType.UUID,
123-
DataTypeInfo(
124-
sqlalchemy_type="UUID(as_uuid=True)",
125-
sqlalchemy_prefix=True,
126-
python_type="UUID",
127-
faker_field_value=str(uuid4()),
128-
value=str(uuid4()),
129-
test_value=str(uuid4()),
130-
),
131-
)
132-
133-
registry.register(
134-
FieldDataType.JSONB,
135-
DataTypeInfo(
136-
sqlalchemy_type="JSONB",
137-
sqlalchemy_prefix=False,
138-
python_type="dict[str, Any]",
139-
faker_field_value="{}",
140-
value="{}",
141-
test_value='{"key": "value"}',
142-
),
143-
)

fastapi_forge/template/{{cookiecutter.project_name}}/tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ async def mock_redis() -> AsyncGenerator[FakeRedis, None]:
9696
"""Provide a fake Redis instance."""
9797
client = FakeRedis()
9898
yield client
99-
await client.close()
99+
await client.aclose()
100100
{% endif %}
101101

102102

0 commit comments

Comments
 (0)