Source code for pybel.io.api

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

"""Contains the main data structure for PyBEL."""

import os
from typing import TextIO, Union

from networkx.utils import open_file
from pkg_resources import iter_entry_points

from ..struct import BELGraph

__all__ = [
    "load",
    "dump",
    "InvalidExtensionError",
]

#: Mapping from extension to importer function
IMPORTERS = {entry.name: entry.load() for entry in iter_entry_points(group="pybel.importer")}

#: Mapping from extension to exporter function
EXPORTERS = {entry.name: entry.load() for entry in iter_entry_points(group="pybel.exporter")}


class InvalidExtensionError(ValueError):
    """Raised when an invalid extension is used."""

    def __init__(self, path):
        fname = os.path.basename(path)
        super().__init__("Invalid extension for file: {}".format(fname))


[docs]def load(path: str, **kwargs) -> BELGraph: """Read a BEL graph. :param path: The path to a BEL graph in any of the formats with extensions described below :param kwargs: The keyword arguments are passed to the importer function :return: A BEL graph. This is the universal loader, which means any file path can be given and PyBEL will look up the appropriate load function. Allowed extensions are: - bel - bel.nodelink.json - bel.cx.json - bel.jgif.json The previous extensions also support gzipping. Other allowed extensions that don't support gzip are: - bel.pickle / bel.gpickle / bel.pkl - indra.json """ for extension, importer in IMPORTERS.items(): if path.endswith(extension): return importer(path, **kwargs) raise InvalidExtensionError(path=path)
[docs]def dump(graph: BELGraph, path: str, **kwargs) -> None: """Write a BEL graph. :param graph: A BEL graph :param path: The path to which the BEL graph is written. :param kwargs: The keyword arguments are passed to the exporter function This is the universal loader, which means any file path can be given and PyBEL will look up the appropriate writer function. Allowed extensions are: - bel - bel.nodelink.json - bel.unodelink.json - bel.cx.json - bel.jgif.json - bel.graphdati.json The previous extensions also support gzipping. Other allowed extensions that don't support gzip are: - bel.pickle / bel.gpickle / bel.pkl - indra.json - tsv - gsea """ for extension, exporter in EXPORTERS.items(): if path.endswith(extension): return exporter(graph, path, **kwargs) raise InvalidExtensionError(path=path)