python-dateutil 2.9.0__py2.py3-none-any.whl → 3.0.0__py2.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.
@@ -1,55 +1,124 @@
1
1
  # -*- coding: utf-8 -*-
2
- import warnings
3
- import json
2
+ """
3
+ The ``dateutil.zoneinfo`` module was originally designed to work with a tarball
4
+ shipped with ``dateutil``. Since ``dateutil`` now uses data from the same
5
+ sources as :py:mod:`zoneinfo`, this module is no longer necessary.
6
+
7
+ .. caution::
8
+ This module is deprecated, and its functionality has been dramatically
9
+ curtailed. It is recommended that you adopt the standard library module
10
+ :py:mod:`zoneinfo` or :func:`dateutil.tz.gettz` instead.
11
+
12
+ """
4
13
 
14
+ import json
15
+ import sys
16
+ import warnings
5
17
  from tarfile import TarFile
6
- from pkgutil import get_data
7
- from io import BytesIO
8
18
 
19
+ import six
20
+
21
+ from dateutil import _tzdata_impl
9
22
  from dateutil.tz import tzfile as _tzfile
10
23
 
11
24
  __all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"]
12
25
 
13
- ZONEFILENAME = "dateutil-zoneinfo.tar.gz"
26
+ ZONEFILENAME = None
14
27
  METADATA_FN = 'METADATA'
15
28
 
16
29
 
17
- class tzfile(_tzfile):
18
- def __reduce__(self):
19
- return (gettz, (self._filename,))
30
+ def _importer_stacklevel():
31
+ """The ``stacklevel`` that attributes a warning to the importing code.
20
32
 
33
+ This module can be imported through ``dateutil.__getattr__`` (e.g. by
34
+ ``from dateutil import zoneinfo``), which calls
35
+ ``importlib.import_module``; the warnings machinery skips the import
36
+ system's own frames, but not those two, so skip them here.
37
+ """
38
+ level = 1
39
+ frame = sys._getframe(1) # The body of this module
40
+ while frame.f_back is not None:
41
+ frame = frame.f_back
42
+ filename = frame.f_code.co_filename
43
+ if "importlib" in filename and "_bootstrap" in filename:
44
+ # Since Python 3.5, the warnings machinery skips these frames
45
+ # without counting them; before that they count like any other.
46
+ if sys.version_info < (3, 5):
47
+ level += 1
48
+ continue
49
+
50
+ level += 1
51
+ if frame.f_globals.get("__name__") not in ("importlib", "dateutil"):
52
+ return level
53
+
54
+ return 2
21
55
 
22
- def getzoneinfofile_stream():
23
- try:
24
- return BytesIO(get_data(__name__, ZONEFILENAME))
25
- except IOError as e: # TODO switch to FileNotFoundError?
26
- warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror))
27
- return None
28
56
 
57
+ warnings.warn(
58
+ "The `dateutil.zoneinfo` module has been replaced with a wrapper around "
59
+ "the tzdata package, and its use is deprecated, to be removed in a future "
60
+ "version. Use the standard library module `zoneinfo` or `dateutil.tz` "
61
+ "instead.",
62
+ DeprecationWarning,
63
+ stacklevel=_importer_stacklevel(),
64
+ )
65
+
66
+
67
+ tzfile = _tzfile
29
68
 
30
69
  class ZoneInfoFile(object):
31
70
  def __init__(self, zonefile_stream=None):
32
71
  if zonefile_stream is not None:
33
- with TarFile.open(fileobj=zonefile_stream) as tf:
34
- self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name)
35
- for zf in tf.getmembers()
36
- if zf.isfile() and zf.name != METADATA_FN}
37
- # deal with links: They'll point to their parent object. Less
38
- # waste of memory
39
- links = {zl.name: self.zones[zl.linkname]
40
- for zl in tf.getmembers() if
41
- zl.islnk() or zl.issym()}
42
- self.zones.update(links)
43
- try:
44
- metadata_json = tf.extractfile(tf.getmember(METADATA_FN))
45
- metadata_str = metadata_json.read().decode('UTF-8')
46
- self.metadata = json.loads(metadata_str)
47
- except KeyError:
48
- # no metadata in tar file
49
- self.metadata = None
72
+ self._load_legacy_zonefile_stream(zonefile_stream)
50
73
  else:
