From 17725c027f6b9a46b316a95f5b76ba3a82e322dd Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Wed, 25 Sep 2024 20:02:40 -0700 Subject: [PATCH] chore: lint --- examples/quality_control.py | 81 +++++---------------------- src/aind_data_schema/core/metadata.py | 33 +++++------ tests/test_metadata.py | 24 +++++--- tests/test_quality_control.py | 51 ++++++----------- 4 files changed, 62 insertions(+), 127 deletions(-) diff --git a/examples/quality_control.py b/examples/quality_control.py index e63dea24f..4ba3b7546 100644 --- a/examples/quality_control.py +++ b/examples/quality_control.py @@ -13,93 +13,38 @@ evaluation_description="Qualitative check that drift map shows minimal movement", evaluation_modality=Modality.ECEPHYS, evaluation_stage=Stage.PROCESSING, - evaluation_status=[ - QCStatus( - evaluator="Fred Flintstone", - timestamp=t, - status=Status.FAIL - ) - ], + evaluation_status=[QCStatus(evaluator="Fred Flintstone", timestamp=t, status=Status.FAIL)], qc_metrics=[ - QCMetric( - name="Probe A drift", - value="High", - reference="ecephys-drift-map" - ), - QCMetric( - name="Probe B drift", - value="Low", - reference="ecephys-drift-map" - ), - QCMetric( - name="Probe C drift", - value="Low", - reference="ecephys-drift-map" - ) + QCMetric(name="Probe A drift", value="High", reference="ecephys-drift-map"), + QCMetric(name="Probe B drift", value="Low", reference="ecephys-drift-map"), + QCMetric(name="Probe C drift", value="Low", reference="ecephys-drift-map"), ], - notes="Manually annotated: failed due to high drift on probe A" + notes="Manually annotated: failed due to high drift on probe A", ) eval1 = QCEvaluation( evaluation_name="Video frame count check", evaluation_modality=Modality.BEHAVIOR_VIDEOS, evaluation_stage=Stage.RAW, - evaluation_status=[ - QCStatus( - evaluator="Fred Flintstone", - timestamp=t, - status=Status.FAIL - ) - ], - qc_metrics=[ - QCMetric( - name="video_1_num_frames", - value=662 - ), - QCMetric( - name="video_2_num_frames", - value=662 - ) - ], - notes="Pass when video_1_num_frames==video_2_num_frames" + evaluation_status=[QCStatus(evaluator="Fred Flintstone", timestamp=t, status=Status.FAIL)], + qc_metrics=[QCMetric(name="video_1_num_frames", value=662), QCMetric(name="video_2_num_frames", value=662)], + notes="Pass when video_1_num_frames==video_2_num_frames", ) eval2 = QCEvaluation( evaluation_name="Probes present", evaluation_modality=Modality.ECEPHYS, evaluation_stage=Stage.RAW, - evaluation_status=[ - QCStatus( - evaluator="Automated", - timestamp=t, - status=Status.PASS - ) - ], + evaluation_status=[QCStatus(evaluator="Automated", timestamp=t, status=Status.PASS)], qc_metrics=[ - QCMetric( - name="ProbeA_success", - value=True - ), - QCMetric( - name="ProbeB_success", - value=True - ), - QCMetric( - name="ProbeC_success", - value=True - ) + QCMetric(name="ProbeA_success", value=True), + QCMetric(name="ProbeB_success", value=True), + QCMetric(name="ProbeC_success", value=True), ], ) q = QualityControl( - overall_status=[ - QCStatus( - evaluator="Automated", - timestamp=t, - status=Status.PASS - ) - ], - evaluations=[eval0, eval1, eval2] + overall_status=[QCStatus(evaluator="Automated", timestamp=t, status=Status.PASS)], evaluations=[eval0, eval1, eval2] ) serialized = q.model_dump_json() diff --git a/src/aind_data_schema/core/metadata.py b/src/aind_data_schema/core/metadata.py index ad76bd732..2d8cd9869 100644 --- a/src/aind_data_schema/core/metadata.py +++ b/src/aind_data_schema/core/metadata.py @@ -24,16 +24,16 @@ CORE_FILES = [ - "subject", - "data_description", - "procedures", - "session", - "rig", - "processing", - "acquisition", - "instrument", - "quality_control" - ] + "subject", + "data_description", + "procedures", + "session", + "rig", + "processing", + "acquisition", + "instrument", + "quality_control", +] class MetadataStatus(str, Enum): @@ -125,7 +125,8 @@ class Metadata(AindCoreModel): default=None, title="Quality Control", description="Description of quality metrics for a data asset" ) - @field_validator(*CORE_FILES, + @field_validator( + *CORE_FILES, mode="before", ) def validate_core_fields(cls, value, info: ValidationInfo): @@ -204,18 +205,14 @@ def validate_expected_files_by_modality(self): for file in CORE_FILES: # For each field, check if this is a required/excluded file file_requirement = getattr(getattr(ExpectedFiles, str(modality.abbreviation).upper()), file) - + # Check required case if file_requirement == FileRequirement.REQUIRED and not getattr(self, file): - raise ValueError( - f"{modality.abbreviation} metadata missing required file: {file}" - ) + raise ValueError(f"{modality.abbreviation} metadata missing required file: {file}") # Check excluded case if file_requirement == FileRequirement.EXCLUDED and getattr(self, file): - raise ValueError( - f"{modality.abbreviation} metadata includes excluded file: {file}" - ) + raise ValueError(f"{modality.abbreviation} metadata includes excluded file: {file}") return self diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 07e998b61..2d3fea574 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -142,7 +142,7 @@ def test_validate_smartspim_metadata(self): location="bucket", data_description=DataDescription.model_construct( label="some label", - platform=Platform.SMARTSPIM, + platform=Platform.SMARTSPIM, creation_time=time(12, 12, 12), modality=[Modality.SPIM], ), @@ -161,14 +161,16 @@ def test_validate_smartspim_metadata(self): name="ecephys_655019_2023-04-03_18-17-09", location="bucket", data_description=DataDescription.model_construct( - label="some label", platform=Platform.SMARTSPIM, creation_time=time(12, 12, 12), - modality=[Modality.SPIM] + label="some label", + platform=Platform.SMARTSPIM, + creation_time=time(12, 12, 12), + modality=[Modality.SPIM], ), subject=Subject.model_construct(), procedures=Procedures.model_construct(subject_procedures=[surgery2]), acquisition=Acquisition.model_construct(), instrument=Instrument.model_construct(), - processing=Processing.model_construct() + processing=Processing.model_construct(), ) self.assertIn("Injection is missing injection_materials.", str(context.exception)) @@ -185,7 +187,9 @@ def test_validate_ecephys_metadata(self): name="ecephys_655019_2023-04-03_18-17-09", location="bucket", data_description=DataDescription.model_construct( - label="some label", platform=Platform.ECEPHYS, creation_time=time(12, 12, 12), + label="some label", + platform=Platform.ECEPHYS, + creation_time=time(12, 12, 12), modality=[Modality.ECEPHYS], ), procedures=Procedures.model_construct(subject_procedures=[surgery1]), @@ -203,7 +207,9 @@ def test_validate_ecephys_metadata(self): name="ecephys_655019_2023-04-03_18-17-09", location="bucket", data_description=DataDescription.model_construct( - label="some label", platform=Platform.ECEPHYS, creation_time=time(12, 12, 12), + label="some label", + platform=Platform.ECEPHYS, + creation_time=time(12, 12, 12), modality=[Modality.ECEPHYS], ), subject=Subject.model_construct(), @@ -224,8 +230,10 @@ def test_validate_rig_session_compatibility(self): name="ecephys_655019_2023-04-03_18-17-09", location="bucket", data_description=DataDescription.model_construct( - label="some label", platform=Platform.ECEPHYS, creation_time=time(12, 12, 12), - modality=[Modality.ECEPHYS] + label="some label", + platform=Platform.ECEPHYS, + creation_time=time(12, 12, 12), + modality=[Modality.ECEPHYS], ), subject=Subject.model_construct(), procedures=Procedures.model_construct(), diff --git a/tests/test_quality_control.py b/tests/test_quality_control.py index 508a5c4bd..acccab46d 100644 --- a/tests/test_quality_control.py +++ b/tests/test_quality_control.py @@ -19,43 +19,28 @@ def test_constructors(self): q = QualityControl() test_eval = QCEvaluation( - evaluation_name="Drift map", - evaluation_status=[ - QCStatus( - evaluator="Fred Flintstone", - timestamp=date.fromisoformat("2020-10-10"), - status=Status.PASS - ) - ], - evaluation_modality=Modality.ECEPHYS, - evaluation_stage=Stage.PROCESSING, - qc_metrics=[ - QCMetric( - name="Multiple values example", - value={"stuff": "in_a_dict"} - ), - QCMetric( - name="Drift map pass/fail", - value=False, - description="Manual evaluation of whether the drift map looks good", - references=["s3://some-data-somewhere"] - ) - ], - ) - - q = QualityControl( - overall_status=[ - QCStatus( - evaluator="Bob", - timestamp=date.fromisoformat("2020-10-10"), - status=Status.PASS - ) + evaluation_name="Drift map", + evaluation_status=[ + QCStatus(evaluator="Fred Flintstone", timestamp=date.fromisoformat("2020-10-10"), status=Status.PASS) ], - evaluations=[ - test_eval + evaluation_modality=Modality.ECEPHYS, + evaluation_stage=Stage.PROCESSING, + qc_metrics=[ + QCMetric(name="Multiple values example", value={"stuff": "in_a_dict"}), + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + references=["s3://some-data-somewhere"], + ), ], ) + q = QualityControl( + overall_status=[QCStatus(evaluator="Bob", timestamp=date.fromisoformat("2020-10-10"), status=Status.PASS)], + evaluations=[test_eval], + ) + assert q is not None