Ë
    pPêj&  ã                  óþ   — U d Z ddlm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mZmZmZ ddlmZ  ee«      Zd	ed
<    G d„ de«      Z	 	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Z G d„ d«      Zdd„Zdd„Zy)z5Routines for finding the sources that mypy will checké    )ÚannotationsN)ÚSequence)ÚFinal)ÚFileSystemCache)ÚPYTHON_EXTENSIONSÚBuildSourceÚmatches_excludeÚmatches_gitignoreÚ	mypy_path)ÚOptionsr   ÚPY_EXTENSIONSc                  ó   — e Zd ZdZy)ÚInvalidSourceListzDException indicating a problem in the list of sources given to mypy.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úV/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/mypy/find_sources.pyr   r      s   „ ÚNr   r   c           	     ó8  — |xs
 t        «       }t        ||«      }g }| D ]ø  }t        j                  j	                  |«      }|j                  t        «      r2|j                  |«      \  }}|j                  t        ||d|«      «       Œi|j                  |«      r6|j                  |«      }	|	s|st        d|› d�«      ‚|j                  |	«       Œ°|j                  rt        j                  j                  |«      nd}
|j                  t        ||
d«      «       Œú |S )ztFrom a list of source files/directories, makes a list of BuildSources.

    Raises InvalidSourceList on errors.
    Nz(There are no .py[i] files in directory 'ú')r   ÚSourceFinderÚosÚpathÚnormpathÚendswithr   Úcrawl_upÚappendr   ÚisdirÚfind_sources_in_dirr   ÚextendÚscripts_are_modulesÚbasename)ÚpathsÚoptionsÚfscacheÚallow_empty_dirÚfinderÚsourcesr   ÚnameÚbase_dirÚsub_sourcesÚmods              r   Úcreate_source_listr/      sù   € ð Ò*œÓ*€GÜ˜' 7Ó+€Fà€GØò 9ˆÜ�w‰w×Ñ Ó%ˆØ�=‰=œÔ'à#Ÿ_™_¨TÓ2‰NˆD�(Ø�N‰Nœ; t¨T°4¸ÓBÕCØ�]‰]˜4Ô Ø ×4Ñ4°TÓ:ˆKÙ¡Ü'Ð*RÐSWÐRXÐXYÐ(ZÓ[Ð[Ø�N‰N˜;Õ'à,3×,GÒ,G”"—'‘'×"Ñ" 4Ô(ÈTˆCØ�N‰Nœ; t¨S°$Ó7Õ8ð9ð €Nr   c                ó¢   — t         j                  j                  | «      \  }}t        t        «      D ]  \  }}||k(  sŒ|dk7  ||fc S  |dk7  d| fS )zŽDetermines sort order for directory listing.

    The desirable properties are:
    1) foo < foo.pyi < foo.py
    2) __init__.py[i] < foo
    Ú__init__éÿÿÿÿ)r   r   ÚsplitextÚ	enumerater   )r+   ÚbaseÚsuffixÚiÚexts        r   Úkeyfuncr9   :   sa   € ô —7‘7×#Ñ# DÓ)�L€Dˆ&ÜœMÓ*ò 1‰ˆˆ3Ø�S‹=Ø˜JÑ&¨¨4Ð0Ò0ð1ð �JÑ  DÐ)Ð)r   c                ó°   — | st         j                  } t         j                  j                  | «      } | j	                  t         j
                  «      r| d d } | S )Nr2   )r   Úcurdirr   Úabspathr   Úsep)Úroots    r   Únormalise_package_baser?   H   s@   € ÙÜ�y‰yˆÜ�7‰7�?‰?˜4Ó €DØ‡}�}”R—V‘VÔØ�C�RˆyˆØ€Kr   c                ó²   — | j                   syt        «       | j                  z   t        j                  «       gz   }|D �cg c]  }t	        |«      ‘Œ c}S c c}w )a«  Returns explicit package bases to use if the option is enabled, or None if disabled.

    We currently use MYPYPATH and the current directory as the package bases. In the future,
    when --namespace-packages is the default could also use the values passed with the
    --package-root flag, see #9632.

    Values returned are normalised so we can use simple string comparisons in
    SourceFinder.is_explicit_package_base
    N)Úexplicit_package_basesr   r   Úgetcwdr?   )r&   Úrootsr>   s      r   Úget_explicit_package_basesrD   Q   sI   € ð ×)Ò)ØÜ‹K˜'×+Ñ+Ñ+¬r¯y©y«{¨mÑ;€EØ5:Ö;¨TÔ" 4Õ(Ò;Ð;ùÒ;s   ¿Ac                  ób   — e Zd Zd	d„Zd
