B
    A!p\              
   @   s0  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
Z
ddlZddlZddlZddlmZ ejdZdejkrejd ZedkrejeZnedkrdZnejedZdd	 Zd
d Zejdk rd\ZZnd\ZZdd Zdd Ze Zde  Z G dd de!Z"dd Z#dd Z$dd Z%dd Z&dd Z'd d! Z(d"d# Z)ej*e+e
j,e'e%e(d$d% d&d% e)d'	Z-d(d) Z.dDd+d,Z/d-d. Z0d/d0 Z1ej2d1d2 Z3d3d4 Z4G d5d6 d6ej5Z5G d7d8 d8ej6Z6G d9d: d:ej7Z8G d;d< d<Z9G d=d> d>Z:G d?d@ d@e9e:Z;dAej<dfdBdCZ=dS )EzIutilities for Pylint configuration :

* pylintrc
* pylint.d (PYLINTHOME)
    )print_functionN)utils~Z
PYLINTHOMEz	.pylint.dc             C   s&   |  tjd} tjtd| |df S )N_z%s%s%sz.stats)replaceosseppathjoinPYLINT_HOME)Z	base_nameZrecurs r   ,lib/python3.7/site-packages/pylint/config.py_get_pdata_pathH   s    r   c          	   C   sD   t | d}y t|t}t|S Q R X W n tk
r>   i S X d S )N   )r   open
_PICK_LOADpickleload	Exception)base	data_filestreamr   r   r   load_resultsM   s    
r   )   r   )wr)wbrbc          
   C   s   t jtsByt t W n& tk
r@   tdt tjd Y nX t	|d}y&t
|t}t| | W d Q R X W n< ttfk
r } ztd||f tjd W d d }~X Y nX d S )NzUnable to create directory %s)filer   zUnable to create file %s: %s)r   r	   existsr   mkdirOSErrorprintsysstderrr   r   
_PICK_DUMPr   dumpIOError)Zresultsr   r   r   exr   r   r   save_results\   s    
r)   c              C   s`  t jdrt jdS t jdr0t jdS t jdrt jt  } xxt jt j| drt jt j| d} t jt j| drt j| dS t jt j| drNt j| dS qNW dt jkrt jt jd rt jd }nHt jd}|dkr
d}n,t j|d}t j|s6t j|dd}t j|s\t jd	rXd	}nd
}|S )zKsearch the pylint rc file and return its path if it find it, else None
    pylintrcz	.pylintrcz__init__.pyz..PYLINTRCr   )r   z/rootz.configz/etc/pylintrcN)	r   r	   r   abspathisfilegetcwdr
   environ
expanduser)curdirr*   Z	user_homer   r   r   find_pylintrcj   s2    
r2   af  
The following environment variables are used:
    * PYLINTHOME
    Path to the directory where persistent data for the run will be stored. If
not found, it defaults to ~/.pylint.d/ or .pylint.d (in the current working
directory).
    * PYLINTRC
    Path to the configuration file. See the documentation for the method used
to search for configuration file.
c               @   s   e Zd ZdZdS )UnsupportedActionzBraised by set_option when it doesn't know what to do for an actionN)__name__
__module____qualname____doc__r   r   r   r   r3      s   r3   c             C   s<   t |}x,|D ]$}|| krd}t|||| f qW |S )Nz-option %s: invalid value: %r, should be in %s)r   
_check_csvoptparseOptionValueError)choicesnamevaluevaluesZ	csv_valuemsgr   r   r   _multiple_choice_validator   s    

r@   c             C   s$   || kr d}t |||| f |S )Nz-option %s: invalid value: %r, should be in %s)r9   r:   )r;   r<   r=   r?   r   r   r   _choice_validator   s    rA   c             C   s
   t |S )N)r   r8   )r   r<   r=   r   r   r   _csv_validator   s    rB   c             C   s   t |dr|S t|S )Npattern)hasattrrecompile)r   r<   r=   r   r   r   _regexp_validator   s    
rG   c                s    fddt  |D S )Nc                s   g | ]}t  |qS r   )rG   ).0val)r   r<   r   r   
<listcomp>   s    z)_regexp_csv_validator.<locals>.<listcomp>)rB   )r   r<   r=   r   )r   r<   r   _regexp_csv_validator   s    rK   c             C   sD   t |trt|S |dkrdS |dkr*dS d}t|| |f d S )N)yZyesT)nZnoFz<option %s: invalid yn value %r, should be in (y, yes, n, no))
isinstanceintboolr9   r:   )optr   r=   r?   r   r   r   _yn_validator   s    
rR   c             C   s   |sd}t |t|S )Nzindent string can't be empty.)r9   r:   r   _unquote)rQ   r   r=   r?   r   r   r   _non_empty_string_validator   s    
rT   c             C   s   t | d ||S )Nr;   )rA   )rQ   r<   r=   r   r   r   <lambda>   s    rU   c             C   s   t | d ||S )Nr;   )r@   )rQ   r<   r=   r   r   r   rU      s   )	stringrO   regexp
regexp_csvcsvynchoicemultiple_choicenon_empty_stringc             C   st   | t krtd|  yt |  |||S  tk
rn   yt |  |S  tk
rh   td||| f Y nX Y nX d S )NzUnsupported type "%s"z"%s value (%r) should be of type %s)
VALIDATORSr   	TypeErrorr9   r:   )Zopttypeoptdictoptionr=   r   r   r   _call_validator   s    rb    c             C   s0   y|d }W n t k
r    | S X t|||| S )zreturn a validated value for an option according to its type

    optional argument name is only used for error message formatting
    type)KeyErrorrb   )r=   r`   r<   Z_typer   r   r   	_validate   s
    rf   c                s    fdd| j D S )Nc                s0   g | ](}t |d dpd kr|jtjk	r|qS )levelr   )getattrhelpr9   SUPPRESS_HELP)rH   ra   )outputlevelr   r   rJ      s   z"_level_options.<locals>.<listcomp>)option_list)grouprk   r   )rk   r   _level_options   s    
