B
    A!p\q              
   @   s   d dl mZm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	m
Z
 d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZmZ d d
lmZm Z m!Z!m"Z"m#Z#m$Z$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/ d dlm0Z0 d dlm1Z1 d dl2Z2ej3dkrTej4dkrNdZ5ndZ5nej6dkrfdZ5ndZ5y
ej7Z8W n e9k
r   dZ8Y nX edd Z:dd Z;eee<Z=ee=dZ>ee=dZ?edd Z@ddd ZAe2jBd!d" ZCd#d$ ZDe2jEFd%d&gd'gd(gd)gd*ggd+d, ZGe2jEFd%d'd-gd.d&gd(d/gd*d/ggd0d1 ZHe2jEFd%d2d3d4gd5d*d6gd5d*d5d6d*ggd7d8 ZIe2jBd9d:d;d< ZJe2jBd9d:d=d> ZKe2jBd?d@ ZLdAdB ZMdCdD ZNdEdF ZOdGdH ZPdIdJ ZQdKdL ZRdMdN ZSdOdP ZTdQdR ZUdSdT ZVdUdV ZWdWdX ZXdYdZ ZYd[d\ ZZd]d^ Z[d_d` Z\dadb Z]dcdd Z^dedf Z_dgdh Z`didj Zadkdl Zbdmdn Zcdodp Zde2jBdqdr Zee2jEfdrdsdt Zge2jEjhe8dudve2jEfdrdwdx Zie2jEfdrdydz Zje2jEfdrd{d| ZkG d}d~ d~elZme2jBdd ZnG dd delZodd Zpdd ZqdS )    )contextmanagerredirect_stdoutN)rmtree)getcwdchdir)joinbasenamedirnameisdirabspathsep)reload)StringIO)configlint)PyLinterRunpreprocess_optionsArgumentPreprocessingError)MSG_STATE_SCOPE_CONFIGMSG_STATE_SCOPE_MODULEMSG_STATE_CONFIDENCEMessagesStoreMessageDefinition	FileStatetokenize_module)InvalidMessageErrorUnknownMessageError)text)checkers)check_messages)
exceptions)
interfacesjavantZUSERPROFILEHOMEZwin32c           
   c   sh   t d} tjt}z| tjt< d V  W d tjdd |d krLtjt= n
|tjt< t| dd X d S )Nz	fake-homePYLINTRC T)ignore_errors)tempfilemkdtemposenvirongetr%   popr   )ZfolderZold_home r/   8lib/python3.7/site-packages/pylint/test/unittest_lint.py	fake_homeM   s    




r1   c             C   s(   yt |  W n tk
r"   Y nX d S )N)r+   removeOSError)filer/   r/   r0   r2   ]   s    r2   inputregrtest_datac              c   s@   t  } t }t|  td}z
|V  W dt| t| X dS )z}Create a temp directory and change the current location to it.

    This is supposed to be used with a *with* statement.
    .N)r)   r*   r   r   r   r   )Ztmpcurrent_dirZabs_tmpr/   r/   r0   tempdiri   s    
r9   r7   c             C   s   t  t   }}xJ| D ]B}t||}t|}|dkr>|| q|t| || qW x|D ]}t|s`t| q`W x|D ]}t|d	  qW dS )a  Creates directories and files found in <path>.

    :param paths: list of relative paths to files or directories
    :param chroot: the root directory in which paths will be created

    >>> from os.path import isdir, isfile
    >>> isdir('/tmp/a')
    False
    >>> create_files(['a/b/foo.py', 'a/b/c/', 'a/b/c/d/e.py'], '/tmp')
    >>> isdir('/tmp/a')
    True
    >>> isdir('/tmp/a/b/c')
    True
    >>> isfile('/tmp/a/b/c/d/e.py')
    True
    >>> isfile('/tmp/a/b/foo.py')
    True
    r'   wN)
