
    Æe              
          d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZ 	 ddej&                  d	ee   d
ee   fdZdej&                  d	ee   ded
efdZ	 ddej&                  dej&                  ded
efdZdee	eef      d
ee   fdZdee	eeef      d
ee	eef      fdZdej&                  ded
efdZ	 ddeded
eeddf   fdZy)z*Utility functions for the autoimport code.    N)OrderedDict)	GeneratorListOptionalTuple)Project   )ModuleCompiled
ModuleFile
ModuleInfoPackagePackageTypeSourcepackage_pathprojectreturnc                    | j                   }|j                  d      s|dv ry|j                  d      ry| j                         r|j                  d      r%|j	                  d      d   }t
        j                  }nu|j                  d      r%|j	                  d      d   }t
        j                  }n?|j                  d      r| j                  }t
        j                  }nyt
        j                  }t        | ||      }t        ||| |      S )	z
    Get package name and type from a path.

    Checks for common issues, such as not being a viable python module
    Returns None if not a viable package.
    .)__pycache__site-packagesN)z	.egg-infoz
.dist-infoz.sor   z.pyd.py)name
startswithendswithis_filesplitr   COMPILEDstemSINGLE_FILESTANDARDget_package_sourcer   )r   r   package_namepackage_typepackage_sources        ?/usr/lib/python3/dist-packages/rope/contrib/autoimport/utils.pyget_package_tupler&      s      $$Ls#|7W'W89  ''--c215L&//L""6*'--c215L&//L""5)',,L&22L"++/g|TN<|LL    packager   c                    |t         j                  v rt        j                  S |'|j                  t        |       v rt        j                  S d| j                  v rt        j                  S t         j                  dk  rHt        |       j                  t         j                        rt        j                  S t        j                  S |t         j                  v rt        j                  S t        j                  S )zADetect the source of a given package. Rudimentary implementation.r   )   
   r   )sysbuiltin_module_namesr   BUILTINaddressstrPROJECTpartsSITE_PACKAGEversion_infor   prefixr    stdlib_module_namesUNKNOWN)r(   r   r   s      r%   r!   r!   -   s     s'''~~w#g,>~~'--'"""
*$w<""3::.??" >> 3***??">>r'   modpathadd_package_namec                    |j                   }| j                  |      j                  }d}t        |      dkD  r1|dd D ]  }||z  }|dz  } |d   dk(  r|dd }n|| j                   z   }|r|dk(  r|}|S |dz   |z   }|S |dk7  sJ |S )z2Get module name from a path in respect to package. r   Nr   __init__.py)r   relative_tor2   len)r8   r   r9   r"   rel_path_partsmodnameparts          r%   get_modname_from_pathrC   @   s     %))L((6<<NG
>Q"3B' 	DtOGsNG	 ".crlG,G")R-, N 6BC5G'5Q N #~~Nr'   resultsc                     t        | d       } | D cg c]  \  }}|	 }}}t        t        j                  |            S c c}}w )z4Sort and deduplicate a list of name, source entries.c                     | d   S Nr<    ys    r%   <lambda>z&sort_and_deduplicate.<locals>.<lambda>X   
    AbE r'   keysortedlistr   fromkeys)rD   r   sourceresults_sorteds       r%   sort_and_deduplicaterU   V   s@    W/2G/67|tVd7N7$$^455 8s   Ac                     t        | d       } | D cg c]  }|dd 	 }}t        t        j                  |            S c c}w )z<Sort and deduplicate a list of name, module, source entries.c                     | d   S rG   rH   rI   s    r%   rK   z,sort_and_deduplicate_tuple.<locals>.<lambda>a   rL   r'   rM   Nr<   rO   )rD   resultrT   s      r%   sort_and_deduplicate_tuplerY   ]   sD     W/2G078ffSbk8N8$$^455 9s   ?path
underlinedc                 @    |ryt        d | j                  D              S )NTc              3   @   K   | ]  }|j                  d          yw)_N)r   ).0rB   s     r%   	<genexpr>zshould_parse.<locals>.<genexpr>i   s     ?D4??3''?s   )allr2   )rZ   r[   s     r%   should_parserb   f   s    ?DJJ???r'   c              #     K   | j                   t        j                  t        j                  fv rH| j                  t
        j                  t
        j                  fv rt        d| j                  |d       yy| j                   t        j                  k(  rX| j                  sJ | j                  j                  dk(  sJ t        | j                  | j                  j                  |d       y| j                  sJ | j                  j                  d      D ]q  }|j                  dk(  r/t        |t        |j                   | j                        |d       At#        ||      sNt        |t        || j                        |d       s yw)z:Find all files to parse in a given path using __init__.py.NTr   Fz**/*.pyr=   )typer   r   r.   rS   r   r    r
   r   r   rZ   suffixr   r   globrC   parentrb   )r(   r[   files      r%   	get_filesri   l   s:     ||,,k.A.ABB>>foov~~>> w||ZFF ?	00	0|||||""e+++w||'8'8*eLL|||LL%%i0 	DyyM) )$++w||D	  dJ/ /gllCZQV 	s   E F
#'F
)N)T)F)__doc__pathlibr,   collectionsr   typingr   r   r   r   rope.base.projectr   defsr
   r   r   r   r   r   Pathr&   r0   r!   boolrC   intrU   rY   rb   ri   rH   r'   r%   <module>rs      s^   0  
 # 3 3 % V V >BM,,M)1'):MgMB\\$,W$5=@( QU\\)0IM,6$uS#X"7 6DI 66%S#&'6	%S/6@w|| @ @$ @ */"&z4%&r'   