rn   c             C   s   | j dks| js|jS |jd dd }y| j jj| }W n tk
rR   d}Y n2X ||}|||}t	|j
||}t||}|tjks|s| j}|j| jt|S )zPatch OptionParser.expand_default with custom behaviour

    This will handle defaults to avoid overriding values in the
    configuration file.
    Nr      )parserZdefault_tagri   Z
_long_optsoptions_manager_all_optionsre   get_option_defoption_attrnamerh   configr   Z_format_option_valuer9   Z
NO_DEFAULTZNO_DEFAULT_VALUEr   str)selfra   optnameproviderr=   r`   r   r   r   _expand_default  s    

rz   c              c   s(   t j} ztt j_d V  W d | t j_X d S )N)r9   HelpFormatterrz   expand_default)Zorig_defaultr   r   r   _patch_optparse  s
    
r}   c             C   s   t | j||S )N)r@   r;   )rQ   r<   r=   r   r   r   #_multiple_choices_validating_option(  s    r~   c               @   s   e Zd Zejjd Zejjddg ZeejjZe	ed< e
ed< eed< eed< eed< eed	< d
d Zdd Zeejjd< dd ZdS )Option)rW   rX   rY   rZ   r\   r]   hiderg   rW   rX   rY   rZ   r\   r]   c             O   s0   t jj| f|| t| dr,| jr,t j| _d S )Nr   )r9   r   __init__rD   r   rj   ri   )rw   ZoptsZattrsr   r   r   r   ?  s    zOption.__init__c             C   sv   | j dkrV| jd kr td| t| jttfsrtdtt | jdd  | n| jd k	rrtd| j  | d S )N)r[   r\   z/must supply a list of choices for type 'choice'z1choices must be a list of strings ('%s' supplied)'r   z#must not supply choices for type %r)	rd   r;   r9   OptionErrorrN   tuplelistrv   split)rw   r   r   r   _check_choiceD  s    


zOption._check_choicero   c             C   sL   |  ||}| jdkr4t|| j}|r4|| |}| | j| j||||S )NZnamed)Zconvert_valuerd   rh   destupdateZtake_actionaction)rw   rQ   r=   r>   rp   Zexistentr   r   r   processX  s    

zOption.processN)r4   r5   r6   r9   r   ZTYPESATTRScopyZTYPE_CHECKERrG   rK   rB   rR   r~   rT   r   r   ZCHECK_METHODSr   r   r   r   r   r   -  s   r   c               @   s&   e Zd Zdd ZdddZdd ZdS )	OptionParserc             O   s    t jj| f|dti| d S )Noption_class)r9   r   r   r   )rw   r   argskwargsr   r   r   r   h  s    zOptionParser.__init__Nc             C   s   |d kr| j }t|dd}||  g }||d |  | jrd|tj	| | |d xB| j
D ]8}|j|krl|jst||rl||| |d qlW |  d|d d S )Noutput_levelr   ZOptions
rc   )	formatterrh   Zstore_option_stringsappendformat_headingindentrl   r9   ZOptionContainerformat_option_helpoption_groupsrg   descriptionrn   format_helpdedentr
   )rw   r   rk   resultrm   r   r   r   r   k  s"    


zOptionParser.format_option_helpc             C   s   || j krt||S )zDisable abbreviations.)Z	_long_optr9   ZBadOptionError)rw   rQ   r   r   r   _match_long_opt  s    

zOptionParser._match_long_opt)N)r4   r5   r6   r   r   r   r   r   r   r   r   g  s   
r   c               @   st   e Zd ZdddZdd Zdd	 Zd
d ZdddZedd Z	edd Z
edd Zedd Zedd ZdS )_ManHelpFormatterr      O   c             C   s   t j| |||| d S )N)r9   r{   r   )rw   Zindent_incrementZmax_help_positionwidthZshort_firstr   r   r   r     s    z_ManHelpFormatter.__init__c             C   s   d|   S )Nz.SH %s
)upper)rw   Zheadingr   r   r   r     s    z _ManHelpFormatter.format_headingc             C   s   |S )Nr   )rw   r   r   r   r   format_description  s    z$_ManHelpFormatter.format_descriptionc             C   s|   y
|j }W n tk
r(   | |}Y nX |jrl| |}ddd | D }|dd}|dd}nd}d	||f S )
N c             S   s   g | ]}|  qS r   )strip)rH   lr   r   r   rJ     s    z3_ManHelpFormatter.format_option.<locals>.<listcomp>\z\\z	[current:z	[default:rc   z.IP "%s"
%s
)Zoption_stringsAttributeErrorZformat_option_stringsri   r|   r
   
splitlinesr   )rw   ra   Z	optstringZ	help_textZhelp_stringr   r   r   format_option  s    

z_ManHelpFormatter.format_optionr   c             C   sr   d}y|  }W n tk
r,   | }Y nX | ||j}t|drT| ||j}d| |||| 	||f S )Nrc   	long_descz%s
%s
%s
%s)
Z_get_prog_namer   Zget_prog_nameformat_short_descriptionr   rD   format_long_descriptionr   format_titleformat_synopsis)rw   	optparserpkginfosectionr   pgm
short_descr   r   r   format_head  s    

z_ManHelpFormatter.format_headc             C   s$   dt  d d  }d| ||| f S )Nz%d-%02d-%02dr   z.TH %s %s "%s" %s)timeZ	localtime)r   r   Zdater   r   r   r     s    z_ManHelpFormatter.format_titlec             C   s   d| |  f S )Nz.SH NAME
.B %s
\- %s
)r   )r   r   r   r   r   r     s    z*_ManHelpFormatter.format_short_descriptionc             C   s   d|  S )Nz6.SH SYNOPSIS
.B  %s
[
.I OPTIONS
] [
.I <arguments>
]
r   )r   r   r   r   r     s    
z!_ManHelpFormatter.format_synopsisc             C   sR   d dd | D }|dd}| | rB|t| d  }d| | f S )Nr   c             s   s   | ]}|  V  qd S )N)lstrip)rH   liner   r   r   	<genexpr>  s    z<_ManHelpFormatter.format_long_description.<locals>.<genexpr>z
.
z

z.SH DESCRIPTION
.B %s
%s
)r
   r   r   lower
startswithlenr   )r   r   r   r   r   r     s    z)_ManHelpFormatter.format_long_descriptionc             C   s<   dt | d| j| j| j| jf }t| dr8|d| j 7 }|S )Nz}.SH SEE ALSO
/usr/share/doc/pythonX.Y-%s/

.SH BUGS
Please report bugs on the project's mailing list:
%s

.SH AUTHOR
%s <%s>
Zdebian_name	copyrightz
.SH COPYRIGHT
%s
)rh   modnameZmailinglistZauthorZauthor_emailrD   r   )r   tailr   r   r   format_tail  s    


z_ManHelpFormatter.format_tailN)r   r   r   r   )r   )r4   r5   r6   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r     s   


r   c               @   s   e Zd ZdZd,ddZd-ddZd.d	d
Zdd Zdd Zdd Z	dd Z
dd Zd/ddZd0ddZdd Zd1ddZdd  Zd!d" Zd#d$ Zd2d%d&Zd3d(d)Zd4d*d+ZdS )5OptionsManagerMixInzLHandle configuration from both a configuration file and command line optionsNc             C   s@   || _ | j||d g | _t | _i | _i | _i | _d| _	d S )N)versionr   )
config_filereset_parsersoptions_providerscollectionsOrderedDictrr   _short_options_nocallback_options	_mygroups	_maxlevel)rw   usager   r   r   r   r   r     s    
zOptionsManagerMixIn.__init__rc   c             C   s:   t jdd| _tt||d| _| | j_t| jjj	| _
d S )N)#;)Zinline_comment_prefixes)r   r   )configparserZConfigParsercfgfile_parserr   r   cmdline_parserrq   setr   r   _optik_option_attrs)rw   r   r   r   r   r   r     s
    
z!OptionsManagerMixIn.reset_parsersTc       
         s   |j dkstdxDtt| jD ]&}|j | j| j kr"| j|| P q"W | j| dd |jD }t|dd}|r|r| 	|j
 |j|| n$x"|D ]\}}| || j|| qW x<|D ]4\ }    fdd|jD }	| 	 ||	| qW dS )	zregister an options providerr   z!provider's priority can't be >= 0c             S   s   g | ]}d |d kr|qS )rm   r   r   )rH   ra   r   r   r   rJ   '  s    zAOptionsManagerMixIn.register_options_provider.<locals>.<listcomp>r   r   c                s(   g | ] }|d   dd  kr|qS )r   rm   rc   )getr   )rH   ra   )gnamer   r   rJ   7  s   N)priorityAssertionErrorranger   r   insertr   optionsrh   add_option_groupr<   r   r7   add_optik_optionr   )
rw   ry   	own_groupiZnon_group_spec_optionsgroupsrQ   r`   ZgdocZgoptionsr   )r   r   register_options_provider  s*    

