o
    2gt                     @  s@  U d Z ddl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	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 ddlmZ ddlZdd	lmZ dd
lmZm Z m!Z! ej"#eZ$ddgZ%de&d< G dd deZ'G dd deZ(ee'e(f Z)de&d< deddZ*dfddZ+G dd dej,Z-dgd!d"Z.eG d#d$ d$Z/dhd(d)Z0did,d-Z1did.d/Z2djd1d2Z3dkd6d7Z4dld9d:Z5dld;d<Z6dmd?d@Z7ej8dAdBdndEdFZ9dodKdLZ:e;dMZ<dpdTdUZ=G dVdW dWej>Z?G dXdY dYeZ@G dZdO dOejAZBdqd\d]ZCdrd`daZDdrdbdcZEG dddQ dQZFdS )szGUtilities for processing .test files containing test case descriptions.    )annotationsN)abstractmethod)	dataclass)Path)AnyFinalIterator
NamedTupleNoReturnPatternUnion)	TypeAlias)defaults)PREFIXtest_data_prefixtest_temp_dirgdblldbr   SUPPORTED_DEBUGGERSc                   @  s&   e Zd ZU ded< ded< ded< dS )
UpdateFilestrmodulecontenttarget_pathN__name__
__module____qualname____annotations__ r   r   F/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/test/data.pyr          
 r   c                   @  s   e Zd ZU ded< ded< dS )
DeleteFiler   r   pathNr   r   r   r   r    r"   '   s   
 r"   
_TypeAliasFileOperationfilenamer   returnc                 C  s8   t j| \} }| d}|d dkr|  d|S )N/__init__.)osr#   splitextsplitpopjoin)r&   _partsr   r   r    _file_arg_to_module/   s
   

r3   caseDataDrivenTestCaseNonec           +   
     s4  t  j j} jj} jjrtjj}nt	j} jj
}g }g }g }i }i }	i }
i }g }i }g }dN fdd}|d  }|d |d	d
 D ]%dN fdd}jdv rjd
us^J tdj}||j}jdkry|tj jdv r|||f qGjdkr||t| tjf qGjdkr|||f qGjdkrjd
usJ |tj jj}t|dd}|||d| f W d
   n1 sw   Y  qGjdkrjd
usJ |tj jj}t|dd}|||d| f W d
   n	1 sw   Y  qGjdkrZjd
us+J |tj jj}t|dd}|||d| f W d
   n	1 sTw   Y  qGtdjrjdkrjd	n
tjtdd
 }|dks|J jd
u rt n
dd jdD }||
|< qGtd jrЈjd!krd	n
tjtd!d
 }|dksJ jd
u rt n
d"d jdD }|||< qGtd#jr
jd$krd	n
tjtd$d
 }|dksJ jd
u rg n
d%d& jdD }|||< qGjd'krRjd
usJ td(j}|d
u r,|d)j t|d*}|d*k r?|d+|  |||d	}|	|t | qGtd,jrCjd
u rcg }njd}d-}|D ]}| d.r|d/d0 } | d1vr|d2 |d0d
 }!zt!d3d4 |!d5D }"W n t"y   ||!d6 Y nw | d7kr|"t#j$kr|| d8t#j$  t%j&|"k}qm| d9kr|"t#j$k r|| d:t#j$  d	t|"  k rd;k sn |d<|! t%j&d
t|" |"k}qm|rBd=d& jD }#tjj'd>kr j(rd?d& |#D }#jd@ks'jdAkr*|#}ntjtd@d
 }|d	ks<J |#||< dB}qGjdCkrSjd
u rSj}qGjjr_dDj ndE }$|dF|$ dG j qG|ry|dH j |
) D ]*}||vr|
| ||< ||
v r||v r|
| *|| s|dI| dJ q}t|}%|j}&t+|&|dK |D ]\}'}t+|d||' qt }(|D ]\})}*|)|(v r|dL|) dM |(|) q|& _,| _-|% _.| _/ j0j0 tj d*  _1| _2| _3|
 _4| _5|	 _6|pg  _7| _8| _9d
