From 95c5c9fd4a2618c9d7642218dd7c1dfeb81019e5 Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Tue, 5 Sep 2023 10:42:28 +0200
Subject: [PATCH] Reorganized default paths

---
 api.py                  |  8 ++++++++
 conf/defaults.py        | 14 ++++++++++++++
 conf/server.py          | 21 ---------------------
 model_server/ilastik.py |  4 ++--
 model_server/session.py |  8 ++++----
 tests/test_api.py       | 11 ++++++++---
 tests/test_ilastik.py   |  1 -
 7 files changed, 36 insertions(+), 31 deletions(-)
 create mode 100644 conf/defaults.py
 delete mode 100644 conf/server.py

diff --git a/api.py b/api.py
index e62758b0..ff82c044 100644
--- a/api.py
+++ b/api.py
@@ -22,6 +22,14 @@ def read_root():
 def read_root(par1=None, par2=None):
     return {'success': True, 'params': {'par1': par1, 'par2': par2}}
 
+@app.get('/paths')
+def list_session_paths():
+    pass
+
+@app.put('/paths/{path_id}')
+def set_path_id(path_id: str, abs_path: str):
+    pass
+
 @app.get('/restart')
 def restart_session() -> dict:
     session.restart()
diff --git a/conf/defaults.py b/conf/defaults.py
new file mode 100644
index 00000000..c1761b7a
--- /dev/null
+++ b/conf/defaults.py
@@ -0,0 +1,14 @@
+from pathlib import Path
+
+root = Path('c:/Users/rhodes/projects/proj0015-model-server/resources')
+paths = {
+    'logs': root / 'logs' / 'session',
+    'inbound_images': root / 'images' / 'inbound',
+    'outbound_images': root / 'images' / 'outbound',
+    'ilastik_projects': root / 'ilastik',
+}
+
+for gk in paths.keys():
+    paths[gk].mkdir(parents=True, exist_ok=True)
+
+# TODO: consider configuring paths via API, and this just becomes a HTTP client script
\ No newline at end of file
diff --git a/conf/server.py b/conf/server.py
deleted file mode 100644
index 707b60ac..00000000
--- a/conf/server.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from pathlib import Path
-
-root = Path('c:/Users/rhodes/projects/proj0015-model-server/resources')
-paths = {
-    'logs': {
-        'session': root / 'logs' / 'session',
-    },
-    'images': {
-        'inbound': root / 'images' / 'inbound',
-        'outbound': root / 'images' / 'outbound',
-    },
-    'ilastik': {
-        'projects': root / 'ilastik'
-    }
-}
-
-for gk in paths.keys():
-    for pk in paths[gk].keys():
-        paths[gk][pk].mkdir(parents=True, exist_ok=True)
-
-# TODO: consider configuring paths via API, and this just becomes a HTTP client script
\ No newline at end of file
diff --git a/model_server/ilastik.py b/model_server/ilastik.py
index 54419f78..c4b876de 100644
--- a/model_server/ilastik.py
+++ b/model_server/ilastik.py
@@ -4,7 +4,7 @@ import pathlib
 import numpy as np
 import vigra
 
-import conf.server
+import conf.defaults
 from model_server.image import GenericImageDataAccessor, InMemoryDataAccessor
 from model_server.model import ImageToImageModel, ParameterExpectedError
 
@@ -14,7 +14,7 @@ class IlastikImageToImageModel(ImageToImageModel):
     def __init__(self, params, autoload=True):
         self.project_file = str(params['project_file'])
         self.project_file_abspath = pathlib.Path(
-            conf.server.paths['ilastik']['projects'] / self.project_file,
+            conf.defaults.paths['ilastik_projects'] / self.project_file,
         )
         if 'project_file' not in params or not self.project_file_abspath.exists():
             raise ParameterExpectedError('Ilastik model expects a project (*.ilp) file')
diff --git a/model_server/session.py b/model_server/session.py
index 1a9b38b9..989fc1b3 100644
--- a/model_server/session.py
+++ b/model_server/session.py
@@ -5,7 +5,7 @@ from pathlib import Path
 from time import strftime, localtime
 from typing import Dict
 
-from conf.server import paths
+from conf.defaults import paths
 from model_server.model import Model
 from model_server.share import SharedImageDirectory
 from model_server.workflow import WorkflowRunRecord
@@ -17,9 +17,9 @@ class Session(object):
     """
     Singleton class for a server session that persists data between API calls
     """
-    inbound = SharedImageDirectory(paths['images']['inbound'])
-    outbound = SharedImageDirectory(paths['images']['outbound'])
-    where_records = Path(paths['logs']['session'])
+    inbound = SharedImageDirectory(paths['inbound_images'])
+    outbound = SharedImageDirectory(paths['outbound_images'])
+    where_records = paths['logs']
 
     def __new__(cls):
         if not hasattr(cls, 'instance'):
diff --git a/tests/test_api.py b/tests/test_api.py
index b7835ffd..8c6c248b 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -22,11 +22,10 @@ class TestServerBaseClass(unittest.TestCase):
 
     @staticmethod
     def copy_input_file_to_server():
-        import pathlib
         from shutil import copyfile
-        from conf.server import paths
+        from conf.defaults import paths
 
-        outpath = pathlib.Path(paths['images']['inbound'] / czifile['filename'])
+        outpath = paths['inbound_images'] / czifile['filename']
 
         copyfile(
             czifile['path'],
@@ -47,6 +46,12 @@ class TestApiFromAutomatedClient(TestServerBaseClass):
         self.assertEqual(resp.json()['params']['par1'], 'hello', resp.json())
         self.assertEqual(resp.json()['params']['par2'], None, resp.json())
 
+    def test_default_session_paths(self):
+        import conf.defaults
+        resp = requests.get(self.uri + 'paths')
+        for p in ['inbound', 'outbound', 'logs']:
+            self.assertEqual(resp.json()['paths'][p], conf.defaults.paths[p])
+
     def test_list_empty_loaded_models(self):
         resp = requests.get(self.uri + 'models')
         self.assertEqual(resp.status_code, 200)
diff --git a/tests/test_ilastik.py b/tests/test_ilastik.py
index 204ad237..fba595e1 100644
--- a/tests/test_ilastik.py
+++ b/tests/test_ilastik.py
@@ -6,7 +6,6 @@ import numpy as np
 import conf.testing
 from model_server.image import CziImageFileAccessor, InMemoryDataAccessor, write_accessor_data_to_file
 from model_server.ilastik import IlastikObjectClassifierModel, IlastikPixelClassifierModel
-from model_server.model import Model
 from model_server.workflow import infer_image_to_image
 from tests.test_api import TestServerBaseClass
 
-- 
GitLab