3
3
import re
4
4
from dataclasses import field
5
5
from decimal import Decimal
6
+ import sys
6
7
from typing import Union , Optional , Tuple
7
8
from urllib .parse import urlparse
8
9
10
+ import isodate
9
11
from rdflib import Literal , BNode , URIRef
10
12
from rdflib .namespace import is_ncname
11
13
from rdflib .term import Identifier as rdflib_Identifier
@@ -230,13 +232,10 @@ def __new__(cls, value: Union[str, datetime.time, datetime.datetime, Literal]) -
230
232
if not isinstance (value , datetime .time ):
231
233
value = datetime .time .fromisoformat (value )
232
234
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
235
+ except (TypeError , ValueError ) as e :
236
+ if is_strict ():
237
+ raise e
238
+ return str (value )
240
239
241
240
@classmethod
242
241
def is_valid (cls , value : Union [str , datetime .time , datetime .datetime , Literal ]) -> bool :
@@ -260,15 +259,15 @@ def __new__(cls, value: Union[str, datetime.date, Literal]) -> str:
260
259
value = value .value
261
260
try :
262
261
if not isinstance (value , datetime .date ):
263
- value = datetime .date .fromisoformat (str (value ))
262
+ if sys .version_info >= (3 , 11 ):
263
+ value = datetime .date .fromisoformat (str (value ))
264
+ else :
265
+ value = isodate .parse_date (value )
264
266
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
267
+ except (TypeError , ValueError ) as e :
268
+ if is_strict ():
269
+ raise e
270
+ return str (value )
272
271
273
272
@classmethod
274
273
def is_valid (cls , value : Union [str , datetime .date , Literal ]) -> bool :
@@ -279,7 +278,10 @@ def is_valid(cls, value: Union[str, datetime.date, Literal]) -> bool:
279
278
if not re .match (r'^\d{4}-\d{2}-\d{2}$' , value ):
280
279
return False
281
280
try :
282
- datetime .date .fromisoformat (str (value ))
281
+ if sys .version_info >= (3 , 11 ):
282
+ datetime .date .fromisoformat (str (value ))
283
+ else :
284
+ value = isodate .parse_date (value )
283
285
except ValueError :
284
286
return False
285
287
return True
@@ -294,15 +296,18 @@ def __new__(cls, value: Union[str, datetime.datetime, Literal]) -> str:
294
296
value = value .value
295
297
try :
296
298
if not isinstance (value , datetime .datetime ):
297
- value = datetime .datetime .fromisoformat (value ) # Note that this handles non 'T' format as well
299
+ if sys .version_info >= (3 , 11 ):
300
+ value = datetime .datetime .fromisoformat (value ) # Note that this handles non 'T' format as well
301
+ else :
302
+ if "T" in str (value ):
303
+ value = isodate .parse_datetime (value )
304
+ else :
305
+ value = isodate .parse_datetime ("T" .join (value .strip ().split (' ' , 1 )))
298
306
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
307
+ except (TypeError , ValueError ) as e :
308
+ if is_strict ():
309
+ raise e
310
+ return str (value )
306
311
307
312
@classmethod
308
313
def is_valid (cls , value : Union [str , datetime .datetime , Literal ]) -> bool :
@@ -311,8 +316,16 @@ def is_valid(cls, value: Union[str, datetime.datetime, Literal]) -> bool:
311
316
if isinstance (value , datetime .datetime ):
312
317
value = value .isoformat ()
313
318
try :
314
- datetime .datetime .fromisoformat (value )
315
- except ValueError :
319
+ if sys .version_info >= (3 , 11 ):
320
+ datetime .datetime .fromisoformat (value )
321
+ else :
322
+ if "T" in str (value ):
323
+ isodate .parse_datetime (value )
324
+ elif " " in value .strip ():
325
+ isodate .parse_datetime ("T" .join (value .strip ().split (' ' , 1 )))
326
+ else :
327
+ datetime .datetime .fromisoformat (value )
328
+ except (ValueError , TypeError ):
316
329
return False
317
330
return True
318
331
0 commit comments