diff --git a/docs/tutorial.md b/docs/tutorial.md index f080b752d..236d5516c 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -166,7 +166,7 @@ and *must* define set `DISPLAY_NAME`, `RELEASE_STATE`, and `SCHEMA_MAPPER` and i `create_data` that takes a `NamedFileContents` objects as input and produces an instance of (something derived from) `Data` as a result: ```python -class ExampleWeylandYutaniParser(MapperVendorParser[Data, Model]): +class ExampleWeylandYutaniParser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.WORKING_DRAFT SCHEMA_MAPPER = Mapper diff --git a/scripts/templates/parser_template b/scripts/templates/parser_template index e6eb8c5c6..a5499007b 100644 --- a/scripts/templates/parser_template +++ b/scripts/templates/parser_template @@ -16,10 +16,10 @@ from allotropy.parsers.$PARSER_NAME$.$PARSER_NAME$_structure import ( create_metadata, ) from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class $CLASS_NAME_PREFIX$Parser(MapperVendorParser[Data, Model]): +class $CLASS_NAME_PREFIX$Parser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.WORKING_DRAFT SUPPORTED_EXTENSIONS = $CLASS_NAME_PREFIX$Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parser_factory.py b/src/allotropy/parser_factory.py index cccdf260c..87bd49f4f 100644 --- a/src/allotropy/parser_factory.py +++ b/src/allotropy/parser_factory.py @@ -2,6 +2,7 @@ from datetime import tzinfo from enum import Enum from pathlib import Path +from typing import Any from allotropy.allotrope.schema_parser.path_util import ROOT_DIR from allotropy.parsers.agilent_gen5.agilent_gen5_parser import AgilentGen5Parser @@ -137,12 +138,14 @@ def supported_extensions(self) -> list[str]: ext.strip() for ext in self.get_parser().SUPPORTED_EXTENSIONS.split(",") ] - def get_parser(self, default_timezone: tzinfo | None = None) -> VendorParser: + def get_parser( + self, default_timezone: tzinfo | None = None + ) -> VendorParser[Any, Any]: timestamp_parser = TimestampParser(default_timezone) return _VENDOR_TO_PARSER[self](timestamp_parser) -_VENDOR_TO_PARSER: dict[Vendor, type[VendorParser]] = { +_VENDOR_TO_PARSER: dict[Vendor, type[VendorParser[Any, Any]]] = { Vendor.AGILENT_GEN5: AgilentGen5Parser, Vendor.AGILENT_GEN5_IMAGE: AgilentGen5ImageParser, Vendor.AGILENT_TAPESTATION_ANALYSIS: AgilentTapestationAnalysisParser, diff --git a/src/allotropy/parsers/agilent_gen5/agilent_gen5_parser.py b/src/allotropy/parsers/agilent_gen5/agilent_gen5_parser.py index 249616093..3278e1b33 100644 --- a/src/allotropy/parsers/agilent_gen5/agilent_gen5_parser.py +++ b/src/allotropy/parsers/agilent_gen5/agilent_gen5_parser.py @@ -24,10 +24,10 @@ NO_MEASUREMENTS_ERROR, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class AgilentGen5Parser(MapperVendorParser[Data, Model]): +class AgilentGen5Parser(VendorParser[Data, Model]): DISPLAY_NAME = "Agilent Gen5" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = AgilentGen5Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/agilent_gen5_image/agilent_gen5_image_parser.py b/src/allotropy/parsers/agilent_gen5_image/agilent_gen5_image_parser.py index b509b5feb..86f9c2e53 100644 --- a/src/allotropy/parsers/agilent_gen5_image/agilent_gen5_image_parser.py +++ b/src/allotropy/parsers/agilent_gen5_image/agilent_gen5_image_parser.py @@ -17,10 +17,10 @@ ReadData, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class AgilentGen5ImageParser(MapperVendorParser[Data, Model]): +class AgilentGen5ImageParser(VendorParser[Data, Model]): DISPLAY_NAME = "Agilent Gen5 Image" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = AgilentGen5Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/agilent_tapestation_analysis/agilent_tapestation_analysis_parser.py b/src/allotropy/parsers/agilent_tapestation_analysis/agilent_tapestation_analysis_parser.py index 64174ddb8..23c3420e0 100644 --- a/src/allotropy/parsers/agilent_tapestation_analysis/agilent_tapestation_analysis_parser.py +++ b/src/allotropy/parsers/agilent_tapestation_analysis/agilent_tapestation_analysis_parser.py @@ -14,10 +14,10 @@ create_metadata, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class AgilentTapestationAnalysisParser(MapperVendorParser[Data, Model]): +class AgilentTapestationAnalysisParser(VendorParser[Data, Model]): DISPLAY_NAME = "Agilent TapeStation Analysis" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "xml" diff --git a/src/allotropy/parsers/appbio_absolute_q/appbio_absolute_q_parser.py b/src/allotropy/parsers/appbio_absolute_q/appbio_absolute_q_parser.py index 0a0808f63..26ed439e2 100644 --- a/src/allotropy/parsers/appbio_absolute_q/appbio_absolute_q_parser.py +++ b/src/allotropy/parsers/appbio_absolute_q/appbio_absolute_q_parser.py @@ -15,10 +15,10 @@ ) from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.utils.pandas import read_csv -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class AppbioAbsoluteQParser(MapperVendorParser[Data, Model]): +class AppbioAbsoluteQParser(VendorParser[Data, Model]): DISPLAY_NAME = "AppBio AbsoluteQ" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "csv" diff --git a/src/allotropy/parsers/appbio_quantstudio/appbio_quantstudio_parser.py b/src/allotropy/parsers/appbio_quantstudio/appbio_quantstudio_parser.py index 2b3bd8fdb..706c074dd 100644 --- a/src/allotropy/parsers/appbio_quantstudio/appbio_quantstudio_parser.py +++ b/src/allotropy/parsers/appbio_quantstudio/appbio_quantstudio_parser.py @@ -23,10 +23,10 @@ ) from allotropy.parsers.lines_reader import LinesReader from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class AppBioQuantStudioParser(MapperVendorParser[Data, Model]): +class AppBioQuantStudioParser(VendorParser[Data, Model]): DISPLAY_NAME = "AppBio QuantStudio RT-PCR" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "txt" diff --git a/src/allotropy/parsers/appbio_quantstudio_designandanalysis/appbio_quantstudio_designandanalysis_parser.py b/src/allotropy/parsers/appbio_quantstudio_designandanalysis/appbio_quantstudio_designandanalysis_parser.py index e94fc0d7d..ad655b1f0 100644 --- a/src/allotropy/parsers/appbio_quantstudio_designandanalysis/appbio_quantstudio_designandanalysis_parser.py +++ b/src/allotropy/parsers/appbio_quantstudio_designandanalysis/appbio_quantstudio_designandanalysis_parser.py @@ -14,10 +14,10 @@ DesignQuantstudioReader, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class AppBioQuantStudioDesignandanalysisParser(MapperVendorParser[Data, Model]): +class AppBioQuantStudioDesignandanalysisParser(VendorParser[Data, Model]): DISPLAY_NAME = "AppBio QuantStudio Design & Analysis" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = DesignQuantstudioReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_parser.py b/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_parser.py index fc2246ac0..02ed435a2 100644 --- a/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_parser.py +++ b/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_parser.py @@ -17,10 +17,10 @@ Header, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class PharmSpecParser(MapperVendorParser[Data, Model]): +class PharmSpecParser(VendorParser[Data, Model]): DISPLAY_NAME = "Beckman PharmSpec" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = BeckmanPharmspecReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/beckman_vi_cell_blu/vi_cell_blu_parser.py b/src/allotropy/parsers/beckman_vi_cell_blu/vi_cell_blu_parser.py index ee46355a4..1af7d9c45 100644 --- a/src/allotropy/parsers/beckman_vi_cell_blu/vi_cell_blu_parser.py +++ b/src/allotropy/parsers/beckman_vi_cell_blu/vi_cell_blu_parser.py @@ -15,10 +15,10 @@ ) from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ViCellBluParser(MapperVendorParser[Data, Model]): +class ViCellBluParser(VendorParser[Data, Model]): DISPLAY_NAME = "Beckman Vi-Cell BLU" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = ViCellBluReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/beckman_vi_cell_xr/vi_cell_xr_parser.py b/src/allotropy/parsers/beckman_vi_cell_xr/vi_cell_xr_parser.py index 968669327..55e7668b9 100644 --- a/src/allotropy/parsers/beckman_vi_cell_xr/vi_cell_xr_parser.py +++ b/src/allotropy/parsers/beckman_vi_cell_xr/vi_cell_xr_parser.py @@ -15,10 +15,10 @@ create_metadata, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ViCellXRParser(MapperVendorParser[Data, Model]): +class ViCellXRParser(VendorParser[Data, Model]): DISPLAY_NAME = "Beckman Vi-Cell XR" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "txt,xls,xlsx" diff --git a/src/allotropy/parsers/biorad_bioplex_manager/biorad_bioplex_manager_parser.py b/src/allotropy/parsers/biorad_bioplex_manager/biorad_bioplex_manager_parser.py index ce7458931..8caf47aab 100644 --- a/src/allotropy/parsers/biorad_bioplex_manager/biorad_bioplex_manager_parser.py +++ b/src/allotropy/parsers/biorad_bioplex_manager/biorad_bioplex_manager_parser.py @@ -19,10 +19,10 @@ Well, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class BioradBioplexParser(MapperVendorParser[Data, Model]): +class BioradBioplexParser(VendorParser[Data, Model]): DISPLAY_NAME = "Bio-Rad Bio-Plex Manager" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "xml" diff --git a/src/allotropy/parsers/bmg_mars/bmg_mars_parser.py b/src/allotropy/parsers/bmg_mars/bmg_mars_parser.py index 12426d6af..c59668b80 100644 --- a/src/allotropy/parsers/bmg_mars/bmg_mars_parser.py +++ b/src/allotropy/parsers/bmg_mars/bmg_mars_parser.py @@ -15,10 +15,10 @@ Header, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class BmgMarsParser(MapperVendorParser[Data, Model]): +class BmgMarsParser(VendorParser[Data, Model]): DISPLAY_NAME = "BMG MARS" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "csv" diff --git a/src/allotropy/parsers/chemometec_nc_view/chemometec_nc_view_parser.py b/src/allotropy/parsers/chemometec_nc_view/chemometec_nc_view_parser.py index aedabc172..554e8dd6d 100644 --- a/src/allotropy/parsers/chemometec_nc_view/chemometec_nc_view_parser.py +++ b/src/allotropy/parsers/chemometec_nc_view/chemometec_nc_view_parser.py @@ -16,10 +16,10 @@ from allotropy.parsers.chemometec_nc_view.constants import DISPLAY_NAME from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ChemometecNcViewParser(MapperVendorParser[Data, Model]): +class ChemometecNcViewParser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = ChemometecNcViewReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/chemometec_nucleoview/nucleoview_parser.py b/src/allotropy/parsers/chemometec_nucleoview/nucleoview_parser.py index 12808b886..a27bb0646 100644 --- a/src/allotropy/parsers/chemometec_nucleoview/nucleoview_parser.py +++ b/src/allotropy/parsers/chemometec_nucleoview/nucleoview_parser.py @@ -13,10 +13,10 @@ ) from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.utils.pandas import df_to_series_data, map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ChemometecNucleoviewParser(MapperVendorParser[Data, Model]): +class ChemometecNucleoviewParser(VendorParser[Data, Model]): DISPLAY_NAME = "ChemoMetec Nucleoview" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = NucleoviewReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/ctl_immunospot/ctl_immunospot_parser.py b/src/allotropy/parsers/ctl_immunospot/ctl_immunospot_parser.py index 92e272caf..cf20297a8 100644 --- a/src/allotropy/parsers/ctl_immunospot/ctl_immunospot_parser.py +++ b/src/allotropy/parsers/ctl_immunospot/ctl_immunospot_parser.py @@ -14,10 +14,10 @@ ) from allotropy.parsers.lines_reader import LinesReader from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class CtlImmunospotParser(MapperVendorParser[Data, Model]): +class CtlImmunospotParser(VendorParser[Data, Model]): DISPLAY_NAME = "CTL ImmunoSpot" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "txt" diff --git a/src/allotropy/parsers/example_weyland_yutani/example_weyland_yutani_parser.py b/src/allotropy/parsers/example_weyland_yutani/example_weyland_yutani_parser.py index f62e1a5dd..4de8bd963 100644 --- a/src/allotropy/parsers/example_weyland_yutani/example_weyland_yutani_parser.py +++ b/src/allotropy/parsers/example_weyland_yutani/example_weyland_yutani_parser.py @@ -18,10 +18,10 @@ Plate, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ExampleWeylandYutaniParser(MapperVendorParser[Data, Model]): +class ExampleWeylandYutaniParser(VendorParser[Data, Model]): DISPLAY_NAME = "Example Weyland Yutani" RELEASE_STATE = ReleaseState.WORKING_DRAFT SUPPORTED_EXTENSIONS = ExampleWeylandYutaniReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/luminex_xponent/luminex_xponent_parser.py b/src/allotropy/parsers/luminex_xponent/luminex_xponent_parser.py index 9e1265e34..91f34543c 100644 --- a/src/allotropy/parsers/luminex_xponent/luminex_xponent_parser.py +++ b/src/allotropy/parsers/luminex_xponent/luminex_xponent_parser.py @@ -15,10 +15,10 @@ Data, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class LuminexXponentParser(MapperVendorParser[MapperData, Model]): +class LuminexXponentParser(VendorParser[MapperData, Model]): DISPLAY_NAME = "Luminex xPONENT" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = LuminexXponentReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/mabtech_apex/mabtech_apex_parser.py b/src/allotropy/parsers/mabtech_apex/mabtech_apex_parser.py index 7b1ace953..152667698 100644 --- a/src/allotropy/parsers/mabtech_apex/mabtech_apex_parser.py +++ b/src/allotropy/parsers/mabtech_apex/mabtech_apex_parser.py @@ -17,10 +17,10 @@ from allotropy.parsers.utils.pandas import ( SeriesData, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class MabtechApexParser(MapperVendorParser[Data, Model]): +class MabtechApexParser(VendorParser[Data, Model]): DISPLAY_NAME = "Mabtech Apex" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = MabtechApexReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/methodical_mind/methodical_mind_parser.py b/src/allotropy/parsers/methodical_mind/methodical_mind_parser.py index 556fb664d..736654499 100644 --- a/src/allotropy/parsers/methodical_mind/methodical_mind_parser.py +++ b/src/allotropy/parsers/methodical_mind/methodical_mind_parser.py @@ -18,10 +18,10 @@ PlateData, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class MethodicalMindParser(MapperVendorParser[Data, Model]): +class MethodicalMindParser(VendorParser[Data, Model]): DISPLAY_NAME = "Methodical Mind" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "txt" diff --git a/src/allotropy/parsers/moldev_softmax_pro/softmax_pro_parser.py b/src/allotropy/parsers/moldev_softmax_pro/softmax_pro_parser.py index 078285b76..fe4783859 100644 --- a/src/allotropy/parsers/moldev_softmax_pro/softmax_pro_parser.py +++ b/src/allotropy/parsers/moldev_softmax_pro/softmax_pro_parser.py @@ -14,10 +14,10 @@ StructureData, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class SoftmaxproParser(MapperVendorParser[Data, Model]): +class SoftmaxproParser(VendorParser[Data, Model]): DISPLAY_NAME = "Molecular Devices SoftMax Pro" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "txt" diff --git a/src/allotropy/parsers/novabio_flex2/novabio_flex2_parser.py b/src/allotropy/parsers/novabio_flex2/novabio_flex2_parser.py index c8b0f5ea4..c81f2f027 100644 --- a/src/allotropy/parsers/novabio_flex2/novabio_flex2_parser.py +++ b/src/allotropy/parsers/novabio_flex2/novabio_flex2_parser.py @@ -16,10 +16,10 @@ ) from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.utils.pandas import read_csv -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class NovaBioFlexParser(MapperVendorParser[Data, Model]): +class NovaBioFlexParser(VendorParser[Data, Model]): DISPLAY_NAME = "NovaBio Flex2" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "csv" diff --git a/src/allotropy/parsers/perkin_elmer_envision/perkin_elmer_envision_parser.py b/src/allotropy/parsers/perkin_elmer_envision/perkin_elmer_envision_parser.py index ed8f53d8b..3862a9b36 100644 --- a/src/allotropy/parsers/perkin_elmer_envision/perkin_elmer_envision_parser.py +++ b/src/allotropy/parsers/perkin_elmer_envision/perkin_elmer_envision_parser.py @@ -14,10 +14,10 @@ Data as StructureData, ) from allotropy.parsers.release_state import ReleaseState -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class PerkinElmerEnvisionParser(MapperVendorParser[Data, Model]): +class PerkinElmerEnvisionParser(VendorParser[Data, Model]): DISPLAY_NAME = "PerkinElmer Envision" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "csv" diff --git a/src/allotropy/parsers/qiacuity_dpcr/qiacuity_dpcr_parser.py b/src/allotropy/parsers/qiacuity_dpcr/qiacuity_dpcr_parser.py index b4b4c2045..85b2fea8f 100644 --- a/src/allotropy/parsers/qiacuity_dpcr/qiacuity_dpcr_parser.py +++ b/src/allotropy/parsers/qiacuity_dpcr/qiacuity_dpcr_parser.py @@ -14,10 +14,10 @@ ) from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class QiacuitydPCRParser(MapperVendorParser[Data, Model]): +class QiacuitydPCRParser(VendorParser[Data, Model]): DISPLAY_NAME = "Qiacuity dPCR" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = QiacuitydPCRReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/revvity_kaleido/kaleido_parser.py b/src/allotropy/parsers/revvity_kaleido/kaleido_parser.py index 867a82795..d737e49ca 100644 --- a/src/allotropy/parsers/revvity_kaleido/kaleido_parser.py +++ b/src/allotropy/parsers/revvity_kaleido/kaleido_parser.py @@ -13,10 +13,10 @@ create_measurement_groups, create_metadata, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class KaleidoParser(MapperVendorParser[Data, Model]): +class KaleidoParser(VendorParser[Data, Model]): DISPLAY_NAME = "Revvity Kaleido" RELEASE_STATE = ReleaseState.RECOMMENDED SCHEMA_MAPPER = Mapper diff --git a/src/allotropy/parsers/revvity_matrix/revvity_matrix_parser.py b/src/allotropy/parsers/revvity_matrix/revvity_matrix_parser.py index 295ee95c9..91e180b85 100644 --- a/src/allotropy/parsers/revvity_matrix/revvity_matrix_parser.py +++ b/src/allotropy/parsers/revvity_matrix/revvity_matrix_parser.py @@ -16,10 +16,10 @@ create_metadata, ) from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class RevvityMatrixParser(MapperVendorParser[Data, Model]): +class RevvityMatrixParser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.WORKING_DRAFT SUPPORTED_EXTENSIONS = RevvityMatrixReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/roche_cedex_bioht/roche_cedex_bioht_parser.py b/src/allotropy/parsers/roche_cedex_bioht/roche_cedex_bioht_parser.py index f2d6a2c65..9fa882807 100644 --- a/src/allotropy/parsers/roche_cedex_bioht/roche_cedex_bioht_parser.py +++ b/src/allotropy/parsers/roche_cedex_bioht/roche_cedex_bioht_parser.py @@ -16,10 +16,10 @@ Sample, Title, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class RocheCedexBiohtParser(MapperVendorParser[Data, Model]): +class RocheCedexBiohtParser(VendorParser[Data, Model]): DISPLAY_NAME = "Roche Cedex BioHT" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = RocheCedexBiohtReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/roche_cedex_hires/roche_cedex_hires_parser.py b/src/allotropy/parsers/roche_cedex_hires/roche_cedex_hires_parser.py index cde7b3045..d3369d208 100644 --- a/src/allotropy/parsers/roche_cedex_hires/roche_cedex_hires_parser.py +++ b/src/allotropy/parsers/roche_cedex_hires/roche_cedex_hires_parser.py @@ -16,10 +16,10 @@ create_metadata, ) from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class RocheCedexHiResParser(MapperVendorParser[Data, Model]): +class RocheCedexHiResParser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = RocheCedexHiResReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/thermo_fisher_genesys30/thermo_fisher_genesys30_parser.py b/src/allotropy/parsers/thermo_fisher_genesys30/thermo_fisher_genesys30_parser.py index fd6e9a300..e7eb54e8d 100644 --- a/src/allotropy/parsers/thermo_fisher_genesys30/thermo_fisher_genesys30_parser.py +++ b/src/allotropy/parsers/thermo_fisher_genesys30/thermo_fisher_genesys30_parser.py @@ -15,10 +15,10 @@ create_measurement_groups, create_metadata, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ThermoFisherGenesys30Parser(MapperVendorParser[Data, Model]): +class ThermoFisherGenesys30Parser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = ThermoFisherGenesys30Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/thermo_fisher_nanodrop_8000/nanodrop_8000_parser.py b/src/allotropy/parsers/thermo_fisher_nanodrop_8000/nanodrop_8000_parser.py index 37a8c3186..7c9d43855 100644 --- a/src/allotropy/parsers/thermo_fisher_nanodrop_8000/nanodrop_8000_parser.py +++ b/src/allotropy/parsers/thermo_fisher_nanodrop_8000/nanodrop_8000_parser.py @@ -15,10 +15,10 @@ create_metadata, SpectroscopyRow, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class Nanodrop8000Parser(MapperVendorParser[Data, Model]): +class Nanodrop8000Parser(VendorParser[Data, Model]): DISPLAY_NAME = "Thermo Fisher NanoDrop 8000" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = Nanodrop8000Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/thermo_fisher_nanodrop_eight/nanodrop_eight_parser.py b/src/allotropy/parsers/thermo_fisher_nanodrop_eight/nanodrop_eight_parser.py index 4682d73c6..9d3f974a5 100644 --- a/src/allotropy/parsers/thermo_fisher_nanodrop_eight/nanodrop_eight_parser.py +++ b/src/allotropy/parsers/thermo_fisher_nanodrop_eight/nanodrop_eight_parser.py @@ -15,10 +15,10 @@ create_metadata, SpectroscopyRow, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class NanodropEightParser(MapperVendorParser[Data, Model]): +class NanodropEightParser(VendorParser[Data, Model]): DISPLAY_NAME = "Thermo Fisher NanoDrop Eight" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = NanodropEightReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/thermo_fisher_nanodrop_one/thermo_fisher_nanodrop_one_parser.py b/src/allotropy/parsers/thermo_fisher_nanodrop_one/thermo_fisher_nanodrop_one_parser.py index dd3a2f3cf..94bcc7c01 100644 --- a/src/allotropy/parsers/thermo_fisher_nanodrop_one/thermo_fisher_nanodrop_one_parser.py +++ b/src/allotropy/parsers/thermo_fisher_nanodrop_one/thermo_fisher_nanodrop_one_parser.py @@ -15,10 +15,10 @@ DataNanodrop, ) from allotropy.parsers.utils.pandas import read_csv, read_multisheet_excel -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ThermoFisherNanodropOneParser(MapperVendorParser[Data, Model]): +class ThermoFisherNanodropOneParser(VendorParser[Data, Model]): DISPLAY_NAME = DISPLAY_NAME RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = "csv,xlsx" diff --git a/src/allotropy/parsers/thermo_fisher_qubit4/thermo_fisher_qubit4_parser.py b/src/allotropy/parsers/thermo_fisher_qubit4/thermo_fisher_qubit4_parser.py index 529a82c40..4cd89f6c0 100644 --- a/src/allotropy/parsers/thermo_fisher_qubit4/thermo_fisher_qubit4_parser.py +++ b/src/allotropy/parsers/thermo_fisher_qubit4/thermo_fisher_qubit4_parser.py @@ -15,10 +15,10 @@ create_metadata, ) from allotropy.parsers.utils.pandas import map_rows -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ThermoFisherQubit4Parser(MapperVendorParser[Data, Model]): +class ThermoFisherQubit4Parser(VendorParser[Data, Model]): DISPLAY_NAME = "Thermo Fisher Qubit 4" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = ThermoFisherQubit4Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/thermo_fisher_qubit_flex/thermo_fisher_qubit_flex_parser.py b/src/allotropy/parsers/thermo_fisher_qubit_flex/thermo_fisher_qubit_flex_parser.py index e2577cd75..ed397537b 100644 --- a/src/allotropy/parsers/thermo_fisher_qubit_flex/thermo_fisher_qubit_flex_parser.py +++ b/src/allotropy/parsers/thermo_fisher_qubit_flex/thermo_fisher_qubit_flex_parser.py @@ -17,10 +17,10 @@ from allotropy.parsers.thermo_fisher_qubit_flex.thermo_fisher_qubit_flex_structure import ( create_data, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ThermoFisherQubitFlexParser(MapperVendorParser[Data, Model]): +class ThermoFisherQubitFlexParser(VendorParser[Data, Model]): DISPLAY_NAME = constants.DISPLAY_NAME RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = ThermoFisherQubit4Reader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/thermo_skanit/thermo_skanit_parser.py b/src/allotropy/parsers/thermo_skanit/thermo_skanit_parser.py index 3f51bed4c..3133be51e 100644 --- a/src/allotropy/parsers/thermo_skanit/thermo_skanit_parser.py +++ b/src/allotropy/parsers/thermo_skanit/thermo_skanit_parser.py @@ -9,10 +9,10 @@ from allotropy.parsers.release_state import ReleaseState from allotropy.parsers.thermo_skanit.thermo_skanit_structure import DataThermoSkanIt from allotropy.parsers.utils.pandas import read_multisheet_excel -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class ThermoSkanItParser(MapperVendorParser[Data, Model]): +class ThermoSkanItParser(VendorParser[Data, Model]): DISPLAY_NAME = "Thermo SkanIt" RELEASE_STATE = ReleaseState.WORKING_DRAFT SUPPORTED_EXTENSIONS = "xlsx" diff --git a/src/allotropy/parsers/unchained_labs_lunatic/unchained_labs_lunatic_parser.py b/src/allotropy/parsers/unchained_labs_lunatic/unchained_labs_lunatic_parser.py index 8ad4bdc02..91b6299b3 100644 --- a/src/allotropy/parsers/unchained_labs_lunatic/unchained_labs_lunatic_parser.py +++ b/src/allotropy/parsers/unchained_labs_lunatic/unchained_labs_lunatic_parser.py @@ -16,10 +16,10 @@ create_measurement_groups, create_metadata, ) -from allotropy.parsers.vendor_parser import MapperVendorParser +from allotropy.parsers.vendor_parser import VendorParser -class UnchainedLabsLunaticParser(MapperVendorParser[Data, Model]): +class UnchainedLabsLunaticParser(VendorParser[Data, Model]): DISPLAY_NAME = "Unchained Labs Lunatic" RELEASE_STATE = ReleaseState.RECOMMENDED SUPPORTED_EXTENSIONS = UnchainedLabsLunaticReader.SUPPORTED_EXTENSIONS diff --git a/src/allotropy/parsers/vendor_parser.py b/src/allotropy/parsers/vendor_parser.py index 55cad9b66..f6a2e9346 100644 --- a/src/allotropy/parsers/vendor_parser.py +++ b/src/allotropy/parsers/vendor_parser.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from collections.abc import Callable -from typing import Any, Generic, TypeVar +from typing import Generic, TypeVar from allotropy.allotrope.models.shared.definitions.definitions import TDateTimeValue from allotropy.allotrope.schema_mappers.schema_mapper import SchemaMapper @@ -14,7 +14,7 @@ Mapper = TypeVar("Mapper") -class VendorParser(ABC): +class VendorParser(ABC, Generic[Data, Model]): """Base class for all vendor parsers.""" # The display name of the parser. Displayed in the README. @@ -23,27 +23,14 @@ class VendorParser(ABC): RELEASE_STATE: ReleaseState # Comma separated list of file extensions that this parser supports. SUPPORTED_EXTENSIONS: str + # The schema mapper to use for mapping to ASM + SCHEMA_MAPPER: Callable[..., SchemaMapper[Data, Model]] timestamp_parser: TimestampParser def __init__(self, timestamp_parser: TimestampParser | None = None): self.timestamp_parser = timestamp_parser or TimestampParser() - @abstractmethod - def to_allotrope(self, named_file_contents: NamedFileContents) -> Any: - raise NotImplementedError - - @property - def asm_converter_name(self) -> str: - return f'{ASM_CONVERTER_NAME}_{self.DISPLAY_NAME.replace(" ", "_").replace("-", "_")}'.lower() - - def _get_date_time(self, time: str) -> TDateTimeValue: - return self.timestamp_parser.parse(time) - - -class MapperVendorParser(VendorParser, Generic[Data, Model]): - SCHEMA_MAPPER: Callable[..., SchemaMapper[Data, Model]] - def _get_mapper(self) -> SchemaMapper[Data, Model]: return self.SCHEMA_MAPPER(self.asm_converter_name, self._get_date_time) @@ -53,3 +40,10 @@ def create_data(self, named_file_contents: NamedFileContents) -> Data: def to_allotrope(self, named_file_contents: NamedFileContents) -> Model: return self._get_mapper().map_model(self.create_data(named_file_contents)) + + @property + def asm_converter_name(self) -> str: + return f'{ASM_CONVERTER_NAME}_{self.DISPLAY_NAME.replace(" ", "_").replace("-", "_")}'.lower() + + def _get_date_time(self, time: str) -> TDateTimeValue: + return self.timestamp_parser.parse(time)