|
4 | 4 | import json |
5 | 5 | import socket |
6 | 6 | 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 |
8 | 8 | from datetime import datetime |
9 | 9 |
|
10 | 10 | import log21 |
|
26 | 26 | domain_registration_data_lookup, |
27 | 27 | domain_registration_data_lookup_) |
28 | 28 |
|
29 | | -__version__ = '1.4.2' |
| 29 | +__version__ = '1.4.3' |
30 | 30 | __github__ = 'https://github.com/MPCodeWriter21/whois21' |
31 | 31 | __author__ = 'CodeWriter21' |
32 | 32 | __email__ = 'CodeWriter21@gmail.com' |
@@ -206,9 +206,9 @@ def __init__( |
206 | 206 | self.registry_domain_id = None |
207 | 207 | self.registrar_whois_server = None |
208 | 208 | 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 |
212 | 212 | self.registrar_name: Union[str, set] = '' |
213 | 213 | self.registrar_iana_id = None |
214 | 214 | self.registrar_abuse_contact_email = None |
@@ -324,16 +324,34 @@ def __set_attrs(self): |
324 | 324 | self.status = data.get('DOMAIN STATUS', []) |
325 | 325 | self.name_servers = data.get('NAME SERVER', []) + data.get('NSERVER', []) |
326 | 326 |
|
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]: |
328 | 330 | """Parses a date time string. |
329 | 331 |
|
330 | 332 | :param date_time: The date time string. |
331 | 333 | :return: The parsed date time. |
332 | 334 | """ |
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 |
337 | 355 |
|
338 | 356 | # Convert the dates to datetime objects. |
339 | 357 | updated_date = ( |
@@ -577,10 +595,11 @@ def __parse_whois_data(self): |
577 | 595 | if (key := key_name.strip(STRIP_CHARS).upper()) not in data: |
578 | 596 | data[key] = value.strip(STRIP_CHARS) |
579 | 597 | 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] |
584 | 603 | i += 1 |
585 | 604 |
|
586 | 605 | if not data: |
@@ -765,7 +784,7 @@ def domain(self) -> Union[str, int]: |
765 | 784 | return self.__domain |
766 | 785 |
|
767 | 786 | @property |
768 | | - def expiration_date(self) -> Optional[datetime]: |
| 787 | + def expiration_date(self) -> Optional[List[datetime]]: |
769 | 788 | """The expiration date of the domain (if available).""" |
770 | 789 | return self.expires_date |
771 | 790 |
|
|
0 commit comments