Spaces:
No application file
No application file
File size: 3,901 Bytes
6a7f780 6b65dee 6a7f780 4c91492 6a7f780 6b65dee 6a7f780 4c91492 6a7f780 4c91492 6a7f780 6b65dee 6a7f780 6b65dee 6a7f780 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
import os
import json
from pydantic import BaseModel, Field, ValidationError
from typing import Literal, Optional, ClassVar
import hashlib
from slugify import slugify
class Player(BaseModel):
teams: ClassVar[list[str]] = ['Fraser Valley United', 'Everglade FC', 'Yucatan Force', 'Tierra Alta FC']
number: int
name: str
age: int
nationality: str
shirt_number: int
position: Literal[
"Goalkeeper", "Left Back", "Center Back", "Right Back",
"Full Back", "Defensive Mid", "Central Mid", "Attacking Mid",
"Left Wing", "Right Wing", "Forward/Winger", "Striker", "Various"
]
preferred_foot: Literal["Left", "Right", "Mixed"]
role: Literal["Starter", "Bench", "Reserve/Prospect"]
@property
def id(self):
if not self.team:
raise ValueError("Team must not be empty")
# return hashlib.sha256(f"{self.team}_{self.number}".encode()).hexdigest()
return slugify(f"{self.team}_{self.number}")
@property
def filename(self):
return f'{self.team.replace(" ", "_")}_{self.number}.json'
# Optional flair / simulation fields
team: Optional[str] = None
height_cm: Optional[int] = Field(None, ge=150, le=210)
weight_kg: Optional[int] = Field(None, ge=50, le=110)
overall_rating: Optional[int] = Field(None, ge=1, le=100)
is_injured: Optional[bool] = False
form: Optional[int] = Field(None, ge=1, le=10) # recent performance (1-10)
# Stats placeholder — useful if you want to track across games
goals: Optional[int] = 0
assists: Optional[int] = 0
yellow_cards: Optional[int] = 0
red_cards: Optional[int] = 0
# Narrative hook
bio: Optional[str] = None
# AI-generated profile pic
profile_pic: Optional[str] = None
@classmethod
def from_row(cls, row):
if len(row) != 8:
raise ValueError("Row must have 8 elements")
return cls(
number=row[0],
name=row[1],
position=row[2],
age=row[3],
nationality=row[4],
shirt_number=row[5],
preferred_foot=row[6],
role=row[7],
)
def player_info(self):
return {
"number": self.number,
"name": self.name,
"position": self.position,
"age": self.age,
"nationality": self.nationality,
"shirt_number": self.shirt_number,
"preferred_foot": self.preferred_foot,
"role": self.role,
}
def player_vector_metadata(self):
return {
"type": "player",
"number": self.number,
"name": slugify(self.name),
"position": slugify(self.position),
"age": self.age,
"nationality": slugify(self.nationality),
"shirt_number": self.shirt_number,
"preferred_foot": slugify(self.preferred_foot),
"role": slugify(self.role),
"team": slugify(self.team),
}
def save(self):
with open(os.path.join("/workspace/data/huge-league/players", self.filename), 'w') as f:
json.dump(self.model_dump(), f)
@classmethod
def load(cls, filename):
with open(os.path.join("/workspace/data/huge-league/players", filename), 'r') as f:
data = json.load(f)
return cls.model_validate(data)
@classmethod
def get_players(cls, team=None):
for filename in os.listdir("/workspace/data/huge-league/players"):
player = cls.load(filename)
if team and player.team != team:
continue
yield player
def save_image(self, image_bytes):
filename = self.filename.replace(".json", ".png")
with open(os.path.join("/workspace/data/huge-league/players_pics", filename), 'wb') as f:
f.write(image_bytes) |