wwvb 7.0.0__py3-none-any.whl → 8.0.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wwvb/__init__.py +20 -5
- wwvb/__version__.py +2 -2
- wwvb/decode.py +1 -1
- wwvb/gen.py +6 -3
- wwvb/iersdata.json +1 -1
- wwvb/wwvbtk.py +6 -4
- {wwvb-7.0.0.dist-info → wwvb-8.0.0rc1.dist-info}/METADATA +4 -8
- wwvb-8.0.0rc1.dist-info/RECORD +18 -0
- wwvb-7.0.0.dist-info/RECORD +0 -18
- {wwvb-7.0.0.dist-info → wwvb-8.0.0rc1.dist-info}/WHEEL +0 -0
- {wwvb-7.0.0.dist-info → wwvb-8.0.0rc1.dist-info}/entry_points.txt +0 -0
- {wwvb-7.0.0.dist-info → wwvb-8.0.0rc1.dist-info}/top_level.txt +0 -0
wwvb/__init__.py
CHANGED
@@ -20,15 +20,30 @@ import enum
|
|
20
20
|
import json
|
21
21
|
import warnings
|
22
22
|
from dataclasses import dataclass
|
23
|
-
from typing import ClassVar
|
23
|
+
from typing import ClassVar, Literal
|
24
24
|
|
25
25
|
from . import iersdata
|
26
26
|
from .tz import Mountain
|
27
27
|
|
28
|
+
WWVBChannel = Literal["amplitude", "phase", "both"]
|
29
|
+
|
28
30
|
TYPE_CHECKING = False
|
29
31
|
if TYPE_CHECKING:
|
30
32
|
from collections.abc import Generator
|
31
|
-
from typing import
|
33
|
+
from typing import NotRequired, Self, TextIO, TypedDict, TypeVar
|
34
|
+
|
35
|
+
class JsonMinute(TypedDict):
|
36
|
+
"""Implementation detail
|
37
|
+
|
38
|
+
This is the Python object type that is serialized by `print_timecodes_json`
|
39
|
+
"""
|
40
|
+
|
41
|
+
year: int
|
42
|
+
days: int
|
43
|
+
hour: int
|
44
|
+
minute: int
|
45
|
+
amplitude: NotRequired[str]
|
46
|
+
phase: NotRequired[str]
|
32
47
|
|
33
48
|
T = TypeVar("T")
|
34
49
|
|
@@ -927,7 +942,7 @@ styles = {
|
|
927
942
|
def print_timecodes(
|
928
943
|
w: WWVBMinute,
|
929
944
|
minutes: int,
|
930
|
-
channel:
|
945
|
+
channel: WWVBChannel,
|
931
946
|
style: str,
|
932
947
|
file: TextIO,
|
933
948
|
*,
|
@@ -964,7 +979,7 @@ def print_timecodes(
|
|
964
979
|
def print_timecodes_json(
|
965
980
|
w: WWVBMinute,
|
966
981
|
minutes: int,
|
967
|
-
channel:
|
982
|
+
channel: WWVBChannel,
|
968
983
|
file: TextIO,
|
969
984
|
) -> None:
|
970
985
|
"""Print a range of timecodes in JSON format.
|
@@ -984,7 +999,7 @@ def print_timecodes_json(
|
|
984
999
|
"""
|
985
1000
|
result = []
|
986
1001
|
for _ in range(minutes):
|
987
|
-
data:
|
1002
|
+
data: JsonMinute = {
|
988
1003
|
"year": w.year,
|
989
1004
|
"days": w.days,
|
990
1005
|
"hour": w.hour,
|
wwvb/__version__.py
CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
28
28
|
commit_id: COMMIT_ID
|
29
29
|
__commit_id__: COMMIT_ID
|
30
30
|
|
31
|
-
__version__ = version = '
|
32
|
-
__version_tuple__ = version_tuple = (
|
31
|
+
__version__ = version = '8.0.0rc1'
|
32
|
+
__version_tuple__ = version_tuple = (8, 0, 0, 'rc1')
|
33
33
|
|
34
34
|
__commit_id__ = commit_id = None
|
wwvb/decode.py
CHANGED
wwvb/gen.py
CHANGED
@@ -9,15 +9,18 @@ from __future__ import annotations
|
|
9
9
|
|
10
10
|
import datetime
|
11
11
|
import sys
|
12
|
-
from typing import Any
|
13
12
|
|
14
13
|
import click
|
15
14
|
import dateutil.parser
|
16
15
|
|
17
16
|
from . import WWVBMinute, WWVBMinuteIERS, print_timecodes, print_timecodes_json, styles
|
18
17
|
|
18
|
+
TYPE_CHECKING = False
|
19
|
+
if TYPE_CHECKING:
|
20
|
+
from . import WWVBChannel
|
19
21
|
|
20
|
-
|
22
|
+
|
23
|
+
def parse_timespec(ctx: click.Context, param: click.Parameter, value: list[str]) -> datetime.datetime: # noqa: ARG001
|
21
24
|
"""Parse a time specifier from the commandline"""
|
22
25
|
try:
|
23
26
|
if len(value) == 5:
|
@@ -95,7 +98,7 @@ def main(
|
|
95
98
|
dut1: int,
|
96
99
|
minutes: int,
|
97
100
|
style: str,
|
98
|
-
channel:
|
101
|
+
channel: WWVBChannel,
|
99
102
|
all_timecodes: bool,
|
100
103
|
timespec: datetime.datetime,
|
101
104
|
) -> None:
|
wwvb/iersdata.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"START": "1972-01-01", "OFFSETS_GZ": "
|
1
|
+
{"START": "1972-01-01", "OFFSETS_GZ": "H4sIAJLBtmgC/+2aa3LDMAiEL5uHLTuxnN5/pn/aTmfSSiAWhGy+E2SWZQE58zwiH/1YivB/96vMXiIX2Io8CTyIrDSWGqlMRdrpDa6aJFnr0m4wYZkCE2UmSF0V+13vBveStK6JTfQyW3O86HLJf0RvDgy5u4FCI+WVKTsVoUdHzsrRoWRfYHIItZ5EEgu0Beu58EgEpMpO9zf4/s3iNO4y7/hqEwOZIPu3+PuO2T7Ic5E8GxsnZHvUYOtELxW1WP+0yx/caFxpyAooq6lq06UEr+UkLeXOIDPZ6EBrqb5K8Tvu6/B9CdnZqFQL05s2KauWy/IeF/tJGAisjK9MgGyDuUkRq4G1gRE+VjA30uZNPsdantkgMq58QO4fw+sqzj+A2/16mmvnyy9UzDvMktDgKYlnkFeB2rx+wNANG40aA4OgsY03AWoDCVs/XMmkyQ0+0jWaUqPdwA0m/MRuccGjCwirHToWzbcs8P7U1nZZLSYdHapWu5HqVg1YjK2fPEwvPZPzLPUF848tyid2u7dh8B7h+wVQ923Q+kqxZe3JclSSB+YTM3nnHrjgFth/vzgZzw6cbOMYa4bHFPU/DR3mp/ubKM4cgwMnHZW4GFxFprOVcevAKGva6oExn1MOmyGDJQPm0rpU8bjqdOo993O6Xz9ofToZela5vwrWoTn4l4o5CIIaKejCEgSnJv784V+z0yyz2F/zCTF9VskETgAA"}
|
wwvb/wwvbtk.py
CHANGED
@@ -8,13 +8,13 @@ from __future__ import annotations
|
|
8
8
|
|
9
9
|
import datetime
|
10
10
|
import functools
|
11
|
-
from tkinter import Canvas, TclError, Tk
|
12
|
-
from typing import TYPE_CHECKING, Any
|
11
|
+
from tkinter import Canvas, Event, TclError, Tk
|
13
12
|
|
14
13
|
import click
|
15
14
|
|
16
15
|
import wwvb
|
17
16
|
|
17
|
+
TYPE_CHECKING = False
|
18
18
|
if TYPE_CHECKING:
|
19
19
|
from collections.abc import Generator
|
20
20
|
|
@@ -25,7 +25,7 @@ def _app() -> Tk:
|
|
25
25
|
return Tk()
|
26
26
|
|
27
27
|
|
28
|
-
def validate_colors(ctx:
|
28
|
+
def validate_colors(ctx: click.Context, param: click.Parameter, value: str) -> list[str]: # noqa: ARG001
|
29
29
|
"""Check that all colors in a string are valid, splitting it to a list"""
|
30
30
|
app = _app()
|
31
31
|
colors = value.split()
|
@@ -106,7 +106,7 @@ def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: P
|
|
106
106
|
canvas.pack(fill="both", expand=True)
|
107
107
|
app.wm_deiconify()
|
108
108
|
|
109
|
-
def resize_canvas(event:
|
109
|
+
def resize_canvas(event: Event) -> None:
|
110
110
|
"""Keep the circle filling the window when it is resized"""
|
111
111
|
sz = min(event.width, event.height) - 8
|
112
112
|
if sz < 0:
|
@@ -141,10 +141,12 @@ def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: P
|
|
141
141
|
|
142
142
|
controller = controller_func().__next__
|
143
143
|
|
144
|
+
# pyrefly: ignore # bad-assignment
|
144
145
|
def after_func() -> None:
|
145
146
|
"""Repeatedly run the controller after the desired interval"""
|
146
147
|
app.after(controller(), after_func)
|
147
148
|
|
149
|
+
# pyrefly: ignore # bad-argument-type
|
148
150
|
app.after_idle(after_func)
|
149
151
|
app.mainloop()
|
150
152
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: wwvb
|
3
|
-
Version:
|
3
|
+
Version: 8.0.0rc1
|
4
4
|
Summary: Generate WWVB timecodes for any desired time
|
5
5
|
Author-email: Jeff Epler <jepler@gmail.com>
|
6
|
-
Project-URL: Source, https://
|
7
|
-
Project-URL: Documentation, https://
|
6
|
+
Project-URL: Source, https://codeberg.org/jepler/wwvbpy
|
7
|
+
Project-URL: Documentation, https://codeberg.org/jepler/wwvbpy
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
9
9
|
Classifier: Programming Language :: Python :: 3.9
|
10
10
|
Classifier: Programming Language :: Python :: 3.10
|
@@ -29,11 +29,7 @@ SPDX-FileCopyrightText: 2021-2024 Jeff Epler
|
|
29
29
|
|
30
30
|
SPDX-License-Identifier: GPL-3.0-only
|
31
31
|
-->
|
32
|
-
[](https://github.com/jepler/wwvbpy/actions/workflows/test.yml)
|
33
|
-
[](https://codecov.io/gh/jepler/wwvbpy)
|
34
|
-
[](https://github.com/jepler/wwvbpy/actions/workflows/cron.yml)
|
35
32
|
[](https://pypi.org/project/wwvb)
|
36
|
-
[](https://results.pre-commit.ci/latest/github/jepler/wwvbpy/main)
|
37
33
|
|
38
34
|
# Purpose
|
39
35
|
|
@@ -63,7 +59,7 @@ The package includes:
|
|
63
59
|
|
64
60
|
# Development status
|
65
61
|
|
66
|
-
The author ([@jepler](https://
|
62
|
+
The author ([@jepler](https://unpythonic.net)) occasionally develops and maintains this project, but
|
67
63
|
issues are not likely to be acted on. They would be interested in adding
|
68
64
|
co-maintainer(s).
|
69
65
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
uwwvb.py,sha256=Ybf8DeOZ5VjfqRGtO90_oEEW6HhGaztIVlh4L423MdQ,5801
|
2
|
+
wwvb/__init__.py,sha256=8QRSFHrGEEnjvalE_mtcVCGvEzPwUl7Os9srr1V5nY0,33832
|
3
|
+
wwvb/__version__.py,sha256=Rclf3PGSRaeFMb7D6Z8qQ4TeuY5MHu6vmzjC3bfviAU,714
|
4
|
+
wwvb/decode.py,sha256=JQw8XT9AoXlJAl16JRZzjECUPfA7jLhDxI-_XSibzbc,2748
|
5
|
+
wwvb/dut1table.py,sha256=HVX1338RlQzAQ-bsMPEdmCqoyIxSWoJSoRu1YGyaJO4,875
|
6
|
+
wwvb/gen.py,sha256=iMTYLtyy3ItC4AplTakkOhHNHzDFVmApjlVwYIK72nI,3798
|
7
|
+
wwvb/iersdata.json,sha256=lUMrygiih4_ItKX_t8Hqnx5bt9_1D1jocPycbtzOfhE,769
|
8
|
+
wwvb/iersdata.json.license,sha256=1k5fhRCuOn0yXbwHtB21G0Nntnf0qMxstflMHuK3-Js,71
|
9
|
+
wwvb/iersdata.py,sha256=nMqA1xcE-iPtmi9m5qcTIJwfsCxZwoNsxHfM-wvooMQ,1210
|
10
|
+
wwvb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
+
wwvb/tz.py,sha256=nlxKnzFPmqLLtC-cEDhWaJ3v3GCSPfqzVtUMf8EEdZ0,248
|
12
|
+
wwvb/updateiers.py,sha256=q3QY--fj06HJ9wCRCmVQK7pCpdXhCudP8BdUPG5WWOA,5781
|
13
|
+
wwvb/wwvbtk.py,sha256=cFBUduN8rQEdrpB0NtHK5r8HNDYfg_3XD7mbhYrVSrk,5284
|
14
|
+
wwvb-8.0.0rc1.dist-info/METADATA,sha256=f_izwyK9BqO8nSNAzycXQHzMsGSFi1oCsh1T1fHdzOg,9612
|
15
|
+
wwvb-8.0.0rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
16
|
+
wwvb-8.0.0rc1.dist-info/entry_points.txt,sha256=KSevvHWLEKxOxUQ-L-OQidD4Sj2BPEfhZ2TQhOgyys4,179
|
17
|
+
wwvb-8.0.0rc1.dist-info/top_level.txt,sha256=0IYdkhEAMgurpv_F-76rlyn4GdxepGFzG99tivVdQVU,11
|
18
|
+
wwvb-8.0.0rc1.dist-info/RECORD,,
|
wwvb-7.0.0.dist-info/RECORD
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
uwwvb.py,sha256=Ybf8DeOZ5VjfqRGtO90_oEEW6HhGaztIVlh4L423MdQ,5801
|
2
|
-
wwvb/__init__.py,sha256=tSEjmfqKR0KYdN7tUySGcXpK_W8rzQTtEXG7P_0WPMA,33432
|
3
|
-
wwvb/__version__.py,sha256=lB_6pZBic6H_5wY9p7_cc7miE65gtXFl65pORFxuiX0,704
|
4
|
-
wwvb/decode.py,sha256=llTLKBW49nl6COheM90NsyMnTNeVApl2oeCHtl6Tf3w,2759
|
5
|
-
wwvb/dut1table.py,sha256=HVX1338RlQzAQ-bsMPEdmCqoyIxSWoJSoRu1YGyaJO4,875
|
6
|
-
wwvb/gen.py,sha256=_fpUypu_2nZfG5Vjnya0B8C26nk1WOhnLMTCXwskAHs,3720
|
7
|
-
wwvb/iersdata.json,sha256=fEElNoF4UJMySnUvNXFlI9TT9k67jdrrGKzO6A1F2rQ,769
|
8
|
-
wwvb/iersdata.json.license,sha256=1k5fhRCuOn0yXbwHtB21G0Nntnf0qMxstflMHuK3-Js,71
|
9
|
-
wwvb/iersdata.py,sha256=nMqA1xcE-iPtmi9m5qcTIJwfsCxZwoNsxHfM-wvooMQ,1210
|
10
|
-
wwvb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
wwvb/tz.py,sha256=nlxKnzFPmqLLtC-cEDhWaJ3v3GCSPfqzVtUMf8EEdZ0,248
|
12
|
-
wwvb/updateiers.py,sha256=q3QY--fj06HJ9wCRCmVQK7pCpdXhCudP8BdUPG5WWOA,5781
|
13
|
-
wwvb/wwvbtk.py,sha256=cdLwWfulywHmGhaiK6L-m_QQAdpfDfyDFagbe_Y8Rgk,5186
|
14
|
-
wwvb-7.0.0.dist-info/METADATA,sha256=6oqjB6nkDQAYeoe8hGbSq5jk9Cj7q9swibX6jubJ-b4,10201
|
15
|
-
wwvb-7.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
16
|
-
wwvb-7.0.0.dist-info/entry_points.txt,sha256=KSevvHWLEKxOxUQ-L-OQidD4Sj2BPEfhZ2TQhOgyys4,179
|
17
|
-
wwvb-7.0.0.dist-info/top_level.txt,sha256=0IYdkhEAMgurpv_F-76rlyn4GdxepGFzG99tivVdQVU,11
|
18
|
-
wwvb-7.0.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|