ó
‹²,]c           @   sç  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	 „  Z d d
 „ Z e rÍ d n d Z e j d e d ƒ d e ƒd Z e j d e d ƒ d e ƒd „  Z d „  Z d d d „ Z d d „ Z e d k rãe j j  e j j! e" ƒ e j# e j# d ƒ Z$ e% e$ ƒ j& ƒ  Z' e e' e$ ƒ e e' e$ ƒ e e' ƒ Z( x1 e( D]& \ Z) Z* e j+ j, d e) e* f ƒ q¶Wn  d S(   s    
Source code analysis utilities
iÿÿÿÿN(   t   _t   DEBUG(   t   programst   encoding(   t   to_text_stringt   to_binary_stringt   PY3(   t   dependenciesi   sL   (^|#)[ ]*(TODO|FIXME|XXX|HINT|TIP|@todo|HACK|BUG|OPTIMIZE|!!!|\?\?\?)([^#]*)c         C   sŽ   g  } x t  |  j ƒ  ƒ D]m \ } } x^ t j t | ƒ D]J } | d ra | d j d ƒ j ƒ  n | d } | j | | d f ƒ q8 Wq W| S(   s1   Find tasks in source code (TODO, FIXME, XXX, ...)iÿÿÿÿs    :iþÿÿÿi   (   t	   enumeratet
   splitlinest   ret   findallt   TASKS_PATTERNt   stript
   capitalizet   append(   t   source_codet   resultst   linet   textt   todot	   todo_text(    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt
   find_tasks   s    #
c         C   s´  yƒ| d k r d } n  y |  d 7}  Wn! t k
 rI |  t d ƒ 7}  n Xd d l } d d l m } y t |  | d | j ƒ } Wn` t k
 rÈ } | j	 d k r¬ g  } q‚| j
 d | j f g } nº t t f k
 rä g  } nž X| | | ƒ } | j j d d	 „  ƒ g  } t j |  ƒ } |  j ƒ  }	 xT | j D]I }
 d
 t |	 |
 j d | ƒ k r5| j |
 j |
 j |
 j f ƒ q5q5WWn* t k
 r¯g  } t r°t j ƒ  q°n X| S(   sV   Check source code with pyflakes
    Returns an empty list if pyflakes is not installeds   <string>s   
iÿÿÿÿN(   t   Checkert   execi    t   keyc         S   s   |  j  S(   N(   t   lineno(   t   x(    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   <lambda>J   t    s   analysis:ignorei   (   t   Nonet	   TypeErrorR   t   _astt   pyflakes.checkerR   t   compilet   PyCF_ONLY_ASTt   SyntaxErrorR   t   argsR   t
   ValueErrort   messagest   sortR   t
   get_codingR	   R   R   t   messaget   message_argst	   Exceptiont   DEBUG_EDITORt	   tracebackt	   print_exc(   R   t   filenameR    R   t   treet   valueR   t   wt   codingt   linest   warning(    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   check_with_pyflakes*   s@    		
s   >=0.6.0s   >=0.5.0t   pyflakess%   Real-time code analysis on the Editort   required_versions   >=2.3t   pycodestyles+   Real-time code style analysis on the Editorc           C   s   t  j d t ƒ S(   s5   Return True if pyflakes required version is installedR8   (   R   t   is_module_installedt   PYFLAKES_REQVER(    (    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   is_pyflakes_installedf   s    c         C   s€   t  j |  ƒ r |  g St  j d d d |  d ƒ } t  j d d d |  ƒ } | d k	 rc t j | g S| d k	 r| t j | g Sd S(   sU   Return checker executable in the form of a list of arguments
    for subprocess.Popent   packaget   modulet   _scriptN(   R   t   is_program_installedt   python_script_existsR   t   syst
   executable(   t   namet   path1t   path2(    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   get_checker_executablek   s    c         C   s0  |  d k r g  S| d k	 r) |  | 7}  n  t g  |  D] } d | k ^ q3 ƒ r[ | d 7} n  | d k r© t j d d d t ƒ } | j | ƒ | j ƒ  |  j | j ƒ n |  j | ƒ |  d } |  d } t	 j
 | | ƒ } | j ƒ  d j ƒ  j ƒ  j ƒ  }	 | d k rt j | j ƒ n  g  }
 t j | ƒ } | j ƒ  } xë |	 D]ã } t t j d | ƒ j ƒ  d d	 !ƒ } y t | | d | ƒ } Wna t k
 r²t | | d ƒ } n= t k
 rît j | d
 t ƒ} t | | d | ƒ } n Xd | k rE| | j d ƒ d } |
 j | | f ƒ qEqEW|
 S(   so   Check source code with checker defined with *args* (list)
    Returns an empty list if checker is not installedR8   s   
t   suffixs   .pyt   deletei    i   s   (\:[\d]+\:)iÿÿÿÿt   force_chardets   analysis:ignores   : i   N(   R   t   anyt   tempfilet   NamedTemporaryFilet   Falset   writet   closeR   RE   R   t   run_programt   communicateR   t   decodeR	   t   ost   unlinkR   R)   t   intR
   t   searcht   groupR   R   t   UnicodeDecodeErrort   Truet   find(   R%   R   R0   t   optionst   argt   tempfdt   cmdt   cmdargst   proct   outputR   R4   R5   R   R   R   R*   (    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   check   sD    %


"%c         C   s_   y. t  d ƒ } t | |  d | d d g ƒ} Wn* t k
 rZ g  } t r[ t j ƒ  q[ n X| S(   s"   Check source code with pycodestyleR:   R0   R]   s   -r(   RH   Rd   R,   R-   R.   R/   (   R   R0   R%   R   (    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   check_with_pep8¯   s    "t   __main__s   bootstrap.pys   Message: %s -- Line: %s
(-   t   __doc__RC   R
   RU   RM   R.   t   spyder.config.baseR    R   t   spyder.utilsR   R   t   spyder.py3compatR   R   R   t   spyderR   R-   R   R   R   R7   R<   t   addt   PYCODESTYLE_REQVERR=   RH   Rd   Re   t   __name__t   patht   joint   dirnamet   __file__t   pardirt   fnamet   opent   readt   codet   check_resultsR*   R   t   stdoutRP   (    (    (    s8   lib/python2.7/site-packages/spyder/utils/codeanalysis.pyt   <module>	   s<   	3		0&