S )OzParse and prepare a single case from suite with test case descriptions.

    This method is part of the setup phase, just before the test case is run.
    msgr   r'   r
   c                   s&   t j j d j d|  dd d S )N:: Fpytrace)pytestfailfileline)r7   r4   r   r    
_case_failP   s   &z#parse_test_case.<locals>._case_failr   __main__   Nc                   s4    j j  d }tj j d| d|  dd d S )N   r8   r9   Fr:   )r?   r<   r=   r>   )r7   item_abs_liner4   itemr   r    
_item_failY   s   $z#parse_test_case.<locals>._item_fail>   r>   fixtureoutfile
outfile-re
rI   >   r>   rI   rK   rJ   builtinsutf8encodingzbuiltins.pyitypingz
typing.pyi	_typeshedz_typeshed.pyizstale[0-9]*$stalec                 S     h | ]}|  qS r   strip.0tr   r   r    	<setcomp>       z"parse_test_case.<locals>.<setcomp>,zrechecked[0-9]*$	recheckedc                 S  rT   r   rU   rW   r   r   r    rZ      r[   ztargets[0-9]*$targetsc                 S  s   g | ]}|  qS r   rU   rW   r   r   r    
<listcomp>   r[   z#parse_test_case.<locals>.<listcomp>deletez(.*)\.([0-9]+)$zInvalid delete section rD   zCan't delete during step z
out[0-9]*$Tversion   	   >   ==>=z5Only >= and == version checks are currently supportedc                 s  s    | ]}t |V  qd S N)int)rX   xr   r   r    	<genexpr>   s    z"parse_test_case.<locals>.<genexpr>r+   z is not a valid python versionre   z. always true since minimum runtime version is rd   z/ always false since minimum runtime version is    zFOnly minor or patch version checks are currently supported with "==": c                 S     g | ]}t |qS r   )expand_variablesrX   r?   r   r   r    r_      r[   \c                 S  rk   r   )fix_win_pathrm   r   r   r    r_      r[   outout1F	triggered  zInvalid section header [z
] in case z*Required output section not found in case zStale modules after pass z& must be a subset of rechecked modulesmainzDuplicated filename z$. Did you include it multiple times?)r7   r   r'   r
   ):parse_test_datadatanamesuite	base_path
native_sepr,   r#   r0   	posixpathrequired_out_sectionappendidargrl   r3   recompilerstripSdirnamer>   openreadmatchrg   lensetr.   group
setdefaultadd
startswithtuple
ValueErrorr   PYTHON3_VERSIONsysversion_infosepnormalize_outputkeysissubsetexpand_errorsinputoutputoutput_inline_startoutput2r?   	last_linefilesoutput_filesexpected_stale_modulesexpected_rechecked_modulesdeleted_pathsrr   expected_fine_grained_targetstest_modules)+r4   
test_itemsrz   r0   out_section_missingr   r   r   r   r   stale_modulesrechecked_modulesrr   r^   r   rA   
first_itemrH   contentsr#   mpathfsrc_pathpassnummodulesreprocessedmnumfullargsversion_checkr   
compare_opversion_strra   
tmp_outputsection_strr   r   	file_path
seen_filesr>   r1   r   rF   r    parse_test_case7   sD  







