55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
"""Helpers for making Skyfield tests stable."""
|
|
|
|
import datetime as dt
|
|
import sys
|
|
|
|
from skyfield import earthlib
|
|
import skyfield.api
|
|
import skyfield.timelib
|
|
|
|
IS_32_BIT = (sys.maxsize == 0x7fffffff)
|
|
_real_datetime_class = dt.datetime
|
|
|
|
class datetime(dt.datetime):
|
|
_fake_now = None
|
|
@staticmethod
|
|
def now():
|
|
return datetime._fake_now
|
|
|
|
def setup(utc=(2015, 10, 11, 10)):
|
|
# Importing Pandas raises a TypeError once our fake datetime is
|
|
# installed. So instead of waiting, let's import it now.
|
|
__import__('pandas')
|
|
|
|
fake_now = dt.datetime(*utc)
|
|
skyfield.api.load = skyfield.iokit.Loader('.', verbose=False)
|
|
skyfield.timelib.Timescale._utcnow = lambda self: fake_now
|
|
datetime._fake_now = fake_now
|
|
dt.datetime = datetime
|
|
|
|
def teardown():
|
|
skyfield.api.load = skyfield.iokit.Loader('.')
|
|
skyfield.timelib.Timescale._utcnow = dt.datetime.utcnow
|
|
dt.datetime = _real_datetime_class
|
|
|
|
class low_precision_ERA(object):
|
|
"""Compute the Earth rotation angle with only a single float for UT1.
|
|
|
|
Skyfield now uses two floats ``t.whole`` and ``t.ut1_fraction`` to
|
|
represent the UT1 Julian date, supplying an additional 16 digits of
|
|
precision. For the Earth rotation angle, which moves very quickly
|
|
per unit time compared to most other astronomical quantities, this
|
|
knocks Skyfield out of agreement with other libraries like NOVAS and
|
|
SOFA that round UT1 to a single float. Various tests use this
|
|
context manager to make Skyfield match the lower-precision output.
|
|
|
|
"""
|
|
def __enter__(self):
|
|
self.saved = earthlib.earth_rotation_angle
|
|
earthlib.earth_rotation_angle = self.era
|
|
def __exit__(self, *args):
|
|
earthlib.earth_rotation_angle = self.saved
|
|
def era(self, whole, fraction):
|
|
rounded_single_float = whole + fraction
|
|
return self.saved(rounded_single_float)
|