66import logging
77from collections import Counter
88from collections .abc import Iterable , Sequence
9+ from datetime import date as date_cls
10+ from datetime import datetime as datetime_cls
911from typing import Any , NamedTuple
1012
1113import bioregistry
1416import pytz
1517from bioregistry import NormalizedNamableReference as Reference
1618from curies import ReferenceTuple
19+ from curies import vocabulary as v
1720from curies .preprocessing import BlocklistError
1821
1922from ..identifier_utils import (
@@ -304,9 +307,7 @@ def _parse_reference_or_uri_literal(
304307 return None
305308
306309
307- unspecified_matching = Reference (
308- prefix = "semapv" , identifier = "UnspecifiedMatching" , name = "unspecified matching process"
309- )
310+ unspecified_matching = Reference .from_reference (v .unspecified_matching_process )
310311
311312
312313class OBOLiteral (NamedTuple ):
@@ -319,44 +320,53 @@ class OBOLiteral(NamedTuple):
319320 @classmethod
320321 def string (cls , value : str , * , language : str | None = None ) -> OBOLiteral :
321322 """Get a string literal."""
322- return cls (value , curies . Reference ( prefix = "xsd" , identifier = "string" ) , language )
323+ return cls (value , v . xsd_string , language )
323324
324325 @classmethod
325326 def boolean (cls , value : bool ) -> OBOLiteral :
326327 """Get a boolean literal."""
327- return cls (str (value ).lower (), curies . Reference ( prefix = "xsd" , identifier = "boolean" ) , None )
328+ return cls (str (value ).lower (), v . xsd_boolean , None )
328329
329330 @classmethod
330331 def decimal (cls , value : float ) -> OBOLiteral :
331332 """Get a decimal literal."""
332- return cls (str (value ), curies . Reference ( prefix = "xsd" , identifier = "decimal" ) , None )
333+ return cls (str (value ), v . xsd_decimal , None )
333334
334335 @classmethod
335336 def float (cls , value : float ) -> OBOLiteral :
336337 """Get a float literal."""
337- return cls (str (value ), curies . Reference ( prefix = "xsd" , identifier = "float" ) , None )
338+ return cls (str (value ), v . xsd_float , None )
338339
339340 @classmethod
340341 def integer (cls , value : int | str ) -> OBOLiteral :
341342 """Get a integer literal."""
342- return cls (str (int (value )), curies . Reference ( prefix = "xsd" , identifier = "integer" ) , None )
343+ return cls (str (int (value )), v . xsd_integer , None )
343344
344345 @classmethod
345346 def year (cls , value : int | str ) -> OBOLiteral :
346347 """Get a year (gYear) literal."""
347- return cls (str (int (value )), curies . Reference ( prefix = "xsd" , identifier = "gYear" ) , None )
348+ return cls (str (int (value )), v . xsd_year , None )
348349
349350 @classmethod
350351 def uri (cls , uri : str ) -> OBOLiteral :
351352 """Get a string literal for a URI."""
352- return cls (uri , curies . Reference ( prefix = "xsd" , identifier = "anyURI" ) , None )
353+ return cls (uri , v . xsd_uri , None )
353354
354355 @classmethod
355- def datetime (cls , dt : datetime . datetime | str ) -> OBOLiteral :
356+ def datetime (cls , dt : datetime_cls | str ) -> OBOLiteral :
356357 """Get a datetime literal."""
357358 if isinstance (dt , str ):
358359 dt = _parse_datetime (dt )
359- return cls (dt .isoformat (), curies .Reference (prefix = "xsd" , identifier = "dateTime" ), None )
360+ return cls (dt .isoformat (), v .xsd_datetime , None )
361+
362+ @classmethod
363+ def date (cls , dt : datetime_cls | date_cls | str ) -> OBOLiteral :
364+ """Get a datetime literal."""
365+ if isinstance (dt , str ):
366+ dt = datetime .date .fromisoformat (dt )
367+ elif isinstance (dt , datetime .datetime ):
368+ dt = dt .date ()
369+ return cls (dt .isoformat (), v .xsd_date , None )
360370
361371
362372def _parse_datetime (dd : str ) -> datetime .datetime :
0 commit comments