&(
&(
&&










r   c                      s   e Zd ZU dZded< ded< ded< ded< d	ed
< dZdZded< ded< ded< ded< d	ed< ded< ded< ded< ded< ded< d? fd*d+Zd@d,d-Zd@d.d/Z	d@d0d1Z
dAd3d4Z	5dBdCd:d;ZdDd=d>Z  ZS )Er5   zNHolds parsed data-driven test cases, and handles directory setup and teardown.DataSuiteCollectorparent	list[str]r   r   rg   r   zdict[int, list[str]]r   rt   r   zlist[tuple[str, str]]r   r   zdict[int, set[str]]r   r   r   boolr   r   z$list[tuple[str, str | Pattern[str]]]r   r   rr   ry   	DataSuiter>   r   rx   writescache	only_whenplatform
str | Noneskipxfailrw   r?   r'   r6   c       
           s|   t  || || _|| _|| _|| _|| _|dkrtjdks(|dkr*tjdkr*d}	|	| _	|
| _
|| _|| _d | _d | _d S )Nwindowswin32posixT)superr*   ry   r>   r   r   r   r   r   r   r   rw   r?   old_cwdtmpdir)selfr   ry   r>   rx   r   r   r   r   r   r   rw   r?   	__class__r   r    r*     s   
zDataDrivenTestCase.__init__c              	   C  s   | j rt   n
| jr| tjj | t}|d usJ d| }|  z|	|  W d S  t
yz   | jdd }|ry| jd usFJ tj|tj| jj}td| j d|  tj|sq| jsiJ tj| j|}t| jj|  w )NzShould not happen--save-failures-tozCopying data from test z to )r   r<   r   
add_markermark	getparentr   objsetuprun_case	Exceptionconfig	getoptionr   r,   r#   r0   basenamerx   printisabsr   shutilcopytree)r   r   ry   save_dir
target_dirr   r   r    runtest5  s,   


zDataDrivenTestCase.runtestc              	     s|  t | d t | _tjdd| _t| jj t	t
 i  | jD ]]\}}td|}|rVt|d}|dks;J tdd|}t|}t|||} |g | q"tj|}tj|d	d
 t|ddd}	|	| W d    n1 szw   Y  q"| j D ]\}}
|dksJ |
D ]}t|} |g t|| qq rt nd} fddtd|d D | _d S )Nr@   z
mypy-test-)prefixz.*\.([0-9]+)$rC   rD   z	\.[0-9]+$rt   T)exist_okwrN   rO   c                   s   g | ]}  |g qS r   )get)rX   r   stepsr   r    r_   p  s    z,DataDrivenTestCase.setup.<locals>.<listcomp>) r   r,   getcwdr   tempfileTemporaryDirectoryr   chdirrx   mkdirr   r   r   r   rg   r   submodule_from_pathr   r   r~   r#   r   makedirsr   writer   itemsr"   maxranger   )r   r#   r   r   r   r   r   	operationdirr   pathsmax_stepr   r   r    r   N  s:   


"zDataDrivenTestCase.setupc                 C  sR   | j d urt| j  | jd ur!z| j  W n	 ty    Y nw d | _ d | _d S rf   )r   r,   r   r   cleanupOSErrorr   r   r   r    teardownr  s   


zDataDrivenTestCase.teardowntuple[str, int, str]c                 C  s   | j | j| jfS rf   )r>   r?   rx   r   r   r   r    
reportinfo}     zDataDrivenTestCase.reportinfoNexcinfo#pytest.ExceptionInfo[BaseException]style
Any | Nonec                 C  sl   t |jtr| }nt |jtjjr|jjs| }n| j	||_
|jdd}d| j d| j d| S )Nshort)r  zdata: r8   z:
)
isinstancevalue
SystemExitexconlyr<   r=   r   r;   r   _traceback_filter	tracebackgetreprr>   r?   )r   r   r  excreprr   r   r    repr_failure  s   

zDataDrivenTestCase.repr_failurelist[list[FileOperation]]c                 C  s   | j S )ax  Return a list of descriptions of file operations for each incremental step.

        The first list item corresponds to the first incremental step, the second for the
        second step, etc. Each operation can either be a file modification/creation (UpdateFile)
        or deletion (DeleteFile).

        Defaults to having two steps if there aern't any operations.
        r   r   r   r   r    
find_steps  s   	zDataDrivenTestCase.find_steps)r   r   ry   r   r>   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   r?   rg   r'   r6   r'   r6   )r'   r   rf   )r   r  r  r  r'   r   )r'   r  )r   r   r   __doc__r   r>   r?   r*   r   r   r   r   r  r  __classcell__r   r   r   r    r5      s6   
 
