diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4aabd2c..ae64106 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.8, 3.9, '3.10', 3.11, 3.12] + python-version: [3.9, '3.10', 3.11, 3.12, 3.13] services: diff --git a/snowexsql/api.py b/snowexsql/api.py index 94fe565..950aff4 100644 --- a/snowexsql/api.py +++ b/snowexsql/api.py @@ -420,16 +420,6 @@ def _filter_campaign(cls, qry, value): Campaign.name == value ) - @classmethod - def _filter_measurement_type(cls, qry, value): - return qry.join( - cls.MODEL.observation - ).join( - PointObservation.measurement_type - ).filter( - MeasurementType.name == value - ) - @classmethod def _filter_instrument(cls, qry, value): return qry.join( diff --git a/snowexsql/tables/campaign_observation.py b/snowexsql/tables/campaign_observation.py index a1dfb65..d9882b1 100644 --- a/snowexsql/tables/campaign_observation.py +++ b/snowexsql/tables/campaign_observation.py @@ -5,12 +5,11 @@ from .campaign import InCampaign from .doi import HasDOI from .instrument import HasInstrument -from .measurement_type import HasMeasurementType from .observers import HasObserver class CampaignObservation( - Base, HasDOI, HasInstrument, HasMeasurementType, HasObserver, InCampaign + Base, HasDOI, HasInstrument, HasObserver, InCampaign ): """ A campaign observation holds additional information for a point or image. diff --git a/snowexsql/tables/image_data.py b/snowexsql/tables/image_data.py index 706ec80..f2f1467 100644 --- a/snowexsql/tables/image_data.py +++ b/snowexsql/tables/image_data.py @@ -3,9 +3,10 @@ from .base import Base from .image_observation import HasImageObservation +from .measurement_type import HasMeasurementType -class ImageData(Base, HasImageObservation): +class ImageData(Base, HasImageObservation, HasMeasurementType): """ Class representing the images table. This table holds all images/rasters """ diff --git a/snowexsql/tables/point_data.py b/snowexsql/tables/point_data.py index b012ab1..e152f09 100644 --- a/snowexsql/tables/point_data.py +++ b/snowexsql/tables/point_data.py @@ -2,11 +2,14 @@ from sqlalchemy.ext.hybrid import hybrid_property from .base import Base +from .measurement_type import HasMeasurementType from .point_observation import HasPointObservation from .single_location import SingleLocationData -class PointData(Base, SingleLocationData, HasPointObservation): +class PointData( + Base, SingleLocationData, HasPointObservation, HasMeasurementType +): """ Class representing the points table. This table holds all point data. Here a single data entry is a single coordinate pair with a single value diff --git a/tests/api/test_point_measurements.py b/tests/api/test_point_measurements.py index 2dd5254..814c4a8 100644 --- a/tests/api/test_point_measurements.py +++ b/tests/api/test_point_measurements.py @@ -39,7 +39,7 @@ def setup_method(self, point_data): def test_all_types(self): result = self.subject.all_types assert result == [ - record.observation.measurement_type.name + record.measurement_type.name for record in self.db_data ] @@ -124,7 +124,7 @@ def test_unknown_instrument(self): def test_date_and_measurement_type(self): result = self.subject.from_filter( date=self.db_data.datetime.date(), - type=self.db_data.observation.measurement_type.name, + type=self.db_data.measurement_type.name, ) assert len(result) == 1 assert result.loc[0].value == self.db_data.value diff --git a/tests/factories/point_data.py b/tests/factories/point_data.py index 9a944d7..a8a16bc 100644 --- a/tests/factories/point_data.py +++ b/tests/factories/point_data.py @@ -5,6 +5,7 @@ from snowexsql.tables import PointData from .base_factory import BaseFactory +from .measurement_type import MeasurementTypeFactory from .point_observation import PointObservationFactory @@ -21,3 +22,4 @@ class Meta: elevation = 3148.2 observation = factory.SubFactory(PointObservationFactory) + measurement_type = factory.SubFactory(MeasurementTypeFactory) diff --git a/tests/factories/point_observation.py b/tests/factories/point_observation.py index 8bbf0e2..0423b96 100644 --- a/tests/factories/point_observation.py +++ b/tests/factories/point_observation.py @@ -7,7 +7,6 @@ from .campaign import CampaignFactory from .doi import DOIFactory from .instrument import InstrumentFactory -from .measurement_type import MeasurementTypeFactory from .observer import ObserverFactory @@ -22,5 +21,4 @@ class Meta: campaign = factory.SubFactory(CampaignFactory) doi = factory.SubFactory(DOIFactory) instrument = factory.SubFactory(InstrumentFactory) - measurement_type = factory.SubFactory(MeasurementTypeFactory) observer = factory.SubFactory(ObserverFactory) diff --git a/tests/tables/test_point_data.py b/tests/tables/test_point_data.py index 407ab31..bf25ff7 100644 --- a/tests/tables/test_point_data.py +++ b/tests/tables/test_point_data.py @@ -3,7 +3,7 @@ import pytest from geoalchemy2 import WKBElement -from snowexsql.tables import PointData +from snowexsql.tables import PointData, MeasurementType @pytest.fixture @@ -48,3 +48,8 @@ def test_elevation_attribute(self): def test_geom_attribute(self): assert isinstance(self.subject.geom, WKBElement) + + def test_has_measurement_type(self): + assert self.subject.measurement_type is not None + assert isinstance(self.subject.measurement_type, MeasurementType) + diff --git a/tests/tables/test_point_observation.py b/tests/tables/test_point_observation.py index af5761b..a1a1748 100644 --- a/tests/tables/test_point_observation.py +++ b/tests/tables/test_point_observation.py @@ -3,7 +3,7 @@ import pytest from snowexsql.tables import ( - Campaign, DOI, Instrument, MeasurementType, Observer, PointObservation + Campaign, DOI, Instrument, Observer, PointObservation ) @@ -41,10 +41,6 @@ def test_has_doi(self): assert self.subject.doi is not None assert isinstance(self.subject.doi, DOI) - def test_has_measurement_type(self): - assert self.subject.measurement_type is not None - assert isinstance(self.subject.measurement_type, MeasurementType) - def test_has_instrument(self): assert self.subject.instrument is not None assert isinstance(self.subject.instrument, Instrument)