Skip to content

Commit 2d04371

Browse files
committed
Update date parsing (partially use isodate pkg)
isodate is already installed since it is a rdflib dependency
1 parent 822eb5e commit 2d04371

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

linkml_runtime/utils/metamodelcore.py

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from typing import Union, Optional, Tuple
77
from urllib.parse import urlparse
88

9+
import isodate
910
from rdflib import Literal, BNode, URIRef
1011
from rdflib.namespace import is_ncname
1112
from rdflib.term import Identifier as rdflib_Identifier
@@ -230,13 +231,10 @@ def __new__(cls, value: Union[str, datetime.time, datetime.datetime, Literal]) -
230231
if not isinstance(value, datetime.time):
231232
value = datetime.time.fromisoformat(value)
232233
return datetime.time.fromisoformat(str(value)).isoformat()
233-
except TypeError as e:
234-
pass
235-
except ValueError as e:
236-
pass
237-
if not is_strict():
238-
return str(value)
239-
raise e
234+
except (TypeError, ValueError) as e:
235+
if is_strict():
236+
raise e
237+
return str(value)
240238

241239
@classmethod
242240
def is_valid(cls, value: Union[str, datetime.time, datetime.datetime, Literal]) -> bool:
@@ -260,15 +258,13 @@ def __new__(cls, value: Union[str, datetime.date, Literal]) -> str:
260258
value = value.value
261259
try:
262260
if not isinstance(value, datetime.date):
263-
value = datetime.date.fromisoformat(str(value))
261+
# value = datetime.date.fromisoformat(str(value))
262+
value = isodate.parse_date(value)
264263
return value.isoformat()
265-
except TypeError as e:
266-
pass
267-
except ValueError as e:
268-
pass
269-
if not is_strict():
270-
return str(value)
271-
raise e
264+
except (TypeError, ValueError) as e:
265+
if is_strict():
266+
raise e
267+
return str(value)
272268

273269
@classmethod
274270
def is_valid(cls, value: Union[str, datetime.date, Literal]) -> bool:
@@ -279,7 +275,8 @@ def is_valid(cls, value: Union[str, datetime.date, Literal]) -> bool:
279275
if not re.match(r'^\d{4}-\d{2}-\d{2}$', value):
280276
return False
281277
try:
282-
datetime.date.fromisoformat(str(value))
278+
# datetime.date.fromisoformat(str(value))
279+
value = isodate.parse_date(value)
283280
except ValueError:
284281
return False
285282
return True
@@ -294,15 +291,16 @@ def __new__(cls, value: Union[str, datetime.datetime, Literal]) -> str:
294291
value = value.value
295292
try:
296293
if not isinstance(value, datetime.datetime):
297-
value = datetime.datetime.fromisoformat(value) # Note that this handles non 'T' format as well
294+
# value = datetime.datetime.fromisoformat(value) # Note that this handles non 'T' format as well
295+
if "T" in str(value):
296+
value = isodate.parse_datetime(value)
297+
else:
298+
value = isodate.parse_datetime("T".join(value.strip().split(' ', 1)))
298299
return value.isoformat()
299-
except TypeError as e:
300-
pass
301-
except ValueError as e:
302-
pass
303-
if not is_strict():
304-
return str(value)
305-
raise e
300+
except (TypeError, ValueError) as e:
301+
if is_strict():
302+
raise e
303+
return str(value)
306304

307305
@classmethod
308306
def is_valid(cls, value: Union[str, datetime.datetime, Literal]) -> bool:
@@ -311,8 +309,14 @@ def is_valid(cls, value: Union[str, datetime.datetime, Literal]) -> bool:
311309
if isinstance(value, datetime.datetime):
312310
value = value.isoformat()
313311
try:
314-
datetime.datetime.fromisoformat(value)
315-
except ValueError:
312+
# datetime.datetime.fromisoformat(value)
313+
if "T" in str(value):
314+
isodate.parse_datetime(value)
315+
elif " " in value.strip():
316+
isodate.parse_datetime("T".join(value.strip().split(' ', 1)))
317+
else:
318+
datetime.datetime.fromisoformat(value)
319+
except (ValueError, TypeError):
316320
return False
317321
return True
318322

0 commit comments

Comments
 (0)