Skip to content

Commit 8b02e3a

Browse files
authored
Merge pull request #9 from jotonedev/remove-pydantic
Refactor models
2 parents 5038cb7 + 81c264c commit 8b02e3a

File tree

10 files changed

+647
-227
lines changed

10 files changed

+647
-227
lines changed

ctftime_api/client.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
import httpx
66
from httpx import URL, Timeout
7-
from pydantic_extra_types.country import CountryAlpha2
87

8+
from ctftime_api.models.country import CountryCode
99
from ctftime_api.models.event import Event, EventResult
10-
from ctftime_api.models.team import TeamRank, Team, TeamComplete
10+
from ctftime_api.models.team import Team, TeamComplete, TeamRank
1111
from ctftime_api.models.vote import Vote
1212

1313
__all__ = ["CTFTimeClient"]
@@ -65,10 +65,10 @@ async def get_top_teams_per_year(
6565
response: dict[str, list[dict]] = await self._get(url, params={"limit": limit})
6666
teams = response.get(f"{year}", [])
6767

68-
return [TeamRank.model_validate(team) for team in teams]
68+
return [TeamRank.from_dict(team) for team in teams]
6969

7070
async def get_top_team_by_country(
71-
self, country: str | CountryAlpha2
71+
self, country: str | CountryCode
7272
) -> list[TeamRank]:
7373
"""
7474
Get the top teams in the leaderboard for a specific country.
@@ -78,9 +78,7 @@ async def get_top_team_by_country(
7878
:raise httpx.HTTPStatusError: If the response status code is not successful.
7979
:raise ValueError: If the country is not a two-letter country code or a pycountry Country object.
8080
"""
81-
if isinstance(country, CountryAlpha2):
82-
country = country
83-
elif isinstance(country, str):
81+
if isinstance(country, str):
8482
if len(country) != 2:
8583
raise ValueError(
8684
"Country must be a two-letter country code or a pycountry Country object."
@@ -89,7 +87,7 @@ async def get_top_team_by_country(
8987
url = self._base_url.join("top-by-country/").join(f"{country}/")
9088
teams: list[dict[str, Any]] = await self._get(url)
9189

92-
return [TeamRank.model_validate(team) for team in teams]
90+
return [TeamRank.from_dict(team) for team in teams]
9391

9492
async def get_events_information(
9593
self, start: int | datetime, end: int | datetime, limit: int = 10
@@ -118,7 +116,7 @@ async def get_events_information(
118116
url, params={"start": start, "finish": end, "limit": limit}
119117
)
120118

121-
return [Event.model_validate(event) for event in events]
119+
return [Event.from_dict(event) for event in events]
122120

123121
async def get_event_information(self, event_id: int) -> Event:
124122
"""
@@ -130,7 +128,7 @@ async def get_event_information(self, event_id: int) -> Event:
130128
url = self._base_url.join(f"events/{event_id}/")
131129
event: dict[str, Any] = await self._get(url)
132130

133-
return Event.model_validate(event)
131+
return Event.from_dict(event)
134132

135133
async def get_teams_information(
136134
self, limit: int = 100, offset: int = 0
@@ -149,7 +147,7 @@ async def get_teams_information(
149147
)
150148
teams: list[dict[str, Any]] = response.get("results", [])
151149

152-
return [Team.model_validate(team) for team in teams]
150+
return [Team.from_dict(team) for team in teams]
153151

154152
async def get_team_information(self, team_id: int) -> TeamComplete:
155153
"""
@@ -161,7 +159,7 @@ async def get_team_information(self, team_id: int) -> TeamComplete:
161159
url = self._base_url.join(f"teams/{team_id}/")
162160
team: dict[str, Any] = await self._get(url)
163161

164-
return TeamComplete.model_validate(team)
162+
return TeamComplete.from_dict(team)
165163

166164
async def get_event_results(
167165
self, year: int | None = None
@@ -181,7 +179,7 @@ async def get_event_results(
181179
event: dict[str, dict] = await self._get(url)
182180

183181
return {
184-
int(ctf_id): EventResult(**result, ctf_id=int(ctf_id))
182+
int(ctf_id): EventResult.from_dict(result)
185183
for ctf_id, result in event.items()
186184
}
187185

@@ -206,4 +204,4 @@ async def get_votes_per_year(
206204
url = self._base_url.join(f"votes/{year}/")
207205
votes: list[dict] = await self._get(url, timeout=timeout)
208206

209-
return [Vote(**vote) for vote in votes]
207+
return [Vote.from_dict(vote) for vote in votes]

ctftime_api/models/country.py

Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
from enum import StrEnum
2+
3+
__all__ = ["CountryCode"]
4+
5+
6+
class CountryCode(StrEnum):
7+
"""
8+
An enum for ISO 3166-1 alpha-2 country codes.
9+
"""
10+
11+
AFGHANISTAN = "AF"
12+
ALAND_ISLANDS = "AX"
13+
ALBANIA = "AL"
14+
ALGERIA = "DZ"
15+
AMERICAN_SAMOA = "AS"
16+
ANDORRA = "AD"
17+
ANGOLA = "AO"
18+
ANGUILLA = "AI"
19+
ANTARCTICA = "AQ"
20+
ANTIGUA_AND_BARBUDA = "AG"
21+
ARGENTINA = "AR"
22+
ARMENIA = "AM"
23+
ARUBA = "AW"
24+
AUSTRALIA = "AU"
25+
AUSTRIA = "AT"
26+
AZERBAIJAN = "AZ"
27+
BAHAMAS = "BS"
28+
BAHRAIN = "BH"
29+
BANGLADESH = "BD"
30+
BARBADOS = "BB"
31+
BELARUS = "BY"
32+
BELGIUM = "BE"
33+
BELIZE = "BZ"
34+
BENIN = "BJ"
35+
BERMUDA = "BM"
36+
BHUTAN = "BT"
37+
BOLIVIA_PLURINATIONAL_STATE_OF = "BO"
38+
BONAIRE_SINT_EUSTATIUS_AND_SABA = "BQ"
39+
BOSNIA_AND_HERZEGOVINA = "BA"
40+
BOTSWANA = "BW"
41+
BOUVET_ISLAND = "BV"
42+
BRAZIL = "BR"
43+
BRITISH_INDIAN_OCEAN_TERRITORY = "IO"
44+
BRUNEI_DARUSSALAM = "BN"
45+
BULGARIA = "BG"
46+
BURKINA_FASO = "BF"
47+
BURUNDI = "BI"
48+
CABO_VERDE = "CV"
49+
CAMBODIA = "KH"
50+
CAMEROON = "CM"
51+
CANADA = "CA"
52+
CAYMAN_ISLANDS = "KY"
53+
CENTRAL_AFRICAN_REPUBLIC = "CF"
54+
CHAD = "TD"
55+
CHILE = "CL"
56+
CHINA = "CN"
57+
CHRISTMAS_ISLAND = "CX"
58+
COCOS_KEELING_ISLANDS = "CC"
59+
COLOMBIA = "CO"
60+
COMOROS = "KM"
61+
CONGO_THE_DEMOCRATIC_REPUBLIC_OF_THE = "CD"
62+
CONGO = "CG"
63+
COOK_ISLANDS = "CK"
64+
COSTA_RICA = "CR"
65+
COTE_D_IVOIRE = "CI"
66+
CROATIA = "HR"
67+
CUBA = "CU"
68+
CURACAO = "CW"
69+
CYPRUS = "CY"
70+
CZECHIA = "CZ"
71+
DENMARK = "DK"
72+
DJIBOUTI = "DJ"
73+
DOMINICA = "DM"
74+
DOMINICAN_REPUBLIC = "DO"
75+
ECUADOR = "EC"
76+
EGYPT = "EG"
77+
EL_SALVADOR = "SV"
78+
EQUATORIAL_GUINEA = "GQ"
79+
ERITREA = "ER"
80+
ESTONIA = "EE"
81+
ESWATINI = "SZ"
82+
ETHIOPIA = "ET"
83+
FALKLAND_ISLANDS_MALVINAS = "FK"
84+
FAROE_ISLANDS = "FO"
85+
FIJI = "FJ"
86+
FINLAND = "FI"
87+
FRANCE = "FR"
88+
FRENCH_GUIANA = "GF"
89+
FRENCH_POLYNESIA = "PF"
90+
FRENCH_SOUTHERN_TERRITORIES = "TF"
91+
GABON = "GA"
92+
GAMBIA = "GM"
93+
GEORGIA = "GE"
94+
GERMANY = "DE"
95+
GHANA = "GH"
96+
GIBRALTAR = "GI"
97+
GREECE = "GR"
98+
GREENLAND = "GL"
99+
GRENADA = "GD"
100+
GUADELOUPE = "GP"
101+
GUAM = "GU"
102+
GUATEMALA = "GT"
103+
GUERNSEY = "GG"
104+
GUINEA = "GN"
105+
GUINEA_BISSAU = "GW"
106+
GUYANA = "GY"
107+
HAITI = "HT"
108+
HEARD_ISLAND_AND_MCDONALD_ISLANDS = "HM"
109+
HOLY_SEE = "VA"
110+
HONDURAS = "HN"
111+
HONG_KONG = "HK"
112+
HUNGARY = "HU"
113+
ICELAND = "IS"
114+
INDIA = "IN"
115+
INDONESIA = "ID"
116+
IRAN_ISLAMIC_REPUBLIC_OF = "IR"
117+
IRAQ = "IQ"
118+
IRELAND = "IE"
119+
ISLE_OF_MAN = "IM"
120+
ISRAEL = "IL"
121+
ITALY = "IT"
122+
JAMAICA = "JM"
123+
JAPAN = "JP"
124+
JERSEY = "JE"
125+
JORDAN = "JO"
126+
KAZAKHSTAN = "KZ"
127+
KENYA = "KE"
128+
KIRIBATI = "KI"
129+
KOREA_THE_DEMOCRATIC_PEOPLES_REPUBLIC_OF = "KP"
130+
KOREA_THE_REPUBLIC_OF = "KR"
131+
KUWAIT = "KW"
132+
KYRGYZSTAN = "KG"
133+
LAO_PEOPLES_DEMOCRATIC_REPUBLIC = "LA"
134+
LATVIA = "LV"
135+
LEBANON = "LB"
136+
LESOTHO = "LS"
137+
LIBERIA = "LR"
138+
LIBYA = "LY"
139+
LIECHTENSTEIN = "LI"
140+
LITHUANIA = "LT"
141+
LUXEMBOURG = "LU"
142+
MACAO = "MO"
143+
REPUBLIC_OF_NORTH_MACEDONIA = "MK"
144+
MADAGASCAR = "MG"
145+
MALAWI = "MW"
146+
MALAYSIA = "MY"
147+
MALDIVES = "MV"
148+
MALI = "ML"
149+
MALTA = "MT"
150+
MARSHALL_ISLANDS = "MH"
151+
MARTINIQUE = "MQ"
152+
MAURITANIA = "MR"
153+
MAURITIUS = "MU"
154+
MAYOTTE = "YT"
155+
MEXICO = "MX"
156+
MICRONESIA_FEDERATED_STATES_OF = "FM"
157+
MOLDOVA_THE_REPUBLIC_OF = "MD"
158+
MONACO = "MC"
159+
MONGOLIA = "MN"
160+
MONTENEGRO = "ME"
161+
MONTSERRAT = "MS"
162+
MOROCCO = "MA"
163+
MOZAMBIQUE = "MZ"
164+
MYANMAR = "MM"
165+
NAMIBIA = "NA"
166+
NAURU = "NR"
167+
NEPAL = "NP"
168+
NETHERLANDS = "NL"
169+
NEW_CALEDONIA = "NC"
170+
NEW_ZEALAND = "NZ"
171+
NICARAGUA = "NI"
172+
NIGER = "NE"
173+
NIGERIA = "NG"
174+
NIUE = "NU"
175+
NORFOLK_ISLAND = "NF"
176+
NORTHERN_MARIANA_ISLANDS = "MP"
177+
NORWAY = "NO"
178+
OMAN = "OM"
179+
PAKISTAN = "PK"
180+
PALAU = "PW"
181+
PALESTINE_STATE_OF = "PS"
182+
PANAMA = "PA"
183+
PAPUA_NEW_GUINEA = "PG"
184+
PARAGUAY = "PY"
185+
PERU = "PE"
186+
PHILIPPINES = "PH"
187+
PITCAIRN = "PN"
188+
POLAND = "PL"
189+
PORTUGAL = "PT"
190+
PUERTO_RICO = "PR"
191+
QATAR = "QA"
192+
REUNION = "RE"
193+
ROMANIA = "RO"
194+
RUSSIAN_FEDERATION = "RU"
195+
RWANDA = "RW"
196+
SAINT_BARTHELEMY = "BL"
197+
SAINT_HELENA_ASCENSION_AND_TRISTAN_DA_CUNHA = "SH"
198+
SAINT_KITTS_AND_NEVIS = "KN"
199+
SAINT_LUCIA = "LC"
200+
SAINT_MARTIN_FRENCH_PART = "MF"
201+
SAINT_PIERRE_AND_MIQUELON = "PM"
202+
SAINT_VINCENT_AND_THE_GRENADINES = "VC"
203+
SAMOA = "WS"
204+
SAN_MARINO = "SM"
205+
SAO_TOME_AND_PRINCIPE = "ST"
206+
SAUDI_ARABIA = "SA"
207+
SENEGAL = "SN"
208+
SERBIA = "RS"
209+
SEYCHELLES = "SC"
210+
SIERRA_LEONE = "SL"
211+
SINGAPORE = "SG"
212+
SINT_MAARTEN_DUTCH_PART = "SX"
213+
SLOVAKIA = "SK"
214+
SLOVENIA = "SI"
215+
SOLOMON_ISLANDS = "SB"
216+
SOMALIA = "SO"
217+
SOUTH_AFRICA = "ZA"
218+
SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS = "GS"
219+
SOUTH_SUDAN = "SS"
220+
SPAIN = "ES"
221+
SRI_LANKA = "LK"
222+
SUDAN = "SD"
223+
SURINAME = "SR"
224+
SVALBARD_AND_JAN_MAYEN = "SJ"
225+
SWEDEN = "SE"
226+
SWITZERLAND = "CH"
227+
SYRIAN_ARAB_REPUBLIC = "SY"
228+
TAIWAN_PROVINCE_OF_CHINA = "TW"
229+
TAJIKISTAN = "TJ"
230+
TANZANIA_UNITED_REPUBLIC_OF = "TZ"
231+
THAILAND = "TH"
232+
TIMOR_LESTE = "TL"
233+
TOGO = "TG"
234+
TOKELAU = "TK"
235+
TONGA = "TO"
236+
TRINIDAD_AND_TOBAGO = "TT"
237+
TUNISIA = "TN"
238+
TURKEY = "TR"
239+
TURKMENISTAN = "TM"
240+
TURKS_AND_CAICOS_ISLANDS = "TC"
241+
TUVALU = "TV"
242+
UGANDA = "UG"
243+
UKRAINE = "UA"
244+
UNITED_ARAB_EMIRATES = "AE"
245+
UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND = "GB"
246+
UNITED_STATES_MINOR_OUTLYING_ISLANDS = "UM"
247+
UNITED_STATES_OF_AMERICA = "US"
248+
URUGUAY = "UY"
249+
UZBEKISTAN = "UZ"
250+
VANUATU = "VU"
251+
VENEZUELA_BOLIVARIAN_REPUBLIC_OF = "VE"
252+
VIET_NAM = "VN"
253+
VIRGIN_ISLANDS_BRITISH = "VG"
254+
VIRGIN_ISLANDS_US = "VI"
255+
WALLIS_AND_FUTUNA = "WF"
256+
WESTERN_SAHARA = "EH"
257+
YEMEN = "YE"
258+
ZAMBIA = "ZM"
259+
ZIMBABWE = "ZW"

ctftime_api/models/duration.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
from pydantic import BaseModel
1+
from dataclasses import dataclass
2+
3+
from dataclasses_json import DataClassJsonMixin, Undefined, dataclass_json
24

35
__all__ = ["Duration"]
46

57

6-
class Duration(BaseModel):
8+
@dataclass_json(undefined=Undefined.EXCLUDE)
9+
@dataclass(frozen=True)
10+
class Duration(DataClassJsonMixin):
711
hours: int
812
days: int

0 commit comments

Comments
 (0)