123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- """Duration module."""
- import operator
- from matplotlib import cbook
- 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.
- """
- cbook._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 __eq__(self, rhs):
- return self._cmp(rhs, operator.eq)
- def __ne__(self, rhs):
- return self._cmp(rhs, operator.ne)
- def __lt__(self, rhs):
- return self._cmp(rhs, operator.lt)
- def __le__(self, rhs):
- return self._cmp(rhs, operator.le)
- def __gt__(self, rhs):
- return self._cmp(rhs, operator.gt)
- def __ge__(self, rhs):
- return self._cmp(rhs, operator.ge)
- def _cmp(self, rhs, op):
- """Compare two Durations.
- = INPUT VARIABLES
- - rhs The Duration to compare against.
- - op The function to do the comparison
- = RETURN VALUE
- - Returns op(self, rhs)
- """
- self.checkSameFrame(rhs, "compare")
- return op(self._seconds, rhs._seconds)
- 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))
- def __rmul__(self, lhs):
- """Scale a Duration by a value.
- = INPUT VARIABLES
- - lhs The scalar to multiply by.
- = RETURN VALUE
- - Returns the scaled Duration.
- """
- return Duration(self._frame, self._seconds * float(lhs))
- def __div__(self, rhs):
- """Divide a Duration by a value.
- = INPUT VARIABLES
- - rhs The scalar to divide by.
- = RETURN VALUE
- - Returns the scaled Duration.
- """
- return Duration(self._frame, self._seconds / rhs)
- def __rdiv__(self, rhs):
- """Divide a Duration by a value.
- = INPUT VARIABLES
- - rhs The scalar to divide by.
- = RETURN VALUE
- - Returns the scaled Duration.
- """
- return Duration(self._frame, rhs / self._seconds)
- def __str__(self):
- """Print the Duration."""
- return "%g %s" % (self._seconds, self._frame)
- def __repr__(self):
- """Print the Duration."""
- return "Duration('%s', %g)" % (self._frame, self._seconds)
- 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}")
|