",
- "- Wire
- Current * number of turns (NI).
"
+ "Set the units of the data.",
+ "Data are expected to be normalized by the source strength, dependent on the type:
",
+ "- Dipole
- Current * area * number of turns (NIA).
",
+ "- Wire
- Current * number of turns (NI).
",
+ "
"
],
"value": "dB/dt (T/s)"
},
@@ -146,7 +147,7 @@
"optional": true,
"enabled": false,
"label": "Elevation channel",
- "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
+ "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
"parent": "topography_object",
"dependency": "topography_object",
"dependencyType": "enabled",
@@ -167,7 +168,7 @@
"dependency": "topography_object",
"dependencyType": "disabled",
"label": "Active model",
- "tooltip": "Provide the active cell boolean model directly if topography not set",
+ "tooltip": "Provide the active cell Boolean model directly if topography not set",
"parent": "mesh",
"value": ""
},
diff --git a/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json b/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json
index f06c6861..77eebdca 100644
--- a/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json
+++ b/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json
@@ -1,5 +1,5 @@
{
- "version": "0.3.0-alpha.6",
+ "version": "0.4.0",
"title": "Time-domain EM (TEM) 1D Inversion",
"icon": "surveyairborneem",
"documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/latest/",
@@ -31,10 +31,11 @@
"main": true,
"label": "Data type",
"tooltip": [
- "Set the units of the data.",
- "Data are expected to be normalized by the source strength, dependent on the type:",
- "- Dipole
- Current * area * number of turns (NIA).
",
- "- Wire
- Current * number of turns (NI).
"
+ "Set the units of the data.",
+ "Data are expected to be normalized by the source strength, dependent on the type:
",
+ "- Dipole
- Current * area * number of turns (NIA).
",
+ "- Wire
- Current * number of turns (NI).
",
+ "
"
],
"value": "dB/dt (T/s)"
},
@@ -212,7 +213,7 @@
"optional": true,
"enabled": false,
"label": "Elevation channel",
- "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
+ "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
"parent": "topography_object",
"dependency": "topography_object",
"dependencyType": "enabled",
@@ -233,7 +234,7 @@
"dependency": "topography_object",
"dependencyType": "disabled",
"label": "Active model",
- "tooltip": "Provide the active cell boolean model directly if topography not set",
+ "tooltip": "Provide the active cell Boolean model directly if topography not set",
"parent": "mesh",
"value": ""
},
@@ -447,7 +448,7 @@
"min": 1,
"enabled": true,
"verbose": 3,
- "tooltip": "Perform an Armijo backtracking linesearch for the provided number of iterations"
+ "tooltip": "Perform an Armijo backtracking line search for the provided number of iterations"
},
"max_cg_iterations": {
"min": 0,
diff --git a/simpeg_drivers-assets/uijson/tdem_forward.ui.json b/simpeg_drivers-assets/uijson/tdem_forward.ui.json
index a67ff175..f46567a5 100644
--- a/simpeg_drivers-assets/uijson/tdem_forward.ui.json
+++ b/simpeg_drivers-assets/uijson/tdem_forward.ui.json
@@ -1,5 +1,5 @@
{
- "version": "0.3.0-alpha.6",
+ "version": "0.4.0",
"title": "Time-domain EM (TEM) Forward",
"icon": "surveyairborneem",
"documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/latest/",
@@ -31,10 +31,11 @@
"main": true,
"label": "Data type",
"tooltip": [
- "Set the units of the data.",
- "Data are expected to be normalized by the source strength, dependent on the type:",
- "- Dipole
- Current * area * number of turns (NIA).
",
- "- Wire
- Current * number of turns (NI).
"
+ "Set the units of the data.",
+ "Data are expected to be normalized by the source strength, dependent on the type:
",
+ "- Dipole
- Current * area * number of turns (NIA).
",
+ "- Wire
- Current * number of turns (NI).
",
+ "
"
],
"value": "dB/dt (T/s)"
},
@@ -118,7 +119,7 @@
"optional": true,
"enabled": false,
"label": "Elevation channel",
- "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
+ "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
"parent": "topography_object",
"dependency": "topography_object",
"dependencyType": "enabled",
@@ -138,7 +139,7 @@
"dependency": "topography_object",
"dependencyType": "disabled",
"label": "Active model",
- "tooltip": "Provide the active cell boolean model directly if topography not set",
+ "tooltip": "Provide the active cell Boolean model directly if topography not set",
"parent": "mesh",
"value": ""
},
diff --git a/simpeg_drivers-assets/uijson/tdem_inversion.ui.json b/simpeg_drivers-assets/uijson/tdem_inversion.ui.json
index c0fa0529..126d44e0 100644
--- a/simpeg_drivers-assets/uijson/tdem_inversion.ui.json
+++ b/simpeg_drivers-assets/uijson/tdem_inversion.ui.json
@@ -1,5 +1,5 @@
{
- "version": "0.3.0-beta.1",
+ "version": "0.4.0",
"title": "Time-domain EM (TEM) Inversion",
"icon": "surveyairborneem",
"documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/latest/",
@@ -31,10 +31,11 @@
"main": true,
"label": "Data type",
"tooltip": [
- "Set the units of the data.",
- "Data are expected to be normalized by the source strength, dependent on the type:",
- "- Dipole
- Current * area * number of turns (NIA).
",
- "- Wire
- Current * number of turns (NI).
"
+ "Set the units of the data.",
+ "Data are expected to be normalized by the source strength, dependent on the type:
",
+ "- Dipole
- Current * area * number of turns (NIA).
",
+ "- Wire
- Current * number of turns (NI).
",
+ "
"
],
"value": "dB/dt (T/s)"
},
@@ -232,7 +233,7 @@
"optional": true,
"enabled": false,
"label": "Elevation channel",
- "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
+ "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
"parent": "topography_object",
"dependency": "topography_object",
"dependencyType": "enabled",
@@ -252,7 +253,7 @@
"dependency": "topography_object",
"dependencyType": "disabled",
"label": "Active model",
- "tooltip": "Provide the active cell boolean model directly if topography not set",
+ "tooltip": "Provide the active cell Boolean model directly if topography not set",
"parent": "mesh",
"value": ""
},
@@ -507,7 +508,7 @@
"min": 1,
"enabled": true,
"verbose": 3,
- "tooltip": "Perform an Armijo backtracking linesearch for the provided number of iterations"
+ "tooltip": "Perform an Armijo backtracking line search for the provided number of iterations"
},
"max_cg_iterations": {
"min": 0,
diff --git a/simpeg_drivers-assets/uijson/tile_estimator.ui.json b/simpeg_drivers-assets/uijson/tile_estimator.ui.json
index 19726fa4..d63bdc22 100644
--- a/simpeg_drivers-assets/uijson/tile_estimator.ui.json
+++ b/simpeg_drivers-assets/uijson/tile_estimator.ui.json
@@ -16,13 +16,5 @@
"main": true,
"label": "Create plot",
"value": true
- },
- "out_group": {
- "label": "UIJson group",
- "value": "",
- "groupType": "{BB50AC61-A657-4926-9C82-067658E246A0}",
- "optional": true,
- "enabled": false,
- "tooltip": "Assign a group to which results will be saved"
}
}
diff --git a/simpeg_drivers-assets/uijson/tipper_forward.ui.json b/simpeg_drivers-assets/uijson/tipper_forward.ui.json
index 4a49198e..2c73996a 100644
--- a/simpeg_drivers-assets/uijson/tipper_forward.ui.json
+++ b/simpeg_drivers-assets/uijson/tipper_forward.ui.json
@@ -1,5 +1,5 @@
{
- "version": "0.3.0-alpha.6",
+ "version": "0.4.0",
"title": "Tipper Forward",
"icon": "surveyztem",
"documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/latest/",
@@ -110,7 +110,7 @@
"optional": true,
"enabled": false,
"label": "Elevation channel",
- "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
+ "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
"parent": "topography_object",
"dependency": "topography_object",
"dependencyType": "enabled",
@@ -130,7 +130,7 @@
"dependency": "topography_object",
"dependencyType": "disabled",
"label": "Active model",
- "tooltip": "Provide the active cell boolean model directly if topography not set",
+ "tooltip": "Provide the active cell Boolean model directly if topography not set",
"parent": "mesh",
"value": ""
},
diff --git a/simpeg_drivers-assets/uijson/tipper_inversion.ui.json b/simpeg_drivers-assets/uijson/tipper_inversion.ui.json
index 315811e3..ecd58b39 100644
--- a/simpeg_drivers-assets/uijson/tipper_inversion.ui.json
+++ b/simpeg_drivers-assets/uijson/tipper_inversion.ui.json
@@ -1,5 +1,5 @@
{
- "version": "0.3.0-alpha.6",
+ "version": "0.4.0",
"title": "Tipper Inversion",
"icon": "surveyztem",
"documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/latest/",
@@ -254,7 +254,7 @@
"optional": true,
"enabled": false,
"label": "Elevation channel",
- "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
+ "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object",
"parent": "topography_object",
"dependency": "topography_object",
"dependencyType": "enabled",
@@ -274,7 +274,7 @@
"dependency": "topography_object",
"dependencyType": "disabled",
"label": "Active model",
- "tooltip": "Provide the active cell boolean model directly if topography not set",
+ "tooltip": "Provide the active cell Boolean model directly if topography not set",
"parent": "mesh",
"value": ""
},
@@ -529,7 +529,7 @@
"min": 1,
"enabled": true,
"verbose": 3,
- "tooltip": "Perform an Armijo backtracking linesearch for the provided number of iterations"
+ "tooltip": "Perform an Armijo backtracking line search for the provided number of iterations"
},
"max_cg_iterations": {
"min": 0,
diff --git a/simpeg_drivers/components/factories/directives_factory.py b/simpeg_drivers/components/factories/directives_factory.py
index 04250362..74304323 100644
--- a/simpeg_drivers/components/factories/directives_factory.py
+++ b/simpeg_drivers/components/factories/directives_factory.py
@@ -25,7 +25,7 @@
from simpeg.utils.mat_utils import cartesian2amplitude_dip_azimuth
from simpeg_drivers.components.factories.simpeg_factory import SimPEGFactory
-from simpeg_drivers.options import BaseInversionOptions
+from simpeg_drivers.options import BaseInversionOptions, ModelTypeEnum
if TYPE_CHECKING:
@@ -418,7 +418,7 @@ def assemble_keyword_arguments(
inversion_object.permutation.T,
]
- if self.params.models.model_type == "Resistivity (Ohm-m)":
+ if self.params.models.model_type == ModelTypeEnum.resistivity:
kwargs["transforms"].append(lambda x: 1 / x)
if "1d" in self.factory_type:
diff --git a/simpeg_drivers/components/factories/source_factory.py b/simpeg_drivers/components/factories/source_factory.py
index 0b0077ac..f9abbed9 100644
--- a/simpeg_drivers/components/factories/source_factory.py
+++ b/simpeg_drivers/components/factories/source_factory.py
@@ -24,6 +24,7 @@
from geoh5py.objects import LargeLoopGroundTEMReceivers
from simpeg_drivers.components.factories.simpeg_factory import SimPEGFactory
+from simpeg_drivers.options import ModelTypeEnum
if TYPE_CHECKING:
@@ -138,7 +139,10 @@ def assemble_keyword_arguments( # pylint: disable=arguments-differ
if self.factory_type in ["magnetotellurics", "tipper"]:
background = deepcopy(self.params.models.conductivity_model)
- if getattr(self.params.models, "model_type", None) == "Resistivity (Ohm-m)":
+ if (
+ getattr(self.params.models, "model_type", None)
+ == ModelTypeEnum.resistivity
+ ):
background **= -1.0
kwargs["sigma_primary"] = [background]
diff --git a/simpeg_drivers/components/models.py b/simpeg_drivers/components/models.py
index d10df22b..2f3f69d5 100644
--- a/simpeg_drivers/components/models.py
+++ b/simpeg_drivers/components/models.py
@@ -24,6 +24,8 @@
mkvc,
)
+from simpeg_drivers.options import ModelTypeEnum
+
if TYPE_CHECKING:
from simpeg_drivers.driver import InversionDriver
@@ -165,7 +167,7 @@ def starting_model(self) -> np.ndarray | None:
mstart = self._starting_model.model.copy()
if mstart is not None and self.is_sigma:
- if self.driver.params.models.model_type == "Resistivity (Ohm-m)":
+ if self.driver.params.models.model_type == ModelTypeEnum.resistivity:
mstart = 1 / mstart
mstart = np.log(mstart)
@@ -221,7 +223,7 @@ def reference_model(self) -> np.ndarray | None:
ref_model = mref.copy()
if self.is_sigma:
- if self.driver.params.models.model_type == "Resistivity (Ohm-m)":
+ if self.driver.params.models.model_type == ModelTypeEnum.resistivity:
ref_model = 1 / ref_model
ref_model = np.log(ref_model)
@@ -263,7 +265,7 @@ def reference_declination(self) -> np.ndarray | None:
def lower_bound(self) -> np.ndarray | None:
if (
self.is_sigma
- and self.driver.params.models.model_type == "Resistivity (Ohm-m)"
+ and self.driver.params.models.model_type == ModelTypeEnum.resistivity
):
bound_model = self._upper_bound.model
else:
@@ -283,7 +285,7 @@ def lower_bound(self) -> np.ndarray | None:
if self.is_sigma:
is_finite = np.isfinite(lbound)
- if self.driver.params.models.model_type == "Resistivity (Ohm-m)":
+ if self.driver.params.models.model_type == ModelTypeEnum.resistivity:
lbound[is_finite] = 1 / lbound[is_finite]
lbound[is_finite] = np.log(lbound[is_finite])
@@ -297,7 +299,7 @@ def lower_bound(self) -> np.ndarray | None:
def upper_bound(self) -> np.ndarray | None:
if (
self.is_sigma
- and self.driver.params.models.model_type == "Resistivity (Ohm-m)"
+ and self.driver.params.models.model_type == ModelTypeEnum.resistivity
):
bound_model = self._lower_bound.model
else:
@@ -311,7 +313,7 @@ def upper_bound(self) -> np.ndarray | None:
if self.is_sigma:
is_finite = np.isfinite(ubound)
- if self.driver.params.models.model_type == "Resistivity (Ohm-m)":
+ if self.driver.params.models.model_type == ModelTypeEnum.resistivity:
ubound[is_finite] = 1 / ubound[is_finite]
ubound[is_finite] = np.log(ubound[is_finite])
@@ -329,7 +331,7 @@ def conductivity_model(self) -> np.ndarray | None:
background_sigma = self._conductivity_model.model.copy()
if background_sigma is not None:
- if self.driver.params.models.model_type == "Resistivity (Ohm-m)":
+ if self.driver.params.models.model_type == ModelTypeEnum.resistivity:
background_sigma = 1 / background_sigma
# Don't apply log if IP inversion
@@ -569,7 +571,7 @@ def save_model(self):
model_type = self.model_type
if (
model_type == "conductivity_model"
- and self.driver.params.models.model_type == "Resistivity (Ohm-m)"
+ and self.driver.params.models.model_type == ModelTypeEnum.resistivity
):
model_type = "resistivity_model"
@@ -588,11 +590,11 @@ def save_model(self):
def edit_ndv_model(self, model):
"""Change values to NDV on models and save to workspace."""
+
model_type = self.model_type
if (
- model_type == "conductivity_model"
- and getattr(self.driver.params.models, "model_type", None)
- == "Resistivity (Ohm-m)"
+ getattr(self.driver.params.models, "model_type", None)
+ == ModelTypeEnum.resistivity
):
model_type = "resistivity_model"
diff --git a/simpeg_drivers/joint/driver.py b/simpeg_drivers/joint/driver.py
index bc93f59e..de308714 100644
--- a/simpeg_drivers/joint/driver.py
+++ b/simpeg_drivers/joint/driver.py
@@ -38,6 +38,7 @@
)
from simpeg_drivers.driver import InversionDriver
from simpeg_drivers.joint.options import BaseJointOptions
+from simpeg_drivers.options import ModelTypeEnum
from simpeg_drivers.utils.utils import simpeg_group_to_driver
@@ -451,7 +452,10 @@ def _get_local_model_save_directives(
)
model_directive.label = driver.params.physical_property
- if getattr(driver.params.models, "model_type", None) == "Resistivity (Ohm-m)":
+ if (
+ getattr(driver.params.models, "model_type", None)
+ == ModelTypeEnum.resistivity
+ ):
model_directive.label = "resistivity_model"
model_directive.transforms = [wire, *model_directive.transforms]
diff --git a/simpeg_drivers/joint/joint_surveys/driver.py b/simpeg_drivers/joint/joint_surveys/driver.py
index c0906560..eb912c18 100644
--- a/simpeg_drivers/joint/joint_surveys/driver.py
+++ b/simpeg_drivers/joint/joint_surveys/driver.py
@@ -14,12 +14,12 @@
from logging import getLogger
import numpy as np
-from geoh5py.groups.property_group_type import GroupTypeEnum
from geoh5py.shared.utils import fetch_active_workspace
from simpeg import maps
from simpeg_drivers.driver import InversionDriver
from simpeg_drivers.joint.driver import BaseJointDriver
+from simpeg_drivers.options import ModelTypeEnum
from .options import JointSurveysOptions
@@ -64,7 +64,7 @@ def validate_create_models(self):
model = np.exp(model)
if (
getattr(self.params.models, "model_type", None)
- == "Resistivity (Ohm-m)"
+ == ModelTypeEnum.resistivity
):
model = 1.0 / model
diff --git a/simpeg_drivers/joint/joint_surveys/options.py b/simpeg_drivers/joint/joint_surveys/options.py
index 037c9ab2..b80a3bd4 100644
--- a/simpeg_drivers/joint/joint_surveys/options.py
+++ b/simpeg_drivers/joint/joint_surveys/options.py
@@ -14,12 +14,26 @@
from pathlib import Path
from typing import ClassVar
-from geoapps_utils.utils.importing import GeoAppsError
-from pydantic import model_validator
+from geoh5py.data import FloatData
+from pydantic import field_validator, model_validator
from simpeg_drivers import assets_path
-from simpeg_drivers.joint.options import BaseJointOptions
-from simpeg_drivers.options import ConductivityModelOptions
+from simpeg_drivers.joint.options import BaseJointOptions, JointModelOptions
+from simpeg_drivers.options import ModelTypeEnum
+
+
+class JointSurveysModelOptions(JointModelOptions):
+ """
+ Joint Surveys model options.
+
+ :param model_type: The physical property type for the inversion.
+ :param starting_model: The starting model for the inversion.
+ :param reference_model: The reference model for the inversion.
+ """
+
+ model_type: ModelTypeEnum = ModelTypeEnum.conductivity
+ starting_model: float | FloatData | None = None
+ reference_model: float | FloatData | None = None
class JointSurveysOptions(BaseJointOptions):
@@ -33,7 +47,20 @@ class JointSurveysOptions(BaseJointOptions):
title: str = "Joint Surveys Inversion"
inversion_type: str = "joint surveys"
- models: ConductivityModelOptions
+ models: JointSurveysModelOptions
+
+ @field_validator("group_a", "group_b", "group_c")
+ @classmethod
+ def no_mvi_groups(cls, val):
+ if val is None:
+ return val
+
+ if "magnetic vector" in val.options.get("inversion_type", ""):
+ raise ValueError(
+ f"Joint inversion doesn't currently support MVI data as passed in "
+ f"the group: {val.name}."
+ )
+ return val
@model_validator(mode="after")
def all_groups_same_physical_property(self):
diff --git a/simpeg_drivers/line_sweep/driver.py b/simpeg_drivers/line_sweep/driver.py
index 1e5a7f84..b726e90a 100644
--- a/simpeg_drivers/line_sweep/driver.py
+++ b/simpeg_drivers/line_sweep/driver.py
@@ -69,9 +69,11 @@ def validate_out_group(self, out_group: SimPEGGroup | None) -> SimPEGGroup:
return out_group
with fetch_active_workspace(self.workspace, mode="r+"):
- out_group = SimPEGGroup.create(
- self.workspace, name=self.batch2d_params.title
- )
+ out_group = self.workspace.get_entity(self.batch2d_params.title)[0]
+ if out_group is None:
+ out_group = SimPEGGroup.create(
+ self.workspace, name=self.batch2d_params.title
+ )
return out_group
diff --git a/simpeg_drivers/options.py b/simpeg_drivers/options.py
index 6622da12..21b1b357 100644
--- a/simpeg_drivers/options.py
+++ b/simpeg_drivers/options.py
@@ -11,6 +11,7 @@
from __future__ import annotations
+from enum import Enum
from logging import getLogger
from pathlib import Path
from typing import Annotated, Any, ClassVar, Literal, TypeAlias
@@ -324,14 +325,17 @@ def gradient_orientations(self) -> tuple(float, float):
return self._gradient_orientations
+class ModelTypeEnum(str, Enum):
+ conductivity = "Conductivity (S/m)"
+ resistivity = "Resistivity (Ohm-m)"
+
+
class ConductivityModelOptions(ModelOptions):
"""
Options for the conductivity model used in all of EM methods.
"""
- model_type: Literal["Conductivity (S/m)", "Resistivity (Ohm-m)"] = (
- "Conductivity (S/m)"
- )
+ model_type: ModelTypeEnum = ModelTypeEnum.conductivity
conductivity_model: float | FloatData | None = Field(
None,
validation_alias=AliasChoices("background_conductivity", "conductivity_model"),
diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py
index b7dd61c0..d3f62c59 100644
--- a/simpeg_drivers/plate_simulation/driver.py
+++ b/simpeg_drivers/plate_simulation/driver.py
@@ -21,11 +21,10 @@
from geoh5py.groups import SimPEGGroup
from geoh5py.objects import Octree, Points, Surface
from geoh5py.shared.utils import fetch_active_workspace, stringify
-from geoh5py.ui_json import InputFile, monitored_directory_copy
from grid_apps.octree_creation.driver import OctreeDriver
from simpeg_drivers.driver import BaseDriver, InversionDriver
-from simpeg_drivers.options import BaseForwardOptions
+from simpeg_drivers.options import BaseForwardOptions, ModelTypeEnum
from simpeg_drivers.plate_simulation.models.events import Anomaly, Erosion, Overburden
from simpeg_drivers.plate_simulation.models.parametric import Plate
from simpeg_drivers.plate_simulation.models.series import DikeSwarm, Geology
@@ -137,7 +136,9 @@ def simulation_parameters(self) -> BaseForwardOptions:
if self._simulation_parameters is None:
self._simulation_parameters = self.params.simulation_parameters()
if self._simulation_parameters.physical_property == "conductivity":
- self._simulation_parameters.models.model_type = "Resistivity (Ohm-m)"
+ self._simulation_parameters.models.model_type = (
+ ModelTypeEnum.resistivity
+ )
return self._simulation_parameters
@property
diff --git a/tests/smoke_test.py b/tests/smoke_test.py
new file mode 100644
index 00000000..9fce01ba
--- /dev/null
+++ b/tests/smoke_test.py
@@ -0,0 +1,19 @@
+# '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+# Copyright (c) 2025 Mira Geoscience Ltd. '
+# '
+# This file is part of simpeg-drivers package. '
+# '
+# simpeg-drivers is distributed under the terms and conditions of the MIT License '
+# (see LICENSE file at the root of this source code package). '
+# '
+# '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+import importlib
+import types
+
+
+def test_import_package():
+ """Simple smoke test to ensure the package imports without errors."""
+
+ mod = importlib.import_module("simpeg_drivers")
+ assert isinstance(mod, types.ModuleType)
diff --git a/tests/version_test.py b/tests/version_test.py
index 5e8051d2..624950ff 100644
--- a/tests/version_test.py
+++ b/tests/version_test.py
@@ -12,16 +12,25 @@
from __future__ import annotations
import importlib
+import json
+import re
from pathlib import Path
import pytest
import yaml
-from packaging.version import InvalidVersion, Version
+from packaging.version import Version
import simpeg_drivers
-def get_conda_recipe_version():
+def _get_json_version() -> str:
+ version_json_path = Path(__file__).resolve().parents[1] / "_version.json"
+ with version_json_path.open(encoding="utf-8") as file:
+ version_json = json.load(file)
+ return version_json["version"]
+
+
+def _get_conda_recipe_version_def() -> str:
recipe_path = Path(__file__).resolve().parents[1] / "recipe.yaml"
with recipe_path.open(encoding="utf-8") as file:
@@ -29,12 +38,6 @@ def get_conda_recipe_version():
return recipe["context"]["version"]
-def test_version_is_consistent():
- project_version = Version(simpeg_drivers.__version__)
- conda_version = Version(get_conda_recipe_version())
- assert conda_version.base_version == project_version.base_version
-
-
def _version_module_exists():
try:
importlib.import_module("simpeg_drivers._version")
@@ -43,6 +46,13 @@ def _version_module_exists():
return False
+def test_conda_recipe_version_loads_json():
+ conda_version_def = _get_conda_recipe_version_def()
+ regex = r"\$\{\{\s*load_from_file\(\s*['\"](_version\.json)['\"]\s*\)\s*\.version\b.*\}\}"
+ regex_match = re.match(regex, conda_version_def)
+ assert regex_match is not None
+
+
@pytest.mark.skipif(
_version_module_exists(),
reason="simpeg_drivers._version can be found: package is built",
@@ -60,28 +70,7 @@ def test_fallback_version_is_zero():
not _version_module_exists(),
reason="simpeg_drivers._version cannot be found: uses a fallback version",
)
-def test_conda_version_is_consistent():
+def test_version_json_is_consistent():
project_version = Version(simpeg_drivers.__version__)
- conda_version = Version(get_conda_recipe_version())
-
- assert conda_version.is_devrelease == project_version.is_devrelease
- assert conda_version.is_prerelease == project_version.is_prerelease
- assert conda_version.is_postrelease == project_version.is_postrelease
- assert conda_version == project_version
-
-
-def test_conda_version_is_pep440():
- version = Version(get_conda_recipe_version())
- assert version is not None
-
-
-def validate_version(version_str):
- try:
- version = Version(version_str)
- return (version.major, version.minor, version.micro, version.pre, version.post)
- except InvalidVersion:
- return None
-
-
-def test_version_is_valid():
- assert validate_version(simpeg_drivers.__version__) is not None
+ json_version = Version(_get_json_version())
+ assert project_version == json_version