
    ~_9                     T   d 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Zddl	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZ dd
lmZ ddl m!Z!m"Z" ddl#m$Z$ 	 ddl%m%Z% 	 ddl'm(Z( 	 ddl)m*Z* ede+ded   fd       Z, G d de
      Z- G d de-      Z. G d de-      Z/ G d de-      Z0 G d de-      Z1 G d de-      Z2 G d  d!e2      Z3 G d" d#e2      Z4 G d$ d%e-      Z5 G d& d'      Z6y# e&$ r dZ%Y w xY w# e&$ r dZ(Y w xY w# e&$ r dZ*Y w xY w)(z8Finders try to find right section for passed module name    N)ABCMetaabstractmethod)contextmanager)fnmatch)	lru_cache)glob)Path)	DictIterableIteratorListOptionalPatternSequenceTupleType)sections)KNOWN_SECTION_MAPPINGConfigexists_case_sensitive)pipreqs)parse_requirements)Pipfilepathreturnc              #      K   t        j                         }t        j                  |        	 d t        j                  |       y# t        j                  |       w xY ww)zKContext manager for changing dir and restoring previous workdir after exit.N)osgetcwdchdir)r   curdirs     :/usr/lib/python3/dist-packages/isort/deprecated/finders.pyr    r    (   s>      YY[FHHTN
