diff --git a/oxrlib/loaders.py b/oxrlib/loaders.py index e839dddcbb9c18748fc020fdae6f2cd04a373b06..5213a40df3b28e6172015d89f62a2ee4b624249d 100644 --- a/oxrlib/loaders.py +++ b/oxrlib/loaders.py @@ -1,4 +1,5 @@ import cgi +import functools import io import urllib.request import urllib.parse @@ -19,6 +20,10 @@ class LoaderSourceError(LoaderError): pass +class NoLoadersError(Exception): + pass + + class FileCache: def __init__(self, dir_path, filename_pattern): self.dir_path = dir_path @@ -75,3 +80,32 @@ class OXRAPIRequest: 'historical/{}.json'.format(date.isoformat()), {'app_id': self.app_id, 'base': base}, ) + + +class LoaderChain: + def __init__(self): + self.loaders = [] + + def add_loader(self, loader): + self.loaders.append(loader) + + def _wrap_load_method(orig_func): + @functools.wraps(orig_func) + def load_wrapper(self, *args, **kwargs): + self.used_loader = None + error = None + for loader in self.loaders: + try: + response = getattr(loader, orig_func.__name__)(*args, **kwargs) + except LoaderError as this_error: + error = this_error + else: + self.used_loader = loader + return response + else: + raise NoLoadersError() if error is None else error + return load_wrapper + + @_wrap_load_method + def historical(self, date, base): + pass