Source code for planetary_coverage.events.orb
"""Orbit number event file module."""
from .event import AbstractEventsFile, EventsList
from ..html import table
[docs]class OrbitEventsFile(AbstractEventsFile):
"""Orbit event file object.
Parameters
----------
fname: str or pathlib.Path
ORB filename to parse.
"""
def __init__(self, fname):
super().__init__(fname, 'No.') # primary_key='No.'
def _repr_html_(self):
return table([
list(event.values())
for event in self
], header=self.fields)
def __getitem__(self, item):
"""Items can be queried orbit number.
Note
----
If a slice is provided, the 2nd argument (stop orbit)
will be included in the query (if present and positive).
"""
orbits = list(self.data.values())
if isinstance(item, int):
return orbits[self._index(item)]
if isinstance(item, (tuple, list)):
return EventsList(
[orbits[self._index(i)] for i in item]
)
if isinstance(item, slice):
start = self._index(item.start)
stop = self._index(item.stop)
if item.stop is not None:
stop = (stop + 1) if stop != -1 else None
return EventsList(
orbits[slice(start, stop, item.step)]
)
raise TypeError('Only `int`, `tuple`, `list` and `slice` are accepted. '
f'`{item.__class__.__name__}` provided.')
def _index(self, i):
"""Compute orbit index."""
if i is None or i < 0:
return i
orbits = list(map(int, self.data.keys()))
if i in orbits:
return orbits.index(i)
raise IndexError(
f'{i} out of range. Orbit available: {orbits[0]} to {orbits[-1]}')
def _ipython_key_completions_(self):
return list(map(int, self.keys()))
def _read_rows(self):
"""Read orbit rows content."""
content = self.fname.read_text(encoding='utf-8')
# Orbit columns
header, _, *lines = content.splitlines() # skip the 2nd line
# Parse header columns
self.fields = [field.lower().strip() for field in header.split(' ') if field]
# Extract orbit row values
self.rows = [
tuple(field.strip() for field in line.split(' ') if field)
for line in lines
]