d„Zdd„Zdd„Zdd„Zej                  dd„«       Z
dd„Zy)r   c                óº   — || _         t        |«      | _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        y ©N)r'   rD   rA   Únamespace_packagesÚexcludeÚexclude_gitignoreÚ	verbosity)Úselfr'   r&   s      r   r1   zSourceFinder.__init__b   sJ   € ØˆŒÜ&@ÀÓ&IˆÔ#Ø")×"<Ñ"<ˆÔØ—‘ˆŒØ!(×!:Ñ!:ˆÔØ ×*Ñ*ˆ�r   c                óL   — | j                   sJ ‚t        |«      | j                   v S rG   )rA   r?   )rL   r   s     r   Úis_explicit_package_basez%SourceFinder.is_explicit_package_basej   s'   € Ø×*Ò*Ð*Ð*Ü% dÓ+¨t×/JÑ/JÐJÐJr   c           	     ó>  — g }t        «       }t        | j                  j                  |«      t        ¬«      }|D �]`  }|dv s|j                  d«      rŒt        j                  j                  ||«      }t        || j                  | j                  | j                  dk\  «      rŒj| j                  r%t        || j                  | j                  dk\  «      rŒ›| j                  j                  |«      r7| j                  |«      }|sŒÊ|j!                  |«       |j#                  |«       Œít        j                  j%                  |«      \  }}	||vs�Œ|	t&        v s�Œ|j!                  |«       | j)                  |«      \  }
}|j+                  t-        ||
d |«      «       �Œc |S )N)Úkey)Ú__pycache__zsite-packagesÚnode_modulesú.é   )ÚsetÚsortedr'   Úlistdirr9   Ú
startswithr   r   Újoinr	   rI   rK   rJ   r
   r    r!   Úaddr"   r3   r   r   r   r   )rL   r   r*   ÚseenÚnamesr+   Úsubpathr-   Ústemr6   Úmoduler,   s               r   r!   z SourceFinder.find_sources_in_dirn   sR  € Øˆä›ˆÜ�t—|‘|×+Ñ+¨DÓ1´wÔ?ˆØó 	QˆDàÐGÑGÈ4Ï?É?Ð[^ÔK_ØÜ—g‘g—l‘l 4¨Ó.ˆGä˜w¨¯©°d·l±lÀDÇNÁNÐVWÑDWÔXØØ×%Ò%Ô*;Ø˜Ÿ™ t§~¡~¸Ñ':ô+ð à�|‰|×!Ñ! 'Ô*Ø"×6Ñ6°wÓ?�ÚØ—H‘H˜T”NØ—N‘N ;Õ/ä!Ÿw™w×/Ñ/°Ó5‘��fØ˜tÓ#¨´-Ó(?Ø—H‘H˜T”NØ'+§}¡}°WÓ'=Ñ$�F˜HØ—N‘N¤;¨w¸ÀÀhÓ#OÖPð/	Qð2 ˆr   c                óü   — t         j                  j                  |«      }t         j                  j                  |«      \  }}t	        |«      xs |}| j                  |«      \  }}|dk(  r||fS t        ||«      }||fS )a^  Given a .py[i] filename, return module and base directory.

        For example, given "xxx/yyy/foo/bar.py", we might return something like:
        ("foo.bar", "xxx/yyy")

        If namespace packages is off, we crawl upwards until we find a directory without
        an __init__.py

        If namespace packages is on, we crawl upwards until the nearest explicit base directory.
        Failing that, we return one past the highest directory containing an __init__.py

        We won't crawl past directories with invalid package names.
        The base directory returned is an absolute path.
        r1   )r   r   r<   ÚsplitÚstrip_pyÚcrawl_up_dirÚmodule_join)rL   r   ÚparentÚfilenameÚmodule_nameÚparent_moduler,   r_   s           r   r   zSourceFinder.crawl_upŽ   s}   € ô �w‰w�‰˜tÓ$ˆÜŸ7™7Ÿ=™=¨Ó.Ñˆ�ä˜xÓ(Ò4¨Hˆà"&×"3Ñ"3°FÓ";Ñˆ�xØ˜*Ò$Ø  (Ð*Ð*ô ˜]¨KÓ8ˆØ�xÐÐr   c                ó0   — | j                  |«      xs d|fS )NÚ )Ú_crawl_up_helper)rL   Údirs     r   rc   zSourceFinder.crawl_up_dir«   s   € Ø×$Ñ$ SÓ)Ò6¨b°#¨YÐ6r   c                ó"  — | j                   �| j                  |«      rd|fS t        j                  j	                  |«      \  }}|j                  d«      }| j                  |«      }|�`|j                  «       s.t        |› dt        j                  j                  |«      › d�«      ‚| j                  |«      \  }}t        ||«      |fS |r|r|j                  «       sy| j                  sy| j                  |«      }|€y|\  }}t        ||«      |fS )a¡  Given a directory, maybe returns module and base directory.

        We return a non-None value if we were able to find something clearly intended as a base
        directory (as adjudicated by being an explicit base directory or by containing a package
        with __init__.py).

        This distinction is necessary for namespace packages, so that we know when to treat
        ourselves as a subpackage.
        Nrj   z-stubsz
 contains z' but is not a valid Python package name)rA   rN   r   r   ra   ÚremovesuffixÚget_init_fileÚisidentifierr   r$   rc   rd   rH   rk   )rL   rl   re   r+   Ú	init_fileÚ
