"""File for Score classes""" import time class Score: """Parent class for Scores. Stores common information for a Score.""" # no user setter, it should never change. def __init__(self, user: str) -> None: """ Default constructor for Score class. Args: user (str): Score's user value (int): Score's value """ self._user: str = user self._value: int = -1 def __str__(self) -> str: """ Returns Score class as a string for printing. Returns: str: Score class as a string """ return self.to_str() @property def user(self) -> str: """ Getter for score user. Returns: str: user """ return self._user @user.setter def user(self, username: str) -> None: """ Setter for score's username. Args: username (str): username to set to """ self._user = username @property def value(self) -> int: """ Getter for score value. Returns: int: value """ return self._value @value.setter def value(self, value: int) -> None: """ Setter for score value. Args: value (int): score value input """ self._value = value def get_str(self) -> str: """ Gets score's value as string. Returns: str: Score's value """ return str(self._value) def set_value_str(self, value: str) -> None: """ Setter for score value from string. Args: value (str): int as a string """ self._value = int(value) def to_str(self) -> str: """ Returns Score object as a string. Returns: str: string of json representation of Score """ return f"{self.user}: {self.get_str()}" class ScoreTime(Score): """Class for a time based score. Inherits from Score.""" def __init__(self, user: str) -> None: # pylint: disable=super-init-not-called """ Default constructor for ScoreTime class. Args: user (str): Score's user score (float): Score's value """ # store time score as seconds. self._user: str = user self._score: float = -1.0 @property def value(self) -> float: """ Getter for score value. Returns: float: value """ return self._score @value.setter def value(self, value: float) -> None: """ Setter for score value. Args: value (float): value """ self._score = value def get_str(self) -> str: """ Gets score's value as string. Turns seconds into MM:SS.ms format. Returns: str: value in time format. """ milliseconds = round((self.value - int(self.value)) * 10) return time.strftime(f"%-M:%S.{milliseconds}", time.gmtime(self.value)) def set_value_str(self, value: str) -> None: """ Setter for score value from a string. Args: value (str): string representation of time """ if value.find(":"): self._score = int(value.split(":")[0]) * 60 + float(value.split(":")[1]) else: self._score = float(value)