| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- """Duration module."""
- import functools
- import operator
- from matplotlib import _api
- class Duration:
- """Class Duration in development."""
- allowed = ["ET", "UTC"]
- def __init__(self, frame, seconds):
- """
- Create a new Duration object.
- = ERROR CONDITIONS
- - If the input frame is not in the allowed list, an error is thrown.
- = INPUT VARIABLES
- - frame The frame of the duration. Must be 'ET' or 'UTC'
- - seconds The number of seconds in the Duration.
- """
- _api.check_in_list(self.allowed, frame=frame)
- self._frame = frame
- self._seconds = seconds
- def frame(self):
- """Return the frame the duration is in."""
- return self._frame
- def __abs__(self):
- """Return the absolute value of the duration."""
- return Duration(self._frame, abs(self._seconds))
- def __neg__(self):
- """Return the negative value of this Duration."""
- return Duration(self._frame, -self._seconds)
- def seconds(self):
- """Return the number of seconds in the Duration."""
- return self._seconds
- def __bool__(self):
- return self._seconds != 0
- def _cmp(self, op, rhs):
- """
- Check that *self* and *rhs* share frames; compare them using *op*.
- """
- self.checkSameFrame(rhs, "compare")
- return op(self._seconds, rhs._seconds)
- __eq__ = functools.partialmethod(_cmp, operator.eq)
- __ne__ = functools.partialmethod(_cmp, operator.ne)
- __lt__ = functools.partialmethod(_cmp, operator.lt)
- __le__ = functools.partialmethod(_cmp, operator.le)
- __gt__ = functools.partialmethod(_cmp, operator.gt)
- __ge__ = functools.partialmethod(_cmp, operator.ge)
- def __add__(self, rhs):
- """
- Add two Durations.
- = ERROR CONDITIONS
- - If the input rhs is not in the same frame, an error is thrown.
- = INPUT VARIABLES
- - rhs The Duration to add.
- = RETURN VALUE
- - Returns the sum of ourselves and the input Duration.
- """
- # Delay-load due to circular dependencies.
- import matplotlib.testing.jpl_units as U
- if isinstance(rhs, U.Epoch):
- return rhs + self
- self.checkSameFrame(rhs, "add")
- return Duration(self._frame, self._seconds + rhs._seconds)
- def __sub__(self, rhs):
- """
- Subtract two Durations.
- = ERROR CONDITIONS
- - If the input rhs is not in the same frame, an error is thrown.
- = INPUT VARIABLES
- - rhs The Duration to subtract.
- = RETURN VALUE
- - Returns the difference of ourselves and the input Duration.
- """
- self.checkSameFrame(rhs, "sub")
- return Duration(self._frame, self._seconds - rhs._seconds)
- def __mul__(self, rhs):
- """
- Scale a UnitDbl by a value.
- = INPUT VARIABLES
- - rhs The scalar to multiply by.
- = RETURN VALUE
- - Returns the scaled Duration.
- """
- return Duration(self._frame, self._seconds * float(rhs))
- __rmul__ = __mul__
- def __str__(self):
- """Print the Duration."""
- return f"{self._seconds:g} {self._frame}"
- def __repr__(self):
- """Print the Duration."""
- return f"Duration('{self._frame}', {self._seconds:g})"
- def checkSameFrame(self, rhs, func):
- """
- Check to see if frames are the same.
- = ERROR CONDITIONS
- - If the frame of the rhs Duration is not the same as our frame,
- an error is thrown.
- = INPUT VARIABLES
- - rhs The Duration to check for the same frame
- - func The name of the function doing the check.
- """
- if self._frame != rhs._frame:
- raise ValueError(
- f"Cannot {func} Durations with different frames.\n"
- f"LHS: {self._frame}\n"
- f"RHS: {rhs._frame}")
|