o
    g9                     @   s   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	 d dl
mZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ dd	 Zejd
d ZG dd dZdS )    N)
ModuleType)DictListOptionalTextIOTuple)utils)_ManHelpFormatter)Option)OptionParserc                 C   s   | j du s| js|jS |jd dd }z	| j jj| }W n ty(   d}Y nw ||}|||}t	|j
||}t||}|tju sH|sK| 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      )parserdefault_taghelp
_long_optsoptions_manager_all_optionsKeyErrorget_option_defoption_attrnamegetattrconfigr   _format_option_valueoptparse
NO_DEFAULTNO_DEFAULT_VALUEreplacestr)selfoptionoptnameprovidervalueoptdict r$   `/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pylint/config/option_manager_mixin.py_expand_default   s   
r&   c                  c   s0    t j} ztt j_d V  W | t j_d S | t j_w N)r   HelpFormatterr&   expand_default)orig_defaultr$   r$   r%   _patch_optparse/   s   r+   c                	   @   s   e Zd ZdZd4ddZd5ddZd6d	d
Zdd Zdd Zdd Z	dd Z
dd Z	d7dee deedf ddfddZdejfdedededdfdd Zd!d" Zd8d#d$Zd%d& Zd'd( Zd)d* Zd4dee fd+d,Zd9d.d/Zd9d0d1Zd2d3 ZdS ):OptionsManagerMixInzLHandle configuration from both a configuration file and command line optionsNc                 C   s<   || _ | | g | _t | _i | _i | _i | _d| _	d S Nr   )
config_filereset_parsersoptions_providerscollectionsOrderedDictr   _short_options_nocallback_options	_mygroups	_maxlevel)r   usager.   r$   r$   r%   __init__=   s   


zOptionsManagerMixIn.__init__ c                 C   s8   t jdd| _tt|d| _| | j_t| jjj	| _
d S )N)#;)inline_comment_prefixes)r7   )configparserConfigParsercfgfile_parserr   r
   cmdline_parserr   setoption_classATTRS_optik_option_attrs)r   r7   r$   r$   r%   r/   J   s   z!OptionsManagerMixIn.reset_parsersTc                    s   |j dks	J dt| jD ]\}}|j |j kr!| j||  nq| j| dd |jD }t|dd}|rG|rG| |j	 |j
|| n|D ]\}}| || j|| qI|D ]\ }	 	   fdd|jD }
|  |	|
| qYdS )	zregister an options providerr   z!provider's priority can't be >= 0c                 S   s   g | ]
}d |d vr|qS )group   r$   .0r   r$   r$   r%   
<listcomp>]   s    zAOptionsManagerMixIn.register_options_provider.<locals>.<listcomp>option_groupsr$   c                    s(   g | ]}|d   dd  kr|qS )rF   rE   r9   )getupperrG   gnamer$   r%   rI   m   s
    N)priority	enumerater0   insertappendoptionsr   add_option_groupnamerL   __doc__add_optik_optionr@   )r   r!   	own_groupioptions_providernon_group_spec_optionsgroupsoptr#   gdocgoptionsr$   rM   r%   register_options_providerT   s6   
z-OptionsManagerMixIn.register_options_providerc                 C   s   || j v r| j | }n)tj| j| d}| j| |j|_|| j |< |dkr4|| jjvr4| j	| |D ]\}}| 
|||| q6d S )N)titleDEFAULT)r5   r   OptionGroupr@   
capitalizerT   levelr?   	_sectionsadd_sectionrW   )r   
group_name_rS   r!   rE   r]   r#   r$   r$   r%   rT   t   s   


z$OptionsManagerMixIn.add_option_groupc                 C   sD   |  |||\}}|j|i |}|| j|< t| j|jpd| _d S r-   )optik_option
add_optionr   maxr6   re   )r   r!   optikcontainerr]   r#   argsr   r$   r$   r%   rW      s   
z$OptionsManagerMixIn.add_optik_optionc                 C   s   t  |}d|v r|| j|< n	d|d< | j|d< d|v r8d|v r5|ddur5|d dvr5|d  d7  < |d= dt| g}d	|v rV|| j|d	 < |d
|d	   |d	= t| D ]}|| j	vrh|
| q\||fS )zjget our personal option definition and return a suitable form for
        use with optik/optparse
        actioncallbackdefaultr   N)
store_truestore_falsez [current: %default]--short-)copyr4   cb_set_provider_optionrK   r   r3   rR   listkeysrD   pop)r   r!   r]   r#   rn   keyr$   r$   r%   rj      s*   



z OptionsManagerMixIn.optik_optionc                 C   sF   | dr|dd }n	| j|dd  }|du rd}| || dS )z!optik callback for option settingrt   r   NrF   )
startswithr3   global_set_option)r   r   r]   r"   r   r$   r$   r%   rx      s   
z*OptionsManagerMixIn.cb_set_provider_optionc                 C   s   | j | || dS )z)set option on the correct option providerN)r   
set_option)r   r]   r"   r$   r$   r%   r~      s   z%OptionsManagerMixIn.global_set_optionr$   streamskipsections.returnc           
      C   s   i }g }| j D ]4}| D ]-\}}|du r|j}||v rqdd |D }|s'q||vr0|| ||g }||7 }qq|p@tj}d}	|D ]}|	rOtd|d t	||
 t||  d}	qEdS )zrwrite a configuration file according to the current configuration
        into the given stream or stdout
        Nc                 S   s4   g | ]\}}}| d dur| ds|||fqS )typeN
deprecated)rK   )rH   ndvr$   r$   r%   rI      s
    z7OptionsManagerMixIn.generate_config.<locals>.<listcomp>F
fileT)r0   options_by_sectionrU   rR   
setdefaultsysstdoutprintr   format_sectionrL   sorted)
r   r   r   r   sectionsr!   sectionrS   
alloptionsprintedr$   r$   r%   generate_config   s8   



z#OptionsManagerMixIn.generate_configrF   pkginfor   c                 C   s   t  3 t }| j|_| j|_t|| j|||d t| j||d t|	||d W d    d S 1 s9w   Y  d S )Nr   )
r+   r	   r6   output_levelr@   r   r   format_headformat_option_helpformat_tail)r   r   r   r   	formatterr$   r$   r%   generate_manpage   s   "z$OptionsManagerMixIn.generate_manpagec                 C   s   | j D ]}|  qdS )z-initialize configuration using default valuesN)r0   load_defaults)r   r!   r$   r$   r%   load_provider_defaults   s   

z*OptionsManagerMixIn.load_provider_defaultsc                 C   s  t d| jd D ]D}ddg| d }|| jv r n2tj| j|d}ddg|  d}d	||d
}| jd }| || j	|| | j
||ff7  _
q|du rT| j}|durptjtj|}tj|sptd| d|owtj|}	|	r8| j}
|drt|dd}t|}W d   n1 sw   Y  z|d d }W n	 ty   Y nw | D ]<\}}| D ],\}}t|tr|rdnd||< qt|ttfrt|||< qt|trd|||< q||
j|  < qnFt|dd}|
!| W d   n	1 s	w   Y  t|
j D ]"\}}|"dr'|t#dd }|$ s6|r6||
j|  < q|s=dS |	rJd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)
        rF   rv   longz-help)re    morez verbose help.rp   )ro   rp   r   r   NzThe config file z doesn't exist!z.tomlzutf-8)encodingtoolpylintyesno,	utf_8_sigzpylint.zUsing config file z1No config file found, using default configurationr   ))ranger6   joinr   	functoolspartialhelpfuncr0   rW   r@   rS   r.   ospath
expandvars
expanduserexistsOSErrorr?   endswithopentomlloadr   items
isinstanceboolintfloatr   ry   rf   rL   	read_filer}   lenisupperabspathr   r   stderr)r   r.   verbose
help_levelr]   help_functionhelp_msgr#   r!   use_config_filer   fpcontentsections_valuesr   valuesr   r"   sectmsgr$   r$   r%   read_config_file   sr   




z$OptionsManagerMixIn.read_config_filec                 C   sT   | j }| D ] }||D ]\}}z| || W q ttjfy&   Y qw qdS )z[Dispatch values previously read from a configuration file to each
        options provider)N)r?   r   r   r~   r   r   OptionError)r   r   r   r   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)r   kwargsr$   r$   r%   load_configurationE  s   
z&OptionsManagerMixIn.load_configurationc                 C   s8   |  D ]\}}|dd}| j| }||| qd S )Nri   rv   )r   r   r   r   )r   r   r]   	opt_valuer!   r$   r$   r%   r   I  s
   
z2OptionsManagerMixIn.load_configuration_from_configc                 C   s   t  D |du rtjdd nt|}| jj|d\}}| jD ]}|j}|j	 D ]}t
||d}|du r6q)t||| q)q|W  d   S 1 sJw   Y  dS )ziOverride configuration according to command line parameters

        return additional arguments
        NrF   )rn   )r+   r   argvry   r@   
parse_argsr4   r   __dict__rz   r   setattr)r   rn   rS   r!   r   attrr"   r$   r$   r%   load_command_line_configurationO  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)ra   descriptionN)r   rc   r@   rd   re   rl   r6   rT   )r   ra   r   re   rE   r$   r$   r%   add_help_section`  s   z$OptionsManagerMixIn.add_help_sectionc                 C   s>   || j j_t  | j  W  d   S 1 sw   Y  dS )z-return the usage string for available optionsN)r@   r   r   r+   format_help)r   re   r$   r$   r%   r   i  s   
$zOptionsManagerMixIn.helpc                 C   s   t | | td d S r-   )r   r   r   exit)r   r   r]   valpre   r$   r$   r%   r   o  s   zOptionsManagerMixIn.helpfuncr'   )r9   )T)Nr$   )NN)r   ) __name__
__module____qualname__rV   r8   r/   r`   rT   rW   rj   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r,   :   sJ    



 

$

E

	r,   )r1   r=   
contextlibrw   r   r   r   r   typesr   typingr   r   r   r   r   r   r   r    pylint.config.man_help_formatterr	   pylint.config.optionr
   pylint.config.option_parserr   r&   contextmanagerr+   r,   r$   r$   r$   r%   <module>   s&   