!

$
r#   c                 C  s<   t dd| } t d| }|d= d|}t dd|}|S )Nz\.pyi?$rt   z[/\\]r   r+   z\.__init__$)r   r   r.   r0   )r#   r2   r   r   r   r    r     s   
r   c                   @  sH   e Zd ZU dZded< ded< ded< ded	< ded
< edddZdS )TestItemzVParsed test caseitem.

    An item is of the form
      [id arg]
      .. data ..
    r   r   r   r   r   rw   rg   r?   end_liner'   c                 C  s   | j | j t| j S rf   )r  r?   r   rw   r   r   r   r    trimmed_newlines  s   zTestItem.trimmed_newlinesN)r'   rg   )r   r   r   r  r   propertyr  r   r   r   r    r    s   
 r  raw_datarx   list[TestItem]c           
   	   C  s  dd| d g|  d }g }g }d}d}d}d}|t|k r||  }	|| drm|	drm|rHt|}t|}|t||||d | |}|	dd	 }d}d
|v rj||	d
d d }|d|	d
 }g }n4|| dr||| dd  n!|| ds|||  n|| dr||| dd  |d7 }|t|k s|rt|}t|}|t||||d |d  |S )z>Parse a list of lines that represent a sequence of test items.rt   z[case ]rL   Nr   [rC   r)   rs   z\[z--z----rD   )
r.   r   rV   r   endswithcollapse_line_continuation
strip_listr~   r  index)
r  rx   linesretrw   r   r   ii0sr   r   r    rv     sD   rv   lr   c                 C  sN   g }| D ]}| tdd| q|r%|d dkr%|  |r%|d dks|S )zReturn a stripped copy of l.

    Strip whitespace at the end of all lines, and strip all empty
    lines from the end of the array.
    z\s+$rt   r)   )r~   r   r   r/   )r$  rr#  r   r   r    r    s   r  c              	   C  sX   g }d}| D ]#}t dd|}|r|d  t dd|7  < n|| |d}q|S )NFz\\$rt   r)   z^ +rn   )r   r   r~   r  )r$  r%  contr#  ssr   r   r    r    s   
r  r#  c                 C  s   |  dtS )Nz<ROOT>)replaceroot_dir)r#  r   r   r    rl     s   rl   r   r   fnamc           	      C  s   t t| D ]s}| | ddd D ]e}td| }|rx|ddkr)d}n|ddkr3d}n	|dd	kr<d
}|d}|d}|dd}|du rc|| d|d  d| d|  q|| d|d  d| d| d| 	 qqdS )zTransform comments such as '# E: message' or
    '# E:3: message' in input.

    The result is lines like 'fnam:line: error: message'.
    z # rC   Nz*^([ENW]):((?P<col>\d+):)? (?P<message>.*)$EerrorNnoteWwarningcolmessagez\##r8   r9   )	r   r   r.   r   searchrV   r   r(  r~   )	r   r   r*  r!  possible_err_commentr   severityr1  r2  r   r   r    r     s*   