setr   r   addr	   r
   r+   makedirsopenclose)pathschrootdirsfilespathfilenamedirpathfilepathr/   r/   r0   create_files}   s    



rH   c              c   s:   t tj} dddg}|tjd d < |V  | tjd d < d S )N         )listsysrD   )ZorigZfaker/   r/   r0   	fake_path   s
    

rN   c          	   C   s<   t g  tjdg|  ks tW d Q R X tj| ks8td S )Nr7   )r   fix_import_pathrM   rD   AssertionError)rN   r/   r/   r0   test_no_args   s    rQ   caseza/b/za/bza/b/__init__.pyza/ac          
   C   sv   t  f}tdg t|dgdg |  }tj| ks6tt| tj|ksPtW d Q R X tj| kshtW d Q R X d S )Nza/b/__init__.pyrS   r7   )r9   rH   r   rM   rD   rP   r   rO   )rN   rR   rA   expectedr/   r/   r0   test_one_arg   s    
rU   za/cza/c/za/c/__init__.pyc          
   C   sx   t  h}tddg t|dgdg |  }tj| ks8tt| tj|ksRtW d Q R X tj| ksjtW d Q R X d S )Nza/b/__init__.pyza/c/__init__.pyrS   r7   )r9   rH   r   rM   rD   rP   r   rO   )rN   rR   rA   rT   r/   r/   r0   test_two_similar_args   s    
rV   za/b/c/__init__.pyza/d/__init__.pyza/e/f.pyza/b/cza/ec          
      s   t   tdddg  fddtddtdgD d	g |  }tj| ksRtt| tj|ksltW d Q R X tj| kstW d Q R X d S )
Nza/b/c/__init__.pyza/d/__init__.pyza/e/f.pyc                s   g | ]}t  |qS r/   )r   ).0suffix)rA   r/   r0   
<listcomp>   s   z"test_more_args.<locals>.<listcomp>)rS   brS   )rS   er7   )	r9   rH   r   r   rM   rD   rP   r   rO   )rN   rR   rT   r/   )rA   r0   test_more_args   s    	.r\   module)scopec             C   s   dgS )NIr/   )disabler/   r/   r0   r`      s    r`   c             C   s   t jS )N)	testutilsTestReporter)reporterr/   r/   r0   rc      s    rc   c             C   s    |    | d td| _| S )NZtoto)r>   set_current_moduler   
file_state)linterr/   r/   r0   init_linter   s    

