import re
from glue.config import DictRegistry
from ipyvuetify import VuetifyTemplate
from ipywidgets import Widget
__all__ = ['convert', 'UniqueDictRegistry', 'ViewerRegistry', 'TrayRegistry',
'ToolRegistry', 'MenuRegistry', 'DataParserRegistry',
'viewer_registry', 'tray_registry', 'tool_registry', 'menu_registry',
'data_parser_registry']
[docs]def convert(name):
"""Converts camel-case strings to snake-case. Used when a user does not define
a specific name for a registry item.
Returns
-------
val : str
Name converted to snake-case.
"""
s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()
[docs]class UniqueDictRegistry(DictRegistry):
"""Base registry class that handles hashmap-like associations between a string
representation of a plugin and the class to be instantiated.
"""
[docs] def add(self, name, cls):
"""Add an item to the registry.
Parameters
----------
name : str
The name referencing the associated class in the registry.
cls : type
The class definition (not instance) associated with the name given
in the first parameter.
"""
if name in self.members:
raise ValueError(f"Viewer with the name {name} already exists, "
f"please choose a different name.")
else:
self.members[name] = cls
[docs]class ViewerRegistry(UniqueDictRegistry):
"""Registry containing references to custom viewers."""
[docs] def __call__(self, name=None, label=None):
def decorator(cls):
self.add(name, cls, label)
return cls
return decorator
[docs] def add(self, name, cls, label=None):
"""Add an item to the registry.
Parameters
----------
name : str
The key referencing the associated class in the registry
dictionary.
cls : type
The class definition (not instance) associated with the name given
in the first parameter.
label : str, optional
The label displayed in the tooltip when hovering over the tray tab.
"""
if name in self.members:
raise ValueError(f"Viewer with the name {name} already exists, "
f"please choose a different name.")
else:
self.members[name] = {'label': label, 'cls': cls}
[docs]class TrayRegistry(UniqueDictRegistry):
"""Registry containing references to plugins that will be added to the sidebar
tray tabs.
"""
[docs] def __call__(self, name=None, label=None, icon=None):
def decorator(cls):
# The class must inherit from `VuetifyTemplate` in order to be
# ingestible by the component initialization.
if not issubclass(cls, VuetifyTemplate):
raise ValueError(
f"Unrecognized superclass for {cls.__name__}. All "
f"registered components must inherit from "
f"`ipyvuetify.VuetifyTemplate`.")
self.add(name, cls, label, icon)
return cls
return decorator
[docs] def add(self, name, cls, label=None, icon=None):
"""Add an item to the registry.
Parameters
----------
name : str
The key referencing the associated class in the registry
dictionary.
cls : type
The class definition (not instance) associated with the name given
in the first parameter.
label : str, optional
The label displayed in the tooltip when hovering over the tray tab.
icon : str, optional
The name of the icon to render in the tray tab.
"""
if name in self.members:
raise ValueError(f"Viewer with the name {name} already exists, "
f"please choose a different name.")
else:
# store the registry name/label so we can access them from the instantiated
# objects (when determining if a specific plugin is open, for example)
cls._registry_name = name
cls._registry_label = label
self.members[name] = {'label': label, 'icon': icon, 'cls': cls}
[docs]class DataParserRegistry(UniqueDictRegistry):
"""Registry containing parsing functions for attempting to auto-populate the
application-defined initial viewers.
"""
[docs] def __call__(self, name=None):
def decorator(func):
self.add(name, func)
return func
return decorator
viewer_registry = ViewerRegistry()
tray_registry = TrayRegistry()
tool_registry = ToolRegistry()
menu_registry = MenuRegistry()
data_parser_registry = DataParserRegistry()