wwvb 5.0.2__py3-none-any.whl → 5.0.3__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.
- uwwvb.py +4 -1
- wwvb/__init__.py +80 -27
- wwvb/__version__.py +2 -2
- wwvb/iersdata.json +1 -1
- wwvb/wwvbtk.py +16 -18
- {wwvb-5.0.2.dist-info → wwvb-5.0.3.dist-info}/METADATA +6 -8
- wwvb-5.0.3.dist-info/RECORD +18 -0
- {wwvb-5.0.2.dist-info → wwvb-5.0.3.dist-info}/WHEEL +1 -1
- wwvb-5.0.2.dist-info/RECORD +0 -18
- {wwvb-5.0.2.dist-info → wwvb-5.0.3.dist-info}/entry_points.txt +0 -0
- {wwvb-5.0.2.dist-info → wwvb-5.0.3.dist-info}/top_level.txt +0 -0
uwwvb.py
CHANGED
@@ -4,7 +4,10 @@
|
|
4
4
|
|
5
5
|
# ruff: noqa: C405 PYI024 PLR2004 FBT001 FBT002
|
6
6
|
|
7
|
-
"""Implementation of a WWVB state machine & decoder for resource-constrained systems
|
7
|
+
"""Implementation of a WWVB state machine & decoder for resource-constrained systems
|
8
|
+
|
9
|
+
This version is intended for use with MicroPython & CircuitPython.
|
10
|
+
"""
|
8
11
|
|
9
12
|
from __future__ import annotations
|
10
13
|
|
wwvb/__init__.py
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
#!/usr/bin/python3
|
2
|
-
"""A
|
2
|
+
"""A package and CLI for WWVB timecodes
|
3
|
+
|
4
|
+
This is the full featured library suitable for use on 'real computers'.
|
5
|
+
For a reduced version suitable for use on MicroPython & CircuitPython,
|
6
|
+
see `uwwvb`.
|
7
|
+
|
8
|
+
This package also includes the commandline programs listed above,
|
9
|
+
perhaps most importantly ``wwvbgen`` for generating WWVB timecodes.
|
10
|
+
"""
|
3
11
|
|
4
12
|
# SPDX-FileCopyrightText: 2011-2024 Jeff Epler
|
5
13
|
#
|
@@ -24,12 +32,6 @@ SECOND = datetime.timedelta(seconds=1)
|
|
24
32
|
T = TypeVar("T")
|
25
33
|
|
26
34
|
|
27
|
-
def _require(x: T | None) -> T:
|
28
|
-
"""Check an Optional item is not None."""
|
29
|
-
assert x is not None
|
30
|
-
return x
|
31
|
-
|
32
|
-
|
33
35
|
def _removeprefix(s: str, p: str) -> str:
|
34
36
|
if s.startswith(p):
|
35
37
|
return s[len(p) :]
|
@@ -323,11 +325,22 @@ _dst_ls_lut = [
|
|
323
325
|
]
|
324
326
|
|
325
327
|
|
326
|
-
|
327
|
-
|
328
|
+
@enum.unique
|
329
|
+
class DstStatus(enum.IntEnum):
|
330
|
+
"""Constants that describe the DST status of a minute"""
|
328
331
|
|
329
|
-
|
330
|
-
"""
|
332
|
+
DST_NOT_IN_EFFECT = 0b00
|
333
|
+
"""DST not in effect today"""
|
334
|
+
DST_STARTS_TODAY = 0b01
|
335
|
+
"""DST starts today at 0200 local standard time"""
|
336
|
+
DST_ENDS_TODAY = 0b10
|
337
|
+
"""DST ends today at 0200 local standard time"""
|
338
|
+
DST_IN_EFFECT = 0b11
|
339
|
+
"""DST in effect all day today"""
|
340
|
+
|
341
|
+
|
342
|
+
class _WWVBMinute(NamedTuple):
|
343
|
+
"""(implementation detail)"""
|
331
344
|
|
332
345
|
year: int
|
333
346
|
"""2-digit year within the WWVB epoch"""
|
@@ -341,7 +354,7 @@ class _WWVBMinute(NamedTuple):
|
|
341
354
|
min: int
|
342
355
|
"""Minute of hour"""
|
343
356
|
|
344
|
-
dst:
|
357
|
+
dst: DstStatus
|
345
358
|
"""2-bit DST code """
|
346
359
|
|
347
360
|
ut1: int
|
@@ -357,7 +370,8 @@ class _WWVBMinute(NamedTuple):
|
|
357
370
|
class WWVBMinute(_WWVBMinute):
|
358
371
|
"""Uniquely identifies a minute of time in the WWVB system.
|
359
372
|
|
360
|
-
To use ut1 and ls information from IERS, create a WWVBMinuteIERS
|
373
|
+
To use ``ut1`` and ``ls`` information from IERS, create a `WWVBMinuteIERS`
|
374
|
+
object instead.
|
361
375
|
"""
|
362
376
|
|
363
377
|
epoch: int = 1970
|
@@ -368,16 +382,25 @@ class WWVBMinute(_WWVBMinute):
|
|
368
382
|
days: int,
|
369
383
|
hour: int,
|
370
384
|
minute: int,
|
371
|
-
dst: int | None = None,
|
385
|
+
dst: DstStatus | int | None = None,
|
372
386
|
ut1: int | None = None,
|
373
387
|
ls: bool | None = None,
|
374
388
|
ly: bool | None = None,
|
375
389
|
) -> WWVBMinute:
|
376
|
-
"""Construct a WWVBMinute
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
390
|
+
"""Construct a WWVBMinute
|
391
|
+
|
392
|
+
:param year: The 2- or 4-digit year. This parameter is converted by the `full_year` method.
|
393
|
+
:param days: 1-based day of year
|
394
|
+
|
395
|
+
:param hour: UTC hour of day
|
396
|
+
|
397
|
+
:param minute: Minute of hour
|
398
|
+
:param dst: 2-bit DST code
|
399
|
+
:param ut1: UT1 offset in units of 100ms, range -900 to +900ms
|
400
|
+
:param ls: Leap second warning flag
|
401
|
+
:param ly: Leap year flag
|
402
|
+
"""
|
403
|
+
dst = cls.get_dst(year, days) if dst is None else DstStatus(dst)
|
381
404
|
if ut1 is None and ls is None:
|
382
405
|
ut1, ls = cls._get_dut1_info(year, days)
|
383
406
|
elif ut1 is None or ls is None:
|
@@ -407,13 +430,13 @@ class WWVBMinute(_WWVBMinute):
|
|
407
430
|
return year
|
408
431
|
|
409
432
|
@staticmethod
|
410
|
-
def get_dst(year: int, days: int) ->
|
433
|
+
def get_dst(year: int, days: int) -> DstStatus:
|
411
434
|
"""Get the 2-bit WWVB DST value for the given day"""
|
412
435
|
d0 = datetime.datetime(year, 1, 1, tzinfo=datetime.timezone.utc) + datetime.timedelta(days - 1)
|
413
436
|
d1 = d0 + datetime.timedelta(1)
|
414
437
|
dst0 = isdst(d0)
|
415
438
|
dst1 = isdst(d1)
|
416
|
-
return dst1 * 2 + dst0
|
439
|
+
return DstStatus(dst1 * 2 + dst0)
|
417
440
|
|
418
441
|
def __str__(self) -> str:
|
419
442
|
"""Implement str()"""
|
@@ -424,7 +447,10 @@ class WWVBMinute(_WWVBMinute):
|
|
424
447
|
)
|
425
448
|
|
426
449
|
def as_datetime_utc(self) -> datetime.datetime:
|
427
|
-
"""Convert to a UTC datetime
|
450
|
+
"""Convert to a UTC datetime
|
451
|
+
|
452
|
+
The returned object has ``tzinfo=datetime.timezone.utc``.
|
453
|
+
"""
|
428
454
|
d = datetime.datetime(self.year, 1, 1, tzinfo=datetime.timezone.utc)
|
429
455
|
d += datetime.timedelta(self.days - 1, self.hour * 3600 + self.min * 60)
|
430
456
|
return d
|
@@ -437,7 +463,18 @@ class WWVBMinute(_WWVBMinute):
|
|
437
463
|
*,
|
438
464
|
dst_observed: bool = True,
|
439
465
|
) -> datetime.datetime:
|
440
|
-
"""Convert to a local datetime according to the DST bits
|
466
|
+
"""Convert to a local datetime according to the DST bits
|
467
|
+
|
468
|
+
The returned object has ``tz=datetime.timezone(computed_offset)``.
|
469
|
+
|
470
|
+
:param standard_time_offset: The UTC offset of local standard time, in seconds west of UTC.
|
471
|
+
The default value, ``7 * 3600``, is for Colorado, the source of the WWVB broadcast.
|
472
|
+
|
473
|
+
:param dst_observed: If ``True`` then the locale observes DST, and a
|
474
|
+
one hour offset is applied according to WWVB rules. If ``False``, then
|
475
|
+
the standard time offset is used at all times.
|
476
|
+
|
477
|
+
"""
|
441
478
|
u = self.as_datetime_utc()
|
442
479
|
offset = datetime.timedelta(seconds=-standard_time_offset)
|
443
480
|
d = u - datetime.timedelta(seconds=standard_time_offset)
|
@@ -682,7 +719,7 @@ class WWVBMinute(_WWVBMinute):
|
|
682
719
|
return cls(u.tm_year, u.tm_yday, u.tm_hour, u.tm_min, ut1=newut1, ls=newls)
|
683
720
|
|
684
721
|
@classmethod
|
685
|
-
def from_timecode_am(cls, t: WWVBTimecode) -> WWVBMinute | None:
|
722
|
+
def from_timecode_am(cls, t: WWVBTimecode) -> WWVBMinute | None: # noqa: PLR0912
|
686
723
|
"""Construct a WWVBMinute from a WWVBTimecode"""
|
687
724
|
for i in (0, 9, 19, 29, 39, 49, 59):
|
688
725
|
if t.am[i] != AmplitudeModulation.MARK:
|
@@ -697,9 +734,13 @@ class WWVBMinute(_WWVBMinute):
|
|
697
734
|
minute = t._get_am_bcd(1, 2, 3, 5, 6, 7, 8)
|
698
735
|
if minute is None:
|
699
736
|
return None
|
737
|
+
if minute >= 60:
|
738
|
+
return None
|
700
739
|
hour = t._get_am_bcd(12, 13, 15, 16, 17, 18)
|
701
740
|
if hour is None:
|
702
741
|
return None
|
742
|
+
if hour >= 24:
|
743
|
+
return None
|
703
744
|
days = t._get_am_bcd(22, 23, 25, 26, 27, 28, 30, 31, 32, 33)
|
704
745
|
if days is None:
|
705
746
|
return None
|
@@ -716,7 +757,9 @@ class WWVBMinute(_WWVBMinute):
|
|
716
757
|
if days > 366 or (not ly and days > 365):
|
717
758
|
return None
|
718
759
|
ls = bool(t.am[56])
|
719
|
-
dst =
|
760
|
+
dst = t._get_am_bcd(57, 58)
|
761
|
+
if dst is None:
|
762
|
+
return None
|
720
763
|
return cls(year, days, hour, minute, dst, ut1, ls, ly)
|
721
764
|
|
722
765
|
|
@@ -729,7 +772,7 @@ class WWVBMinuteIERS(WWVBMinute):
|
|
729
772
|
return round(get_dut1(d) * 10) * 100, isls(d)
|
730
773
|
|
731
774
|
|
732
|
-
def _bcd_bits(n: int) -> Generator[bool
|
775
|
+
def _bcd_bits(n: int) -> Generator[bool]:
|
733
776
|
"""Return the bcd representation of n, starting with the least significant bit"""
|
734
777
|
while True:
|
735
778
|
d = n % 10
|
@@ -743,9 +786,13 @@ class AmplitudeModulation(enum.IntEnum):
|
|
743
786
|
"""Constants that describe an Amplitude Modulation value"""
|
744
787
|
|
745
788
|
ZERO = 0
|
789
|
+
"""A zero bit (reduced carrier during the first 200ms of the second)"""
|
746
790
|
ONE = 1
|
791
|
+
"""A one bit (reduced carrier during the first 500ms of the second)"""
|
747
792
|
MARK = 2
|
793
|
+
"""A mark bit (reduced carrier during the first 800ms of the second)"""
|
748
794
|
UNSET = -1
|
795
|
+
"""An unset or unknown amplitude modulation value"""
|
749
796
|
|
750
797
|
|
751
798
|
@enum.unique
|
@@ -753,8 +800,11 @@ class PhaseModulation(enum.IntEnum):
|
|
753
800
|
"""Constants that describe a Phase Modulation value"""
|
754
801
|
|
755
802
|
ZERO = 0
|
803
|
+
"""A one bit (180° phase shift during the second)"""
|
756
804
|
ONE = 1
|
805
|
+
"""A zero bit (No phase shift during the second)"""
|
757
806
|
UNSET = -1
|
807
|
+
"""An unset or unknown phase modulation value"""
|
758
808
|
|
759
809
|
|
760
810
|
class WWVBTimecode:
|
@@ -777,7 +827,10 @@ class WWVBTimecode:
|
|
777
827
|
The the bits ``self.am[poslist[i]]`` in MSB order are converted from
|
778
828
|
BCD to integer
|
779
829
|
"""
|
780
|
-
pos =
|
830
|
+
pos = list(poslist)[::-1]
|
831
|
+
for p in pos:
|
832
|
+
if self.am[p] not in {AmplitudeModulation.ZERO, AmplitudeModulation.ONE}:
|
833
|
+
return None
|
781
834
|
val = [bool(self.am[p]) for p in pos]
|
782
835
|
result = 0
|
783
836
|
base = 1
|
wwvb/__version__.py
CHANGED
wwvb/iersdata.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"START": "1972-01-01", "OFFSETS_GZ": "
|
1
|
+
{"START": "1972-01-01", "OFFSETS_GZ": "H4sIAHTtFGgC/+2aa3LDMAiEL5uHLDuxnN5/pn/aTmfSSiAWhGR9J8gsywJylqVHPtqxZuH/7leeI0fKsGd5EngQ2WisJWKegrThDa6aJFnL0u4wYZkCE2UmSF0U+13vCveStC6JTfQyW3O86HLJf0SvDgy5u4FCI+WVKRuy0KMjJeXoULIvMDmEWgeRxAJtwXquPCIBqbLh/gbfv0mcxk3mHV9tYiATZP8W/zgw2wd5LpJnY+WErI8abJ3opaIW6592+YMbjSsNWQFlNVVtuhjhtQzSUh4MEpOdDrSW6qsUv+O+Dt+XkIONSrUwvWmTsmq5LO9xsZ+EgcDK+MIESDaYmxSxGlgbGOFjBXMjbV7lc6zlmQ0i48oH5P4+vK7i/AHc7tfTXDtffqFi3m6WhApPSTyDvArU5vUDhm7YaNQYGASVbbwLUBtI2PrhSiZNbvCRrtGUGu0GbjDhJ3aLCx5dQFjt0LFovmWB96e6tktqMenoULXajVS3asBibP3kYXrpmZxnsS2Yf2xRPrHbvQ2D9wjfL4C6b4PWV4otW0vWUYkeWE5M8M594oLbxP77xcl4NuBkG0dfM3xOUf/T0GF+ur+J5pljcODEUZkXg6vIdLYy7g3oZU3bPNDnc8qwGdJZMmAurUsRj6tOo95zP6fb9YPWp5OuZ5X7q2DrmsG/VCyTyaREnDRhnUxOzfzzhzuJhuMTQw5vlI1NAAA="}
|
wwvb/wwvbtk.py
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
# SPDX-License-Identifier: GPL-3.0-only
|
7
7
|
from __future__ import annotations
|
8
8
|
|
9
|
+
import datetime
|
9
10
|
import functools
|
10
|
-
import time
|
11
11
|
from tkinter import Canvas, TclError, Tk
|
12
12
|
from typing import TYPE_CHECKING, Any
|
13
13
|
|
@@ -59,31 +59,29 @@ DEFAULT_COLORS = "#3c3c3c #3c3c3c #3c3c3c #cc3c3c #88883c #3ccc3c"
|
|
59
59
|
metavar="COLORS",
|
60
60
|
help="2, 3, 4, or 6 Tk color values",
|
61
61
|
)
|
62
|
-
@click.option("--size", default=48)
|
63
|
-
@click.option("--min-size", default=None)
|
62
|
+
@click.option("--size", default=48, help="initial size in pixels")
|
63
|
+
@click.option("--min-size", default=None, type=int, help="minimum size in pixels (default: same as initial size)")
|
64
64
|
def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: PLR0915
|
65
65
|
"""Visualize the WWVB signal in realtime"""
|
66
66
|
if min_size is None:
|
67
67
|
min_size = size
|
68
68
|
|
69
|
-
def deadline_ms(deadline:
|
69
|
+
def deadline_ms(deadline: datetime.datetime) -> int:
|
70
70
|
"""Compute the number of ms until a deadline"""
|
71
|
-
now =
|
72
|
-
return int(max(0, deadline - now) * 1000)
|
71
|
+
now = datetime.datetime.now(datetime.timezone.utc)
|
72
|
+
return int(max(0, (deadline - now).total_seconds()) * 1000)
|
73
73
|
|
74
|
-
def wwvbtick() -> Generator[tuple[
|
74
|
+
def wwvbtick() -> Generator[tuple[datetime.datetime, wwvb.AmplitudeModulation]]:
|
75
75
|
"""Yield consecutive values of the WWVB amplitude signal, going from minute to minute"""
|
76
|
-
timestamp =
|
76
|
+
timestamp = datetime.datetime.now(datetime.timezone.utc).replace(second=0, microsecond=0)
|
77
77
|
|
78
78
|
while True:
|
79
|
-
|
80
|
-
key = tt.tm_year, tt.tm_yday, tt.tm_hour, tt.tm_min
|
81
|
-
timecode = wwvb.WWVBMinuteIERS(*key).as_timecode()
|
79
|
+
timecode = wwvb.WWVBMinuteIERS.from_datetime(timestamp).as_timecode()
|
82
80
|
for i, code in enumerate(timecode.am):
|
83
|
-
yield timestamp + i, code
|
84
|
-
timestamp = timestamp + 60
|
81
|
+
yield timestamp + datetime.timedelta(seconds=i), code
|
82
|
+
timestamp = timestamp + datetime.timedelta(seconds=60)
|
85
83
|
|
86
|
-
def wwvbsmarttick() -> Generator[tuple[
|
84
|
+
def wwvbsmarttick() -> Generator[tuple[datetime.datetime, wwvb.AmplitudeModulation]]:
|
87
85
|
"""Yield consecutive values of the WWVB amplitude signal
|
88
86
|
|
89
87
|
.. but deal with time progressing unexpectedly, such as when the
|
@@ -94,10 +92,10 @@ def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: P
|
|
94
92
|
"""
|
95
93
|
while True:
|
96
94
|
for stamp, code in wwvbtick():
|
97
|
-
now =
|
98
|
-
if stamp < now - 60:
|
95
|
+
now = datetime.datetime.now(datetime.timezone.utc)
|
96
|
+
if stamp < now - datetime.timedelta(seconds=60):
|
99
97
|
break
|
100
|
-
if stamp < now - 1:
|
98
|
+
if stamp < now - datetime.timedelta(seconds=1):
|
101
99
|
continue
|
102
100
|
yield stamp, code
|
103
101
|
|
@@ -137,7 +135,7 @@ def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: P
|
|
137
135
|
yield deadline_ms(stamp)
|
138
136
|
led_on(code)
|
139
137
|
app.update()
|
140
|
-
yield deadline_ms(stamp + 0.2 + 0.3 * int(code))
|
138
|
+
yield deadline_ms(stamp + datetime.timedelta(seconds=0.2 + 0.3 * int(code)))
|
141
139
|
led_off(code)
|
142
140
|
app.update()
|
143
141
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: wwvb
|
3
|
-
Version: 5.0.
|
3
|
+
Version: 5.0.3
|
4
4
|
Summary: Generate WWVB timecodes for any desired time
|
5
5
|
Author-email: Jeff Epler <jepler@gmail.com>
|
6
6
|
Project-URL: Source, https://github.com/jepler/wwvbpy
|
@@ -33,13 +33,11 @@ SPDX-License-Identifier: GPL-3.0-only
|
|
33
33
|
[](https://codecov.io/gh/jepler/wwvbpy)
|
34
34
|
[](https://github.com/jepler/wwvbpy/actions/workflows/cron.yml)
|
35
35
|
[](https://pypi.org/project/wwvb)
|
36
|
-
[](https://github.com/jepler/wwvbpy/actions/workflows/codeql.yml)
|
37
36
|
[](https://results.pre-commit.ci/latest/github/jepler/wwvbpy/main)
|
38
37
|
|
39
38
|
# Purpose
|
40
39
|
|
41
|
-
|
42
|
-
may be useful in testing WWVB decoder software.
|
40
|
+
Python package and command line programs for interacting with WWVB timecodes.
|
43
41
|
|
44
42
|
Where possible, wwvbpy uses existing facilities for calendar and time
|
45
43
|
manipulation (datetime and dateutil).
|
@@ -65,7 +63,7 @@ The package includes:
|
|
65
63
|
|
66
64
|
# Development status
|
67
65
|
|
68
|
-
The author (@jepler) occasionally develops and maintains this project, but
|
66
|
+
The author ([@jepler](https://github.com/jepler)) occasionally develops and maintains this project, but
|
69
67
|
issues are not likely to be acted on. They would be interested in adding
|
70
68
|
co-maintainer(s).
|
71
69
|
|
@@ -93,7 +91,7 @@ channel.
|
|
93
91
|
# Usage
|
94
92
|
|
95
93
|
~~~~
|
96
|
-
Usage:
|
94
|
+
Usage: wwvbgen [OPTIONS] [TIMESPEC]...
|
97
95
|
|
98
96
|
Generate WWVB timecodes
|
99
97
|
|
@@ -123,7 +121,7 @@ Options:
|
|
123
121
|
|
124
122
|
For example, to display the leap second that occurred at the end of 1998,
|
125
123
|
~~~~
|
126
|
-
$
|
124
|
+
$ wwvbgen -m 7 1998 365 23 56
|
127
125
|
WWVB timecode: year=98 days=365 hour=23 min=56 dst=0 ut1=-300 ly=0 ls=1
|
128
126
|
'98+365 23:56 210100110200100001120011001102010100010200110100121000001002
|
129
127
|
'98+365 23:57 210100111200100001120011001102010100010200110100121000001002
|
@@ -145,7 +143,7 @@ The letters `a` through `u` represent offsets of -1.0s through +1.0s
|
|
145
143
|
in 0.1s increments; `k` represents 0s. (In practice, only a smaller range
|
146
144
|
of values, typically -0.7s to +0.8s, is seen)
|
147
145
|
|
148
|
-
For 2001 through
|
146
|
+
For 2001 through 2024, NIST has published the actual DUT1 values broadcast,
|
149
147
|
and the date of each change, though it in the format of an HTML
|
150
148
|
table and not designed for machine readability:
|
151
149
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
uwwvb.py,sha256=KIx4eYsLVu6KzF-Pzr-0htDWbNK9r0W-V6eK-CvHctQ,5806
|
2
|
+
wwvb/__init__.py,sha256=hnIha8mfZfD5l-0YhDf4Hz3YSs-idvHgKh3pd5PHBhI,32868
|
3
|
+
wwvb/__version__.py,sha256=Go8qgjS_vxKNujIcp3hLHHuyaklRsxOHDXpF1FhhwKo,511
|
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=VwE_jHstK9FpcfW-Txqh7CMd_w0hH0G5FEUVhNZ3biQ,765
|
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=Zemj6m0hwPLP31y8ODAS7sqLeB8SSHvv833pfUPHMUo,5661
|
13
|
+
wwvb/wwvbtk.py,sha256=9RcSssben6CEsX7P3Rmphvmlnp8HoAb9gMFcCP35ryk,5184
|
14
|
+
wwvb-5.0.3.dist-info/METADATA,sha256=Nq0GMmxrFBXRlCBnznV3BoiyWZSAm8Y8n7JKI4BAjug,10201
|
15
|
+
wwvb-5.0.3.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
16
|
+
wwvb-5.0.3.dist-info/entry_points.txt,sha256=KSevvHWLEKxOxUQ-L-OQidD4Sj2BPEfhZ2TQhOgyys4,179
|
17
|
+
wwvb-5.0.3.dist-info/top_level.txt,sha256=0IYdkhEAMgurpv_F-76rlyn4GdxepGFzG99tivVdQVU,11
|
18
|
+
wwvb-5.0.3.dist-info/RECORD,,
|
wwvb-5.0.2.dist-info/RECORD
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
uwwvb.py,sha256=dyYlxZ6tIlcbKsWExNHKA8OtRfbziaCy5Xcj_97bGtA,5737
|
2
|
-
wwvb/__init__.py,sha256=_c1tdOybgVWRTJcP_VTd6nVSe-ilfR6Q7jrbaMGFSms,30729
|
3
|
-
wwvb/__version__.py,sha256=YB05MjFiw1d0kvsBTJz-HozOgAVgYLVfveizijD2LRY,511
|
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=t99q3q2r8gMBHyehYCKCEgM95QuQ2-GFfCLewkVKdSA,765
|
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=Zemj6m0hwPLP31y8ODAS7sqLeB8SSHvv833pfUPHMUo,5661
|
13
|
-
wwvb/wwvbtk.py,sha256=TvJdwbwEYkiv-dEopq4_GSgeD16wQGgG4pIMRw_MJT4,4870
|
14
|
-
wwvb-5.0.2.dist-info/METADATA,sha256=cF5ziUc7JJAqm7OrcWhg4GauiVYv65m1z0aCjti77Xk,10382
|
15
|
-
wwvb-5.0.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
16
|
-
wwvb-5.0.2.dist-info/entry_points.txt,sha256=KSevvHWLEKxOxUQ-L-OQidD4Sj2BPEfhZ2TQhOgyys4,179
|
17
|
-
wwvb-5.0.2.dist-info/top_level.txt,sha256=0IYdkhEAMgurpv_F-76rlyn4GdxepGFzG99tivVdQVU,11
|
18
|
-
wwvb-5.0.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|