z-OptionsManagerMixIn.register_options_providerc             C   s   || j kr| j | }nRtj| j| d}| j| |j|_|| j |< |dkrh|| jjkrh| j	| x |D ]\}}| 
|||| qnW d S )N)titleZDEFAULT)r   r9   OptionGroupr   
capitalizer   rg   r   	_sectionsZadd_sectionr   )rw   Z
group_namer   r   ry   rm   rQ   r`   r   r   r   r   =  s    

z$OptionsManagerMixIn.add_option_groupc             C   s@   |  |||\}}|j||}|| j|< t| j|jp6d| _d S )Nr   )optik_optionZ
add_optionrr   maxr   rg   )rw   ry   ZoptikcontainerrQ   r`   r   ra   r   r   r   r   R  s    
z$OptionsManagerMixIn.add_optik_optionc             C   s   t  |}d|kr|| j|< nd|d< | j|d< d|krpd|krj|ddk	rj|d dkrj|d  d7  < |d= dt| g}d	|kr|| j|d	 < |d
|d	   |d	= x(t| D ]}|| j	kr|
| qW ||fS )zjget our personal option definition and return a suitable form for
        use with optik/optparse
        r   callbackdefaultri   N)
store_truestore_falsez [current: %default]z--Zshort-)r   r   cb_set_provider_optionr   rv   r   r   r   keysr   pop)rw   ry   rQ   r`   r   keyr   r   r   r   X  s(    


z OptionsManagerMixIn.optik_optionc             C   sF   | dr|dd }n| j|dd  }|dkr6d}| || dS )z!optik callback for option settingz--ro   Nr   )r   r   global_set_option)rw   ra   rQ   r=   rp   r   r   r   r   w  s    
z*OptionsManagerMixIn.cb_set_provider_optionc             C   s   | j | || dS )z)set option on the correct option providerN)rr   
set_option)rw   rQ   r=   r   r   r   r     s    z%OptionsManagerMixIn.global_set_optionr   c             C   s   i }g }xv| j D ]l}xf| D ]Z\}}|dkr4|j}||kr>qdd |D }|sRq||krd|| ||g }	|	|7 }	qW qW |ptj}d}
x:|D ]2}|
rtd|d t	||
 t||  d}
qW dS )zrwrite a configuration file according to the current configuration
        into the given stream or stdout
        Nc             S   s4   g | ],\}}}| d dk	r| ds|||fqS )rd   NZ
deprecated)r   )rH   rM   dvr   r   r   rJ     s   z7OptionsManagerMixIn.generate_config.<locals>.<listcomp>Fr   )r   T)r   options_by_sectionr<   r   
setdefaultr#   stdoutr"   r   Zformat_sectionr   sorted)rw   r   Zskipsectionsencodingr   sectionsry   r   r   Z
alloptionsZprintedr   r   r   generate_config  s0    


z#OptionsManagerMixIn.generate_configr   c          	   C   s2   t  " t| j|||ptj| jd W d Q R X d S )N)r   rg   )r}   _generate_manpager   r#   r   r   )rw   r   r   r   r   r   r   generate_manpage  s    z$OptionsManagerMixIn.generate_manpagec             C   s   x| j D ]}|  qW dS )z-initialize configuration using default valuesN)r   load_defaults)rw   ry   r   r   r   load_provider_defaults  s    z*OptionsManagerMixIn.load_provider_defaultsc          	      s  d}x| j krddg| d }| jkr0P |f fdd	}ddd	g|  }d
||d} jd } | j|| | j||ff7  _|d7 }qW |dkr j}|dk	rtj	
|}tj	|std||otj	|}	|	rV j}
tj|ddd}|
| W dQ R X x:t|
j D ](\}}| s*|r*||
j| < q*W |s`dS |	rzdtj	|}nd}t|tjd dS )zrread the configuration file but do not load it (i.e. dispatching
        values to each options provider)
        r   r   Zlongz-helpc                s   t  | td d S )Nr   )r"   ri   r#   exit)ra   rQ   rI   prg   )rw   r   r   helpfunc  s    z6OptionsManagerMixIn.read_config_file.<locals>.helpfuncz%s verbose help.r   Zmorer   )r   r   ri   r   Nz#The config file {:s} doesn't exist!r   Z	utf_8_sig)r   zUsing config file {}z1No config file found, using default configuration)r   )r   r
   rr   r   r   r   r   r   r   r	   r0   r   r'   formatr   ior   Z	read_filer   r   itemsisupperr   r,   r"   r#   r$   )rw   r   verboseZ	helplevelrQ   r  Zhelpmsgr`   ry   Zuse_config_filerp   fpZsectr>   r?   r   )rw   r   read_config_file  s@    