mod_prefixr,   Úresults           r   rk   zSourceFinder._crawl_up_helper®   s,  € ð ×&Ñ&Ð2°t×7TÑ7TÐUXÔ7YØ�s�7ˆNä—w‘w—}‘} SÓ)‰ˆ�Ø× Ñ  Ó*ˆð ×&Ñ& sÓ+ˆ	ØÐ Ø×$Ñ$Ô&ô (Ø�f˜J¤r§w¡w×'7Ñ'7¸	Ó'BÐ&Cð D=ð =óð ð
 $(×#4Ñ#4°VÓ#<Ñ ˆJ˜Ü˜z¨4Ó0°(Ð:Ð:ñ ™6¨×):Ñ):Ô)<Øð ×&Ò&Øð ×&Ñ& vÓ.ˆØˆ>ð ð  &Ñˆ
�HÜ˜: tÓ,¨hÐ6Ð6r   c                óè   — t         D ]i  }t        j                  j                  |d|z   «      }| j                  j                  |«      r|c S |dk(  sŒK| j                  j                  |«      sŒg|c S  y)zêCheck whether a directory contains a file named __init__.py[i].

        If so, return the file's name (with dir prefixed).  If not, return None.

        This prefers .pyi over .py (because of the ordering of PY_EXTENSIONS).
        r1   z.pyN)r   r   r   rY   r'   ÚisfileÚinit_under_package_root)rL   rl   r8   Úfs       r   ro   zSourceFinder.get_init_fileâ   se   € ô !ò 	ˆCÜ—‘—‘˜S *¨sÑ"2Ó3ˆAØ�|‰|×"Ñ" 1Ô%Ø’Ø�e‹| §¡× DÑ DÀQÕ GØ’ð	ð r   N)r'   r   r&   r   ÚreturnÚNone)r   Ústrrx   Úbool)r   rz   rx   úlist[BuildSource])r   rz   rx   útuple[str, str])rl   rz   rx   r}   )rl   rz   rx   ztuple[str, str] | None)rl   rz   rx   ú
str | None)r   r   r   r1   rN   r!   r   rc   Ú	functoolsÚ	lru_cacherk   ro   r   r   r   r   r   a   s=   „ ó+óKóó@ ó:7ð ×Ñò17ó ð17ôfr   r   c                ó   — | r| dz   |z   S |S )z8Join module ids, accounting for a possibly empty parent.rS   r   )re   Úchilds     r   rd   rd   ò   s   € áØ˜‰|˜eÑ#Ð#Ø€Lr   c                ó^   — t         D ]$  }| j                  |«      sŒ| dt        |«        c S  y)zVStrip a trailing .py or .pyi suffix.

    Return None if no such suffix is found.
    N)r   r   Úlen)Úargr8   s     r   rb   rb   ù   s7   € ô
 ò $ˆØ�<‰<˜ÕØ�{œ#˜c›(˜Ð#Ò#ð$ð r   )NF)
r%   zSequence[str]r&   r   r'   zFileSystemCache | Noner(   r{   rx   r|   )r+   rz   rx   ztuple[bool, int, str])r>   rz   rx   rz   )r&   r   rx   zlist[str] | None)re   rz   r‚   rz   rx   rz   )r…   rz   rx   r~   )r   Ú
__future__r   r   r   Úcollections.abcr   Útypingr   Úmypy.fscacher   Úmypy.modulefinderr   r   r	   r
   r   Úmypy.optionsr   Útupler   Ú__annotations__Ú	Exceptionr   r/   r9   r?   rD   r   rd   rb   r   r   r   ú<module>r�      s¨   ðÚ ;å "ã Û 	Ý $Ý å (÷õ õ !áÐ.Ó/€ˆuÓ /ôO˜	ô Oð '+Ø!ð	Øðàðð $ðð ð	ð
 óó>*óó<÷ Nñ Nóbôr   