U
    -_g2                     @   sX   d dl mZ d dlmZ dd Zdd ZG dd dZG d	d
 d
eZG dd dZdS )    )Action)ConfigParserc                 C   s   t | }|tkp|tkS )z@Return true if val is an instance of a known sequence type.
    )typelisttuple)valZval_type r   -/usr/lib/python3/dist-packages/sos/options.py_is_seq   s    r
   c                 C   s$   |   }|dkrdS |dkr dS d S )N)trueZonZyesT)ZfalseZoffZnoF)lower)r   Z_valr   r   r	   str_to_bool   s    r   c                   @   s   e Zd Zdd Zdd Zd dd	Zd
d Zdd Zi fddZe	i fddZ
e	dd Zdd Zdd Zd!ddZd"ddZdd ZdS )#
SoSOptionsc                 C   s   dd }t ||rt||}t| |}||r6||rL|sL|| jkrxt|sxt| || |rj| j| q| j| nt|rt| |||  d S )Nc                 S   s   | dkp| d kS )N r   )r   r   r   r	   _unset    s    z%SoSOptions._merge_opt.<locals>._unset)hasattrgetattr_nondefaultr
   setattrdiscardadd)selfoptsrc
is_defaultr   ZnewvalueZoldvaluer   r   r	   
_merge_opt   s"    


zSoSOptions._merge_optc                 C   s0   t |tst|}| jD ]}| ||| qd S N)
isinstancedictvars	arg_namesr   )r   r   r   argr   r   r	   _merge_opts7   s    

zSoSOptions._merge_optsF r   c           	         sz   |}d} j D ]}||| | 7 }q||  fdd j D }|sVdd |D }ndd |D }|t| || S )aI  Format a SoSOptions object as a human or machine readable string.

            :param quote: quote option values
            :param sep: list separator string
            :param prefix: arbitrary prefix string
            :param suffix: arbitrary suffix string
            :param literal: print values as Python literals
        z=%sc                    s   g | ]}t  |qS r   )r   ).0r!   r   r   r	   
<listcomp>L   s     z$SoSOptions.__str.<locals>.<listcomp>c                 S   s"   g | ]}t |rd |n|qS ),)r
   joinr$   vr   r   r	   r&   O   s     c                 S   s&   g | ]}t |trd | d n|qS )')r   strr)   r   r   r	   r&   R   s     )r    stripr   )	r   quotesepprefixsuffixargsZarg_fmtr!   Zvalsr   r%   r	   Z__str=   s    	

zSoSOptions.__strc                 C   s   |   S r   _SoSOptions__strr%   r   r   r	   __str__V   s    zSoSOptions.__str__c                 C   s   | j dddddS )NTz, zSoSOptions())r.   r/   r0   r1   r3   r%   r   r   r	   __repr__Y   s    
zSoSOptions.__repr__c                 K   sh   || _ t| | _t | _| j D ]}t| || j |  q"| D ] \}}| j| t| || qBdS )a  Initialise a new ``SoSOptions`` object from keyword arguments.

            Initialises the new object with values taken from keyword
            arguments matching the names of ``SoSOptions`` attributes.

            A ``ValueError`` is raised is any of the supplied keyword
            arguments does not correspond to a known ``SoSOptions`
            attribute name.

            :param *kwargs: a list of ``SoSOptions`` keyword args.
            :returns: the new ``SoSOptions`` object.
        N)	arg_defaultsr   keysr    setr   r   itemsappend)r   r8   kwargsr!   Zkwargr   r   r	   __init__]   s    
zSoSOptions.__init__c                 C   s&   t f t|d|i}||d |S )a  Initialise a new SoSOptions object from a ``Namespace``
            obtained by parsing command line arguments.

            :param args: parsed command line arguments
            :returns: an initialised SoSOptions object
            :returntype: SoSOptions
        r8   T)r   r   r"   )clsr2   r8   Zoptsr   r   r	   	from_argsu   s    	zSoSOptions.from_argsc                    sR   d}d} |krd  gS  |kr@ fddt dt|D S d  d| gS )zConvert a named option and optional value to command line
            argument notation, correctly handling options that take
            no value or that have special representations (e.g. verify
            and verbose).
        )Z
alloptionszallow-system-changeszall-logsZbatchZbuilddebugZexperimentalzlist-pluginszlist-presetszlist-profilesz	no-reportzno-env-varsquietZverify)verbose--c                    s   g | ]}d   qS )rD   r   )r$   dr   r   r	   r&      s     z+SoSOptions._opt_to_args.<locals>.<listcomp>r   =)rangeint)r?   r   r   Zno_valuecountr   rF   r	   _opt_to_args   s    zSoSOptions._opt_to_argsc                 C   s   t | j| t|r|S t | j| tr6t|dS t | j| trpt|}|dkrltd| d| d|S t | j| trt|S |S )a  Ensure that the value read from a config file is the proper type
        for consumption by the component, as defined by arg_defaults.

        Params:
            :param key:         The key in arg_defaults we need to match the
                                type of
            :param val:         The value to be converted to a particular type
            :param conf:        File values are being loaded from
        r'   Nz
Value of 'z' in z# must be True or False or analagous)	r   r8   r   r   splitboolr   	ExceptionrI   )r   keyr   confr   r   r	   _convert_to_type   s    
zSoSOptions._convert_to_typec           	   
      s    fdd}t  }z(t dd}||  W 5 Q R X W n< tk
rx } ztd  d|jd   W 5 d}~X Y nX |d	| ||| |d
rtdr|d
D ]0\}}|	dd j
krj|d |  qdS )zRead the provided config_file and update options from that.

        Positional arguments:

            :param config_file:             Filepath to the config file
            :param component:               Which component (section) to load
        c                    s   | | rt|| }d| kr6t|d|d< dddd}t|D ]<}d|krl||||dd< ||krJ||||| < qJ| D ]b\}}t|t	r|d	kr|d
d}|j
krtd| d|  d q|| }t|| qd S )NrC   	verbosityZlabelplugoptsZprofiles)nameZplugin_optionZprofile-_keywordsr#   r   zUnknown option 'z' in section 'r+   )has_sectionr   r;   r9   rI   popr   replacer   r,   r8   printrQ   r   )ZsectionconfigodictZrename_optsrO   r   config_filer   r   r	   _update_from_section   s*    

z9SoSOptions.update_from_conf.<locals>._update_from_sectionzutf-8)encodingz+WARNING: Unable to read configuration file z :    NglobalZplugin_optionsrS   .r   rG   )r   openZ	read_fileOSErrorr[   r2   rX   r   r;   rL   Zskip_pluginsrS   r<   )	r   r_   Z	componentr`   r\   ferO   r   r   r^   r	   update_from_conf   s    	"

