from typing import List, Union, Dict
from ordered_set import OrderedSet
from modelindex.models.BaseModelIndex import BaseModelIndex
from modelindex.models.Result import Result
from modelindex.utils import full_filepath, load_any_file, lowercase_keys
[docs]class ResultList(BaseModelIndex):
"""ResultList is a list of Result objects."""
[docs] def __init__(self,
results: Union[List[Union[Dict, Result, str]], Result, Dict] = None,
_filepath: str = None,
):
"""
Args:
results (list, Result, dict): Either a list of results, a single Result object or a dict representing a result
_filepath (str): path to the file where the data is coming from
"""
check_errors = OrderedSet()
if results is None:
results = []
if isinstance(results, Result) or isinstance(results, dict):
results = [results]
results_parsed = []
for r in results:
if isinstance(r, str):
try:
results_parsed.append(Result.from_file(r, _filepath))
except (IOError, ValueError) as e:
check_errors.add(str(e))
elif isinstance(r, Result):
results_parsed.append(r)
else:
results_parsed.append(Result.from_dict(r, _filepath))
super().__init__(
data=results_parsed,
filepath=_filepath,
check_errors=check_errors,
)
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
def __iter__(self):
self._iterator_inx = 0
return self
def __next__(self):
if self._iterator_inx < len(self.data):
self._iterator_inx += 1
return self.data[self._iterator_inx - 1]
else:
raise StopIteration
def __len__(self):
return len(self.data)
[docs] @staticmethod
def from_file(filepath: str = None, parent_filepath: str = None):
"""Load a ResultList from a file.
Args:
filepath (str): File from which to load the result list
parent_filepath (str): Parent filename (if file is imported from another file)
"""
fullpath = full_filepath(filepath, parent_filepath)
raw, md_path = load_any_file(filepath, parent_filepath)
d = raw
if isinstance(d, list):
return ResultList(d, fullpath)
elif isinstance(d, dict):
lc_keys = lowercase_keys(raw)
if "results" in lc_keys:
return ResultList(d[lc_keys["results"]], fullpath)
raise ValueError(f"Expected a list of results, but got something else"
f"in file {fullpath}")