Skip to content

Commit 18f9ef4

Browse files
authored
Merge pull request #114 from jepler/iersdata-json
store iersdata in json
2 parents 378fed2 + 856f282 commit 18f9ef4

8 files changed

+46
-112
lines changed

.github/workflows/cron.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ jobs:
4141
git config user.name "${GITHUB_ACTOR} (github actions cron)"
4242
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
4343
git remote set-url --push origin https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
44-
if git commit -m"update iersdata" src/wwvb/iersdata_dist.py; then git push origin HEAD:main; fi
44+
if git commit -m"update iersdata" src/wwvb/iersdata.json; then git push origin HEAD:main; fi

pyproject.toml

+3-5
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ requires = [
1010
build-backend = "setuptools.build_meta"
1111
[tool.setuptool]
1212
package_dir = {"" = "src"}
13+
include-package-data = true
1314

1415
[tool.setuptools.dynamic]
1516
readme = {file = ["README.md"], content-type="text/markdown"}
1617
dependencies = {file = "requirements.txt"}
17-
[tool.setuptools.package-data]
18-
"pkgname" = ["py.typed"]
1918
[tool.setuptools_scm]
2019
write_to = "src/wwvb/__version__.py"
2120
[tool.ruff.lint]
@@ -40,9 +39,8 @@ classifiers = [
4039
]
4140
requires-python = ">=3.9"
4241
[project.urls]
43-
homepage = "https://github.com/jepler/wwvbpy"
44-
repository = "https://github.com/jepler/wwvbpy"
45-
42+
Source = "https://github.com/jepler/wwvbpy"
43+
Documentation = "https://github.com/jepler/wwvbpy"
4644
[project.scripts]
4745
wwvbgen = "wwvb.gen:main"
4846
wwvbdecode = "wwvb.decode:main"

requirements-dev.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ sphinx
1818
sphinx-autodoc-typehints
1919
sphinx-rtd-theme
2020
twine; implementation_name=="cpython"
21-
types-beautifulsoup4
22-
types-python-dateutil
23-
types-requests
21+
types-beautifulsoup4; implementation_name=="cpython"
22+
types-python-dateutil; implementation_name=="cpython"
23+
types-requests; implementation_name=="cpython"
2424
tzdata
2525
wheel

src/wwvb/iersdata.json

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"START": "1972-01-01", "OFFSETS_GZ": "H4sIADt21mYC/+2a23LDMAhEfzYXWXZiOfn/mb60nXbcSiAWhGyd92Qyy7KAnWnqkXc75iz83/3Ks+VIGdYsTwIPIguNuUTMU5A27OCqSZK1LO0KE5YpMFFmgtRFsfd6V7iXpHVJbKKX2ZrjRZdL/i16dWDI3Q0UGimvTNmQhR4dKSlHh5J9gckh1DqIJBZoC9Zz5hEJSJUN9x18/yZxGjeZd3y1iYFMkP1L/G3DbB/kuUiejZUTsj5qsHWil4parH/a5Q9uNK40ZAWU1VS16WKE1zJIS7kxSExWOtBaqq9S/I77PHxfQjY2KtXC9KZNyqrlsrzHxX4SBgIr4wsTINlgblLEamBtYISPFcyNtHmVz7GWZzaIjCsfkPv78LqK8w/gdr+e5tr58gMV83azJFR4SuIZ5FWgNq8fMHTDRqPGwCCobONVgNpAwtYPVzJpcoOPdI2m1Gg3cIMJX7FbXPDoAsJqh45F8y0LvD/VtV1Si0lHh6rVbqS6VQMWY+tHHqaXnsl5FtuC+ccW5RW73bNh8B7h+wmg7rNB6yvFlqUl81GJHphOTPDOfeCC28D+/cXJeDbgZBtHXzN8TFH/09Bhfrq/icaZY3DgxKMyLgZXkelsZVwb0Muatnigz8cph82QzpIBc2ldinhcdRr1nvs53a4ftF6ddD2r3F8FS9cc/E3FNBgMSsRBE+bB4NQ0WWN+fSj3hT7/LiLQ6QPGGD1QmEwAAA=="}

src/wwvb/iersdata.json.license

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
SPDX-FileCopyrightText: Public domain
2+
SPDX-License-Identifier: CC0-1.0

src/wwvb/iersdata.py

+18-8
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,33 @@
55
#
66
# SPDX-License-Identifier: GPL-3.0-only
77

8+
import binascii
89
import datetime
9-
import pathlib
10+
import gzip
11+
import importlib.resources
12+
import json
1013

1114
import platformdirs
1215

1316
__all__ = ["DUT1_DATA_START", "DUT1_OFFSETS", "start", "span", "end"]
14-
from .iersdata_dist import DUT1_DATA_START, DUT1_OFFSETS
1517