51
- self.zones = {}
52
- self.metadata = None
74
+ self._eager_load_tzdata()
75
+
76
+ def _eager_load_tzdata(self):
77
+ try:
78
+ import tzdata
79
+ except ImportError as e:
80
+ six.raise_from(
81
+ ImportError(
82
+ "The tzdata module is required to use ZoneInfoFile; either add "
83
+ "a dependency on tzdata or migrate away from dateutil.zoneinfo."
84
+ ),
85
+ e,
86
+ )
87
+
88
+ zone_dict = {}
89
+
90
+ for key in _tzdata_impl._load_tzdata_keys():
91
+ with _tzdata_impl._load_tzdata(key) as f:
92
+ zone_dict[key] = tzfile(f, key=key)
93
+
94
+ self.zones = zone_dict
95
+ self.metadata = {
96
+ "metadata_version": "3.0",
97
+ "tzversion": tzdata.IANA_VERSION,
98
+ }
99
+
100
+ def _load_legacy_zonefile_stream(self, zonefile_stream):
101
+ with TarFile.open(fileobj=zonefile_stream) as tf:
102
+ self.zones = {
103
+ zf.name: tzfile(tf.extractfile(zf), filename=zf.name)
104
+ for zf in tf.getmembers()
105
+ if zf.isfile() and zf.name != METADATA_FN
106
+ }
107
+ # deal with links: They'll point to their parent object. Less
108
+ # waste of memory
109
+ links = {
110
+ zl.name: self.zones[zl.linkname]
111
+ for zl in tf.getmembers()
112
+ if zl.islnk() or zl.issym()
113
+ }
114
+ self.zones.update(links)
115
+ try:
116
+ metadata_json = tf.extractfile(tf.getmember(METADATA_FN))
117
+ metadata_str = metadata_json.read().decode("UTF-8")
118
+ self.metadata = json.loads(metadata_str)
119
+ except KeyError:
120
+ # no metadata in tar file
121
+ self.metadata = None
53
122
 
54
123
  def get(self, name, default=None):
55
124
  """
@@ -99,7 +168,7 @@ def get_zonefile_instance(new_instance=False):
99
168
  zif = getattr(get_zonefile_instance, '_cached_instance', None)
100
169
 
101
170
  if zif is None:
102
- zif = ZoneInfoFile(getzoneinfofile_stream())
171
+ zif = ZoneInfoFile()
103
172
 
104
173
  get_zonefile_instance._cached_instance = zif
105
174
 
@@ -108,8 +177,7 @@ def get_zonefile_instance(new_instance=False):
108
177
 
109
178
  def gettz(name):
110
179
  """
111
- This retrieves a time zone from the local zoneinfo tarball that is packaged
112
- with dateutil.
180
+ This retrieves a time zone from the ``tzdata`` package.
113
181
 
114
182
  :param name:
115
183
  An IANA-style time zone name, as found in the zoneinfo file.
@@ -140,14 +208,12 @@ def gettz(name):
140
208
  DeprecationWarning)
141
209
 
142
210
  if len(_CLASS_ZONE_INSTANCE) == 0:
143
- _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))
211
+ _CLASS_ZONE_INSTANCE.append(ZoneInfoFile())
144
212
  return _CLASS_ZONE_INSTANCE[0].zones.get(name)
145
213
 
146
214
 
147
215
  def gettz_db_metadata():
148
- """ Get the zonefile metadata
149
-
150
- See `zonefile_metadata`_
216
+ """Get the zonefile metadata
151
217
 
152
218
  :returns:
153
219
  A dictionary with the database metadata
@@ -163,5 +229,5 @@ def gettz_db_metadata():
163
229
  DeprecationWarning)
164
230
 
165
231
  if len(_CLASS_ZONE_INSTANCE) == 0:
166
- _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))
232
+ _CLASS_ZONE_INSTANCE.append(ZoneInfoFile())
167
233
  return _CLASS_ZONE_INSTANCE[0].metadata
