
    JeB                        d Z ddl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
mZ ddlmZmZmZmZmZ ddl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 dd	lmZ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*m+Z+m,Z, ddl*m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6 e	jn                  Z8dZ9dZ:e0jv                  Z<e0jz                  Z>e0j~                  Z@e/j                  ZBe/j                  ZC G d d      ZD G d d      ZE G d d      ZF G d d      ZG G d de      ZH G d d e5      ZI G d! d"e      ZJd# ZKeLd$k(  r eK        yy)%zPylint widget.    N)getopenfilename)
QByteArrayQProcessQProcessEnvironmentSignalSlot)QInputDialogQLabelQMessageBoxQTreeWidgetItemQVBoxLayout)on_conf_change_)PluginMainWidget)get_conf_path
is_pynsistrunning_in_mac_app)is_anaconda)get_pylintrc_path)
TextEditor)ima)getcwd_or_homeget_home_dir)get_python_executable)QStylePaletteSpyderPalette)PythonModulesComboBoxis_module_or_package)OneColumnTreeOneColumnTreeActions   d   c                       e Zd ZdZdZdZdZy)PylintWidgetActionschange_history_depth_actionrun_analysis_actionbrowse_action
log_actionN)__name__
__module____qualname__ChangeHistoryRunCodeAnalysis
BrowseFileShowLog     C/usr/lib/python3/dist-packages/spyder/plugins/pylint/main_widget.pyr%   r%   @   s    1M+O JGr2   r%   c                       e Zd ZdZdZdZy)PylintWidgetOptionsMenuSectionsglobal_sectionsection_sectionhistory_sectionN)r*   r+   r,   GlobalSectionHistoryr1   r2   r3   r5   r5   G   s    FGGr2   r5   c                       e Zd ZdZy)PylintWidgetMainToolbarSectionsmain_sectionN)r*   r+   r,   Mainr1   r2   r3   r=   r=   M   s    Dr2   r=   c                        e Zd ZdZdZdZdZdZy)PylintWidgetToolbarItems
file_combo
rate_label
date_labelstretcher_1stretcher_2N)r*   r+   r,   FileComboBox	RateLabel	DateLabel
Stretcher1
Stretcher2r1   r2   r3   rA   rA   Q   s    LIIJJr2   rA   c                        e Zd ZdZ ed       ej                  d      d ed       ej                  d      d ed       ej                  d      d ed	       ej                  d
      ddZ fdZ xZ	S )CategoryItemz~
    Category item for results.

    Notes
    -----
    Possible categories are Convention, Refactor, Warning and Error.
    
Convention
convention)translation_stringiconRefactorrefactorWarningwarningErrorerror)rN   rR   rT   rV   c                    |dkD  s|dk(  rt        d      }nt        d      }| j                  |   d   }|d| d| dz  }t        |   ||gt        j
                         | j                  |   d	   }| j                  d|       y )
