3
K^3              %   @   s  d Z ddlmZmZmZmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ ddlmZmZ ydd	lmZ W n ek
r   dZY nX ydd
lmZ W n ek
r   dZY nX yddlmZ W n ek
r   dZY nX yddlmZ W n" ek
r0   ddlmZ Y nX dddddZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd de#Z$G d d! d!e#Z%G d"d# d#eZ&G d$d% d%eZ'dS )&z9Finders try to find right section for passed module name
    )absolute_importdivisionprint_functionunicode_literalsN)fnmatch)glob   )PY2)chdirexists_case_sensitive)pipreqs)parse_requirements)Pipfile)	lru_cacheZSTANDARD_LIBRARYZFUTURE_LIBRARYZFIRST_PARTYZTHIRD_PARTY)STDLIBZFUTUREZ
FIRSTPARTY
THIRDPARTYc               @   s   e Zd Zdd ZdS )
BaseFinderc             C   s   || _ || _d S )N)configsections)selfr   r    r   1/tmp/pip-unpacked-wheel-33jdb_it/isort/finders.py__init__/   s    zBaseFinder.__init__N)__name__
__module____qualname__r   r   r   r   r   r   .   s   r   c               @   s   e Zd Zdd ZdS )ForcedSeparateFinderc             C   sJ   xD| j d D ]6}|}|jds&d| }t||s>t|d| r|S qW d S )Nforced_separate*z%s*.)r   endswithr   )r   module_namer   	path_globr   r   r   find5   s    
zForcedSeparateFinder.findN)r   r   r   r#   r   r   r   r   r   4   s   r   c               @   s   e Zd Zdd ZdS )LocalFinderc             C   s   |j dr| jjS d S )Nr   )
startswithr   ZLOCALFOLDER)r   r!   r   r   r   r#   A   s    
zLocalFinder.findN)r   r   r   r#   r   r   r   r   r$   @   s   r$   c                   s8   e Zd Z fddZedd Zdd Zdd Z  ZS )	KnownPatternFinderc       	         s   t t j|| g  _xt jD ]~}tj||}dj|j	 } j
j|g } fdd|D }x>|D ]6}d|jddjdd d	 } jjtj||f qhW q$W d S )
Nz	known_{0}c                s    g | ]} j |D ]}|qqS r   )_parse_known_pattern).0known_patternpattern)r   r   r   
<listcomp>P   s   z/KnownPatternFinder.__init__.<locals>.<listcomp>^r   z.*?z.?$)superr&   r   known_patternsreversedr   KNOWN_SECTION_MAPPINGgetformatlowerr   replaceappendrecompile)	r   r   r   	placementZknown_placementZ
config_keyr0   r)   regexp)	__class__)r   r   r   G   s    

zKnownPatternFinder.__init__c             C   s*   t rtjjtjj| dS tjj| S dS )z7
        Evaluates if path is a python package
        z__init__.pyN)r	   ospathexistsjoinisdir)r>   r   r   r   _is_packageX   s    zKnownPatternFinder._is_packagec                s4    j tjjr* fddtj D }n g}|S )z[
        Expand pattern if identified as a directory and return found sub packages
        c                s$   g | ]}j tjj |r|qS r   )rB   r=   r>   r@   )r(   filename)r*   r   r   r   r+   h   s   z;KnownPatternFinder._parse_known_pattern.<locals>.<listcomp>)r    r=   r>   seplistdir)r   r*   patternsr   )r*   r   r   r'   b   s
    z'KnownPatternFinder._parse_known_patternc                s\   |j d  fddtt ddD }x.|D ]&}x | jD ]\}}|j|r:|S q:W q.W d S )Nr   c             3   s    | ]}d j  d| V  qdS )r   N)r@   )r(   Zfirst_k)partsr   r   	<genexpr>t   s    z*KnownPatternFinder.find.<locals>.<genexpr>r   r   )splitrangelenr0   match)r   r!   Zmodule_names_to_checkZmodule_name_to_checkr*   r:   r   )rG   r   r#   q   s    