zSoSOptions.update_from_confTc                 C   s<   | j D ]0}t||sqt||dk	s(|s| ||d qdS )aN  Merge another set of ``SoSOptions`` into this object.

            Merge two ``SoSOptions`` objects by setting unset or default
            values to their value in the ``src`` object.

            :param src: the ``SoSOptions`` object to copy from
            :param is_default: ``True`` if new default values are to be set.
        NF)r    r   r   r   )r   r   Zskip_defaultr!   r   r   r	   merge   s
    	

zSoSOptions.mergec                 C   s6   i }| j D ]&}t| |}|r(|dkr(d}|||< q
|S )zReturn this ``SoSOptions`` option values as a dictionary of
            argument name to value mappings.

            :returns: a name:value dictionary of option values.
        Z
add_presetZ
del_presetZdescZnoteN)r    r   )r   Zpreset_filterr]   r!   valuer   r   r	   r      s    


zSoSOptions.dictc                    sL   fddfdddd  t   dd d	} fd
d|D S )zReturn command arguments for this object.

            Return a list of the non-default options of this ``SoSOptions``
            object in ``sos report`` command line argument notation:

                ``["--all-logs", "-vvv"]``

        c                    sL   d}|r||krdS | dkr$|r$dS |  j krHt|t j |  krHdS dS )z. Test for non-null option values.
            )FalseNonez[]z""z''0FrS   T)r8   r,   )rT   rl   Znull_valuesr%   r   r	   	has_value  s    
z%SoSOptions.to_args.<locals>.has_valuec                    s*   | dkrdS | dkr |dkr dS  | |S )z8 Filter out preset and null-valued options.
            rk   F)Zlog_sizeZplugin_timeoutZcmd_timeoutr   Tr   )rT   rl   )rp   r   r	   
filter_opt   s    z&SoSOptions.to_args.<locals>.filter_optc                 S   s|   |  drdt|d  }|S | dd} t|r<d|n|}|dk	rX|  d| }n| }t|dkrpd	| nd| }|S )
zD Convert sos option notation to command line arguments.
            rR   rU   r*   rV   r'   Tr#   rb   rD   )
startswithrI   rZ   r
   r(   len)rT   rl   r!   r   r   r   r	   argify+  s    
z"SoSOptions.to_args.<locals>.argifyc                 S   s   | d S )Nr   r   )xr   r   r	   <lambda>?      z$SoSOptions.to_args.<locals>.<lambda>)rO   c                    s$   g | ]\}}||r ||qS r   r   )r$   nr*   )rt   rq   r   r	   r&   @  s     
 z&SoSOptions.to_args.<locals>.<listcomp>)sortedr   r;   )r   Z	opt_itemsr   )rt   rq   rp   r   r	   to_args
  s
    	zSoSOptions.to_argsN)Fr#   r   r   )T)T)__name__
__module____qualname__r   r"   r4   r5   r7   r>   classmethodr@   rK   rQ   ri   rj   r   rz   r   r   r   r	   r      s   

=

r   c                   @   s   e Zd ZdZdddZdS )SosListOptionz0Allow to specify comma delimited list of pluginsNc                 C   s<   t |d}t|| jr*|t|| j7 }t|| j| d S )Nr'   )r   rL   r   destr   )r   parser	namespacevaluesZoption_stringr;   r   r   r	   __call__G  s    zSosListOption.__call__)N)r{   r|   r}   __doc__r   r   r   r   r	   r   C  s   r   c                   @   s   e Zd ZdZdddZdS )ClusterOptionz6Used to store/manipulate options for cluster profiles.Nc                 C   s"   || _ || _|| _|| _|| _d S r   )rT   rl   opt_typeclusterdescription)r   rT   rl   r   r   r   r   r   r	   r>   Q  s
    zClusterOption.__init__)N)r{   r|   r}   r   r>   r   r   r   r	   r   N  s   r   N)	argparser   configparserr   r
   r   r   r   r   r   r   r   r	   <module>	   s   	  (