
    c                     f   d Z dZddlZddlZddlZddlmZmZ  ej                  d      j                  Z
 ej                  d      Zee_        e
e_	        eej                  d<   dZd	Zd
Z G d de      Z G d de      Z G d de      Z G d de      ZddZd Zdee   dee   dee   ddfdZy)aI  Logilab common library (aka Logilab's extension to the standard library).

:type STD_BLACKLIST: tuple
:var STD_BLACKLIST: directories ignored by default by the functions in
  this package which have to recurse into directories

:type IGNORED_EXTENSIONS: tuple
:var IGNORED_EXTENSIONS: file extensions that may usually be ignored
zrestructuredtext en    N)ListSequencezlogilab-common__pkginfo__zlogilab.common.__pkginfo__)CVSz.svnz.hgz.gitz.toxdebiandistbuild)z.pycz.pyoz.elc~z.swpz.origTc                        e Zd ZdZdedefdZy)attrdictz>A dictionary for which keys are also accessible as attributes.attrreturnc                 >    	 | |   S # t         $ r t        |      w xY wN)KeyErrorAttributeErrorselfr   s     9/usr/lib/python3/dist-packages/logilab/common/__init__.py__getattr__zattrdict.__getattr__8   s+    	': 	' &&	's    N)__name__
__module____qualname____doc__strr        r   r   r   5   s    H' ' 'r   r   c                       e Zd Zd Zd Zy)dictattrc                     || _         y r   )_dictattr__proxy)r   proxys     r   __init__zdictattr.__init__@   s	    r   c                 `    	 t        | j                  |      S # t        $ r t        |      w xY wr   )getattrr!   r   r   r   s     r   __getitem__zdictattr.__getitem__C   s1    	!4<<.. 	!4. 	!s    -N)r   r   r   r#   r&   r   r   r   r   r   ?   s    !r   r   c                       e Zd Zd Zd ZeZy)
nullobjectc                      y)Nz<nullobject>r   r   s    r   __repr__znullobject.__repr__K   s    r   c                      y)NFr   r*   s    r   __bool__znullobject.__bool__N   s    r   N)r   r   r   r+   r-   __nonzero__r   r   r   r(   r(   J   s     Kr   r(   c                       e Zd Zd Zd Zd Zy)tempattrc                 .    || _         || _        || _        y r   )objr   value)r   r2   r   r3   s       r   r#   ztempattr.__init__U   s    	
r   c                     t        | j                  | j                        | _        t	        | j                  | j                  | j
                         | j                  S r   )r%   r2   r   oldvaluesetattrr3   r*   s    r   	__enter__ztempattr.__enter__Z   s9    $))4$))TZZ0xxr   c                 Z    t        | j                  | j                  | j                         y r   )r6   r2   r   r5   )r   exctyper3   	tracebacks       r   __exit__ztempattr.__exit___   s    $))T]]3r   N)r   r   r   r#   r7   r;   r   r   r   r0   r0   T   s    

4r   r0   c                     |g }| D ]Q  }t        |t        t        f      rt        |||       '||j	                  |       ;|j	                   ||             S |S )zFlatten a list of list with any level.

    If tr_func is not None, it should be a one argument function that'll be called
    on each final element.

    :rtype: list

    >>> flatten([1, [2, 3]])
    [1, 2, 3]
    )
isinstancelisttupleflattenappend)iterabletr_funcresultsvals       r   r@   r@   }   s_      )cD%=)C'*_NN3NN73<() Nr   c                    g }| D ]  }|dd }t        t        |            D ]  }||   t        |      z  ||<    |rrt        |d         t        |      z
  t        |      z  }d}t        t        |            D ]3  }||   }t        |      D ]  }|j                  ||       |dz  } |dz  }5 |j                  |        |S )a  
    Given a list of lists, return a list of domain for each list to produce all
    combinations of possibles values.

    :rtype: list

    Example:

    >>> make_domains(['a', 'b'], ['c','d', 'e'])
    [['a', 'b', 'a', 'b', 'a', 'b'], ['c', 'c', 'd', 'd', 'e', 'e']]
    Nr      )rangeleninsertrA   )	listsdomainsrB   
new_domainimissingjr3   dummys	            r   make_domainsrR      s     G #a[
s7|$ 	4A c(m3GAJ	471:X6#h-GGA3x=)  "7^ E%%a/FA Q 	z"# Nr   	blacklistdirnames	filenamesr   c                 j    | D ].  }||v r|j                  |       ||v s|j                  |       0 y)z`remove files/directories in the black list

    dirnames/filenames are usually from os.walk
    N)remove)rS   rT   rU   norecurss       r   _handle_blacklistrY      s=    
  'xOOH%"X&	'r   )NN)r   __docformat__systypespkg_resourcestypingr   r   get_distributionversion__version__
ModuleTyper   r   __package__modulesSTD_BLACKLISTIGNORED_EXTENSIONSUSE_MX_DATETIMEdictr   r   objectr(   r0   r@   rR   r   rY   r   r   r   <module>rj      s   $ & 
   !,m,,-=>FF e}-"  " ,7( )QC  't '!t ! 4v 4R4B	'# 	'$s) 	'PTUXPY 	'^b 	'r   