Source code for graphtransliterator.transliterators

# -*- coding: utf-8 -*-
"""

graphtransliterator.transliterators
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bundled transliterators are loaded by explicitly importing
:mod:`graphtransliterator.transliterators`. Each is an instance of
:mod:`graphtransliterator.bundled.Bundled`.
"""
from .bundled import Bundled  # noqa
from .schemas import MetadataSchema  # noqa
import inspect
import pkgutil

__all__ = ["Bundled", "MetadataSchema", "iter_names", "iter_transliterators"]

_transliterators = []


def _skip_class_name(name):
    """Determine if the class name should be skipped."""
    return name == "Bundled" or name.startswith("_")


def add_transliterators(path=__path__):
    """Walk submodules and loads bundled transliterators into namespace.

    Bundled transliterators are stored as ``Bundled`` subclass.

    Parameters
    ----------
    path : list
        List of paths, must be an iterable of strings

    Raises
    ------
    ValueError
        A transliterator of the same name already has been loaded."""

    for loader, module_name, is_pkg in pkgutil.walk_packages(path):
        # if it is not a submodule, skip it.
        if not is_pkg:
            continue
        _module = loader.find_module(module_name).load_module(module_name)

        for name, _obj in inspect.getmembers(_module, inspect.isclass):
            # Skip Bundled, as it is already loaded
            # Skip any classes starting with _
            if _skip_class_name(name):
                continue
            if name in __all__:
                raise ValueError(
                    'A transliterator named "{}" already exists'.format(name)
                )
            # import module and add class to globals, so that it will show up as
            # graphtransliterator.transliterators.TRANSLITERATORNAME
            assert len(_module.__path__) == 1  # There should be only one path
            globals()[name] = getattr(_module, name)
            __all__.append(name)
            _transliterators.append(name)


add_transliterators()


[docs] def iter_names(): """Iterate through bundled transliterator names.""" for _ in _transliterators: yield _
[docs] def iter_transliterators(**kwds): """Iterate through instances of bundled transliterators.""" for _ in iter_names(): yield (eval(_ + "()"))