@@ -1,75 +1,42 @@
1
- import logging
2
- import os
3
- import tempfile
4
- import shutil
5
- import json
6
- from subprocess import check_call, check_output
7
- from tarfile import TarFile
1
+ import warnings
8
2
 
9
- from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME
3
+ __all__ = ["rebuild", "RebuildDeprecationWarning"]
10
4
 
11
5
 
12
- def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None):
13
- """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar*
6
+ class RebuildDeprecationWarning(FutureWarning):
7
+ """Warning raised by :func:`rebuild`, which no longer does anything.
14
8
 
15
- filename is the timezone tarball from ``ftp.iana.org/tz``.
9
+ A warnings filter turns this into an error by default. To keep calling
10
+ :func:`rebuild` as a no-op, filter it out, e.g.::
16
11
 
12
+ warnings.filterwarnings(
13
+ "ignore", category=dateutil.zoneinfo.rebuild.RebuildDeprecationWarning
14
+ )
17
15
  """
18
- tmpdir = tempfile.mkdtemp()
19
- zonedir = os.path.join(tmpdir, "zoneinfo")
20
- moduledir = os.path.dirname(__file__)
21
- try:
22
- with TarFile.open(filename) as tf:
23
- for name in zonegroups:
24
- tf.extract(name, tmpdir)
25
- filepaths = [os.path.join(tmpdir, n) for n in zonegroups]
26
-
27
- _run_zic(zonedir, filepaths)
28
-
29
- # write metadata file
30
- with open(os.path.join(zonedir, METADATA_FN), 'w') as f:
31
- json.dump(metadata, f, indent=4, sort_keys=True)
32
- target = os.path.join(moduledir, ZONEFILENAME)
33
- with TarFile.open(target, "w:%s" % format) as tf:
34
- for entry in os.listdir(zonedir):
35
- entrypath = os.path.join(zonedir, entry)
36
- tf.add(entrypath, entry)
37
- finally:
38
- shutil.rmtree(tmpdir)
39
16
 
40
17
 
41
- def _run_zic(zonedir, filepaths):
42
- """Calls the ``zic`` compiler in a compatible way to get a "fat" binary.
43
-
44
- Recent versions of ``zic`` default to ``-b slim``, while older versions
45
- don't even have the ``-b`` option (but default to "fat" binaries). The
46
- current version of dateutil does not support Version 2+ TZif files, which
47
- causes problems when used in conjunction with "slim" binaries, so this
48
- function is used to ensure that we always get a "fat" binary.
49
- """
50
-
51
- try:
52
- help_text = check_output(["zic", "--help"])
53
- except OSError as e:
54
- _print_on_nosuchfile(e)
55
- raise
56
-
57
- if b"-b " in help_text:
58
- bloat_args = ["-b", "fat"]
59
- else:
60
- bloat_args = []
61
-
62
- check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths)
63
-
64
-
65
- def _print_on_nosuchfile(e):
66
- """Print helpful troubleshooting message
18
+ def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None):
19
+ """Formerly rebuilt the zoneinfo tarball bundled with ``dateutil``.
67
20
 
68
- e is an exception raised by subprocess.check_call()
21
+ ``dateutil`` no longer ships a zoneinfo tarball; it reads time zone data
22
+ from the system and from the `tzdata <https://pypi.org/project/tzdata/>`_
23
+ package instead. This function now does nothing except raise
24
+ :class:`RebuildDeprecationWarning`, which is an error unless a warnings
25
+ filter says otherwise.
69
26
 
27
+ .. deprecated:: 3.0.0
70
28
  """
71
- if e.errno == 2:
72
- logging.error(
73
- "Could not find zic. Perhaps you need to install "
74
- "libc-bin or some other package that provides it, "
75
- "or it's not in your PATH?")
29
+ # The filter is added at call time rather than at import time, so that it
30
+ # is still in place if the module was first imported inside a
31
+ # warnings.catch_warnings() block. It is appended, so any filter the user
32
+ # has installed for this category takes precedence.
33
+ warnings.filterwarnings(
34
+ "error", category=RebuildDeprecationWarning, append=True
35
+ )
36
+ warnings.warn(
37
+ "dateutil.zoneinfo.rebuild() no longer does anything, because dateutil "
38
+ "no longer ships a zoneinfo tarball. Use the tzdata package or the "
39
+ "system time zone data instead.",
40
+ RebuildDeprecationWarning,
41
+ stacklevel=2,
42
+ )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: python-dateutil
3
- Version: 2.9.0
3
+ Version: 3.0.0
4
4
  Summary: Extensions to the standard Python datetime module
