From b960536264300a7282619060a487023431a99ee8 Mon Sep 17 00:00:00 2001 From: Ethan Holz Date: Wed, 17 Dec 2025 15:24:50 -0700 Subject: [PATCH 1/4] feat(warehouse): add result tokenizable store --- openfe/storage/warehouse.py | 48 +++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/openfe/storage/warehouse.py b/openfe/storage/warehouse.py index 02a81d5c4..b80ab6121 100644 --- a/openfe/storage/warehouse.py +++ b/openfe/storage/warehouse.py @@ -32,7 +32,7 @@ class WarehouseStores(TypedDict): """ setup: ExternalStorage - # We will add a result and task store here in the future. + result: ExternalStorage class WarehouseBaseClass: @@ -63,7 +63,7 @@ def __repr__(self): # probably should include repr of external store, too return f"{self.__class__.__name__}({self.stores})" - def delete(self, store_name: Literal["setup"], location: str): + def delete(self, store_name: Literal["setup", "result"], location: str): """Delete an object from a specific store. Parameters @@ -106,6 +106,31 @@ def load_setup_tokenizable(self, obj: GufeKey) -> GufeTokenizable: """ return self._load_gufe_tokenizable(gufe_key=obj) + def store_result_tokenizable(self, obj: GufeKey) -> GufeTokenizable: + """Store a GufeTokenizable object from the result store. + + Parameters + ---------- + obj : GufeKey + The key of the object to store. + """ + return self._store_gufe_tokenizable("result", obj) + + def load_result_tokenizable(self, obj: GufeKey) -> GufeTokenizable: + """Load a GufeTokenizable object from the result store. + + Parameters + ---------- + obj : GufeKey + The key of the object to load. + + Returns + ------- + GufeTokenizable + The loaded object. + """ + return self._load_gufe_tokenizable(gufe_key=obj) + def exists(self, key: GufeKey) -> bool: """Check if an object with the given key exists in any store. @@ -144,15 +169,15 @@ def _get_store_for_key(self, key: GufeKey) -> ExternalStorage: return self.stores[name] raise ValueError(f"GufeKey {key} is not stored") - def _store_gufe_tokenizable(self, store_name: Literal["setup"], obj: GufeTokenizable): + def _store_gufe_tokenizable(self, store_name: Literal["setup", "result"], obj: GufeTokenizable): """Store a GufeTokenizable object with deduplication. - Parameters - ---------- - store_name : Literal["setup"] - Name of the store to store the object in. - obj : GufeTokenizable - The object to store. + Parameters + ---------- + store_name : Literal["setup"] + Name of the store to store the object in. + obj : GufeTokenizable + The object to store. Notes ----- @@ -276,7 +301,6 @@ class FileSystemWarehouse(WarehouseBaseClass): def __init__(self, root_dir: str = "warehouse"): setup_store = FileStorage(f"{root_dir}/setup") - # When we add a result store it will look like this - # result_store = FileStorage(f"{root_dir}/results") - stores = WarehouseStores(setup=setup_store) + result_store = FileStorage(f"{root_dir}/result") + stores = WarehouseStores(setup=setup_store, result=result_store) super().__init__(stores) From dbff24f8b2f6a68faf5441a8c1b9ef0a8c5d3538 Mon Sep 17 00:00:00 2001 From: Ethan Holz Date: Wed, 17 Dec 2025 15:26:52 -0700 Subject: [PATCH 2/4] docs(warehouse): add docs on the result store --- openfe/storage/warehouse.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openfe/storage/warehouse.py b/openfe/storage/warehouse.py index b80ab6121..45c311da9 100644 --- a/openfe/storage/warehouse.py +++ b/openfe/storage/warehouse.py @@ -25,6 +25,8 @@ class WarehouseStores(TypedDict): ---------- setup : ExternalStorage Storage location for setup-related objects and configurations. + result : ExternalStorage + Storage location for result-related object. Notes ----- From 9d64f7e866851121a6662e51b5ed1b1c998e743a Mon Sep 17 00:00:00 2001 From: Ethan Holz Date: Fri, 19 Dec 2025 15:05:30 -0700 Subject: [PATCH 3/4] chore: add property for result store --- openfe/storage/warehouse.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openfe/storage/warehouse.py b/openfe/storage/warehouse.py index 45c311da9..f0fb04b65 100644 --- a/openfe/storage/warehouse.py +++ b/openfe/storage/warehouse.py @@ -273,15 +273,26 @@ def recursive_build_object_cache(key: GufeKey) -> GufeTokenizable: @property def setup_store(self): - """Get the setup store. + """Get the setup store Returns ------- ExternalStorage - The setup storage location. + The setup storage location """ return self.stores["setup"] + @property + def result_store(self): + """Get the result store. + + Returns + ------- + ExternalStorage + The result storage location + """ + return self.stores["result"] + class FileSystemWarehouse(WarehouseBaseClass): """Warehouse implementation using local filesystem storage. From 889175406a10ddb3dad6f681247eb2b60ea87a18 Mon Sep 17 00:00:00 2001 From: Ethan Holz Date: Mon, 29 Dec 2025 10:58:53 -0700 Subject: [PATCH 4/4] fix: use the correct function signature for handling setup --- openfe/storage/warehouse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfe/storage/warehouse.py b/openfe/storage/warehouse.py index f0fb04b65..c10baa12c 100644 --- a/openfe/storage/warehouse.py +++ b/openfe/storage/warehouse.py @@ -108,7 +108,7 @@ def load_setup_tokenizable(self, obj: GufeKey) -> GufeTokenizable: """ return self._load_gufe_tokenizable(gufe_key=obj) - def store_result_tokenizable(self, obj: GufeKey) -> GufeTokenizable: + def store_result_tokenizable(self, obj: GufeTokenizable): """Store a GufeTokenizable object from the result store. Parameters