Source code for flask_nav3

import re
import sys
from importlib import import_module

if sys.version_info >= (3, 7):
    from collections.abc import MutableMapping
else:
    from collections import MutableMapping


[docs]def register_renderer(app, iid, renderer, force=True): """Registers a renderer on the application. :param app: The :class:`~flask.Flask` application to register the renderer on :param iid: Internal id-string for the renderer :param renderer: Renderer to register :param force: Whether or not to overwrite the renderer if a different one is already registered for ``iid`` """ renderers = app.extensions.setdefault("nav_renderers", {}) if force: renderers[iid] = renderer else: renderers.setdefault(iid, renderer)
[docs]def get_renderer(app, iid): # noqa: WPS210 """Retrieve a renderer. :param app: :class:`~flask.Flask` application to look ``iid`` up on :param iid: Internal renderer id-string to look up """ renderer = app.extensions.get("nav_renderers", {})[iid] if isinstance(renderer, tuple): mod_name, cls_name = renderer mod = import_module(mod_name) clsnm = mod for name in cls_name.split("."): clsnm = getattr(clsnm, name) return clsnm return renderer
[docs]class ElementRegistry(MutableMapping): # type: ignore [type-arg] """The ElementRegistry class.""" def __init__(self): """Constructor for ElementRegistry.""" self._elems = {} def __getitem__(self, key): """Returns key item from elements.""" the_item = self._elems[key] if callable(the_item): try: return the_item() except Exception as ee: # we wrap the exception, because otherwise things get # confusing if __getitem__ returns a KeyError # fixme: could use raise_from here on Py3 raise NavbarRenderingError( "Encountered {0} while trying to render navbar".format(repr(ee)), ) return the_item def __setitem__(self, key, ivalue): """Sets key => ivalue in elements.""" self._elems[key] = ivalue def __delitem__(self, key): # noqa: WPS603 """Delete key item from elements.""" self._elems.pop(key) def __iter__(self): """__iter__ magic function.""" # TODO: Determine if the WPS328 is relavent for key in self._elems.keys(): # noqa: WPS328 return self[key] def __len__(self): """Returns the number of elements.""" return len(self._elems)