&*r   r?   c                 C  sP   |  tt dd} td| }|s| S | \}}}d| dd|p%d|S )z`Changes Windows paths to Linux paths in error messages.

    E.g. foo\bar.py -> foo/bar.py.
    rn   r(   z^([\S/]+):(\d+:)?(\s+.*)z{}:{}{}rt   )r(  r)  r   r   groupsformat)r?   r   r&   linenor2  r   r   r    ro   ,  s   ro   c                 C  sL   t d| }|s
| S d| d|d |ddd| |dd S )zChanges filename paths to Linux paths in Cobertura output files.

    E.g. filename="pkg\subpkg\a.py" -> filename="pkg/subpkg/a.py".
    z&<class .* filename="(?P<filename>.*?)"z{}{}{}NrC   r&   rn   r(   )r   r4  r8  startr   r(  end)r?   r   r   r   r    fix_cobertura_filename:  s   0r<  parserr   c                 C  sf   |  d}|jddddd |jdd dd	 |jd
ddd |jddddd |jdd dtdd d S )Nmypy--update-data
store_trueFzLUpdate test data to reflect actual output (supported only for certain tests))actiondefaulthelpr   zBCopy the temp directories from failing tests to a target directory)rB  rC  z--mypy-verbosecountz/Set the verbose flag when creating mypy Options)rA  rC  z--mypyc-showcz%Display C code on mypyc test failuresz--mypyc-debugdebuggerz8Run the first mypyc run test with the specified debugger)rB  destchoicesrC  )getgroup	addoptionr   )r=  r   r   r   r    pytest_addoptionP  s8   

rJ  T)tryfirstr   pytest.Configc                 C  s(   |  drd S |  drd| j_d S d S )Nz--collectonlyr?  r   )r   optionnumprocesses)r   r   r   r    pytest_cmdline_maino  s
   

rO  	collectorr   objectr  c                 C  s.   t |trt|tr|turtj| |dS dS )zCalled by pytest on each object in modules configured in conftest.py files.

    collector is pytest.Collector, returns Optional[pytest.Class]
    r   rx   N)r  type
issubclassr   r   from_parent)rP  rx   r   r   r   r    pytest_pycollect_makeitemz  s   
rV  z(?P<name>[a-zA-Z_0-9]+)(?P<writescache>-writescache)?(?P<only_when>-only_when_cache|-only_when_nocache)?(?P<skip_path_normalization>-skip_path_normalization)?(-(?P<platform>posix|windows))?(?P<skip>-skip)?(?P<xfail>-xfail)?r   DataFileCollectorry   r   r>   Iterator[DataDrivenTestCase]c                 c  sB   t |dd}| }W d   n1 sw   Y  tjd|tjtjB d}t|}t|dd }t	 }|D ]e}	t|}t
|	}
|
sMtd|	|
d	}||v r`td
|| j|tj| ||t||jt|
d|
d|
dt|
dt|
d|
d ||dV  ||dd 7 }||h q9dS )zIterate over raw test cases in file, at collection time, ignoring sub items.

    The collection phase is slow, so any heavy processing should be deferred to after
    uninteresting tests are filtered (when using -k PATTERN switch).
    zutf-8rO   Nz^\[case ([^]+)]+)\][ \t]*$\n)flagsrL   rC   zInvalid testcase id rx   z1Found a duplicate test name "{}" in {} on line {}r   r   r   r   r   skip_path_normalization)r   ry   r>   rx   r   r   r   r   r   r   rw   r?   )r   r   r   r.   DOTALL	MULTILINEiternextrD  r   _case_name_pattern	fullmatchRuntimeErrorr   r8  rx   r5   rU  add_test_name_suffixtest_name_suffixr   update)r   ry   r>   r   rw   cases
cases_iterline_no
test_namescase_idr   rx   r   r   r    split_test_cases  sJ   




rj  c                   @  s   e Zd ZdddZdS )r   r'   Iterator[DataFileCollector]c                 c  sH    | j }tj|jsJ d|j d|jD ]
}tj| |dV  qdS )zNCalled by pytest on each of the object returned from pytest_pycollect_makeitemzTest data prefix (z) not set correctlyrR  N)r   r,   r#   isdirdata_prefixr   rW  rU  )r   ry   	data_filer   r   r    collect  s   
zDataSuiteCollector.collectN)r'   rk  )r   r   r   ro  r   r   r   r    r     s    r   c                   @  s&   e Zd ZU ded< ded< ded< dS )DataFileFixrg   r9  
end_linenor   r  Nr   r   r   r   r    rp    r!   rp  c                      sr   e Zd ZU dZded< ded< ed fd	d
ZdddZd fddZd fddZ	dddZ
dddZ  ZS )rW  zvRepresents a single `.test` data driven test file.

    More context: https://github.com/python/mypy/issues/11662
    r   r   zlist[DataFileFix]_fixesrx   r   r'   c                  s"   t  j||d}t|tsJ |S )N)rx   )r   rU  r  rW  )clsr   rx   rP  r   r   r    rU    s   zDataFileCollector.from_parentrX  c                 c  s0    t | | jjtj| jjj| jdE d H  d S )N)r   ry   r>   )rj  r   r   r,   r#   r0   rm  rx   r   r   r   r    ro    s   zDataFileCollector.collectr6   c                   s   t    g | _d S rf   )r   r   rr  r   r   r   r    r     s   

