B
    nb\	                 @   sb  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mZmZ ddl	m
Z
mZ ddlmZmZmZ ddlmZ edkZdZd	d
 Zd ddZerdndZejdeded dZejdeded dd Zdd Zd!ddZd"ddZedkr^ejej e!ej"ej"dZ#e$e#% Z&ee&e#ee&e# ee& Z'x&e'D ]\Z(Z)ej*+de(e)f  q<W dS )#z 
Source code analysis utilities
    N)_DEBUG)programsencoding)to_text_stringto_binary_stringPY3)dependencies   zL(^|#)[ ]*(TODO|FIXME|XXX|HINT|TIP|@todo|HACK|BUG|OPTIMIZE|!!!|\?\?\?)([^#]*)c             C   sl   g }xbt |  D ]R\}}xHtt|D ]8}|d rF|d d n|d }|||d f q(W qW |S )z1Find tasks in source code (TODO, FIXME, XXX, ...)z :   )	enumerate
splitlinesrefindallTASKS_PATTERNstrip
capitalizeappend)source_coderesultslinetextZtodoZ	todo_text r   8lib/python3.7/site-packages/spyder/utils/codeanalysis.py
find_tasks   s    r   c          
   C   sl  y<|dkrd}y| d7 } W n  t k
r<   | td7 } Y nX ddl}ddlm} yt| |d|j}W n^ tk
r } z&|jdkrg }n|j	d |j
fg}W dd}~X Y n tt fk
r   g }Y nxX |||}|jjdd d	 g }t| }|  }	xB|jD ]8}
d
t|	|
j
d  |kr ||
j|
j |
j
f q W W n( tk
rf   g }trbt  Y nX |S )zVCheck source code with pyflakes
    Returns an empty list if pyflakes is not installedNz<string>
r   )Checkerexecc             S   s   | j S )N)lineno)xr   r   r   <lambda>J   s    z%check_with_pyflakes.<locals>.<lambda>)keyzanalysis:ignorer   )	TypeErrorr   _astZpyflakes.checkerr   compileZPyCF_ONLY_ASTSyntaxErrorr   argsr    
ValueErrorZmessagessortr   
get_codingr   r   r   messageZmessage_args	ExceptionDEBUG_EDITOR	traceback	print_exc)r   filenamer%   r   Ztreevaluer   wcodinglinesZwarningr   r   r   check_with_pyflakes*   s@    
"


r6   z>=0.6.0z>=0.5.0pyflakesz%Real-time code analysis on the Editor)Zrequired_versionz>=2.3pycodestylez+Real-time code style analysis on the Editorc               C   s   t dtS )z5Return True if pyflakes required version is installedr7   )r   Zis_module_installedPYFLAKES_REQVERr   r   r   r   is_pyflakes_installedf   s    r:   c             C   sX   t | r| gS t jd| d d}t jd| d}|dk	rBtj|gS |dk	rTtj|gS dS )zUReturn checker executable in the form of a list of arguments
    for subprocess.PopenN_script)packagemodule)r   Zis_program_installedZpython_script_existssys
executable)nameZpath1Zpath2r   r   r   get_checker_executablek   s    

rA   c          	   C   s  | dkrg S |dk	r| |7 } t dd | D r6|d7 }|dkrltjddd}|| |  | |j n
| | | d }| d	d }t||}|	 d 
   }|dkrt|j g }	t|}
| }x|D ]}ttd
| d	d }yt||d	  |
}W nZ tk
r:   t||d	  }Y n6 tk
rn   tj|dd}
t||d	  |
}Y nX d|kr||dd d }|	||f qW |	S )zoCheck source code with checker defined with *args* (list)
    Returns an empty list if checker is not installedNc             S   s   g | ]}d |kqS )r7   r   ).0argr   r   r   
<listcomp>   s    zcheck.<locals>.<listcomp>r   z.pyF)suffixdeleter   r   z(\:[\d]+\:)r   T)Zforce_chardetzanalysis:ignorez:    )anytempfileZNamedTemporaryFilewritecloser   r@   r   Zrun_programZcommunicater   decoder   osunlinkr   r+   intr   searchgroupr   r$   UnicodeDecodeErrorfind)r(   r   r1   optionsZtempfdcmdZcmdargsprocoutputr   r4   r5   r   r    r   r,   r   r   r   check   sD    



rX   c             C   sH   yt d}t|| |dgd}W n$ tk
rB   g }tr>t  Y nX |S )z"Check source code with pycodestyler8   z-r)r1   rT   )rA   rX   r-   r.   r/   r0   )r   r1   r(   r   r   r   r   check_with_pep8   s    rY   __main__zbootstrap.pyzMessage: %s -- Line: %s
)N)NN)N),__doc__r>   r   rM   rI   r/   Zspyder.config.baser   r   Zspyder.utilsr   r   Zspyder.py3compatr   r   r   Zspyderr	   r.   r   r   r6   r9   addZPYCODESTYLE_REQVERr:   rA   rX   rY   __name__pathjoindirname__file__pardirfnameopenreadcodeZcheck_resultsr,   r   stdoutrJ   r   r   r   r   <module>	   s<   
3
0

