"""Functions to interact with config files."""from__future__importannotationsimportfunctoolsfromconfigparserimportConfigParserfromtypingimportTYPE_CHECKING,TypedDictfromcable_club.constantsimportGENDERS,UTF8_SIGifTYPE_CHECKING:frompathlibimportPath
[docs]classPokeInfo(TypedDict):"""Information about a Pokemon found in config files."""abilities:set[str]forms:set[int]genders:set[int]moves:set[str]
PokeDex=dict[str,PokeInfo]"""Maps Pokemon names to their information."""# NOTE(elpekenin): mypy complains:# >>> error: Missing type parameters for generic type "set" [type-arg]# which is plain wrong :)class_Universe(set):# type: ignore[type-arg]"""Custom "set" whose __contains__ always returns True."""def__contains__(self,item:object)->bool:"""Check if item is contained in this set."""returnTrue
[docs]defsections(file_path:Path)->set[str]:"""Read a config file and return its sections."""parser=ConfigParser()withfile_path.open("r",encoding=UTF8_SIG)asfile:parser.read_file(file)returnset(parser.sections())
[docs]@functools.lru_cache(maxsize=1)defparse_pokemon_data(file_path:Path)->PokeDex:"""Read all Pokemon data from a config file."""data:PokeDex={}parser=ConfigParser()withfile_path.open("r",encoding=UTF8_SIG)asfile:parser.read_file(file)forsection_nameinparser.sections():section=parser[section_name]abilities={abilityforabilityinsection["abilities"].split(",")ifability}if"forms"insection:forms={int(f)forfinsection["forms"].split(",")iff}else:forms=_Universe()# default to {male, female} ~~~~~~~~~~~~~~~~~~~~vgenders=GENDERS.get(section["gender_ratio"],{0,1})moves={moveformoveinsection["moves"].split(",")ifmove}data[section_name]={"abilities":abilities,"forms":forms,"genders":genders,"moves":moves,}returndata