zDataFileCollector.setupc                   s   t    |   d S rf   )r   r   _apply_fixesr   r   r   r    r     s   
zDataFileCollector.teardownfixrp  c                 C  s   | j | d S rf   )rr  r~   )r   ru  r   r   r    enqueue_fix  r   zDataFileCollector.enqueue_fixc                 C  sn   | j sd S t| jjj| j }| d}t| j ddD ]}|j	||j
d |jd < q|d| d S )NrL   T)reverserC   )rr  r   r   r   rm  rx   	read_textr.   sortedr  r9  rq  
write_textr0   )r   	data_pathr  ru  r   r   r    rt    s   zDataFileCollector._apply_fixes)r   r   rx   r   r'   rW  )r'   rX  r  )ru  rp  r'   r6   )r   r   r   r  r   classmethodrU  ro  r   r   rv  rt  r  r   r   r   r    rW    s   
 

suffixc                 C  s<   t d| }|r|d}| d t|  | | S | | S )Nz-[-A-Za-z0-9]+$r   )r   r4  r   r   )rx   r}  r   magic_suffixr   r   r    rb    s
   
rb  testcaser   c                 C  s   d| j  v pd| jv S )Nincremental)rx   lowerr>   )r  r   r   r    is_incremental  s   r  c                 C  sD   t dd | jD rdS | jD ]\}}tj|dr dS qdS )Nc                 s  s    | ]	}t d |V  qdS )z# flags[2-9]:N)r   r   rm   r   r   r    ri     s    z#has_stable_flags.<locals>.<genexpr>Fz	mypy.ini.T)anyr   r   r,   r#   r   r   )r  r&   r   r   r   r    has_stable_flags  s   r  c                   @  sB   e Zd ZU ded< eZeZdZdZ	dZ
dddZedddZdS )r   r   r   Frt   r'   r6   c                 C  s   dS )zSetup fixtures (ad-hoc)Nr   r   r   r   r    r   2  s    zDataSuite.setupr  r5   c                 C  s   t rf   )NotImplementedError)r   r  r   r   r    r   5  s   zDataSuite.run_caseNr  )r  r5   r'   r6   )r   r   r   r   r   rz   r   rm  r}   r{   rc  r   r   r   r   r   r   r    r   !  s   
 
)r&   r   r'   r   )r4   r5   r'   r6   )r#   r   r'   r   )r  r   rx   r   r'   r  )r$  r   r'   r   )r#  r   r'   r   )r   r   r   r   r*  r   r'   r6   )r?   r   r'   r   )r=  r   r'   r6   )r   rL  r'   r6   )rP  r   rx   r   r   rQ  r'   r  )r   rW  ry   r   r>   r   r'   rX  )rx   r   r}  r   r'   r   )r  r5   r'   r   )Gr  
__future__r   r,   os.pathr|   r   r   r   r   abcr   dataclassesr   pathlibr   rQ   r   r   r   r	   r
   r   r   typing_extensionsr   r$   r<   r>  r   mypy.test.configr   r   r   r#   normpathr)  r   r   r   r"   r%   r3   r   Itemr5   r   r  rv   r  r  rl   r   ro   r<  rJ  hookimplrO  rV  r   r_  rj  Classr   rp  	CollectorrW  rb  r  r  r   r   r   r   r    <module>   sh    $

 = 
,


-









/
/

	