66from typing import Union , Optional , Tuple
77from urllib .parse import urlparse
88
9+ import isodate
910from rdflib import Literal , BNode , URIRef
1011from rdflib .namespace import is_ncname
1112from 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