139 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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}")
 |