88from typing import Any , get_args , get_origin
99
1010from pydantic import BaseModel , ConfigDict , Field , model_validator
11+ from pydantic_core import PydanticUndefined
1112
1213logger = logging .getLogger (__name__ )
1314
@@ -16,7 +17,7 @@ def spec_field(
1617 * ,
1718 required : bool | None = None ,
1819 allow_spec_override : bool = False ,
19- default : Any = None ,
20+ default : Any = PydanticUndefined ,
2021 ** kwargs : Any ,
2122) -> Any :
2223 """Define database-mapped fields with ARC spec metadata."""
@@ -66,7 +67,8 @@ def _field_metadata(field_info: Any) -> dict[str, Any]:
6667 @staticmethod
6768 def _field_default (field_info : Any ) -> Any :
6869 """Return default value for a field, including default_factory values."""
69- return field_info .get_default (call_default_factory = True )
70+ val = field_info .get_default (call_default_factory = True )
71+ return None if val is PydanticUndefined else val
7072
7173 @staticmethod
7274 def _field_accepts_string (annotation : Any ) -> bool :
@@ -252,8 +254,8 @@ class InvestigationRow(BaseRow):
252254 identifier : str = spec_field ()
253255 title : str = spec_field ()
254256 description_text : str = spec_field (default = "" , allow_spec_override = True )
255- submission_date : datetime | None = spec_field ()
256- public_release_date : datetime | None = spec_field ()
257+ submission_date : datetime | None = spec_field (default = None )
258+ public_release_date : datetime | None = spec_field (default = None )
257259
258260
259261class StudyRow (BaseRow ):
@@ -262,55 +264,55 @@ class StudyRow(BaseRow):
262264 identifier : str = spec_field ()
263265 investigation_ref : str = spec_field ()
264266 title : str = spec_field ()
265- description_text : str | None = spec_field ()
266- submission_date : datetime | None = spec_field ()
267- public_release_date : datetime | None = spec_field ()
267+ description_text : str | None = spec_field (default = None )
268+ submission_date : datetime | None = spec_field (default = None )
269+ public_release_date : datetime | None = spec_field (default = None )
268270
269271
270272class AssayRow (BaseRow ):
271273 """Pydantic model for assay database rows."""
272274
273275 identifier : str = spec_field ()
274276 investigation_ref : str = spec_field ()
275- study_ref : str | None = spec_field ()
276- title : str | None = spec_field ()
277- description_text : str | None = spec_field ()
278- measurement_type_term : str | None = spec_field ()
279- measurement_type_uri : str | None = spec_field ()
280- measurement_type_version : str | None = spec_field ()
281- technology_type_term : str | None = spec_field ()
282- technology_type_uri : str | None = spec_field ()
283- technology_type_version : str | None = spec_field ()
284- technology_platform : str | None = spec_field ()
277+ study_ref : str | None = spec_field (default = None )
278+ title : str | None = spec_field (default = None )
279+ description_text : str | None = spec_field (default = None )
280+ measurement_type_term : str | None = spec_field (default = None )
281+ measurement_type_uri : str | None = spec_field (default = None )
282+ measurement_type_version : str | None = spec_field (default = None )
283+ technology_type_term : str | None = spec_field (default = None )
284+ technology_type_uri : str | None = spec_field (default = None )
285+ technology_type_version : str | None = spec_field (default = None )
286+ technology_platform : str | None = spec_field (default = None )
285287
286288
287289class PublicationRow (BaseRow ):
288290 """Pydantic model for publication database rows."""
289291
290292 investigation_ref : str = spec_field ()
291293 target_type : str = spec_field ()
292- pubmed_id : str | None = spec_field ()
293- doi : str | None = spec_field ()
294- authors : str | None = spec_field ()
295- title : str | None = spec_field ()
296- status_term : str | None = spec_field ()
297- status_uri : str | None = spec_field ()
298- status_version : str | None = spec_field ()
299- target_ref : str | None = spec_field ()
294+ pubmed_id : str | None = spec_field (default = None )
295+ doi : str | None = spec_field (default = None )
296+ authors : str | None = spec_field (default = None )
297+ title : str | None = spec_field (default = None )
298+ status_term : str | None = spec_field (default = None )
299+ status_uri : str | None = spec_field (default = None )
300+ status_version : str | None = spec_field (default = None )
301+ target_ref : str | None = spec_field (default = None )
300302
301303
302304class ContactRow (BaseRow ):
303305 """Pydantic model for contact database rows."""
304306
305307 investigation_ref : str = spec_field ()
306308 target_type : str = spec_field ()
307- last_name : str | None = spec_field ()
308- first_name : str | None = spec_field ()
309- mid_initials : str | None = spec_field ()
310- email : str | None = spec_field ()
311- phone : str | None = spec_field ()
312- fax : str | None = spec_field ()
313- postal_address : str | None = spec_field ()
314- affiliation : str | None = spec_field ()
315- roles : str | None = spec_field () # JSON string
316- target_ref : str | None = spec_field ()
309+ last_name : str | None = spec_field (default = None )
310+ first_name : str | None = spec_field (default = None )
311+ mid_initials : str | None = spec_field (default = None )
312+ email : str | None = spec_field (default = None )
313+ phone : str | None = spec_field (default = None )
314+ fax : str | None = spec_field (default = None )
315+ postal_address : str | None = spec_field (default = None )
316+ affiliation : str | None = spec_field (default = None )
317+ roles : str | None = spec_field (default = None ) # JSON string
318+ target_ref : str | None = spec_field (default = None )
0 commit comments