Commit ea91e3e4 authored by J. Fernando Sánchez's avatar J. Fernando Sánchez

Add an option to force the load of shelf plugins

Closes gsi-upm/senpy#34
parent f76b777b
......@@ -183,7 +183,11 @@ Training a classifier can be time time consuming. To avoid running the training
def deactivate(self):
You can speficy a 'shelf_file' in your .senpy file. By default the ShelfMixin creates a file based on the plugin name and stores it in that plugin's folder.
You can specify a 'shelf_file' in your .senpy file. By default the ShelfMixin creates a file based on the plugin name and stores it in that plugin's folder.
Shelves may get corrupted if the plugin exists unexpectedly.
A corrupt shelf prevents the plugin from loading.
If you do not care about the pickle, you can force your plugin to remove the corrupted file and load anyway, set the 'force_shelf' to True in your .senpy file.
I want to implement my service as a plugin, How i can do it?
......@@ -237,7 +237,10 @@ class BaseModel(SenpyMixin, dict):
self.__setitem__(self._get_key(key), value)
def __delattr__(self, key):
object.__delattr__(self, key)
except AttributeError:
def _plain_dict(self):
d = {k: v for (k, v) in self.items() if k[0] != "_"}
......@@ -98,8 +98,10 @@ class ShelfMixin(object):
if os.path.isfile(self.shelf_file):
self.__dict__['_sh'] = pickle.load(open(self.shelf_file, 'rb'))
except EOFError:
logger.warning('corrupted shelf file!')
except (EOFError, pickle.UnpicklingError):
logger.warning('{} has a corrupted shelf file!'.format(
if not self.get('force_shelf', False):
return self._sh
......@@ -83,7 +83,40 @@ class PluginsTest(TestCase):
res2 = a.analyse(input=1)
assert res2.entries[0].nif__isString == 2
def test_two(self):
def test_corrupt_shelf(self):
''' Reusing the values of a previous shelf '''
emptyfile = os.path.join(self.shelf_dir, "emptyfile")
invalidfile = os.path.join(self.shelf_dir, "invalid_file")
with open(emptyfile, 'w+b'), open(invalidfile, 'w+b') as inf:
files = {emptyfile: ['empty file', EOFError],
invalidfile: ['invalid file', pickle.UnpicklingError]}
for fn in files:
with open(fn, 'rb') as f:
msg, error = files[fn]
a = ShelfDummyPlugin(info={
'name': 'shelve',
'version': 'test',
assert os.path.isfile(a.shelf_file)
print('Shelf file: %s' % a.shelf_file)
with self.assertRaises(error):
# By default, raise an error['a'] = 'fromA'
del a._sh
assert os.path.isfile(a.shelf_file)
a.force_shelf = True['a'] = 'fromA'
b = pickle.load(f)
assert b['a'] == 'fromA'
def test_reuse_shelf(self):
''' Reusing the values of a previous shelf '''
a = ShelfDummyPlugin(info={
'name': 'shelve',
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment