Source code for pybel_cx.ndex_utils

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

"""Integration with NDEx.

This module provides a wrapper around CX import/export and the NDEx
`client <https://github.com/ndexbio/ndex-python>`_ to allow for easy upload and download of BEL documents to the
`NDEx <http://www.ndexbio.org/>`_ database.

The programmatic API also provides options for specifying username and password. By default, it checks the environment
variables: ``NDEX_USERNAME`` and ``NDEX_PASSWORD``.
"""

import logging
import os

from ndex2.client import Ndex2
from requests.compat import urlsplit

from .constants import NDEX_PASSWORD, NDEX_USERNAME
from .cx import from_cx, to_cx

__all__ = [
    'to_ndex',
    'from_ndex',
]

log = logging.getLogger(__name__)


def build_ndex_client(username=None, password=None, debug=False):
    """Build an NDEx client by checking environmental variables.

    It has been requested that the :code:`ndex-client` has this functionality built-in by this GitHub
    `issue <https://github.com/ndexbio/ndex-python/issues/9>`_

    :param Optional[str] username: NDEx username
    :param Optional[str] password: NDEx password
    :param bool debug: If true, turn on NDEx client debugging
    :return: An NDEx client
    :rtype: ndex2.client.Ndex2
    """
    if username is None and NDEX_USERNAME in os.environ:
        username = os.environ[NDEX_USERNAME]
        log.info('got NDEx username from environment: %s', username)

    if password is None and NDEX_PASSWORD in os.environ:
        password = os.environ[NDEX_PASSWORD]
        log.info('got NDEx password from environment')

    return Ndex2(username=username, password=password, debug=debug)


def cx_to_ndex(cx, username=None, password=None, debug=False):
    """Upload a CX document to NDEx.

    This function is not necessarily specific to PyBEL.

    :param list cx: A CX JSON dictionary
    :param Optional[str] username: NDEx username
    :param Optional[str] password: NDEx password
    :param bool debug: If true, turn on NDEx client debugging
    :return: The UUID assigned to the network by NDEx
    :rtype: str
    """
    ndex = build_ndex_client(username=username, password=password, debug=debug)
    res = ndex.save_new_network(cx)

    url_parts = urlsplit(res).path
    network_id = url_parts.split('/')[-1]

    return network_id


[docs]def to_ndex(graph, username=None, password=None, debug=False): """Upload a BEL graph to NDEx. :param pybel.BELGraph graph: A BEL graph :param Optional[str] username: NDEx username :param Optional[str] password: NDEx password :param bool debug: If true, turn on NDEx client debugging :return: The UUID assigned to the network by NDEx :rtype: str Example Usage: >>> from pybel.examples import sialic_acid_graph >>> from pybel_cx import to_ndex >>> to_ndex(sialic_acid_graph) """ cx = to_cx(graph) return cx_to_ndex(cx, username=username, password=password, debug=debug)
[docs]def from_ndex(network_id, username=None, password=None, debug=False): """Download a BEL Graph from NDEx. .. warning:: This function only will work for CX documents that have been originally exported from PyBEL :param str network_id: The UUID assigned to the network by NDEx :param Optional[str] username: NDEx username :param Optional[str] password: NDEx password :param bool debug: If true, turn on NDEx client debugging :rtype: pybel.BELGraph Example Usage: >>> from pybel_cx import from_ndex >>> network_id = '1709e6f3-04a1-11e7-aba2-0ac135e8bacf' >>> graph = from_ndex(network_id) """ ndex = build_ndex_client(username, password, debug) res = ndex.get_network_as_cx_stream(network_id) cx = res.json() graph = from_cx(cx) return graph