Skip to content

Commit 2cd8f4a

Browse files
fix: Modified the way dates are handled.
1 parent 202c7b4 commit 2cd8f4a

4 files changed

Lines changed: 44 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ Help this project by [Donation](DONATE.md)
55

66
Changes log
77
-----------
8+
### 1.4.3
9+
10+
+ Fixed issue #5.
11+
+ Dates are now lists.
812

913
### 1.4.2
1014

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,10 @@ python -m build .
8484
Changes
8585
-------
8686

87-
### 1.4.2
87+
### 1.4.3
8888

89-
+ Added new attributes to `WHOIS` class: `emails`, `phone_numbers` and `fax_numbers`
90-
+ Added a new property that contains expiration date(`expiration_date`) to `WHOIS` class
91-
+ Improved WHOIS data parsing (For both human eyes and computer results)
89+
+ Fixed issue #5.
90+
+ Dates are now lists.
9291

9392
Usage Examples:
9493
---------------
@@ -185,7 +184,8 @@ In order to support this project you can donate some crypto of your choice 8D
185184

186185
[Donate Addresses](https://github.com/MPCodeWriter21/whois21/blob/master/DONATE.md)
187186

188-
Or if you can't, give [this project](https://github.com/MPCodeWriter21/whois21) a star on GitHub :)
187+
Or if you can't, simply give [this project](https://github.com/MPCodeWriter21/whois21)
188+
one star on GitHub :)
189189

190190
References
191191
----------

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies = [
2424
"requests>=2.28.2",
2525
"importlib_resources>=5.10.2"
2626
]
27-
version = "1.4.2"
27+
version = "1.4.3"
2828

2929
[tool.setuptools]
3030
packages = ["whois21"]

whois21/__init__.py

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import json
55
import socket
66
import string
7-
from typing import Any, Set, Dict, Tuple, Union, Optional, Sequence
7+
from typing import Any, Set, Dict, List, Tuple, Union, Optional, Sequence
88
from datetime import datetime
99

1010
import log21
@@ -26,7 +26,7 @@
2626
domain_registration_data_lookup,
2727
domain_registration_data_lookup_)
2828

29-
__version__ = '1.4.2'
29+
__version__ = '1.4.3'
3030
__github__ = 'https://github.com/MPCodeWriter21/whois21'
3131
__author__ = 'CodeWriter21'
3232
__email__ = 'CodeWriter21@gmail.com'
@@ -206,9 +206,9 @@ def __init__(
206206
self.registry_domain_id = None
207207
self.registrar_whois_server = None
208208
self.registrar_url = None
209-
self.updated_date: Optional[datetime] = None
210-
self.creation_date: Optional[datetime] = None
211-
self.expires_date: Optional[datetime] = None
209+
self.updated_date: Optional[List[datetime]] = None
210+
self.creation_date: Optional[List[datetime]] = None
211+
self.expires_date: Optional[List[datetime]] = None
212212
self.registrar_name: Union[str, set] = ''
213213
self.registrar_iana_id = None
214214
self.registrar_abuse_contact_email = None
@@ -324,16 +324,34 @@ def __set_attrs(self):
324324
self.status = data.get('DOMAIN STATUS', [])
325325
self.name_servers = data.get('NAME SERVER', []) + data.get('NSERVER', [])
326326

327-
def parse_time(date_time: str) -> Union[datetime, None]:
327+
def parse_time(
328+
date_time: Union[str, Sequence[str]]
329+
) -> Union[List[datetime], None]:
328330
"""Parses a date time string.
329331
330332
:param date_time: The date time string.
331333
:return: The parsed date time.
332334
"""
333-
try:
334-
return datetime.fromisoformat(date_time)
335-
except ValueError:
336-
return None
335+
if isinstance(date_time, str):
336+
try:
337+
return [datetime.fromisoformat(date_time)]
338+
except ValueError:
339+
return None
340+
else:
341+
if isinstance(date_time, Sequence):
342+
result = []
343+
for date in date_time:
344+
try:
345+
result.append(datetime.fromisoformat(date))
346+
except ValueError:
347+
pass
348+
except TypeError:
349+
log21.debug(
350+
"WHOIS: __set_attrs: parse_time: TypeError:",
351+
f"{date_time = }, {type(date_time) = }"
352+
)
353+
return result if result else None
354+
return None
337355

338356
# Convert the dates to datetime objects.
339357
updated_date = (
@@ -577,10 +595,11 @@ def __parse_whois_data(self):
577595
if (key := key_name.strip(STRIP_CHARS).upper()) not in data:
578596
data[key] = value.strip(STRIP_CHARS)
579597
else:
580-
if isinstance(data[key], list):
581-
data[key].append(value.strip(STRIP_CHARS))
582-
elif isinstance(data[key], str):
583-
data[key] = [data[key], value.strip(STRIP_CHARS)]
598+
if (value := value.strip(STRIP_CHARS)):
599+
if isinstance(data[key], list):
600+
data[key].append(value)
601+
elif isinstance(data[key], str):
602+
data[key] = [data[key], value]
584603
i += 1
585604

586605
if not data:
@@ -765,7 +784,7 @@ def domain(self) -> Union[str, int]:
765784
return self.__domain
766785

767786
@property
768-
def expiration_date(self) -> Optional[datetime]:
787+
def expiration_date(self) -> Optional[List[datetime]]:
769788
"""The expiration date of the domain (if available)."""
770789
return self.expires_date
771790

0 commit comments

Comments
 (0)