z$OptionsManagerMixIn.read_config_filec             C   sb   | j }xV| D ]J}xD||D ]6\}}y| || W q  ttjfk
rT   w Y q X q W qW dS )zddispatch values previously read from a configuration file to each
        options provider)
        N)r   r   r  r   re   r9   r   )rw   rp   r   ra   r=   r   r   r   load_config_file  s    z$OptionsManagerMixIn.load_config_filec             K   s
   |  |S )z4override configuration according to given parameters)load_configuration_from_config)rw   r   r   r   r   load_configuration  s    z&OptionsManagerMixIn.load_configurationc             C   s<   x6|  D ]*\}}|dd}| j| }||| q
W d S )Nr   r   )r  r   rr   r   )rw   ru   rQ   Z	opt_valuery   r   r   r   r    s    
z2OptionsManagerMixIn.load_configuration_from_configc          	   C   s   t   |dkr tjdd }nt|}| jj|d\}}xJ| jD ]@}|j}x4|j	 D ]&}t
||d}|dkrrqXt||| qXW qBW |S Q R X dS )ziOverride configuration according to command line parameters

        return additional arguments
        Nr   )r   )r}   r#   argvr   r   
parse_argsr   ru   __dict__r   rh   setattr)rw   r   r   ry   ru   attrr=   r   r   r   load_command_line_configuration   s    z3OptionsManagerMixIn.load_command_line_configurationr   c             C   s:   t j| j| |d}||_t| j|| _| j| dS )z,add a dummy option section for help purpose )r   r   N)r9   r   r   r   rg   r   r   r   )rw   r   r   rg   rm   r   r   r   add_help_section  s
    z$OptionsManagerMixIn.add_help_sectionc          	   C   s&   || j j_t  | j  S Q R X dS )z.return the usage string for available options N)r   r   r   r}   r   )rw   rg   r   r   r   ri     s    