rg   c             C   sL   G dd dt j}| ||  |   t }| t| | d d S )Nc               @   s.   e Zd ZejZdZddiZeddd Z	dS )z@test_pylint_visit_method_taken_in_account.<locals>.CustomCheckercustomZW9999)r'   rh   r'   c             S   s   d S )Nr/   )self_r/   r/   r0   visit_class  s    zLtest_pylint_visit_method_taken_in_account.<locals>.CustomChecker.visit_classN)
__name__
__module____qualname__r"   ZIAstroidCheckerZ__implements__namemsgsr    rk   r/   r/   r/   r0   CustomChecker   s   rq   abc)	r   ZBaseCheckerZregister_checkerr>   r   set_reporterr   TextReportercheck)rf   rq   outr/   r/   r0   )test_pylint_visit_method_taken_in_account   s    	rw   c             C   s   | }| dst| ds t|jddd |jdddd | drLt| ddr\t|d | drtt| dst|jddd |jdddd | dst| ddstd S )	NW0101W0102package)r^   r]   rI   )r^   linetutu)is_message_enabledrP   r`   rd   enable)rg   rf   r/   r/   r0   test_enable_message  s    
r   c             C   s   | }| dst| ds t|jddd |jdddd	 | drLt| dsZt|j ddd
rlt|d | drt| dst|jddd |jdddd	 | dst| dst|j ddd
std S )Nrx   C0202Wrz   )r^   Cr]   rI   )r^   r{   )r{   r|   )r}   rP   r`   rd   r~   )rg   rf   r/   r/   r0   test_enable_message_category!  s     
r   c             C   s   G dd dt }| }|d t|dks0t|jdddd t|dksRtt|ddksft|jdddd t|ddkst| |_t|jd	t	j
d
kstd S )Nc               @   s   e Zd ZdgZdS )z,test_message_state_scope.<locals>.FakeConfigZHIGHN)rl   rm   rn   
confidencer/   r/   r/   r0   
FakeConfig5  s   r   r   rx   r]   rK   )r^   r{   ry   zthis-is-bad)r   )objectr`   r   Zget_message_state_scoperP   r   r~   r   r   r"   Z	INFERENCE)rg   r   rf   r/   r/   r0   test_message_state_scope4  s    
r   c             C   s  | }|   ttd}|d ||d}|t| |j}||j	| |
ds\t|
dsjt|
ddszt|
ddrt|
ddrt|
ddst|
dd	rt|
dd
st|
ddrt|
ddrt|
ddst|
ddrt|
ddrt|
ddr0t|
ddsBt|
ddrTt|
ddrft|
ddsxt|
ddst|
ddrt|
ddst|
ddst|
ddrt|
ddst|
ddst|
ddst|j}d|jd ks"td|jd ks6td|jksFtd|jd  ksZtd|jd! ksntd"|jd# kstd$|jd% kstd S )&Nzfunc_block_disable_msg.pyZfunc_block_disable_msgW0613E1101                $   *   +   .   1   3   9   =   @   B   ZE0602>   F   H   K   M      )r   r      )r   !   )r   r   rI   )C0302r   )r   2   j   )r   l   m   )r   n   )r>   r   REGRTEST_DATArd   Zget_astZprocess_tokensr   re   Zcollect_block_linesZ
msgs_storer}   rP   Z_suppression_mapping)rg   rf   rG   ZastroidZfsr/   r/   r0   test_enable_message_blockF  sT    

r   c             C   s>  | }| dst| ds t| ds.t| ds<t|jddd |jdddd	 | drht| drvt| ddrt| ddrt|d
 | drt| drt| dst| dst|jddd |jdddd	 | dst| dst| dds(t| dds:tdS )zkmessages can be controlled by symbolic names.

    The state is consistent across symbols and numbers.
    rx   Zunreachablery   zdangerous-default-valuerz   )r^   r]   rI   )r^   r{   r|   N)r}   rP   r`   rd   r~   )rg   rf   r/   r/   r0   test_enable_by_symbol  s,    
r   c             C   sB   |  dst| d |  dr&t| d |  ds>td S )NZRP0001)Zreport_is_enabledrP   r`   r~   )rf   r/   r/   r0   test_enable_report  s
    