zKnownPatternFinder.find)	r   r   r   r   staticmethodrB   r'   r#   __classcell__r   r   )r<   r   r&   F   s   
r&   c                   s$   e Zd Z fddZdd Z  ZS )
PathFinderc                s  t t| j|| tj g| _| jjdp4tjjd| _	| j	rNtj
j| j	| _	d| _| j	rdj| j	| _x.tdj| j	D ]}|| jkrz| jj| qzW x.tdj| j	D ]}|| jkr| jj| qW x0tdj| j	D ]}tj
j|r| jj| qW | jjdptjjd	| _| jrtj
j| j| _x2tdj| jD ]}|| jkr@| jj| q@W x2tdj| jD ]}|| jkrt| jj| qtW tj
jtj d
 | _| j| jkr| jj| j tjdpd| _x0tj
dd  D ]}|| jkr| jj| qW d S )Nvirtual_envVIRTUAL_ENVFz{0}/src/z{0}/lib/python*/site-packagesz{0}/lib/python*/*/site-packagesz	{0}/src/*	conda_envZCONDA_PREFIXstdlib
EXT_SUFFIXz.sor   )r/   rP   r   r=   getcwdpathsr   r3   environrQ   r>   realpathvirtual_env_srcr4   r   r7   rA   rS   normcase	sysconfig	get_pathsstdlib_lib_prefixget_config_var
ext_suffixsys)r   r   r   r>   )r<   r   r   r   |   sB    

zPathFinder.__init__c             C   s   x| j D ]}dj||jdd f}t|d pTt|d pTt|| j pTt|d }t|ohtjj|}|sr|rd|kr| jj	S d|kr| jj	S | j
r| j|kr| jj	S | jr| j|kr| jj	S tjj|j| jr| jjS | jd	 S qW d S )
N/r   r   z.pyz.soz/__init__.pyzsite-packageszdist-packagesdefault_section)rW   r@   rJ   r   r`   r=   r>   rA   r   r   rQ   rZ   rS   r[   r%   r^   r   r   )r   r!   prefixZpackage_pathZ	is_module
is_packager   r   r   r#      s&    zPathFinder.find)r   r   r   r   r#   rO   r   r   )r<   r   rP   {   s   /rP   c                   sV   e Zd Zd fdd	Zedd Zdd Zedd	 Zd
d Zdd Z	dd Z
  ZS )ReqsBaseFinderr   c                s6   t t| j|| || _| jr2| j | _| j | _d S )N)	r/   rf   r   r>   enabled_load_mappingmapping_load_namesnames)r   r   r   r>   )r<   r   r   r      s
    
zReqsBaseFinder.__init__c           
   C   sN   t sdS tjjtjt } tjj| d} t| }tdd |D S Q R X dS )zxReturn list of mappings `package_name -> module_name`

        Example:
            django-haystack -> haystack
        Nri   c             s   s&   | ]}|j  jd ddd V  qdS ):Nr   rI   )striprJ   )r(   liner   r   r   rH      s    z/ReqsBaseFinder._load_mapping.<locals>.<genexpr>)	r   r=   r>   dirnameinspectgetfiler@   opendict)r>   fr   r   r   rh      s    
zReqsBaseFinder._load_mappingc             C   s>   g }x4| j  D ](}x"| j|D ]}|j| j| qW qW |S )z<Return list of thirdparty modules from requirements
        )
_get_files
_get_namesr7   _normalize_name)r   rk   r>   namer   r   r   rj      s
    zReqsBaseFinder._load_namesc             c   s,   d}x"| |kr&| }| V  t jj| } qW d S )N )r=   r>   ro   )r>   prevr   r   r   _get_parents   s
    
zReqsBaseFinder._get_parentsc             c   sX   t jj| j}t jj|r&t jj|}x,| j|D ]}x| j|D ]
}|V  qBW q2W dS )z/Return paths to all requirements files
        N)r=   r>   abspathisfilero   r{   _get_files_from_dir)r   r>   	file_pathr   r   r   ru      s    zReqsBaseFinder._get_filesc             C   s$   | j r| j j||}|j jddS )zConvert package name to module name

        Examples:
            Django -> django
            django-haystack -> haystack
            Flask-RESTFul -> flask_restful
        -_)ri   r3   r5   r6   )r   rx   r   r   r   rw      s    zReqsBaseFinder._normalize_namec             C   sN   | j s
d S |jd\}}}|j }|s*d S x| jD ]}||kr2| jjS q2W d S )Nr   )rg   	partitionr5   rk   r   r   )r   r!   Z_sepZ_submodulesrx   r   r   r   r#      s    zReqsBaseFinder.find)r   )r   r   r   r   rN   rh   rj   r{   ru   rw   r#   rO   r   r   )r<   r   rf      s   	rf   c               @   sT   e Zd ZdZeeZdd Zee	dddd Z
d	d
 Zee	dddd ZdS )RequirementsFinder.txt.inc             C   s
   t j|S )z<Return paths to requirements files from passed dir.
        )r   _get_files_from_dir_cached)r   r>   r   r   r   r~     s    z&RequirementsFinder._get_files_from_dir   )maxsizec             C   s   g }xt j|D ]}d|krqt jj||}t jj|r|x@t j|D ]2}x,| jD ]"}|j|rP|jt jj|| qPW qDW qt jj|rx$| jD ]}|j|r|j| P qW qW |S )Nrequirements)	r=   rE   r>   r@   rA   extsr    r7   r}   )clsr>   resultfname	full_pathZsubfile_nameextr   r   r   r     s"    



z-RequirementsFinder._get_files_from_dir_cachedc             C   s
   t j|S )z>Load required packages from path to requirements file
        )r   _get_names_cached)r   r>   r   r   r   rv   3  s    zRequirementsFinder._get_namesc          
   C   sP   g }t tjj|2 t|}x"|j D ]}|jr(|j|j q(W W d Q R X |S )N)r
   r=   r>   ro   r   valuesrx   r7   )r   r>   resultsr   reqr   r   r   r   8  s    z$RequirementsFinder._get_names_cachedN)r   r   )r   r   r   r   boolr   rg   r~   classmethodr   r   rv   r   r   r   r   r   r     s   r   c               @   s$   e Zd ZeeZdd Zdd ZdS )PipfileFinderc          	   c   s:   t |( tj|}x|jD ]}|jV  qW W d Q R X d S )N)r
   r   loadpackagesrx   )r   r>   projectr   r   r   r   rv   I  s    

zPipfileFinder._get_namesc             c   s   dt j|kr|V  d S )Nr   )r=   rE   )r   r>   r   r   r   r~   O  s    z!PipfileFinder._get_files_from_dirN)r   r   r   r   r   rg   rv   r~   r   r   r   r   r   F  s   r   c               @   s   e Zd Zdd ZdS )DefaultFinderc             C   s
   | j d S )Nrc   )r   )r   r!   r   r   r   r#   U  s    zDefaultFinder.findN)r   r   r   r#   r   r   r   r   r   T  s   r   c               @   s0   e Zd Zeeeeeee	fZ
dddZdd ZdS )FindersManagerNc             C   s   |j dd| _|d kr| jn|}g | _xb|D ]Z}y| jj||| W q, tk
r } z"| jrttdj|jt| W Y d d }~X q,X q,W t	| j| _d S )NverboseFzD{} encountered an error ({}) during instantiation and cannot be used)
r3   r   findersr7   	Exceptionprintr4   r   strtuple)r   r   r   r   finder	exceptionr   r   r   r   d  s    

"zFindersManager.__init__c             C   sp   xj| j D ]`}y|j|}W n@ tk
rZ } z$| jrJtdj|jt|| W Y d d }~X nX |d k	r|S qW d S )NzC{} encountered an error ({}) while trying to identify the {} module)r   r#   r   r   r   r4   r   r   )r   r!   r   sectionr   r   r   r   r#   s  s    
zFindersManager.find)N)r   r   r   r   r$   r&   rP   r   r   r   r   r   r#   r   r   r   r   r   Y  s   
r   )(__doc__
__future__r   r   r   r   rp   r=   os.pathr8   ra   r\   r   r   Z	pie_slicer	   utilsr
   r   r   ImportErrorZpip_apir   Zrequirementslibr   	functoolsr   Zbackports.functools_lru_cacher2   objectr   r   r$   r&   rP   rf   r   r   r   r   r   r   r   r   <module>   sR   


5FN7