123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- # coding: utf-8
- import typing
- from _elementtree import Element
-
- from synergine2.config import Config
-
- from opencombat.exception import NotFoundException
- from opencombat.strategy.team.model import UnitModel
- from opencombat.util import get_text_xml_element
- from opencombat.util import get_class_from_string_path
- from opencombat.xml import XmlValidator
-
-
- class UnitStash(object):
- def __init__(
- self,
- config: Config,
- units_file_path: str,
- ) -> None:
- self._config = config
- self._units = None # type: typing.List[UnitModel]
-
- self.schema_file_path = self._config.get(
- 'global.teams_schema',
- 'opencombat/strategy/units.xsd',
- )
- self._xml_validator = XmlValidator(
- config,
- self.schema_file_path,
- )
- self._root_element = self._xml_validator.validate_and_return(
- units_file_path,
- )
-
- def _get_computed_units(self) -> typing.List[UnitModel]:
- units = []
-
- for unit_element in self._root_element.findall('unit'):
- unit_element = typing.cast(Element, unit_element)
-
- unit_id = unit_element.attrib['id']
- unit_country = unit_element.attrib['country']
- unit_name = get_text_xml_element(unit_element, 'name')
- unit_class_path = get_text_xml_element(unit_element, 'type')
- unit_class = get_class_from_string_path(
- self._config,
- unit_class_path,
- )
-
- units.append(
- UnitModel(
- id_=unit_id,
- name=unit_name,
- class_=unit_class,
- country=unit_country,
- )
- )
-
- return units
-
- @property
- def units(self) -> typing.List[UnitModel]:
- if self._units is None:
- self._units = self._get_computed_units()
-
- return self._units
-
- def get_unit(
- self,
- unit_id: str,
- unit_country: str,
- ) -> UnitModel:
- for unit in self.units:
- if unit.id == unit_id and unit.country == unit_country:
- return unit
-
- raise NotFoundException(
- 'No unit matching with id "{}" and country "{}" in "{}"'.format(
- unit_id,
- unit_country,
- self.schema_file_path,
- )
- )
|