Skip to content

Commit

Permalink
llow unregistering of loaders and savers.
Browse files Browse the repository at this point in the history
  • Loading branch information
gb119 committed Jan 1, 2024
1 parent 83c7ffd commit bb7d58d
Show file tree
Hide file tree
Showing 5 changed files with 1,220 additions and 1,174 deletions.
3 changes: 2 additions & 1 deletion Stoner/formats/__init__.py
Expand Up @@ -15,12 +15,13 @@
"load",
"get_loader",
"get_saver",
"clear_routine",
]
from copy import copy
import io
from pathlib import Path
from . import instruments, generic, rigs, facilities, simulations, attocube, maximus
from .decorators import register_loader, register_saver, next_loader, best_saver, get_loader, get_saver
from .decorators import register_loader, register_saver, next_loader, best_saver, get_loader, get_saver, clear_routine
from ..core.exceptions import StonerLoadError
from ..tools import make_Data
from ..tools.file import get_mime_type
Expand Down
44 changes: 44 additions & 0 deletions Stoner/formats/decorators.py
Expand Up @@ -288,3 +288,47 @@ def get_saver(filetype, silent=False):
pass
if not silent:
raise StonerLoadError(f"Cannot locate a loader function for {filetype}") from err


def clear_routine(name, loader=True, saver=True):
"""Remove the routine with the specified name from the registered loaders and/or savers.
Args:
name (str): Name of routine to remove
Keyword Arguments:
loader (bool):
Whether to remove tyhe loader (default True)
saver (bool):
Whether to remove the saver routne (default True)
Returns:
(dict):
Removed kiader and saver routines.
"""
ret = {}
for k, lookup, pattern_lookup, type_lookup in zip(
["loader", "saver"],
[_loaders_by_name, _savers_by_name],
[_loaders_by_pattern, _savers_by_pattern],
[_loaders_by_type, None],
):
if not locals()[k]:
continue
func = lookup.pop(name, None)
if func is None:
continue
ret[k] = func
for lookup_dict in [pattern_lookup, type_lookup]:
if not isinstance(lookup_dict, dict):
continue
for _, values in _loaders_by_pattern.items():
remove = []
for ix, (priority, loader) in enumerate(values):
if loader is func:
remove.append(ix)
if remove:
remove.reverse()
for ix in remove:
del values[ix]
return ret
30 changes: 15 additions & 15 deletions tests/Stoner/mixedmetatest.dat
@@ -1,15 +1,15 @@
TDI Format 1.5 1 2 3 4
Stoner.class{String}=Data 0 1 2 3
t0{Boolean}=True 4 5 6 7
t1{I32}=1 8 9 10 11
t10{List}=[1, (1, 2), 'abc']
t11{List}=[[[1]]]
t12{Void}=None
t2{Double Float}=0.2
t3{Cluster (I32,String)}={'a': 1, 'b': 'abc'}
t4{Cluster (I32,I32)}=(1, 2)
t5{1D Array (Invalid Type)}=array([0, 1, 2])
t6{List}=[1, 2, 3]
t7{String}=abc
t8{String}=\\abc\cde
t9{Double Float}=1e-20
TDI Format 1.5 1 2 3 4
Stoner.class{String}=Data 0 1 2 3
t0{Boolean}=True 4 5 6 7
t1{I32}=1 8 9 10 11
t10{List}=[1, (1, 2), 'abc']
t11{List}=[[[1]]]
t12{Void}=None
t2{Double Float}=0.2
t3{Cluster (I32,String)}={'a': 1, 'b': 'abc'}
t4{Cluster (I32,I32)}=(1, 2)
t5{1D Array (Invalid Type)}=array([0, 1, 2])
t6{List}=[1, 2, 3]
t7{String}=abc
t8{String}=\\abc\cde
t9{Double Float}=1e-20

0 comments on commit bb7d58d

Please sign in to comment.