zOptionsManagerMixIn.help)NN)rc   N)T)Nr   N)r   N)NN)N)r   )r   )r4   r5   r6   r7   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  ri   r   r   r   r   r     s&   



 
!


1

	r   c               @   sf   e Zd ZdZdZdZdZdZdd Zdd	 Z	dddZ
dd ZdddZdd Zdd ZdddZd
S )OptionsProviderMixInz-Mixin to provide options to an OptionsManagerr   r   r   r   c             C   s   t  | _|   d S )N)r9   ZValuesru   r   )rw   r   r   r   r   -  s    
zOptionsProviderMixIn.__init__c             C   sV   xP| j D ]F\}}|d}|dkr|dkr4| |}|d}| |||| qW dS )z,initialize the provider using default valuesr   r   Nr   )r   r   rs   r   )rw   rQ   r`   r   r   r   r   r   r   1  s    


z"OptionsProviderMixIn.load_defaultsNc             C   s&   |dkr|  |}|d|ddS )z-get the config attribute corresponding to optNr   r   r   )rs   r   r   )rw   rQ   r`   r   r   r   rt   <  s    
z$OptionsProviderMixIn.option_attrnamec             C   s   t | j| |dS )z*get the current value for the given optionN)rh   ru   rt   )rw   rQ   r   r   r   option_valueB  s    z!OptionsProviderMixIn.option_valuec             C   sZ  |dkr|  |}|dk	r&t|||}|dkr:|dd}|dkrZt| j| ||| n|dkrzt| j| ||d n|dkrt| j| ||d n|dkr0| ||}t| j|d}|dkrt|tt	fr|}n|dk	rg }|
| t| j|| n,t|t	r$t| j|||f  n
|
| n&|d	krN|d	 d||d nt|dS )
z?method called to set an option (registered in the options list)Nr   Zstore)r   countr   r   r   r   r   )rs   rf   r   r  ru   rt   rh   rN   r   r   r   r3   )rw   rx   r=   r   r`   Z_listr   r   r   r   F  s8    




zOptionsProviderMixIn.set_optionc             C   sH   | j s
tx"| j D ]}|d |kr|d S qW td|| jf |dS )z7return the dictionary defining an option given its namer   r   zno such option %s in section %rN)r   r   r9   r   r<   )rw   rQ   ra   r   r   r   rs   g  s    
z#OptionsProviderMixIn.get_option_defc             c   s   i }x6| j D ],\}}||dg ||| |f qW d|krTd|dfV  x&t| D ]\}}| |fV  qbW dS )ztreturn an iterator on options grouped by section

        (section, [list of (optname, optdict, optvalue)])
        rm   N)	r   r   r   r   r  r   r   r  r   )rw   r   rx   r`   r   r   r   r   r   r   q  s    z'OptionsProviderMixIn.options_by_sectionc             c   s6   |d kr| j }x"|D ]\}}||| |fV  qW d S )N)r   r  )rw   r   rx   r`   r   r   r   options_and_values  s    z'OptionsProviderMixIn.options_and_values)N)NN)N)r4   r5   r6   r7   r   r<   r   rg   r   r   rt   r  r   rs   r   r  r   r   r   r   r  $  s   

