Source code for dicetables.dicerecord

"""
An immutable record of dice added to and removed from DiceTable
"""
from typing import Dict

from dicetables.eventsbases.eventerrors import DiceRecordError
from dicetables.eventsbases.protodie import ProtoDie


class RecordVerifier(object):
    @staticmethod
    def check_types(die_input):
        if any(not isinstance(die, ProtoDie) or not isinstance(num, int) for die, num in die_input.items()):
            raise DiceRecordError('input must be {ProtoDie: int, ...}')

    @staticmethod
    def check_negative(die_input):
        for key, val in die_input.items():
            if val < 0:
                raise DiceRecordError('Tried to create a DiceRecord with a negative value at {!r}: {}'.format(key, val))

    @staticmethod
    def check_number(num):
        if num < 0:
            raise DiceRecordError('Tried to add_die or remove_die with a negative number.')


def scrub_zeroes(input_dict):
    return {key: val for key, val in input_dict.items() if val}


[docs]class DiceRecord(object): def __init__(self, dice_number_dict: Dict[ProtoDie, int]): RecordVerifier.check_types(dice_number_dict) RecordVerifier.check_negative(dice_number_dict) self._record = scrub_zeroes(dice_number_dict)
[docs] @classmethod def new(cls) -> 'DiceRecord': return cls({})
[docs] def get_dict(self) -> Dict[ProtoDie, int]: return self._record.copy()
[docs] def get_number(self, query_die: ProtoDie) -> int: return self._record.get(query_die, 0)
[docs] def add_die(self, die: ProtoDie, times: int) -> 'DiceRecord': RecordVerifier.check_number(times) new = self._record.copy() new[die] = times + self.get_number(die) return DiceRecord(new)
[docs] def remove_die(self, die: ProtoDie, times: int) -> 'DiceRecord': RecordVerifier.check_number(times) new = self._record.copy() new[die] = self.get_number(die) - times return DiceRecord(new)
[docs] def __eq__(self, other): if not isinstance(other, DiceRecord): return False return self.get_dict() == other.get_dict()
def __ne__(self, other): return not self == other def __repr__(self): return 'DiceRecord({!r})'.format(self._record)