From 77ef80454b575df0491812b1c129ec06a37930d9 Mon Sep 17 00:00:00 2001 From: Ken Kroenlein Date: Wed, 5 Aug 2026 11:07:38 -0600 Subject: [PATCH] Reconcile DataSourceDesignSpace with platform API Resolve a stash-pop conflict in DataSourceDesignSpace by keeping the current DesignSubspace serialization (flat paths, Resource base), then add the read-only `descriptors` field that the platform derives from the data source but the client was not modeling. Co-Authored-By: Claude Opus 4.8 --- src/citrine/__version__.py | 2 +- .../design_spaces/data_source_design_space.py | 6 ++++++ tests/informatics/test_design_spaces.py | 13 +++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/citrine/__version__.py b/src/citrine/__version__.py index 0fd7811c0..111dc9172 100644 --- a/src/citrine/__version__.py +++ b/src/citrine/__version__.py @@ -1 +1 @@ -__version__ = "4.2.0" +__version__ = "4.3.0" diff --git a/src/citrine/informatics/design_spaces/data_source_design_space.py b/src/citrine/informatics/design_spaces/data_source_design_space.py index 174a4f208..6ed23ef07 100644 --- a/src/citrine/informatics/design_spaces/data_source_design_space.py +++ b/src/citrine/informatics/design_spaces/data_source_design_space.py @@ -1,6 +1,7 @@ from citrine._rest.resource import Resource from citrine._serialization import properties from citrine.informatics.data_sources import DataSource +from citrine.informatics.descriptors import Descriptor from citrine.informatics.design_spaces.subspace import DesignSubspace __all__ = ['DataSourceDesignSpace'] @@ -17,10 +18,15 @@ class DataSourceDesignSpace(Resource['DataSourceDesignSpace'], DesignSubspace): the description of the design space data_source: DataSource the source of data for this design space + descriptors: list[Descriptor] + the descriptors that the platform derives from the data source. This is + populated by the platform and is read-only. """ data_source = properties.Object(DataSource, 'data_source') + descriptors = properties.List( + properties.Object(Descriptor), 'descriptors', serializable=False, default=[]) typ = properties.String('type', default='DataSourceDesignSpace', deserializable=False) diff --git a/tests/informatics/test_design_spaces.py b/tests/informatics/test_design_spaces.py index 9848cc966..3ecd19210 100644 --- a/tests/informatics/test_design_spaces.py +++ b/tests/informatics/test_design_spaces.py @@ -126,11 +126,15 @@ def test_hierarchical_initialization(hierarchical_design_space): def test_data_source_build(valid_data_source_design_space_dict): - ds = DataSourceDesignSpace.build(valid_data_source_design_space_dict) - assert ds.name == valid_data_source_design_space_dict["name"] - assert ds.description == valid_data_source_design_space_dict["description"] - assert ds.data_source == DataSource.build(valid_data_source_design_space_dict["data_source"]) + descriptor = RealDescriptor("x", lower_bound=0, upper_bound=1, units="") + data = dict(valid_data_source_design_space_dict, descriptors=[descriptor.dump()]) + ds = DataSourceDesignSpace.build(data) + assert ds.name == data["name"] + assert ds.description == data["description"] + assert ds.data_source == DataSource.build(data["data_source"]) assert str(ds) == f"" + assert ds.descriptors == [descriptor] + assert "descriptors" not in ds.dump() def test_data_source_initialization(valid_data_source_design_space_dict): @@ -142,3 +146,4 @@ def test_data_source_initialization(valid_data_source_design_space_dict): assert ds.name == data["name"] assert ds.description == data["description"] assert ds.data_source.dump() == data["data_source"] + assert ds.descriptors == []