From 528f7621d955b110f5d7005a12511ca609789ce1 Mon Sep 17 00:00:00 2001
From: Timothe Jost <timothe.jost@wanadoo.fr>
Date: Sat, 16 Mar 2024 04:27:58 +0100
Subject: [PATCH] fixing pipe load autofind the right step

---
 src/pypelines/__init__.py |  2 +-
 src/pypelines/disk.py     |  6 +++++-
 src/pypelines/pipes.py    | 15 ++++++++++-----
 src/pypelines/steps.py    |  2 +-
 4 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/pypelines/__init__.py b/src/pypelines/__init__.py
index edbe75c..41a8598 100644
--- a/src/pypelines/__init__.py
+++ b/src/pypelines/__init__.py
@@ -1,4 +1,4 @@
-__version__ = "0.0.26"
+__version__ = "0.0.27"
 
 from . import loggs
 from .pipes import *
diff --git a/src/pypelines/disk.py b/src/pypelines/disk.py
index a132ab2..0b0e176 100644
--- a/src/pypelines/disk.py
+++ b/src/pypelines/disk.py
@@ -23,6 +23,10 @@ class BaseDiskObject(metaclass=ABCMeta):
     disk_version = None
     disk_step = None
 
+    step: "BaseStep"
+    session: Session
+    extra: str
+
     def __init__(self, session: Session, step: "BaseStep", extra="") -> None:
         # this object is meant to be short lived. Created, check drive,
         # and quickly take action by saving or loading file according to the procedures defined.
@@ -91,7 +95,7 @@ class BaseDiskObject(metaclass=ABCMeta):
         return None
 
     def is_matching(self):
-        if self.is_loadable() and not self.version_deprecated() and not self.step_level_too_low():
+        if self.is_loadable() and not (self.version_deprecated() or self.step_level_too_low()):
             return True
         return False
 
diff --git a/src/pypelines/pipes.py b/src/pypelines/pipes.py
index 9dc41a8..5abfa81 100644
--- a/src/pypelines/pipes.py
+++ b/src/pypelines/pipes.py
@@ -130,11 +130,16 @@ class BasePipe(metaclass=ABCMeta):
         return function
 
     def load(self, session, extra="", which: Literal["lowest", "highest"] = "highest"):
-        ordered_steps = sorted(list(self.steps.values()), key=lambda item: item.get_level(selfish=True))
-
         if which == "lowest":
-            step = ordered_steps[0]
+            reverse = False
         else:
-            step = ordered_steps[-1]
+            reverse = True
+
+        ordered_steps = sorted(
+            list(self.steps.values()), key=lambda item: item.get_level(selfish=True), reverse=reverse
+        )
 
-        return step.load(session, extra)
+        for step in ordered_steps:
+            if step.get_disk_object(session, extra).is_matching():
+                return step.load(session, extra)
+        raise ValueError(f"Could not find a {self} object to load for the session {session.alias} with extra {extra}")
diff --git a/src/pypelines/steps.py b/src/pypelines/steps.py
index 211445b..a221241 100644
--- a/src/pypelines/steps.py
+++ b/src/pypelines/steps.py
@@ -143,7 +143,7 @@ class BaseStep:
 
     def get_load_wrapped(self):
         @wraps(self.pipe.disk_class.load)
-        def wrapper(session, extra=None):
+        def wrapper(session, extra=None, strict=False):
             # print("extra in load wrapper : ", extra)
             if extra is None:
                 extra = self.get_default_extra()
-- 
GitLab