matejak/estimagus

View on GitHub
estimage/entities/task.py

Summary

Maintainability
A
0 mins
Test Coverage
A
91%
import dataclasses

from .estimate import Estimate


# decorator to skip getters
def setterOnly(wrapped):
    return property(None, wrapped)


@dataclasses.dataclass(init=False)
class TaskModel:
    name: str
    _time_estimate: Estimate
    _point_estimate: Estimate
    masked: bool

    def __init__(self, name):
        self.name = name
        self.nullify()
        self.masked = False

    def mask(self):
        self.masked = True

    def unmask(self):
        self.masked = False

    @property
    def nominal_time_estimate(self):
        return self._time_estimate

    @property
    def remaining_time_estimate(self):
        if self.masked:
            return Estimate(0, 0)
        return self._time_estimate

    @setterOnly
    def time_estimate(self, value: Estimate):
        self._time_estimate = value

    def set_time_estimate(self, most_likely, optimistic, pessimistic):
        self._time_estimate = Estimate.from_triple(most_likely, optimistic, pessimistic)

    @property
    def nominal_point_estimate(self):
        return self._point_estimate

    @property
    def remaining_point_estimate(self):
        if self.masked:
            return Estimate(0, 0)
        return self._point_estimate

    @setterOnly
    def point_estimate(self, value: Estimate):
        self._point_estimate = value

    def set_point_estimate(self, most_likely, optimistic, pessimistic):
        self._point_estimate = Estimate.from_triple(most_likely, optimistic, pessimistic)

    def nullify(self):
        self._time_estimate = Estimate(0, 0)
        self._point_estimate = Estimate(0, 0)

    def save(self):
        raise NotImplementedError()

    @classmethod
    def load(cls, name) -> "TaskModel":
        raise NotImplementedError()


class MemoryTaskModel(TaskModel):
    RESULTS = dict()

    def save(self):
        MemoryTaskModel.RESULTS[self.name] = (
            self.nominal_point_estimate, self.nominal_time_estimate,
        )

    @classmethod
    def load(cls, name) -> "TaskModel":
        result = cls(name)
        result.point_estimate = cls.RESULTS[name][0]
        result.time_estimate = cls.RESULTS[name][1]
        return result