ó
|£*^c           @   s¼   d  d l  Z  d  d l m Z d  d l m Z d  d l Z d  d l m Z d  d l m	 Z	 d d g Z
 d „  Z d	 „  Z d
 „  Z e d „  ƒ Z e e d <e e d <e e d <d d „ Z d S(   iÿÿÿÿN(   t   defaultdict(   t   splitext(   t	   decorator(   t   is_string_liket   not_implemented_fort	   open_filec             s   t  ‡  f d †  ƒ } | S(   sì  Decorator to mark algorithms as not implemented

    Parameters
    ----------
    graph_types : container of strings
        Entries must be one of 'directed','undirected', 'multigraph', 'graph'.

    Returns
    -------
    _require : function
        The decorated function.

    Raises
    ------
    NetworkXNotImplemnted
    If any of the packages cannot be imported

    Notes
    -----
    Multiple types are joined logically with "and".
    For "or" use multiple @not_implemented_for() lines.

    Examples
    --------
    Decorate functions like this::

       @not_implemnted_for('directed')
       def sp_function():
           pass

       @not_implemnted_for('directed','multigraph')
       def sp_np_function():
           pass
    c            sÊ   | d } i | j  ƒ  d 6| j  ƒ  d 6| j ƒ  d 6| j ƒ  d 6} t } y% x ˆ  D] } | oi | | } qV WWn  t k
 r“ t d d ƒ ‚ n X| r¹ t j d d	 j ˆ  ƒ ƒ ‚ n |  | | Ž  Sd  S(
   Ni    t   directedt
   undirectedt
   multigrapht   graphs   use one or more of s'   directed, undirected, multigraph, graphs   not implemented for %s typet    (   t   is_directedt   is_multigrapht   Truet   KeyErrort   nxt   NetworkXNotImplementedt   join(   t   ft   argst   kwargsR	   t   termst   matcht   t(   t   graph_types(    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyt   _not_implemented_for2   s     
	(   R   (   R   R   (    (   R   sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyR      s    #c         C   s   d d  l  } | j |  d | ƒS(   Niÿÿÿÿt   mode(   t   gzipt   open(   t   pathR   R   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyt   _open_gzH   s    c         C   s   d d  l  } | j |  d | ƒS(   NiÿÿÿÿR   (   t   bz2t   BZ2File(   R   R   R   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyt	   _open_bz2L   s    c           C   s   t  S(   N(   R   (    (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyt   <lambda>R   s    s   .gzs   .bz2s   .gzipt   rc            s   t  ‡  ‡ f d †  ƒ } | S(   sz  Decorator to ensure clean opening and closing of files.

    Parameters
    ----------
    path_arg : int
        Location of the path argument in args.  Even if the argument is a
        named positional argument (with a default value), you must specify its
        index as a positional argument.
    mode : str
        String for opening mode.

    Returns
    -------
    _open_file : function
        Function which cleanly executes the io.

    Examples
    --------
    Decorate functions like this::

       @open_file(0,'r')
       def read_function(pathname):
           pass

       @open_file(1,'w')
       def write_function(G,pathname):
           pass

       @open_file(1,'w')
       def write_function(G, pathname='graph.dot')
           pass

       @open_file('path', 'w+')
       def another_function(arg, **kwargs):
           path = kwargs['path']
           pass
    c            sU  y | ˆ } Wn| t  k
 rg y | ˆ } Wn/ t k
 r] d } t j | j ˆ ƒ ƒ ‚ q“ Xt } n, t k
 rŒ d } t j | ƒ ‚ n Xt } t | ƒ rÎ t	 | ƒ d } t
 | | d ˆ  ƒ} t } n* t | d ƒ rì | } t } n | } t } | r| }	 | | ˆ <n t | ƒ }	 | |	 ˆ <z |  |	 | Ž  }
 Wd  | rP| j ƒ  n  X|
 S(   Ns&   Missing required keyword argument: {0}s,   path_arg of open_file decorator is incorrecti   R   t   read(   t	   TypeErrorR   R   t   NetworkXErrort   formatR   t
   IndexErrort   FalseR   R   t   _dispatch_dictt   hasattrt   listt   close(   t   funcR   R   R   t   msgt   is_kwargt   extt   fobjt
   close_fobjt   new_argst   result(   R   t   path_arg(    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyt
   _open_file›   s@    			
(   R   (   R6   R   R7   (    (   R   R6   sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyR   X   s    CH(   t   syst   collectionsR    t   os.pathR   t   networkxR   R   t   networkx.utilsR   t   __all__R   R   R!   R*   R   (    (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/utils/decorators.pyt   <module>   s   		9		