5
5
  Home-page: https://github.com/dateutil/dateutil
6
6
  Author: Gustavo Niemeyer
@@ -28,11 +28,20 @@ Classifier: Programming Language :: Python :: 3.9
28
28
  Classifier: Programming Language :: Python :: 3.10
29
29
  Classifier: Programming Language :: Python :: 3.11
30
30
  Classifier: Programming Language :: Python :: 3.12
31
+ Classifier: Programming Language :: Python :: 3.13
32
+ Classifier: Programming Language :: Python :: 3.14
33
+ Classifier: Programming Language :: Python :: 3.15
34
+ Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
35
+ Classifier: Programming Language :: Python :: Implementation :: CPython
36
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
31
37
  Classifier: Topic :: Software Development :: Libraries
32
38
  Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,>=2.7
33
39
  Description-Content-Type: text/x-rst
34
40
  License-File: LICENSE
35
- Requires-Dist: six >=1.5
41
+ Requires-Dist: six>=1.6
42
+ Requires-Dist: tzdata
43
+ Dynamic: description
44
+ Dynamic: license-file
36
45
 
37
46
  dateutil - powerful extensions to datetime
38
47
  ==========================================
@@ -41,7 +50,7 @@ dateutil - powerful extensions to datetime
41
50
 
42
51
  |gitter| |readthedocs|
43
52
 
44
- |travis| |appveyor| |pipelines| |coverage|
53
+ |appveyor| |gha| |coverage|
45
54
 
46
55
  .. |pypi| image:: https://img.shields.io/pypi/v/python-dateutil.svg?style=flat-square
47
56
  :target: https://pypi.org/project/python-dateutil/
@@ -51,17 +60,13 @@ dateutil - powerful extensions to datetime
51
60
  :target: https://pypi.org/project/python-dateutil/
52
61
  :alt: supported Python version
53
62
 
54
- .. |travis| image:: https://img.shields.io/travis/dateutil/dateutil/master.svg?style=flat-square&label=Travis%20Build
55
- :target: https://travis-ci.org/dateutil/dateutil
56
- :alt: travis build status
57
-
58
63
  .. |appveyor| image:: https://img.shields.io/appveyor/ci/dateutil/dateutil/master.svg?style=flat-square&logo=appveyor
59
64
  :target: https://ci.appveyor.com/project/dateutil/dateutil
60
65
  :alt: appveyor build status
61
66
 
62
- .. |pipelines| image:: https://dev.azure.com/pythondateutilazure/dateutil/_apis/build/status/dateutil.dateutil?branchName=master
63
- :target: https://dev.azure.com/pythondateutilazure/dateutil/_build/latest?definitionId=1&branchName=master
64
- :alt: azure pipelines build status
67
+ .. |gha| image:: https://github.com/dateutil/dateutil/actions/workflows/validate.yml/badge.svg
68
+ :target: https://github.com/dateutil/dateutil/actions
69
+ :alt: github actions build status
65
70
 
66
71
  .. |coverage| image:: https://codecov.io/gh/dateutil/dateutil/branch/master/graphs/badge.svg?branch=master
67
72
  :target: https://codecov.io/gh/dateutil/dateutil?branch=master
@@ -189,11 +194,6 @@ Releases Signing key fingerprint
189
194
  New releases *may* have signed tags, but binary and source distributions
190
195
  uploaded to PyPI will no longer have GPG signatures attached.
191
196
 
192
- Contact
193
- =======
194
- Our mailing list is available at `dateutil@python.org <https://mail.python.org/mailman/listinfo/dateutil>`_. As it is hosted by the PSF, it is subject to the `PSF code of
195
- conduct <https://www.python.org/psf/conduct/>`_.
196
-
197
197
  License