16-
for location in [
17-
platformdirs.user_data_dir("wwvbpy", "unpythonic.net"),
18-
platformdirs.site_data_dir("wwvbpy", "unpythonic.net"),
18+
content: dict[str, str] = {"START": "1970-01-01", "OFFSETS_GZ": "H4sIAFNx1mYC/wMAAAAAAAAAAAA="}
19+
20+
path = importlib.resources.files("wwvb") / "iersdata.json"
21+
content = json.loads(path.read_text(encoding="utf-8"))
22+
23+
for location in [ # pragma no cover
24+
platformdirs.user_data_path("wwvbpy", "unpythonic.net"),
25+
platformdirs.site_data_path("wwvbpy", "unpythonic.net"),
1926
]:
20-
path = pathlib.Path(location) / "wwvbpy_iersdata.py"
21-
if path.exists(): # pragma no cover
22-
exec(path.read_text(encoding="utf-8"), globals(), globals())
27+
path = location / "iersdata.json"
28+
if path.exists():
29+
content = json.loads(path.read_text(encoding="utf-8"))
2330
break
2431

32+
DUT1_DATA_START = datetime.date.fromisoformat(content["START"])
33+
DUT1_OFFSETS = gzip.decompress(binascii.a2b_base64(content["OFFSETS_GZ"])).decode("ascii")
34+
2535
start = datetime.datetime.combine(DUT1_DATA_START, datetime.time(), tzinfo=datetime.timezone.utc)
2636
span = datetime.timedelta(days=len(DUT1_OFFSETS))
2737
end = start + span

src/wwvb/iersdata_dist.py

-39
This file was deleted.

src/wwvb/updateiers.py

+18-56
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88

99
from __future__ import annotations
1010

11+
import binascii
1112
import csv
1213
import datetime
14+
import gzip
1315
import io
14-
import itertools
16+
import json
1517
import pathlib
1618
from typing import Callable
1719

@@ -20,15 +22,7 @@
2022
import platformdirs
2123
import requests
2224

23-
DIST_PATH = pathlib.Path(__file__).parent / "iersdata_dist.py"
24-
25-
OLD_TABLE_START: datetime.date | None = None
26-
OLD_TABLE_END: datetime.date | None = None
27-
if DIST_PATH.exists():
28-
import wwvb.iersdata_dist
29-
30-
OLD_TABLE_START = wwvb.iersdata_dist.DUT1_DATA_START
31-
OLD_TABLE_END = OLD_TABLE_START + datetime.timedelta(days=len(wwvb.iersdata_dist.DUT1_OFFSETS) - 1)
25+
DIST_PATH = pathlib.Path(__file__).parent / "iersdata.json"
3226

3327
IERS_URL = "https://datacenter.iers.org/data/csv/finals2000A.all.csv"
3428
IERS_PATH = pathlib.Path("finals2000A.all.csv")
@@ -47,7 +41,7 @@ def _get_text(url: str) -> str:
4741
return pathlib.Path(url).read_text(encoding="utf-8")
4842

4943

50-
def update_iersdata( # noqa: PLR0915, PLR0912
44+
def update_iersdata( # noqa: PLR0915
5145
target_path: pathlib.Path,
5246
) -> None:
5347
"""Update iersdata.py"""
@@ -124,57 +118,25 @@ def patch(patch_start: datetime.date, patch_end: datetime.date, val: int) -> Non
124118
assert wwvb_start is not None
125119
patch(wwvb_start, wwvb_data_stamp + datetime.timedelta(days=1), wwvb_dut1)
126120

127-
with target_path.open("w", encoding="utf-8") as output:
128-
129-
def code(*args: str) -> None:
130-
"""Print to the output file"""
131-
print(*args, file=output)
132-
133-
code("# -*- python3 -*-")
134-
code("# fmt: off")
135-
code('"""File generated from public data - not subject to copyright"""')
136-
code("# SPDX" + "-FileCopyrightText: Public domain")
137-
code("# SPDX" + "-License-Identifier: CC0-1.0")
138-
code("# isort: skip_file")
139-
code("import datetime")
140-
141-
code("__all__ = ['DUT1_DATA_START', 'DUT1_OFFSETS']")
142-
code(f"DUT1_DATA_START = {table_start!r}")
143-
c = sorted(chr(ord("a") + ch + 10) for ch in set(offsets))
144-
code(f"{','.join(c)} = tuple({''.join(c)!r})")
145-
code(f"DUT1_OFFSETS = str( # {table_start.year:04d}{table_start.month:02d}{table_start.day:02d}")
146-
line = ""
147-
j = 0
148-
149-
for val, it in itertools.groupby(offsets):
150-
part = ""
151-
ch = chr(ord("a") + val + 10)
152-
sz = len(list(it))
153-
if j:
154-
part = part + "+"
155-
part = part + ch if sz < 2 else part + f"{ch}*{sz}"
156-
j += sz
157-
if len(line + part) > 60:
158-
d = table_start + datetime.timedelta(j - 1)
159-
code(f" {line:<60s} # {d.year:04d}{d.month:02d}{d.day:02d}")
160-
line = part
161-
else:
162-
line = line + part
163-
d = table_start + datetime.timedelta(j - 1)
164-
code(f" {line:<60s} # {d.year:04d}{d.month:02d}{d.day:02d}")
165-
code(")")
166121
table_end = table_start + datetime.timedelta(len(offsets) - 1)
167-
if OLD_TABLE_START:
168-
print(f"old iersdata covered {OLD_TABLE_START} .. {OLD_TABLE_END}")
122+
base = ord("a") + 10
123+
offsets_bin = bytes(base + ch for ch in offsets)
124+
125+
target_path.write_text(
126+
json.dumps(
127+
{
128+
"START": table_start.isoformat(),
129+
"OFFSETS_GZ": binascii.b2a_base64(gzip.compress(offsets_bin)).decode("ascii").strip(),
130+
},
131+
),
132+
)
133+
169134
print(f"iersdata covers {table_start} .. {table_end}")
170135

171136

172137
def iersdata_path(callback: Callable[[str, str], pathlib.Path]) -> pathlib.Path:
173138
"""Find out the path for this directory"""
174-
print("iersdata_path", callback)
175-
r = callback("wwvbpy", "unpythonic.net") / "wwvb_iersdata.py"
176-
print(f"iersdata_path {r=!r}")
177-
return r
139+
return callback("wwvbpy", "unpythonic.net") / "iersdata.json"
178140

179141

180142
@click.command()

0 commit comments

Comments
 (0)