Skip to content

Commit d688cc7

Browse files
committed
feat: generate Pydantic v2 models from OpenAPI spec
1 parent 3d44076 commit d688cc7

2 files changed

Lines changed: 179 additions & 1 deletion

File tree

justfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
stackcoin_root := env("STACKCOIN_ROOT", "../StackCoin")
2+
13
generate:
24
datamodel-codegen \
3-
--input ../../openapi.json \
5+
--input {{stackcoin_root}}/openapi.json \
46
--input-file-type openapi \
57
--output-model-type pydantic_v2.BaseModel \
68
--output stackcoin/stackcoin/models.py \

stackcoin/stackcoin/models.py

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
# generated by datamodel-codegen:
2+
# filename: openapi.json
3+
# timestamp: 2026-03-05T03:46:00+00:00
4+
5+
from __future__ import annotations
6+
7+
from pydantic import AwareDatetime, BaseModel, Field
8+
9+
10+
class CreateRequestParams(BaseModel):
11+
amount: int = Field(..., description="Amount of STK to request")
12+
label: str | None = Field(None, description="Optional request label")
13+
14+
15+
class Requester(BaseModel):
16+
id: int | None = Field(None, description="Requester user ID")
17+
username: str | None = Field(None, description="Requester username")
18+
19+
20+
class Responder(BaseModel):
21+
id: int | None = Field(None, description="Responder user ID")
22+
username: str | None = Field(None, description="Responder username")
23+
24+
25+
class CreateRequestResponse(BaseModel):
26+
amount: int = Field(..., description="Requested amount")
27+
request_id: int = Field(..., description="Created request ID")
28+
requested_at: AwareDatetime = Field(..., description="Request timestamp")
29+
requester: Requester
30+
responder: Responder
31+
status: str = Field(..., description="Request status")
32+
success: bool = Field(..., description="Whether the operation succeeded")
33+
34+
35+
class DiscordGuild(BaseModel):
36+
designated_channel_snowflake: str | None = Field(
37+
None, description="Designated channel snowflake ID"
38+
)
39+
id: int = Field(..., description="Guild ID")
40+
last_updated: AwareDatetime = Field(..., description="Last updated timestamp")
41+
name: str = Field(..., description="Guild name")
42+
snowflake: str = Field(..., description="Discord guild snowflake ID")
43+
44+
45+
class DiscordGuildResponse(BaseModel):
46+
designated_channel_snowflake: str | None = Field(
47+
None, description="Designated channel snowflake ID"
48+
)
49+
id: int = Field(..., description="Guild ID")
50+
last_updated: AwareDatetime = Field(..., description="Last updated timestamp")
51+
name: str = Field(..., description="Guild name")
52+
snowflake: str = Field(..., description="Discord guild snowflake ID")
53+
54+
55+
class Pagination(BaseModel):
56+
limit: int | None = Field(None, description="Items per page")
57+
page: int | None = Field(None, description="Current page")
58+
total: int | None = Field(None, description="Total items")
59+
total_pages: int | None = Field(None, description="Total pages")
60+
61+
62+
class DiscordGuildsResponse(BaseModel):
63+
guilds: list[DiscordGuild] | None = Field(None, description="The guilds list")
64+
pagination: Pagination | None = None
65+
66+
67+
class ErrorResponse(BaseModel):
68+
error: str = Field(..., description="Error message")
69+
70+
71+
class Request(BaseModel):
72+
amount: int = Field(..., description="Requested amount")
73+
id: int = Field(..., description="Request ID")
74+
label: str | None = Field(None, description="Request label")
75+
requested_at: AwareDatetime = Field(..., description="Request timestamp")
76+
requester: Requester
77+
resolved_at: AwareDatetime | None = Field(None, description="Resolution timestamp")
78+
responder: Responder
79+
status: str = Field(..., description="Request status")
80+
transaction_id: int | None = Field(None, description="Associated transaction ID")
81+
82+
83+
class RequestActionResponse(BaseModel):
84+
request_id: int = Field(..., description="Request ID")
85+
resolved_at: AwareDatetime = Field(..., description="Resolution timestamp")
86+
status: str = Field(..., description="New request status")
87+
success: bool = Field(..., description="Whether the operation succeeded")
88+
transaction_id: int | None = Field(None, description="Associated transaction ID")
89+
90+
91+
class RequestResponse(BaseModel):
92+
amount: int = Field(..., description="Requested amount")
93+
id: int = Field(..., description="Request ID")
94+
label: str | None = Field(None, description="Request label")
95+
requested_at: AwareDatetime = Field(..., description="Request timestamp")
96+
requester: Requester
97+
resolved_at: AwareDatetime | None = Field(None, description="Resolution timestamp")
98+
responder: Responder
99+
status: str = Field(..., description="Request status")
100+
transaction_id: int | None = Field(None, description="Associated transaction ID")
101+
102+
103+
class RequestsResponse(BaseModel):
104+
pagination: Pagination | None = None
105+
requests: list[Request] | None = Field(None, description="The requests list")
106+
107+
108+
class SendStkParams(BaseModel):
109+
amount: int = Field(..., description="Amount of STK to send")
110+
label: str | None = Field(None, description="Optional transaction label")
111+
112+
113+
class SendStkResponse(BaseModel):
114+
amount: int = Field(..., description="Amount sent")
115+
from_new_balance: int = Field(..., description="Sender's new balance")
116+
success: bool = Field(..., description="Whether the operation succeeded")
117+
to_new_balance: int = Field(..., description="Recipient's new balance")
118+
transaction_id: int = Field(..., description="Created transaction ID")
119+
120+
121+
class From(BaseModel):
122+
id: int | None = Field(None, description="From user ID")
123+
username: str | None = Field(None, description="From username")
124+
125+
126+
class To(BaseModel):
127+
id: int | None = Field(None, description="To user ID")
128+
username: str | None = Field(None, description="To username")
129+
130+
131+
class Transaction(BaseModel):
132+
amount: int = Field(..., description="Transaction amount")
133+
from_: From = Field(..., alias="from")
134+
id: int = Field(..., description="Transaction ID")
135+
label: str | None = Field(None, description="Transaction label")
136+
time: AwareDatetime = Field(..., description="Transaction timestamp")
137+
to: To
138+
139+
140+
class TransactionResponse(BaseModel):
141+
amount: int = Field(..., description="Transaction amount")
142+
from_: From = Field(..., alias="from")
143+
id: int = Field(..., description="Transaction ID")
144+
label: str | None = Field(None, description="Transaction label")
145+
time: AwareDatetime = Field(..., description="Transaction timestamp")
146+
to: To
147+
148+
149+
class TransactionsResponse(BaseModel):
150+
pagination: Pagination | None = None
151+
transactions: list[Transaction] | None = Field(None, description="The transactions list")
152+
153+
154+
class User(BaseModel):
155+
admin: bool = Field(..., description="Whether user is an admin")
156+
balance: int = Field(..., description="User's STK balance")
157+
banned: bool = Field(..., description="Whether user is banned")
158+
id: int | None = Field(None, description="User ID")
159+
inserted_at: AwareDatetime | None = Field(None, description="Creation timestamp")
160+
updated_at: AwareDatetime | None = Field(None, description="Update timestamp")
161+
username: str = Field(..., description="Username")
162+
163+
164+
class UserResponse(BaseModel):
165+
admin: bool = Field(..., description="Whether user is an admin")
166+
balance: int = Field(..., description="User's STK balance")
167+
banned: bool = Field(..., description="Whether user is banned")
168+
id: int | None = Field(None, description="User ID")
169+
inserted_at: AwareDatetime | None = Field(None, description="Creation timestamp")
170+
updated_at: AwareDatetime | None = Field(None, description="Update timestamp")
171+
username: str = Field(..., description="Username")
172+
173+
174+
class UsersResponse(BaseModel):
175+
pagination: Pagination | None = None
176+
users: list[User] | None = Field(None, description="The users list")

0 commit comments

Comments
 (0)