s   *A!A A!AA!c                   <    e Zd ZdeddfdZededee   fd       Zy)
BaseFinderconfigr   Nc                     || _         y N)r%   )selfr%   s     r"   __init__zBaseFinder.__init__4   s	        module_namec                     t         r'   NotImplementedErrorr(   r+   s     r"   findzBaseFinder.find7       !!r*   )	__name__
__module____qualname__r   r)   r   strr   r0    r*   r"   r$   r$   3   s;    v $  " " " "r*   r$   )	metaclassc                   "    e Zd Zdedee   fdZy)ForcedSeparateFinderr+   r   c                     | j                   j                  D ]9  }|}|j                  d      sd|z  }t        ||      st        |d|z         s7|c S  y )N*z%s*.)r%   forced_separateendswithr   )r(   r+   r=   	path_globs       r"   r0   zForcedSeparateFinder.find=   sZ    #{{:: 	'O'I"++C0!O3	{I.'+sY2W&&	' r*   Nr2   r3   r4   r5   r   r0   r6   r*   r"   r9   r9   <   s    	 	 	r*   r9   c                   "    e Zd Zdedee   fdZy)LocalFinderr+   r   c                 (    |j                  d      ryy )Nr<   LOCALFOLDER)
startswithr/   s     r"   r0   zLocalFinder.findJ   s    !!#& r*   Nr@   r6   r*   r"   rB   rB   I   s      r*   rB   c                   T     e Zd Zdeddf fdZdedee   fdZdedee   fdZ	 xZ
S )	KnownPatternFinderr%   r   Nc                 X   t         	|   |       g | _        t        |j                        D ]  }t        j                  ||      j                         }d| }t        t        | j                  || j                  j                  j                  |g                   }|D cg c]  }| j                  |      D ]  }|  }}}|D ]Z  }d|j                  dd      j                  dd      z   dz   }| j                  j                  t        j                   |      |f       \  y c c}}w )Nknown_^r;   z.*?z.?$)superr)   known_patternsreversedr   r   getlowerlistgetattrr%   known_other_parse_known_patternreplaceappendrecompile)
r(   r%   	placementknown_placement
config_keyrN   known_patternpatternregexp	__class__s
            r"   r)   zKnownPatternFinder.__init__Q   s/    >@!&//2 	LI377	9MSSUO!/!23J!Z1H1H1L1L_^`1abN
 &4!#88G  N 
 "0 L}44S$?GGTRRUXX##**BJJv,>	+JKL	Ls   "D&r^   c           
         |j                  t        j                  j                        rt        j                  t        j                  j                  | j                  j                  |            D cg c]V  }t        j                  j                  t        j                  j                  | j                  j                  ||            r|X }}|S |g}|S c c}w )zIExpand pattern if identified as a directory and return found sub packages)	r>   r   r   seplistdirjoinr%   	directoryisdir)r(   r^   filenamepatternss       r"   rU   z'KnownPatternFinder._parse_known_patternd   s    BGGKK( !#

277<<8M8Mw+W X77==dkk.C.CWh!WX H    yHs   3ACr+   c                     |j                  d      fdt        t              dd      D        }|D ]-  }| j                  D ]  \  }}|j	                  |      s|c c S  / y )Nr<   c              3   F   K   | ]  }d j                  d|         yw)r<   N)rd   ).0first_kpartss     r"   	<genexpr>z*KnownPatternFinder.find.<locals>.<genexpr>t   s       cw%/!: cs   !r   )splitrangelenrN   match)r(   r+   module_names_to_checkmodule_name_to_checkr^   rZ   rm   s         @r"   r0   zKnownPatternFinder.findq   sr    !!#& c%PSTYPZ\]_aJb c$9 	% &*&9&9 %"==!56$$%	% r*   )r2   r3   r4   r   r)   r5   r   rU   r   r0   __classcell__r`   s   @r"   rG   rG   P   sG    Lv L$ L&C DI   r*   rG   c                   D     e Zd Zddededdf fdZdedee   fdZ xZS )	
PathFinderr%   r   r   Nc                    t         |   |       t        j                  j	                  |      }| d}||g| _        | j                  j                  xs t        j                  j                  d      | _        | j                  r.t        j                  j                  | j                        | _        d| _        | j                  r| j                   d| _        t        | j                   d      D ],  }|| j
                  vs| j
                  j                  |       . t        | j                   d      D ],  }|| j
                  vs| j
                  j                  |       . t        | j                   d      D ]=  }t        j                  j                  |      s#| j
                  j                  |       ? | j                  j                  xs# t        j                  j                  d      xs d| _        | j                  rt        j                  j                  | j                        | _        t        | j                   d      D ],  }|| j
                  vs| j
                  j                  |       . t        | j                   d      D ],  }	|	| j
                  vs| j
                  j                  |	       . t        j                  j!                  t#        j$                         d	         | _        | j&                  | j
                  vr%| j
                  j                  | j&                         t(        j                  d
d  D ],  }
|
| j
                  vs| j
                  j                  |
       . y )Nz/srcVIRTUAL_ENV z/src/z/lib/python*/site-packagesz/lib/python*/*/site-packagesz/src/*CONDA_PREFIXstdlib   )rM   r)   r   r   abspathpathsr%   virtual_envenvironrP   realpathvirtual_env_srcr   rW   rf   	conda_envnormcase	sysconfig	get_pathsstdlib_lib_prefixsys)r(   r%   r   root_dirsrc_dir	venv_pathnested_venv_pathvenv_src_path
conda_pathnested_conda_pathsystem_pathr`   s              r"   r)   zPathFinder.__init__}   s     77??4(Jd#(
  ;;22Sbjjnn]6S!ww//0@0@AD!&*&6&6%7u#=D !T%5%5$66P"QR 1	DJJ.JJ%%i01 %)D,<,<+==Y)Z$[ 8 #4::5JJ%%&678 "&)9)9(:&&A!B 577==/JJ%%m45
 ..V"**..2PVTV>>WW--dnn=DN"dnn%55O#PQ 2
TZZ/JJ%%j12 &*T^^,<<X*Y%Z 9!$DJJ6JJ%%&789
 "$!1!1)2E2E2G2Q!R!!3JJd445 88AB< 	/K$**,

!!+.	/r*   r+   c                 P   | j                   D ]  }dj                  ||j                  d      d   f      t              j	                         }t        dz         xs< t        fdt        j                  j                  D              xs t        dz         }t              xr t        j                  j                        }|s|sd|v sd|v s| j                  r | j                  |v rt        j                   c S t        j                  j#                  |      | j$                  k(  rt        j&                  c S | j(                  r | j(                  |v rt        j                   c S | j*                  j,                  D ]@  }||j.                  v s| j*                  j1                  |      r.t        j2                  c c S  t        j                  j#                  |      j5                  | j$                        rt        j&                  c S | j*                  j6                  c S  y )	N/r<   r   z.pyc              3   :   K   | ]  }t        |z           y wr'   r   )rk   
ext_suffixpackage_paths     r"   rn   z"PathFinder.find.<locals>.<genexpr>   s#      " *,*CDs   z/__init__.pyzsite-packageszdist-packages)r   rd   rp   r	   resolver   any	importlib	machineryEXTENSION_SUFFIXESr   r   rf   r   r   r   
THIRDPARTYr   r   STDLIBr   r%   	src_pathsparents
is_skipped
FIRSTPARTYrE   default_section)r(   r+   prefixpath_obj	is_module
is_packagesrc_pathr   s          @r"   r0   zPathFinder.find   s   jj 	3F88V[->->s-CA-F$GHLL)113H%lU&:; H &/&9&9&L&L H
 ))FG  /|<\|A\JJ#v-&&0((T-A-AV-K#...WW%%f-1G1GG#??*^^&(@#... $ 5 5 3H8#3#33DKK<R<RS[<\'2223 77##F+66t7M7MN#??*{{222=	3> r*   r<   )	r2   r3   r4   r   r5   r)   r   r0   rv   rw   s   @r"   ry   ry   |   s5    ,/v ,/S ,/4 ,/\     r*   ry   c                       e Zd ZdZddededdf fdZededee   fd       Z	ededee   fd       Z
edeeeef      fd	       Zdee   fd
Zededee   fd       Zdee   fdZdedefdZdedee   fdZ xZS )ReqsBaseFinderFr%   r   r   Nc                     t         |   |       || _        | j                  r+| j	                         | _        | j                         | _        y y r'   )rM   r)   r   enabled_load_mappingmapping_load_namesnames)r(   r%   r   r`   s      r"   r)   zReqsBaseFinder.__init__   sC     	<<--/DL))+DJ r*   c                     t         r'   r-   r(   r   s     r"   
_get_nameszReqsBaseFinder._get_names   r1   r*   c                     t         r'   r-   r   s     r"   _get_files_from_dirz"ReqsBaseFinder._get_files_from_dir   r1   r*   c                  d   t         syt        j                  j                  t	        j
                  t                     } t        j                  j                  | d      } t        |       5 }i }|D ]*  }|j                         j                  d      \  }}}|||<   , |cddd       S # 1 sw Y   yxY w)zxReturn list of mappings `package_name -> module_name`

        Example:
            django-haystack -> haystack
        Nr   :)
r   r   r   dirnameinspectgetfilerd   openstrip	partition)r   fmappingslineimport_name_	pypi_names          r"   r   zReqsBaseFinder._load_mapping   s     wwww78ww||D),$Z 	1')H 2,0JJL,B,B3,G)Q	&1#2 	 	 	s   )3B&&B/c                     g }| j                         D ]8  }| j                  |      D ]"  }|j                  | j                  |             $ : |S )z3Return list of thirdparty modules from requirements)
_get_filesr   rW   _normalize_name)r(   r   r   names       r"   r   zReqsBaseFinder._load_names   sS    OO% 	9D- 9T11$789	9 r*   c              #   r   K   d}| |k7  r,| }|  t         j                  j                  |       } | |k7  r+y y w)Nr|   )r   r   r   )r   prevs     r"   _get_parentszReqsBaseFinder._get_parents   s7     dlDJ77??4(D dls   277c              #   <  K   t         j                  j                  | j                        }t         j                  j                  |      rt         j                  j	                  |      }| j                  |      D ]  }| j                  |      E d{     y7 w)z&Return paths to all requirements filesN)r   r   r   isfiler   r   r   r   s     r"   r   zReqsBaseFinder._get_files  so     wwtyy)77>>$77??4(D%%d+ 	6D//555	65s   BBBBr   c                     | j                   r,| j                   j                  |j                  dd      |      }|j                         j                  dd      S )zConvert package name to module name

        Examples:
            Django -> django
            django-haystack -> django_haystack
            Flask-RESTFul -> flask_restful
        -r   )r   rP   rV   rQ   )r(   r   s     r"   r   zReqsBaseFinder._normalize_name  sE     <<<<##DLLc$:DADzz|##C--r*   r+   c                     | j                   sy |j                  d      \  }}}|j                         }|sy | j                  D ]  }||k(  s	t        j
                  c S  y )Nr<   )r   r   rQ   r   r   r   )r(   r+   _sep_submodulesr   s        r"   r0   zReqsBaseFinder.find  sc    ||)4)>)>s)C&T;!'')JJ 	+Dd"***	+ r*   r   )r2   r3   r4   r   r   r5   r)   r   r   r   r   staticmethodr   r
   r   r   r   r   r   r   r0   rv   rw   s   @r"   r   r      s   G,v ,S ,4 , "s "x} " " " " " " 8DcN3  $T#Y  )3 )8C= ) )6HSM 6
.C 
.C 
.  r*   r   c                       e Zd ZdZ ee      Zdedee   fdZ	e
 ed      dedee   fd              Zdedee   fdZe
 ed      dedee   fd	              Zy
)RequirementsFinder)z.txtz.inr   r   c              #   B   K   | j                  |      E d{    y7 w)z3Return paths to requirements files from passed dir.N)_get_files_from_dir_cachedr   s     r"   r   z&RequirementsFinder._get_files_from_dir,  s     224888      )maxsizec           	      P   g }t        j                  |      D ]
  }d|vr	t         j                  j                  ||      }t         j                  j	                  |      rmt        j                  |      D ]T  }| j
                  D ]C  }|j                  |      s|j                  t         j                  j                  ||             E V t         j                  j                  |      s| j
                  D ]'  }|j                  |      s|j                  |        
  |S )Nrequirements)	r   rc   r   rd   rf   extsr>   rW   r   )clsr   resultsfname	full_pathsubfile_nameexts          r"   r   z-RequirementsFinder._get_files_from_dir_cached0  s     ZZ% 	EU*T51I ww}}Y'$&JJy$9 RL"xx R'005#NN277<<	<+PQRR  ww~~i(88 C~~c*y1	( r*   c              #   B   K   | j                  |      E d{    y7 w)z5Load required packages from path to requirements fileN)_get_names_cachedr   s     r"   r   zRequirementsFinder._get_namesK  s     ))$///r   c                    g }t        t        j                  j                  |            5  t	        |      }|j                         D ]*  }|j                  s|j                  |j                         , 	 d d d        |S # 1 sw Y   |S xY wr'   )r    r   r   r   r   valuesr   rW   )r   r   resultr   reqs        r"   r   z$RequirementsFinder._get_names_cachedO  su     277??4() 	,-d3L#**, ,88MM#((+,	, 	, s   +A?A??B	N)r2   r3   r4   r   boolr   r   r5   r   r   classmethodr   r   r   r   r   r6   r*   r"   r   r   (  s    D%&G9 9 9 rc d3i   20s 0x} 0 r	S 	T#Y 	  	r*   r   c                   H    e Zd Z ee      Zdedee   fdZdedee   fdZ	y)PipfileFinderr   r   c              #      K   t        |      5  t        j                  |      }|j                  D ]  }|j                    	 d d d        y # 1 sw Y   y xY wwr'   )r    r   loadpackagesr   )r(   r   projectr   s       r"   r   zPipfileFinder._get_names`  sM     4[ 	ll4(G'' hh	 	 	s   A5A	AAAc              #   D   K   dt        j                  |      v r| y y w)Nr   )r   rc   r   s     r"   r   z!PipfileFinder._get_files_from_dirf  s!     

4((J )s    N)
r2   r3   r4   r   r   r   r5   r   r   r   r6   r*   r"   r   r   ]  s9    7mGs x}   r*   r   c                   "    e Zd Zdedee   fdZy)DefaultFinderr+   r   c                 .    | j                   j                  S r'   )r%   r   r/   s     r"   r0   zDefaultFinder.findl  s    {{***r*   Nr@   r6   r*   r"   r   r   k  s    + + +r*   r   c                   v    e Zd ZU eeeeeee	fZ
eee      ed<   	 d	dedeeee         ddfdZdedee   fdZy)
FindersManager_default_finders_classesNr%   finder_classesr   c                    |j                   | _         || j                  }g }|D ]  }	 |j                   ||              t        |      | _        y # t        $ r1}| j                   rt	        |j
                   d| d       Y d }~cd }~ww xY w)N encountered an error (z)) during instantiation and cannot be used)verboser   rW   	Exceptionprintr2   tuplefinders)r(   r%   r   r  
finder_cls	exceptions         r"   r)   zFindersManager.__init__{  s     $^^!!::N$&( 	J
z&12	 05W~  <<)2233J9+ V? ?s   A	B'BBr+   c           
          | j                   D ]  }	 |j                  |      }||c S  y # t        $ r>}| j                  r(t	        |j
                  j                   d| d| d       Y d }~`d }~ww xY w)Nr   z) while trying to identify the z module)r  r0   r   r   r   r`   r2   )r(   r+   findersectionr  s        r"   r0   zFindersManager.find  s    ll 	F ++k2&"N '	    <<!++4455LYK X22=gG	s   +	A24A--A2r'   )r2   r3   r4   r9   rB   rG   ry   r   r   r   r   r   r   r$   __annotations__r   r   r   r)   r5   r0   r6   r*   r"   r   r   p  sz    <htJ'78  VZ>>.6xZ@P7Q.R>	>,  r*   r   )7__doc__importlib.machineryr   r   r   os.pathrX   r   r   abcr   r   
contextlibr   r   	functoolsr   r   pathlibr	   typingr
   r   r   r   r   r   r   r   r   isortr   isort.settingsr   r   isort.utilsr   r   ImportErrorpip_apir   requirementslibr   r5   r    r$   r9   rB   rG   ry   r   r   r   r   r   r6   r*   r"   <module>r     s?   >   	  	 
  ' %     [ [ [  8 -
*
'    "7 "
: 
* ) )XO OdWZ Wt2 2jN +J +
/ /q
  G    Gs6   0D 7D >D DDDDD'&D'