198
198
  =======
199
199
 
@@ -0,0 +1,27 @@
1
+ dateutil/__init__.py,sha256=Rlncv13heMaerX26_chS__gaCqk8o0BPH5zljim_Z_M,650
2
+ dateutil/_common.py,sha256=77w0yytkrxlYbSn--lDVPUMabUXRR9I3lBv_vQRUqUY,932
3
+ dateutil/_tzdata_impl.py,sha256=F4Cj7D4gowRHi6D0649YUtlnB-1ynzOOmVEUCozGw6c,4835
4
+ dateutil/_version.py,sha256=-Oe07VK7JZRuZhf_WAyReYEKe8tlyWlu6k6HEynNyfY,160
5
+ dateutil/easter.py,sha256=dyBi-lKvimH1u_k6p7Z0JJK72QhqVtVBsqByvpEPKvc,2678
6
+ dateutil/relativedelta.py,sha256=NB5lZwcsKtft2nj7Bfaevh7iU8IDFYku_uQg8dCNiOs,24835
7
+ dateutil/rrule.py,sha256=2T1idORGtozykXoZlCr4GFlTkpGEDwSD_FKghaDlfjY,67585
8
+ dateutil/tzwin.py,sha256=7Ar4vdQCnnM0mKR3MUjbIKsZrBVfHgdwsJZc_mGYRew,59
9
+ dateutil/utils.py,sha256=dKCchEw8eObi0loGTx91unBxm_7UGlU3v_FjFMdqwYM,1965
10
+ dateutil/parser/__init__.py,sha256=wWk6GFuxTpjoggCGtgkceJoti4pVjl4_fHQXpNOaSYg,1766
11
+ dateutil/parser/_parser.py,sha256=7klDdyicksQB_Xgl-3UAmBwzCYor1AIZqklIcT6dH_8,58796
12
+ dateutil/parser/isoparser.py,sha256=8Fy999bnCd1frSdOYuOraWfJTtd5W7qQ51NwNuH_hXM,13233
13
+ dateutil/tz/__init__.py,sha256=TtmK228efAGvqU9D2f3MFPPWjdjCS2W5afUoC6WlLb4,1350
14
+ dateutil/tz/_common.py,sha256=cgzDTANsOXvEc86cYF77EsliuSab8Puwpsl5-bX3_S4,12977
15
+ dateutil/tz/_factories.py,sha256=unb6XQNXrPMveksTCU-Ag8jmVZs4SojoPUcAHpWnrvU,2569
16
+ dateutil/tz/_tzfile.py,sha256=Qh5WxE8qDy-P2BQ1grI_qNn2nrazjn54cEZBvuPd0Lg,49242
17
+ dateutil/tz/_tzpath.py,sha256=b83zAaiflC200NjHWa7RRQt6idBnlp5nEQngvol1f90,3288
18
+ dateutil/tz/tz.py,sha256=5AeTP7njYdzWP9nLBFpXUWatk9GDZPk6YIlzkAoRdHY,50272
19
+ dateutil/tz/win.py,sha256=xJszWgSwE1xPx_HJj4ZkepyukC_hNy016WMcXhbRaB8,12935
20
+ dateutil/zoneinfo/__init__.py,sha256=k1tAG2ct92qpNQ7hcHVFkOYz572l_cmVgOpqJFvV434,7972
21
+ dateutil/zoneinfo/rebuild.py,sha256=iCA6CfiNLy_A_zgR0xlb88XTner38nd8CpLmDtq6YCw,1625
22
+ python_dateutil-3.0.0.dist-info/licenses/LICENSE,sha256=ugD1Gg2SgjtaHN4n2LW50jIeZ-2NqbwWPv-W1eF-V34,2889
23
+ python_dateutil-3.0.0.dist-info/METADATA,sha256=4Q6tk1mK7VG9soqjDvZO5dbMyHHoh0HSIOUE6XmvRpU,8237
24
+ python_dateutil-3.0.0.dist-info/WHEEL,sha256=Uvlg2aNlEKdilsyFSJt1QX5me0eEbCjQzR3nZeFkvy4,109
25
+ python_dateutil-3.0.0.dist-info/top_level.txt,sha256=4tjdWkhRZvF7LA_BYe_L9gB2w_p2a-z5y6ArjaRkot8,9
26
+ python_dateutil-3.0.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
27
+ python_dateutil-3.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: setuptools (84.2.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
Binary file
@@ -1,25 +0,0 @@
1
- dateutil/__init__.py,sha256=Mqam67WO9IkTmUFyI66vS6IoSXTp9G388DadH2LCMLY,620
2
- dateutil/_common.py,sha256=77w0yytkrxlYbSn--lDVPUMabUXRR9I3lBv_vQRUqUY,932
3
- dateutil/_version.py,sha256=Vb5T-8FcBzgHCb1RYqez20zYqm5tplcF41kZi7B8cik,411
4
- dateutil/easter.py,sha256=dyBi-lKvimH1u_k6p7Z0JJK72QhqVtVBsqByvpEPKvc,2678
5
- dateutil/relativedelta.py,sha256=IY_mglMjoZbYfrvloTY2ce02aiVjPIkiZfqgNTZRfuA,24903
6
- dateutil/rrule.py,sha256=KJzKlaCd1jEbu4A38ZltslaoAUh9nSbdbOFdjp70Kew,66557
7
- dateutil/tzwin.py,sha256=7Ar4vdQCnnM0mKR3MUjbIKsZrBVfHgdwsJZc_mGYRew,59
8
- dateutil/utils.py,sha256=dKCchEw8eObi0loGTx91unBxm_7UGlU3v_FjFMdqwYM,1965
9
- dateutil/parser/__init__.py,sha256=wWk6GFuxTpjoggCGtgkceJoti4pVjl4_fHQXpNOaSYg,1766
10
- dateutil/parser/_parser.py,sha256=7klDdyicksQB_Xgl-3UAmBwzCYor1AIZqklIcT6dH_8,58796
11
- dateutil/parser/isoparser.py,sha256=8Fy999bnCd1frSdOYuOraWfJTtd5W7qQ51NwNuH_hXM,13233
12
- dateutil/tz/__init__.py,sha256=F-Mz13v6jYseklQf9Te9J6nzcLDmq47gORa61K35_FA,444
13
- dateutil/tz/_common.py,sha256=cgzDTANsOXvEc86cYF77EsliuSab8Puwpsl5-bX3_S4,12977
14
- dateutil/tz/_factories.py,sha256=unb6XQNXrPMveksTCU-Ag8jmVZs4SojoPUcAHpWnrvU,2569
15
- dateutil/tz/tz.py,sha256=EUnEdMfeThXiY6l4sh9yBabZ63_POzy01zSsh9thn1o,62855
16
- dateutil/tz/win.py,sha256=xJszWgSwE1xPx_HJj4ZkepyukC_hNy016WMcXhbRaB8,12935
17
- dateutil/zoneinfo/__init__.py,sha256=KYg0pthCMjcp5MXSEiBJn3nMjZeNZav7rlJw5-tz1S4,5889
18
- dateutil/zoneinfo/dateutil-zoneinfo.tar.gz,sha256=Y25Djz4f3ZwC5TcTaM4UJMhWRNZSciMe0zOF9XsDv4I,156385
19
- dateutil/zoneinfo/rebuild.py,sha256=MiqYzCIHvNbMH-LdRYLv-4T0EIA7hDKt5GLR0IRTLdI,2392
20
- python_dateutil-2.9.0.dist-info/LICENSE,sha256=ugD1Gg2SgjtaHN4n2LW50jIeZ-2NqbwWPv-W1eF-V34,2889
21
- python_dateutil-2.9.0.dist-info/METADATA,sha256=K-Gq16MVMeVLv55QoQuFM3r-Ofdvp5ACKJZ3t4wr4oU,8348
22
- python_dateutil-2.9.0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
23
- python_dateutil-2.9.0.dist-info/top_level.txt,sha256=4tjdWkhRZvF7LA_BYe_L9gB2w_p2a-z5y6ArjaRkot8,9
24
- python_dateutil-2.9.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
25
- python_dateutil-2.9.0.dist-info/RECORD,,