Source code for sphinxcontrib.bibtex.plugin
import sys
if sys.version_info >= (3, 10):
from importlib.metadata import EntryPoint, entry_points
else:
from importlib_metadata import entry_points, EntryPoint
from typing import Any, Dict, List, Type
_runtime_plugins: Dict[str, Dict[str, Type]] = {
"sphinxcontrib.bibtex.style.referencing": {}
}
# wrapper to work around missing type annotations for entry_points function
def _entry_points(group: str, name: str) -> List[EntryPoint]:
return entry_points(group=group, name=name) # type: ignore
[docs]
def find_plugin(group: str, name: str) -> Type[Any]:
"""Load a sphinxcontrib-bibtex plugin, either from the runtime store,
or from the entry points.
"""
global _runtime_plugins
if group not in _runtime_plugins:
raise ImportError(f"plugin group {group} not found")
try:
return _runtime_plugins[group][name]
except KeyError:
for entry_point in _entry_points(group=group, name=name):
return entry_point.load()
raise ImportError(f"plugin {group}.{name} not found")
[docs]
def register_plugin(
group: str, name: str, klass: Type[Any], force: bool = False
) -> bool:
"""Register a sphinxcontrib-bibtex plugin into the runtime store."""
global _runtime_plugins
if group not in _runtime_plugins:
raise ImportError(f"plugin group {group} not found")
eps: List[Any]
try:
eps = [_runtime_plugins[group][name]]
except KeyError:
eps = _entry_points(group=group, name=name)
if not eps or force:
_runtime_plugins[group][name] = klass
return True
else:
return False