From c19801d2b5d7d6ce405c5301cfe875938c3e8152 Mon Sep 17 00:00:00 2001 From: Richard Christie Date: Fri, 22 Aug 2025 09:26:15 +1200 Subject: [PATCH 1/2] Write id and version to settings --- src/scaffoldfitter/fitter.py | 2 ++ tests/test_fitcube.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/scaffoldfitter/fitter.py b/src/scaffoldfitter/fitter.py index 6e5945e..8002885 100644 --- a/src/scaffoldfitter/fitter.py +++ b/src/scaffoldfitter/fitter.py @@ -156,6 +156,8 @@ def encodeSettingsJSON(self) -> str: :return: String JSON encoding of Fitter settings. """ dct = { + "id": "scaffold fitter settings", + "version": "1.0.0", "modelCoordinatesField": self._modelCoordinatesFieldName, "modelFitGroup": self._modelFitGroupName, "fibreField": self._fibreFieldName, diff --git a/tests/test_fitcube.py b/tests/test_fitcube.py index 159957d..b9f061e 100644 --- a/tests/test_fitcube.py +++ b/tests/test_fitcube.py @@ -1,3 +1,4 @@ +import json import logging import math import os @@ -229,6 +230,18 @@ def test_alignMarkersFitRegularData(self): # test json serialisation s = fitter.encodeSettingsJSON() + settings_dct = json.loads(s) + self.assertEqual(len(settings_dct), 10) + self.assertEqual(settings_dct['id'], 'scaffold fitter settings') + self.assertEqual(settings_dct['version'], '1.0.0') + self.assertEqual(settings_dct['modelCoordinatesField'], 'coordinates') + self.assertIsNone(settings_dct['modelFitGroup']) + self.assertIsNone(settings_dct['fibreField']) + self.assertIsNone(settings_dct['flattenGroup']) + self.assertEqual(settings_dct['dataCoordinatesField'], 'data_coordinates') + self.assertEqual(settings_dct['markerGroup'], 'marker') + self.assertEqual(settings_dct['diagnosticLevel'], 1) + self.assertEqual(len(settings_dct['fitterSteps']), 3) fitter2 = Fitter(zinc_model_file, zinc_data_file) fitter2.decodeSettingsJSON(s, decodeJSONFitterSteps) fitterSteps = fitter2.getFitterSteps() From 995bce95842fe3c5305419611f72044e6ace511a Mon Sep 17 00:00:00 2001 From: Richard Christie Date: Fri, 22 Aug 2025 10:18:21 +1200 Subject: [PATCH 2/2] Verify settings id and version --- src/scaffoldfitter/fitter.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/scaffoldfitter/fitter.py b/src/scaffoldfitter/fitter.py index 8002885..4641275 100644 --- a/src/scaffoldfitter/fitter.py +++ b/src/scaffoldfitter/fitter.py @@ -126,6 +126,8 @@ def cleanup(self): self._logger = None self._context = None + SCAFFOLD_FITTER_SETTINGS_ID = "scaffold fitter settings" + def decodeSettingsJSON(self, s: str, decoder): """ Define Fitter from JSON serialisation output by encodeSettingsJSON. @@ -140,6 +142,10 @@ def decodeSettingsJSON(self, s: str, decoder): # ensure there is a first config step: if (len(self._fitterSteps) > 0) and isinstance(self._fitterSteps[0], FitterStepConfig): # field names are read (default to None), fields are found on load + id = settings.get("id") + if id is not None: + assert id == self.SCAFFOLD_FITTER_SETTINGS_ID + assert settings['version'] == '1.0.0' # future: migrate if version changes self._modelCoordinatesFieldName = settings.get("modelCoordinatesField") self._modelFitGroupName = settings.get("modelFitGroup") self._fibreFieldName = settings.get("fibreField") @@ -156,7 +162,7 @@ def encodeSettingsJSON(self) -> str: :return: String JSON encoding of Fitter settings. """ dct = { - "id": "scaffold fitter settings", + "id": self.SCAFFOLD_FITTER_SETTINGS_ID, "version": "1.0.0", "modelCoordinatesField": self._modelCoordinatesFieldName, "modelFitGroup": self._modelFitGroupName,