N   r   messagesmessagerP    ( )rQ   )r   
CATEGORIESsuper__init__r   TypesetIcon)selfparentcategorynumber_of_messagesrZ   titlerQ   	__class__s          r3   ra   zCategoryItem.__init__v   s    !%71%<}H|H )*>?2()8*A66%/*>*>? x(0Qr2   )
r*   r+   r,   __doc__r   r   rQ   r_   ra   __classcell__ri   s   @r3   rM   rM   Z   s     #$L/CHH\*

 #$J-CHHZ(

 #$I,CHHY'

 #$G*CHHW%
J& r2   rM   c                   R     e Zd Z eeee      Z	  fdZd Zd Z	d Z
d Zd Z xZS )ResultsTreec                 p    t         |   |       d | _        d | _        d | _        | j                  d       y N )r`   ra   filenameresultsdata	set_title)rd   re   ri   s     r3   ra   zResultsTree.__init__   s1     	rr2   c                     | j                   j                  t        |            }|#|\  }}| j                  j	                  ||d       yy)zDouble-click eventNrq   )rt   getidsig_edit_goto_requestedemit)rd   itemrt   fnamelinenos        r3   	activatedzResultsTree.activated   sD    yy}}RX& ME6((--eVR@ r2   c                     t        |t              r4|j                         r| j                  |       y| j	                  |       y| j                  |       y)zClick event.N)
isinstancerM   
isExpandedcollapseItem
expandItemr~   )rd   r{   s     r3   clickedzResultsTree.clicked   s<    dL) !!$'%NN4 r2   c                 F    | j                          | j                  d       y rp   )clearru   rd   s    r3   clear_resultszResultsTree.clear_results   s    

rr2   c                 @    || _         || _        | j                          y N)rr   rs   refresh)rd   rr   rs   s      r3   set_resultszResultsTree.set_results   s     r2   c                 .   t        d      | j                  z   }| j                  |       | j                          i | _        d| j
                  d   fd| j
                  d   fd| j
                  d   fd| j
                  d	   ff}|D ]  \  }}t        | |t        |            }|s|j                  d
       i }|D ]V  }t        |      dk(  rt        t        |      d gz         }|\  }}	}
}}t        j                  t        j                  | j                              d   }|j                  |      s|j                  |      }||d  }t        j                   | j                        }|j                  d      s||k(  rt        j"                  ||      }n%t        j"                  |g|j%                  d       }t        j&                  |      rt        j"                  |d      }dD ]!  }t        j(                  ||z         s||z   } n t        j&                  | j                        r\|j+                  |      }|Kt-        ||gt,        j.                        }|j1                  dt3        j4                  d             |||<   |}n|}t        |      dkD  r|sd}nd}dz  }|j7                  |||	|
      }t-        ||gt,        j.                        }|j1                  dt3        j4                  d             ||	f| j                  t9        |      <   Y  y )NzResults for rN   C:rR   R:rT   W:rV   E:T   r   .ra   )z.pyz.pywpythonrY   z	{msg_id} z{msg_id} ({message_name}) zline {lineno}: {message})msg_idmessage_namer}   r[   arrow)r   rr   ru   r   rt   rs   rM   lensetDisabledtuplelistospsplitextbasename
startswithfinddirnamejoinsplitisdirisfilerw   r   rb   rc   r   rQ   formatrx   )rd   rh   rs   rf   rZ   
title_itemmodulesmessage_datamoduler}   r[   r   r   r   i_baser   modnameextre   r{   message_stringmsg_items                         r3   r   zResultsTree.refresh   s   .!DMM1u

	 4<<-.d+,T*+dll4()	
 #* 9	<Hh%dHc(mDJ&&t,G ( 3<|$)#(l);tf)D#EL@L=<<T]](CDQG((2#[[2F#FG_F++dmm4$$S)Vx-?!hhw7G!hhwCc1BCG99W%!hhw
;G* Czz'#+.")C-
 99T]]+$[[1F~.zF8/>/C/C EQ(:;+/(!%'Fv;?')4)E"<<!/!6!6!!7 "7 "4 +^,o.B.BD  CHHW$56+2F*;		"X,'g3<9	<r2   )r*   r+   r,   r   strintry   ra   r~   r   r   r   r   rk   rl   s   @r3   rn   rn      s7    $S#s3A!
G<r2   rn   c                       e Zd ZdZdZ ed      ZdZ ee	e
e	      Z	  e       Z	 d' fd	Z e       d        Zd(dZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Z eddg      d        Zd Zd Z e        ee
      d)d              Zd Z ee	      d        Z d)dZ!d Z"d Z#d Z$d Z%d Z&d(d Z' e       d!        Z(d" Z) e       d)d#       Z*d$ Z+d% Z,d& Z- xZ.S )*PylintWidgetz
    Pylint widget.
    Tzpylint.resultsz1.1.0c                    t         |   |||       d | _        d | _        d | _        d | _        g | _        | j                  d      | _        d | _	        d | _
        t        | t        j                        | _        t        |       | _        t        j"                  | j                   _        t        |       | _        t        j(                  | j&                  _        t+        |       | _        t/        j0                  | j2                        r_	 t5        | j2                  d      5 }t7        j8                  |j;                               }d d d        d   | j<                  k(  r
|dd  | _        | j                  jC                  | j                  jD                         | j                  d d d   D ]  }| jG                  |        tI               }|jK                  | j,                         | jM                  |       | j                  jN                  jQ                  | jR                         | j,                  jT                  jQ                  | jT                         y # 1 sw Y   xY w# t>        t@        f$ r Y w xY w)Nhistory_filenamesid_rbr   rY   )+r`   ra   _processoutputerror_outputrr   rdataget_confcurr_filenamescode_analysis_actionr(   r   rA   rG   	filecombor
   	ratelabelrH   ID	datelabelrI   rn   
treewidgetr   r   DATAPATHopenpickleloadsreadVERSIONEOFErrorImportErrorsetInsertPolicyInsertAtTopset_filenamer   	addWidget	setLayoutvalidconnect_check_new_filery   )	rd   namepluginre   fhrt   r|   layoutri   s	           r3   ra   zPylintWidget.__init__'  s   vv.  
"mm,?@$(!! /.;;=  4>>4>>%d+::dmm$$--. 3"!<<	2D3 7dll*!%abDJ
 	&&t~~'A'AB((2. 	%Ee$	% )v 	$$T%9%9://77((	*)3 3
 k* s*   I $I$I II I21I2c                      j                          d _        d _        t               x _        }|j                  t        j                         |j                  t                      |j                  j                   j                         |j                  j                   fd       |j                  j                  t        j                  f fd	        j                   j!                               }t#               }|j%                  dd       t&        j(                  dk(  rt+               }t&        j,                  j/                  d|      }|j%                  d|       t1               s9t3               s/|j%                  dt&        j,                  j/                  d             t5               r1t&        j,                  j/                  d	      }|j%                  d	|       |j7                  |       |j9                  t:        j<                  |       |j?                         }|s: jA                          tC        jD                   tG        d
      tG        d             yy)zStart the code analysis.rq   c                  (     j                  d      S )NT)rW   )_read_outputr   s   r3   <lambda>z%PylintWidget._start.<locals>.<lambda>g  s    D%%D%1 r2   c                 (    j                  | |      S r   )	_finished)ecesrd   s     r3   r   z%PylintWidget._start.<locals>.<lambda>i  s    t~~b"/E r2   PYTHONIOENCODINGutf8ntUSERPROFILEAPPDATA
PYTHONHOMErV   zProcess failed to startN)$start_spinnerr   r   r   r   setProcessChannelModeSeparateChannelssetWorkingDirectoryr   readyReadStandardOutputr   r   readyReadStandardErrorfinished
ExitStatusget_commandget_filenamer   insertosr   r   environrw   r   r   r   setProcessEnvironmentstartsys
executablewaitForStartedstop_spinnerr   criticalr   )rd   processcommand_argsprocessEnvironmenthome_diruser_profilepyhomerunnings   `       r3   _startzPylintWidget._start[  s    	"*4.0%%h&?&?@##N$45''//0A0AB&&..1	3  "--E	G ''(9(9(;<02!!"4f=77d? $~H::>>-BL%%m\B <")))RZZ^^I5NO ZZ^^L1F%%lF;%%&89cnnl3((*  '
+, r2   c                    | j                   }|r |j                  t        j                         n|j                  t        j                         t               }|j                         r:|r||j                         z  }n||j                         z  }|j                         r:t        |j                         d      }|r| xj                  |z  c_        n| xj                  |z  c_        | j                          y )Nzutf-8)r   setReadChannelr   StandardErrorStandardOutputr   bytesAvailablereadAllStandardErrorreadAllStandardOutputr   rt   r   r   update_actions)rd   rW   r   qbatexts        r3   r   zPylintWidget._read_output  s    --""8#9#9:""8#:#:;l$$&w3355w4466	 $$& 388:w'%KK4Kr2   c                 h   | j                   so| j                          | j                  rRt        j                  | t        d      | j                         t        d| j                  z   t        j                         y | j                         }| j                  | j                         \  }}}| j                          | j                  |t        j                         |||f       | j                  | j                   z   | _         | j                  d       | j!                          | j                          y )NrV   zpylint error:

)fileT)justanalyzed)r   r   r   r   r   r   printr   stderrr   parse_output_save_historyset_datatime	localtime	show_datar  )rd   	exit_codeexit_statusrr   ratepreviousrs   s          r3   r   zPylintWidget._finished  s    {{  $$gJ%%
 )D,=,==CJJO$$&"&"3"3DKK"@hh!147 KL''$++5D)r2   c                 r    | j                         }|| j                  k7  r|| _        | j                          y y r   )r   rr   r  )rd   r|   s     r3   r   zPylintWidget._check_new_file  s2    !!#DMM!!DMNN "r2   c                 h    | j                   }|d uxr! |j                         t        j                  k(  S r   )r   stater   Running)rd   r   s     r3   _is_runningzPylintWidget._is_running  s,    --d"Jw}}(:J:J'JJr2   c                     | j                   j                          | j                   j                  d       | j                          y )Ni  )r   closewaitForFinishedr   r   s    r3   _kill_processzPylintWidget._kill_process  s0    %%d+r2   c                 T   | j                  d      }| j                  j                         |kD  r| j                  j                         }||z
  }t        |      D ]:  }| j                  j                         }| j                  j	                  |dz
         < | j                  j                          y| j                  j                         }||z
  }t        |||z         D ]G  }|t        | j                        k\  r y| j                  |   }| j                  j                  ||       I y)z:Change the number of files listed in the history combobox.max_entriesrY   N)	r   r   countrange
removeItemselectedr   r   
insertItem)rd   r'  num_elementsdiff__iact_filenames          r3   _update_combobox_historyz%PylintWidget._update_combobox_history  s    mmM2>>!K/>>//1L+-DDk <#~~335)),*:;< NN##%>>//1L-D<)<= ;D//00#2215))!\:	;r2   c                    | j                   rrg }| j                  D ]6  }t        d      |vst        j                  |      }|j                  |       8 |dt         | _        | j                  d| j                         yg | _        y)z#Save the current history filenames.untitledNr   )re   r   r   r   normpathappendMAX_HISTORY_ENTRIESset_conf)rd   list_save_filesr|   rr   s       r3   r  zPylintWidget._save_history  s{    ;; O,, 5Z=-"||E2H#**845
 #22F3F"GDMM-t/B/BC"$Dr2   c                     t        d      S )NzCode Analysisr   r   s    r3   	get_titlezPylintWidget.get_title  s    !!r2   c                     | j                   S r   )r   r   s    r3   get_focus_widgetzPylintWidget.get_focus_widget  s    r2   c                 	   | j                  t        j                  t        d      t        d      | j	                  d      | j
                        }| j                  t        j                  t        d      t        d      | j	                  d      | j                        | _        | j                  t        j                  t        d      t        d      | j	                  d      | j                        | _        | j                  t        j                  t        d	      t        d
      | j	                  d      | j                        | _        | j                         }| j!                  | j"                  j%                  t&        j(                        |t*        j,                         | j!                  | j"                  j%                  t&        j.                        |t*        j,                         | j!                  | j"                  j%                  t&        j0                        |t*        j2                         | j!                  | j"                  j%                  t&        j4                        |t*        j2                         | j!                  ||t*        j6                         | j!                  || j"                  j8                  t*        j6                         | j"                  j:                  j=                  d       | j?                         }| j@                  | j                  | j                  fD ]$  }| jC                  ||tD        jF                         & | jI                  d      }| jJ                  | jM                  tN        jP                        | jR                  | jM                  tN        jT                        | j                  fD ]$  }| jC                  ||tD        jF                         & | jW                          | jX                  rn| j[                          | j@                  j]                  d| j_                                | j                  ja                  | j@                  jc                                n| j                  ja                  d       | j@                  jd                  jg                  | j                  j`                         y )Nz
History...zSet history maximum entrieshistory)r  tiprQ   	triggeredzRun code analysisrunSelect Python filefileopenOutputzComplete outputlog)menusectionFrH  	secondaryr   r   )4create_actionr%   r-   r   create_iconchange_history_depthr.   sig_start_analysis_requestedr   r/   select_filer(   r0   show_logr)   get_options_menuadd_item_to_menur   
get_actionr!   CollapseAllActionr5   r9   ExpandAllActionCollapseSelectionActionr:   ExpandSelectionActionr;   rG  restore_action
setVisibleget_main_toolbarr   add_item_to_toolbarr=   r?   create_toolbarr   create_stretcherrA   rJ   r   rK   r  r   remove_obsolete_itemsinsertItemsget_filenames
setEnabledis_validr   r   )rd   r&   options_menutoolbarr{   secondary_toolbars         r3   setupzPylintWidget.setup  s   &*&8&8--</0!!),// '9 '
# %)$6$6//&'%&!!%(77 %7 %
! "//**'(&'!!*-&& 0 
 ,,''8#$!!%(mm - 
 ,,.OO&&$6683::	 	 	
 	OO&&$4463::	 	 	
 	OO&&$<<>3;;	 	 	
 	OO&&$::<3;;	 	 	
 	'3;; 	 	
 	'%%3;; 	 	

 	&&11%8'')^^T%7%7..0 	D$$7<< % 	 !//<^^**5@@ + B^^**5@@ + B__& 	D $$!7<< % 	 	::&&(NN&&q$*<*<*>?%%001H1H1JK%%007 	$$T%>%>%I%IJr2   r'  r   )optionc                 j    |dk(  r| j                          y |dk(  r|| _        | j                          y y )Nr'  r   )r2  r   )rd   rg  values      r3   on_conf_updatezPylintWidget.on_conf_updateU  s8    ]"))+**"'D))+ +r2   c                     | j                         r+| j                  j                  | j                  d             n*| j                  j                  | j                  d             | j	                          y )NstoprB  )r!  r   rc   rL  r^  r   s    r3   r  zPylintWidget.update_actions]  sX    %%--d.>.>v.FG%%--d.>.>u.EF""$r2   c                 $    | j                          y r   )stop_code_analysisr   s    r3   on_closezPylintWidget.on_closee  s    !r2   c                      |t               }|j                  d       |j                  t        d             |j	                  t        d             |j                  t         j                         |j                  t        t               |j                  d       |j                   j                  d             |j                  j                   fd       |j                          y j!                  d|       y)a  
        Set history maximum entries.

        Parameters
        ----------
        value: int or None, optional
            The valur to set  the maximum history depth. If no value is
            provided, an input dialog will be launched. Default is None.
        NFr;   zMaximum entriesrY   r'  c                 (    j                  d|       S )Nr'  )r8  )ri  rd   s    r3   r   z3PylintWidget.change_history_depth.<locals>.<lambda>  s    dmmM5A r2   )r	   setModalsetWindowTitler   setLabelTextsetInputModeIntInputsetIntRangeMIN_HISTORY_ENTRIESr7  
setIntStepsetIntValuer   intValueSelectedr   showr8  )rd   ri  dialogs   `  r3   rM  z!PylintWidget.change_history_depthj  s     =!$'F OOE"!!!I,/"3 45 5 5624GHa t}}];< ##++AC KKMMM-/r2   c                 H    t        | j                  j                               S )z3
        Get current filename in combobox.
        )r   r   currentTextr   s    r3   r   zPylintWidget.get_filename  s     4>>--/00r2   c                    | j                         r| j                          t        |      }t        j                  |      }| j                         |k(  ry| j                  |      \  }}|| j                  vrT| j                  j                  d|       | j                  j                  d|       | j                  j                  d       n	 | j                  j                  |      }| j                  j                  |       | j                  j                  |       | j                  j                  d|       | j                  j                  d|       | j                  j                  d       | j                  j#                         }|| j%                  d      kD  r| j                  j                  |dz
         | j                  j'                          y# t        $ r | j                  j!                  |       Y w xY w)z3
        Set current filename in combobox.
        Nr   r'  rY   )r!  r%  r   r   r5  r   get_datar   r   r,  r   setCurrentIndexfindTextr*  pop
IndexErrorremover(  r   r+  )rd   rr   index_datar-  s        r3   r   zPylintWidget.set_filename  s   
  x=<<)
 (*}}X.u4...NN%%a2&&q(3NN**1-5//9))%0##''. NN%%a2&&q(3NN**1-~~++-$--66NN%%lQ&67!  5##**845s   AG $G>=G>c                     | j                         r| j                          n=|| j                  |       | j                  j	                         r| j                          | j                          y)z
        Perform code analysis for given `filename`.

        If `filename` is None default to current filename in combobox.

        If this method is called while still running it will stop the code
        analysis.
        N)r!  r%  r   r   rb  r  r  )rd   rr   s     r3   start_code_analysisz PylintWidget.start_code_analysis  sU      #!!(+~~&&(r2   c                 F    | j                         r| j                          yy)z1
        Stop the code analysis process.
        N)r!  r%  r   s    r3   rn  zPylintWidget.stop_code_analysis  s!       r2   c                 r    | j                   D cg c]  \  }}t        |      r||f c}}| _         yc c}}w )z*
        Removing obsolete items.
        N)r   r   )rd   rr   rt   s      r3   r^  z"PylintWidget.remove_obsolete_items  s8     >BZZ 9>8T-h7  & 9
 9s   3c                 L    | j                   D cg c]  \  }}|	 c}}S c c}}w )zI
        Return all filenames for which there is data available.
        )r   )rd   rr   r  s      r3   r`  zPylintWidget.get_filenames  s      15

;_Xu;;;s    c                     t        j                  |      }t        | j                        D ]  \  }\  }}||k(  s||fc S  y)zG
        Get and load code analysis data for given `filename`.
        )NN)r   abspath	enumerater   )rd   rr   r  r|   rt   s        r3   r  zPylintWidget.get_data  sJ     ;;x($-djj$9 	 E=E4 d{"	 r2   c                 T   t        j                  |      }| j                  |      \  }}|| j                  j	                  |       | j                  j                  d||f       t        | j                        | j                  d      kD  rC| j                  j	                  d       t        | j                        | j                  d      kD  rCt        | j                  d      5 }t        j                  | j                  g| j                  z   |d       ddd       y# 1 sw Y   yxY w)zI
        Set and save code analysis `data` for given `filename`.
        Nr   r'  r   wb   )r   r  r  r   r  r   r   r   r   r   r   dumpr   )rd   rr   rt   r  r  r   s         r3   r  zPylintWidget.set_data  s     ;;x(}}X.uJJNN5!

!h-.$**om <<JJNN2 $**om << $--& 	<"KK3R;	< 	< 	<s   %0DD'c                    t         }t        }|sd| _        | j                  j	                  | j                  duxr t        | j                        dkD         | j                         r| j                          | j                         }|sy| j                  |      \  }}|(t        d      }| j                  j                          d}n|\  }	}
}}|
(t        d      }| j                  j                          d}nd}d}d}t        }t        |
      d	kD  rt        }nt        |
      d
kD  rt         }t        d      }|||fz  ||d|
z  fz  z   }|rt        d      }d|d|d}||||fz  z  }| j                  j#                  ||       t%        j&                  d|	      }|||fz  }| j(                  j+                  |       | j,                  j+                  |       y)z*
        Show data in treewidget.
        Nr   z#Source code has not been rated yet.rq   z7Analysis did not succeed (see output for more details).z)<span style="color: %s"><b>%s </b></span>z(<span style="color: %s"><b>%s</b></span>z!<span style="color: %s">%s</span>g      @g      @zGlobal evaluation:z%s/10zprevious run:r\   r]   z/10)z%Y-%m-%d %H:%M:%S)MAIN_TEXT_COLORMAIN_PREVRATE_COLORr   r)   ra  r   r!  r%  r   r  r   r   r   DANGER_COLORfloatSUCCESS_COLORWARNING_COLORr   r  strftimer   setTextr   )rd   r  
text_colorprevrate_colorrr   _indexrt   r  	date_textdatetimer  previous_raters   
text_style
rate_styleprevrate_stylecolor	text_prundates                      r3   r  zPylintWidget.show_data  s    %
,DK""4;;d#: $<'*4;;'7!';	=  $$&}}X.<:;DOO))+I592HdM7| : ;--/	J
I
!F$;#)E4[2%)E-.#z4&88%4(AAC  !/ 2I1:M JINni-HHHD++Hg>}}%8(C&*d);;	t$y)r2   c                     | j                   rEt        | j                   t        d      | d      }|j                  dd       |j	                          yy)z)
        Show output log dialog.
        zCode analysis outputT)rh   re   readonlyi  i  N)r   r   r   resizeexec_)rd   output_dialogs     r3   rP  zPylintWidget.show_log5  sN    
 ;;&./	M   c*! r2   c                     t        j                  |      t               | j                  d      t        j                  d      g}t        |      S )zQ
        Get the path to the most proximate pylintrc config to the file.
        project_dir~)search_paths)r   r   r   r   
expanduserr   )rd   rr   r  s      r3   r   zPylintWidget.get_pylintrc_pathF  sB     KK!MM-(NN3	
 !l;;r2   c                    |d| j                   j                  d       t        | t        d      t	               t        d      dz         \  }}| j                   j                  d       |r"| j                  |       | j                          yy)z
        Select filename using a open file dialog and set as current filename.

        If `filename` is provided, the dialog is not used.
        NFrC  zPython filesz (*.py ; *.pyw)T)sig_redirect_stdio_requestedrz   r   r   r   r   r  )rd   rr   
_selfilters      r3   rO  zPylintWidget.select_fileW  s     --2259#2&' .!$55	$ Hj --2248h'$$& r2   c                 p   t        j                  | j                  dd            }| j                  dd      st               |k(  rd}|S t        j                  |      rTt
        j                  dk(  rt        j                  |      }|S t        j                  t        j                  |            }|S d}|S )z|
        Check if custom interpreter is active and if so, return path for the
        environment that contains it.
        r   main_interpreterrI  defaultNr   )r   r5  r   r   r   r   r   r   )rd   custom_interpreterpath_of_custom_interpreters      r3   test_for_custom_interpreterz(PylintWidget.test_for_custom_interpreterl  s    
 !\\MM,0BMC

 MM)-?M@$&*<<)-&" *) zz,-
 77d?14*2,. *) 25S[[*>, 2-.
 *) .2*))r2   c                     g }t         g d}| j                         }|%|dj                  |j                  dd            gz  }| j	                  |      }||dj                  |      gz  }|j                  |       |S )zN
        Return command to use to run code analysis on given filename
        )z-mpylintz--output-format=textz;--msg-template={msg_id}:{symbol}:{line:3d},{column}: {msg}"z}--init-hook=import pylint_venv;                     pylint_venv.inithook('{}',                    force_venv_activation=True)\z\\rr   z--rcfile={})
PYLINT_VERr  r   replacer   r6  )rd   rr   r   r  pylintrc_paths        r3   r   zPylintWidget.get_command  s     !L &*%E%E%G"%11 282::4H2J	 L ...A$]11-@AALH%r2   c                 (   g g g g d}d}d}|j                         D ]  }|j                  |      r|t        |      d }#t        j                  d|      s:i }d}d}g d}	t        |	      D ]p  \  }
}|
t        |	      dz
  k(  rt        |      }n|j                  d	|      }|dk  r ||| }|s |d
k(  rt        |j                  d      d         }|||<   |dz   }r ||d
   |d   |d   |d   f}||d   d	z      j                  |        d}d}|j                  |      }|dkD  r(|j                  d|      }|dkD  r||t        |      z   | }d}|<d}|j                  |      }|dkD  r#|j                  d|      }||t        |      z   | }|||fS )zK
        Parse output and return current revious rate and results.
        )r   r   r   r   z************* Module rq   Nz^[CRWE]+([0-9]{4})?:r   )r   r   line_nbr[   rY   :r  ,r[   r   r   zYour code has been rated at z/10zprevious run: )

splitlinesr   r   rematchr  r   r   r   r6  )rd   r   rs   
txt_moduler   lineitemsidx_0idx_1	key_nameskey_idxkey_namer{   pylint_itemr  txt_ratei_rate
i_rate_endr  txt_pruni_prun
i_prun_ends                         r3   r  zPylintWidget.parse_output  s   
 2Rr:,
%%' "	;Dz*c*o./883T:EEEHI%.y%9 ;!c)nq00IE IIc51E19UE*y(tzz#q12D"&h	#;&  &uY'7y9I$Xn0EGQ#&--k:E"	;J 1X&A:UF3JA~fS]2:> 'H[[:6Fz#[[7
!&X"6zBXw&&r2   )NNN)Fr   )/r*   r+   r,   rj   ENABLE_SPINNERr   r   r   r   r   r   ry   rN  ra   r   r  r   r   r   r!  r%  r2  r  r;  r=  rf  r   rj  r  ro  rM  r   r   r  rn  r^  r`  r  r  r  rP  r   rO  r  r   r  rk   rl   s   @r3   r   r     sf    N-.HG %S#s3 $*8 0*h 
V, ,\,*K
;&% "fKP M+>?@, A,%"
 
V	#Y0  0<1 
#Y%" %"N(!9<	<"7*r 
V" " <" 
V' '(*@>?'r2   r   c                  Z   ddl m}  ddlm}  |       }d|_         | d      }t        d|      }|j                          |j                          |j                  dd	       |j                          |j                  t        
       t        j                  |j                                y)zRun pylint widget testr   )qapplication)	MagicMockr     )	test_time)r   r   i  i  r  N)spyder.utils.qthelpersr  unittest.mockr  CONF_SECTIONr   _setuprf  r  r|  r  __file__r   exitr  )r  r  plugin_mockappwidgets        r3   testr    sy    3'+K'K

$Cx<F
MMO
LLN
MM#s
KKM
1HHSYY[r2   __main__)Mrj   r   os.pathpathr   r   r  r   r  r  qtpy.compatr   qtpy.QtCorer   r   r   r   r   qtpy.QtWidgetsr	   r
   r   r   r   spyder.api.config.decoratorsr   spyder.api.translationsr   spyder.api.widgets.main_widgetr   spyder.config.baser   r   r   spyder.config.utilsr   spyder.plugins.pylint.utilsr   2spyder.plugins.variableexplorer.widgets.texteditorr   spyder.utils.icon_managerr   spyder.utils.miscr   r   r   spyder.utils.paletter   r   spyder.widgets.comboboxesr   r   spyder.widgets.onecolumntreer    r!   __version__r  rx  r7  COLOR_ERROR_1r  COLOR_WARN_1r  COLOR_SUCCESS_1r  COLOR_TEXT_1r  r  r%   r5   r=   rA   rM   rn   r   r  r*   r1   r2   r3   <module>r     s(    
   	 
   ' ) ) 8 % ; L L + 9 I ) : 3 == L
 
  ****--
  ,,#00       +? +by<- y<xc'# c'R$ zF r2   