!
r  c               @   s   e Zd ZdZdd ZdS )ConfigurationMixInz]basic mixin for simple configurations which don't need the
    manager / providers model
    c          	   O   s   |s| dd tj| f|| t|  t| dd sg | _xT| jD ]J\}}y|d  df}W n tk
rx   wFY nX || jkrF| j	| qFW | j
| dd d S )Nr   rc   r   rm   F)r   )r   r   r   r  rh   r   r   r   re   r   r   )rw   r   r   r   r`   Zgdefr   r   r   r     s    

zConfigurationMixIn.__init__N)r4   r5   r6   r7   r   r   r   r   r   r    s   r  r   c             C   sP   t  }||_| |_t|| |||d t| ||d t|||d d S )N)r   )r   r   rp   r"   r   r   r   )r   r   r   r   rg   r   r   r   r   r     s    r   )rc   )>r7   Z
__future__r   
contextlibr   r   r  r9   r   r   rE   r#   r   r   Zpylintr   r	   r0   Z	USER_HOMEr/   r   dirnamer
   r   r   version_infor%   r   r)   r2   r+   globalsZENV_HELPr   r3   r@   rA   rB   rG   rK   rR   rT   rS   rO   rF   r^   rb   rf   rn   rz   contextmanagerr}   r~   r   r   r{   r   r   r  r  r   r   r   r   r   r   <module>#   s~   	

	

"	
	
:!{  #c