r   c             C   s,   t |  | dd | jjjdks(td S )Nzoutput-formatr   rt   )r   register
set_optionrc   	__class__rl   rP   )rf   r/   r/   r0   !test_report_output_format_aliased  s    
r   c          	   C   s2   t |  ttj | dd W d Q R X d S )Nzoutput-formatzmissing.module.Class)r   r   pytestraisesr!   ZInvalidReporterErrorr   )rf   r/   r/   r0   test_set_unsupported_reporter  s    
r   c             C   sV   |  dd | drt| dr(t| ds6t| drDt| drRtd S )Nr`   zC0111,W0234C0111W0234W0113zmissing-docstringznon-iterator-returned)r   r}   rP   )rf   r/   r/   r0   test_set_option_1  s    r   c             C   sV   |  dd | drt| dr(t| ds6t| drDt| drRtd S )Nr`   )r   r   r   r   r   zmissing-docstringznon-iterator-returned)r   r}   rP   )rf   r/   r/   r0   test_set_option_2  s    r   c             C   sL   |  d ddd |  D ks$t| d ddd |  D ksHtd S )Ndesignc             S   s   g | ]
}|j qS r/   )ro   )rW   cr/   r/   r0   rY     s    z(test_enable_checkers.<locals>.<listcomp>c             S   s   g | ]
}|j qS r/   )ro   )rW   r   r/   r/   r0   rY     s    )r`   prepare_checkersrP   r~   )rf   r/   r/   r0   test_enable_checkers  s    

r   c             C   sB   |    |  }dd |D }dddddh}t ||@ ks>td S )Nc             S   s   h | ]
}|j qS r/   )ro   )rW   r   r/   r/   r0   	<setcomp>  s    z#test_errors_only.<locals>.<setcomp>r   formatmetricsZmiscellaneoussimilarities)Z
error_moder   r;   rP   )rf   r   checker_namesZ
should_notr/   r/   r0   test_errors_only  s
    r   c             C   s6   |  dd |  dd ddd |  D ks2td S )Nr`   ZRP0801ZR0801r   c             S   s   g | ]
}|j qS r/   )ro   )rW   r   r/   r/   r0   rY     s    z(test_disable_similar.<locals>.<listcomp>)r   r   rP   )rf   r/   r/   r0   test_disable_similar  s    r   c             C   sL   |  dd |  dd dd |  D }xdD ]}||ks0t|q0W dS )	z(check that we disabled a lot of checkersZreportsFr`   zR,C,Wc             S   s   g | ]
}|j qS r/   )ro   )rW   r   r/   r/   r0   rY     s    z%test_disable_alot.<locals>.<listcomp>)r   r   r   N)r   r   rP   )rf   r   Zcnamer/   r/   r0   test_disable_alot  s
    
r   c             C   sX   |  t  |   | d | jdddd | jdddd d	d
g| jjksTtd S )N0123ZC0301rI   )rI   rJ   )r{   argszline-too-longrJ   )rK      zC:  1: Line too long (1/2)zC:  2: Line too long (3/4))	rs   ra   rb   r>   rd   add_messagerc   messagesrP   )rf   r/   r/   r0   test_addmessage  s    
r   c          	   C   s   |  t  |   | d tt}| jddd W d Q R X t	|j
dksVttt}| jddddd W d Q R X t	|j
d	ksttt}| d
 W d Q R X t	|j
dkstd S )Nr   zline-too-long)rI   rJ   )r   z)Message C0301 must provide line, got NonerJ   Z	fake_node)r{   Znoder   z@Message C0301 must only provide line, got line=2, node=fake_nodeZC0321z)Message C0321 must provide Node, got None)rs   ra   rb   r>   rd   r   r   r   r   strvaluerP   )rf   cmr/   r/   r0   test_addmessage_invalid  s    

r   c              C   sb   t tdd} tj|  tddt tddgdd}tdd |j D d	ksRt	tj
|  d S )
Nr6   dummy_pluginz--load-pluginszempty.pyF)do_exitc             S   s   g | ]}|j d kr|j qS )r   )ro   )rW   chr/   r/   r0   rY     s    z1test_load_plugin_command_line.<locals>.<listcomp>rJ   )r   HERErM   rD   appendr   lenrf   get_checkersrP   r2   )dummy_plugin_pathrunr/   r/   r0   test_load_plugin_command_line  s    
r   c              C   sn   t tdd} tj|  t tdd}td|t tddgdd}tdd	 |j D d
ks^t	tj
|  d S )Nr6   r   zdummy_plugin.rcz--rcfilezempty.pyF)r   c             S   s   g | ]}|j d kr|j qS )r   )ro   )rW   r   r/   r/   r0   rY     s    z0test_load_plugin_config_file.<locals>.<listcomp>rJ   )r   r   rM   rD   r   r   r   rf   r   rP   r2   )r   Zconfig_pathr   r/   r/   r0   test_load_plugin_config_file  s    
r   c           	   C   sR   t tdd} tj|  tddddt tddgdd	}|jjjd
ddgksNt	d S )Nr6   r   z--load-pluginsZdummy_conf_pluginz--ignorezfoo,barzempty.pyF)r   foobarbin)
r   r   rM   rD   r   r   rf   r   Z
black_listrP   )r   r   r/   r/   r0   test_load_plugin_configuration#  s    r   c            	   C   sP   t t tddddg W d Q R X t t tddddg W d Q R X d S )Nz--load-pluginsZ
unexistantz--init-hookzraise RuntimeError)r   r   RuntimeErrorr   r/   r/   r/   r0   *test_init_hooks_called_before_load_plugins4  s    r   c             C   sB   |  t  | tjtjtdd dg| j	j
ks>td S )NdataZascriptzC:  2: Line too long (175/100))rs   ra   rb   ru   r+   rD   r   r	   __file__rc   r   rP   )rf   r/   r/   r0   test_analyze_explicit_script;  s    r   c             C   sL   dd |   D }d|kst| dd dd |   D }d|ksHtd S )Nc             S   s   g | ]
}|j qS r/   )ro   )rW   r   r/   r/   r0   rY   B  s    z1test_python3_checker_disabled.<locals>.<listcomp>Zpython3r~   c             S   s   g | ]
}|j qS r/   )ro   )rW   r   r/   r/   r0   rY   F  s    )r   rP   r   )rf   r   r/   r/   r0   test_python3_checker_disabledA  s
    r   c             C   sH   t  }| | | }x*dD ]"}t|tj}t||stqW d S )N)z$^Pylint global options and switches$z+Verbatim name of the checker is ``python3``z^:old-octal-literal \(E1608\):z^:dummy-variables-rgx:)r   Zprint_full_documentationgetvaluerecompile	MULTILINEsearchrP   )rf   rv   outputZre_strZregexpr/   r/   r0   test_full_documentationJ  s    

	r   c               C   s   t jdd  d S )Nr&   )r+   r,   r.   r/   r/   r/   r0   pop_pylintrc\  s    r   c              C   s   t jd} | dkrd}nt j| d}tj|ks6tzVtt d}|t j	d< zt
t tj|kshtW d yt | W n   Y nX X W d t j	d= X d S )N~z	.pylint.dZ
PYLINTHOME)r+   rD   
expanduserr   r   ZPYLINT_HOMErP   r)   
gettempdirr,   r   r2   )ZuhomerT   Zpylintdr/   r/   r0   test_pylint_homea  s     
r   zITOX runs this test from within the repo and finds the project's pylintrc.)reasonc           	   C   s   t   t } ttjtjtj zRt	
 d ks:ttt dtjd< t	
 d ks^tdtjd< t	
 d ksxtW d t|  tt	 X W d Q R X d S )Nz	.pylintrcr&   r7   )r1   r   r   r+   rD   r	   r   rM   
executabler   find_pylintrcrP   r   r)   r   r,   r   )r8   r/   r/   r0   test_pylintrcy  s    
r   c              C   s   t  } tddddddg t  t d ks4tW d Q R X t| ddt| dd	dt| dd	dt| dd	dt| dd	d
dddd}x4| D ](\}}t	t| | t |kstqW W d Q R X d S )Nz
a/pylintrcza/b/__init__.pyza/b/pylintrcza/b/c/__init__.pyza/b/c/d/__init__.pyza/b/c/d/e/.pylintrcrS   pylintrcrZ   r   dr[   z	.pylintrc)rS   za/bza/b/cza/b/c/dz	a/b/c/d/e)
r9   rH   r1   r   r   rP   r   itemsr+   r   )rA   resultsbasedirrT   r/   r/   r0   test_pylintrc_parentdir  s$    
r   c           
   C   s   t  } t z tdddg t d ks.tt| ddt| dddd d d}x4| D ](\}}t	t| | t |ksXtqXW W d Q R X W d Q R X d S )Nz
a/pylintrcza/b/pylintrcza/b/c/d/__init__.pyrS   r   rZ   )rS   za/bza/b/cza/b/c/d)
r9   r1   rH   r   r   rP   r   r   r+   r   )rA   r   r   rT   r/   r/   r0   "test_pylintrc_parentdir_no_package  s    
r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestPreprocessOptionsc             C   s   | j ||f d S )N)r   r   )ri   ro   r   r/   r/   r0   	_callback  s    zTestPreprocessOptions._callbackc             C   s>   g | _ tdddg| jdf| jdfd ddg| j ks:td S )	Nz--fooz	--bar=bazz--qu=uxFT)r   qu)r   N)r   ux)r   r   r   rP   )ri   r/   r/   r0   test_value_equal  s
    z&TestPreprocessOptions.test_value_equalc             C   s2   g | _ tddgd| jdfi dg| j ks.td S )Nz--qur   r   T)r   r   )r   r   r   rP   )ri   r/   r/   r0   test_value_space  s    z&TestPreprocessOptions.test_value_spacec          	   C   sV   t t tdddgddi W d Q R X t t tddgddi W d Q R X d S )Nz--fooz--barz--qu=uxr   )NT)r   r   r   r   )ri   r/   r/   r0   !test_error_missing_expected_value  s    z7TestPreprocessOptions.test_error_missing_expected_valuec          	   C   s.   t t tdddgddi W d Q R X d S )Nz--fooz
--bar=spamz--qu=uxr   )NF)r   r   r   r   )ri   r/   r/   r0   test_error_unexpected_value  s    z1TestPreprocessOptions.test_error_unexpected_valueN)rl   rm   rn   r   r   r   r   r   r/   r/   r/   r0   r     s
   r   c              C   s&   t  } G dd dt}| |  | S )Nc               @   s4   e Zd ZdZdddddgifddd	d
difdZdS )zstore.<locals>.CheckerZacheckermessagez
msg-symbolzmsg description.Z	old_names)W0001z
old-symbolz(Duplicate keyword argument %r in %s callzduplicate-keyword-argzJUsed when a function call passes the same keyword argument multiple times.Z
maxversion)rJ      )W1234E1234N)rl   rm   rn   ro   rp   r/   r/   r/   r0   Checker  s   
r  )r   r   Zregister_messages_from_checker)storer  r/   r/   r0   r    s    r  c               @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )TestMessagesStoreFc             C   s   ||j |dkstd S )N)
checkerref)Zformat_helprP   )ri   Zdescmsgr	  r/   r/   r0   _compare_messages  s    z#TestMessagesStore._compare_messagesc          	   C   s<   t |dd tsttt |d W d Q R X d S )Nr  r   ZYB12)
isinstanceget_message_definitionsr   rP   r   r   r   )ri   r  r/   r/   r0   test_check_message_id  s    z'TestMessagesStore.test_check_message_idc             C   s2   | dd }| jd|dd | jd|dd d S )Nr  r   z_:msg-symbol (W1234): *message*
  msg description. This message belongs to the achecker checker.T)r	  z1:msg-symbol (W1234): *message*
  msg description.F)r  r  )ri   r  message_definitionr/   r/   r0   test_message_help  s    z#TestMessagesStore.test_message_helpc             C   s2   | dd }| jd|dd | jd|dd d S )Nr  r   z:duplicate-keyword-arg (E1234): *Duplicate keyword argument %r in %s call*
  Used when a function call passes the same keyword argument multiple times.
  This message belongs to the achecker checker. It can't be emitted when using
  Python >= 2.6.T)r	  z:duplicate-keyword-arg (E1234): *Duplicate keyword argument %r in %s call*
  Used when a function call passes the same keyword argument multiple times.
  This message can't be emitted when using Python >= 2.6.F)r  r  )ri   r  r  r/   r/   r0   test_message_help_minmax
  s    z*TestMessagesStore.test_message_help_minmaxc          	   C   s6   t  }t| |  W d Q R X d| ks2td S )Nz:msg-symbol (W1234): *message*)r   r   Zlist_messagesr   rP   )ri   r  r   r/   r/   r0   test_list_messages  s    
z$TestMessagesStore.test_list_messagesc             C   sB   | ddd d|dd jks&td|dd jks>td S )Nr  zold-bad-namez
msg-symbolr   )add_renamed_messager  symbolrP   )ri   r  r/   r/   r0   test_add_renamed_message$  s    z*TestMessagesStore.test_add_renamed_messagec          	   C   s>   t t}|ddd W d Q R X d}t|j|ks:td S )Nr  zold-msg-symbolzduplicate-keyword-argzWMessage id 'W1234' cannot have both 'msg-symbol' and 'old-msg-symbol' as symbolic name.)r   r   r   r  r   r   rP   )ri   r  r   rT   r/   r/   r0    test_add_renamed_message_invalid)  s
    z2TestMessagesStore.test_add_renamed_message_invalidc             C   s4   d| dd jkstd| dd jks0td S )Nz
msg-symbolr  r   z
old-symbol)r  r  rP   )ri   r  r/   r/   r0   test_renamed_message_register5  s    z/TestMessagesStore.test_renamed_message_registerN)F)rl   rm   rn   r  r  r  r  r  r  r  r  r/   r/   r/   r0   r    s   
r  c           	      s   G  fdddt  tjtdd} tj| d}xdD ]}t }  }||j_d|j_	|
  || z&tjtj|  || |g W dtj  X |j}t|d	kstd
|d ks8tq8W dS )zYCheck that we can write custom should_analyze_file that work
    even for arguments.
    c                   s    e Zd Zd fdd	Z  ZS )z7test_custom_should_analyze_file.<locals>.CustomPyLinterFc                s*   t j|dkrdS t | j|||dS )Nzwrong.pyF)is_argument)r+   rD   r   supershould_analyze_file)ri   modnamerD   r  )CustomPyLinterr   r/   r0   r  @  s    
zKtest_custom_should_analyze_file.<locals>.CustomPyLinter.should_analyze_file)F)rl   rm   rn   r  __classcell__r/   )r  )r   r0   r  ?  s   r  r6   Zbad_packagezwrong.py)rI   rJ   r   NrI   zinvalid syntax)r   r+   rD   r   r   ra   rb   r   jobsZ
persistentr>   rs   rM   r   r	   ru   r.   r   r   rP   )Zpackage_dirZ
wrong_filer  rc   rf   r   r/   )r  r0   test_custom_should_analyze_file:  s"    	

r  c             C   sN   t  }| }|  || ttd}||g |j}t|dksJt	d S )Nznot__init__.pyr   )
ra   rb   r>   rs   r   INPUTDIRru   r   r   rP   )rg   rc   rf   rG   r   r/   r/   r0   test_filename_with__init__^  s    

r!  )r7   )r
contextlibr   r   rM   r+   r   r)   Zshutilr   r   r   os.pathr   r   r	   r
   r   r   	importlibr   ior   Zpylintr   r   Zpylint.lintr   r   r   r   Zpylint.utilsr   r   r   r   r   r   r   Zpylint.exceptionsr   r   Zpylint.testutilsra   Zpylint.reportersr   r   Zpylint.checkers.utilsr    r!   r"   r   ro   _namer%   platformZpypy_version_infoZPYPY_VERSION_INFOAttributeErrorr1   r2   r   r   r   r   r9   rH   ZfixturerN   rQ   ZmarkZparametrizerU   rV   r\   r`   rc   rg   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zusefixturesr   Zskipifr   r   r   r   r   r  r  r  r!  r/   r/   r/   r0   <module>   s    $	




%	$:				H$