"""Test whether Skyfield handles file download and file age correctly.""" import os import shutil import tempfile from contextlib import contextmanager from datetime import date try: from unittest.mock import patch except ImportError: from mock import patch from skyfield import api old_content = (b' 2015 10 1 67.9546\n' b' 2015 11 1 68.0055\n' b' 2015 12 1 68.0514\n' b' 2016 1 1 68.1024\n') new_content = (old_content + b' 2016 2 1 68.1577\n') def load(): path = tempfile.mkdtemp() try: yield api.Loader(path) finally: shutil.rmtree(path) def save_file(load, content=old_content): with open(load.path_to('deltat.data'), 'wb') as f: f.write(content) def file_contents(load): with open(load.path_to('deltat.data'), 'rb') as f: return f.read() @contextmanager def on(load, year, month, day): fake_date = date(year, month, day) download = lambda *args, **kw: save_file(load, new_content) with patch('skyfield.iokit.download', download): # Python 2.6 does not support the comma "with" statement, so: with patch('skyfield.iokit.today', lambda *args: fake_date): yield # The tests. def test_build_url(load): url = 'ftp://ssd.jpl.nasa.gov/pub/eph/planets/bsp/de421.bsp' assert load.build_url('de421.bsp') == url assert load.build_url('unknown.kind.of.file') is None def test_open_in_main_directory(load): with open(os.path.join(load.directory, 'file.tle'), 'wb') as f: f.write(b'example text\n') data = load.open('file.tle').read() print(repr(data)) assert data == b'example text\n' def test_open_in_subdirectory(load): os.mkdir(os.path.join(load.directory, 'folder')) with open(os.path.join(load.directory, 'folder', 'file.tle'), 'wb') as f: f.write(b'example text\n') data = load.open('folder/file.tle').read() assert data == b'example text\n' def test_missing_file_gets_downloaded(load): with on(load, 2016, 1, 15): data = load('deltat.data') assert file_contents(load).endswith(b' 68.1577\n') assert data[1][-1] == 68.1577 def test_11_month_old_file_gets_reused(load): save_file(load) with on(load, 2016, 12, 15): data = load('deltat.data') assert file_contents(load).endswith(b' 68.1024\n') assert data[1][-1] == 68.1024 def test_12_month_old_file_gets_redownloaded(load): save_file(load) with on(load, 2017, 1, 15): data = load('deltat.data') assert file_contents(load).endswith(b' 68.1577\n') assert data[1][-1] == 68.1577 def test_builtin_timescale(load): ts = load.timescale(builtin=True) ts.utc(2019, 7, 21, 11, 11)