
    -_g2                     f    d dl mZ d dlmZ d Zd Z G d d      Z G d de      Z G d	 d
      Zy)    )Action)ConfigParserc                 <    t        |       }|t        u xs |t        u S )z@Return true if val is an instance of a known sequence type.
    )typelisttuple)valval_types     -/usr/lib/python3/dist-packages/sos/options.py_is_seqr      s"     CyHt0x500    c                 8    | j                         }|dv ry|dv ryy )N)trueonyesT)falseoffnoF)lower)r	   _vals     r   str_to_boolr      s(    99;D$$%%r   c                   |    e Zd Zd Zd ZddZd Zd Zi fdZe	i fd       Z
e	d        Zd	 Zd
 ZddZddZd Zy)
SoSOptionsc                 p   d }t        ||      rt        ||      }t        | |      } ||      r ||      r|s|| j                  vrRt        |      sGt	        | ||       |r| j                  j                  |       y | j                  j                  |       y t        |      rt	        | |||z          y y y )Nc                     | dk(  xs | d u S )N  )r	   s    r   _unsetz%SoSOptions._merge_opt.<locals>._unset    s    2I,-r   )hasattrgetattr_nondefaultr   setattrdiscardadd)selfoptsrc
is_defaultr   newvalueoldvalues          r   
_merge_optzSoSOptions._merge_opt   s    	. 3sC(HtS)H
 x )9D,,,wx7Hc8,$$,,S1$$((-"c8h#67 #! r   c                     t        |t              st        |      }| j                  D ]  }| j	                  |||        y N)
isinstancedictvars	arg_namesr+   )r%   r'   r(   args       r   _merge_optszSoSOptions._merge_opts7   s8    #t$s)C>> 	2COOCj1	2r   c                    |}d}| j                   D ]  }|||z   |z   z  } |j                  |       | j                   D cg c]  }t        | |       }}|s,|D 	cg c]   }	t        |	      rdj	                  |	      n|	" }}	n%|D 	cg c]  }	t        |	t              rd|	 dn|	 }}	|t        |      z  j                  |      |z   S c c}w c c}	w c c}	w )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=%s,')r1   stripr    r   joinr.   strr   )
r%   quotesepprefixsuffixargsarg_fmtr2   valsvs
             r   __strzSoSOptions.__str=   s     >> 	(CC'MC''D	(

3.2nn=sc"==>BC71:CHHQK14CDC DHHa
1c 2as!H9HDHuT{"))#.77 > D Is    C%CCc                 "    | j                         S r-   _SoSOptions__strr%   s    r   __str__zSoSOptions.__str__V   s    zz|r   c                 ,    | j                  dddd      S )NTz, zSoSOptions())r:   r;   r<   r=   rD   rF   s    r   __repr__zSoSOptions.__repr__Y   s!    zz$}!$  & 	&r   c                 B   || _         t        |j                               | _        t	               | _        | j                   D ]  }t        | || j                   |           |j                         D ]-  \  }}| j                  j                  |       t        | ||       / y)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   keysr1   setr!   r"   itemsappend)r%   rL   kwargsr2   kwargs        r   __init__zSoSOptions.__init__]   s     )l//125$$ 	7CD#t0056	7 !,,. 	&JCNN!!#&D#u%	&r   c                 Z    t        di t        |      d|i}|j                  |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
        rL   Tr   )r   r0   r3   )clsr>   rL   optss       r   	from_argszSoSOptions.from_argsu   s/     BDJB\Bt$r   c                     d}d}||v rd| gS ||v r&t        dt        |            D cg c]  }d| 	 c}S d| d| gS c c}w )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).
        )
alloptionszallow-system-changeszall-logsbatchbuilddebugexperimentalzlist-pluginszlist-presetszlist-profilesz	no-reportzno-env-varsquietverify)verbose--r   =)rangeint)rU   r&   r	   no_valuecountds         r   _opt_to_argszSoSOptions._opt_to_args   si    

 (?J<%<(-aS(:;1bJ;;SE3% !! <s   Ac                    t        | j                  |   t        |            r|S t        | j                  |   t              rt        |j	                  d            S t        | j                  |   t
              r!t        |      }|t        d| d| d      |S t        | j                  |   t              rt        |      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
        r5   z
Value of 'z' in z# must be True or False or analagous)	r.   rL   r   r   splitboolr   	Exceptionrd   )r%   keyr	   confs       r   _convert_to_typezSoSOptions._convert_to_type   s     d'',d3i8Jd'',d3		#''d'',d3c"C{ U4& 1   ! ! Jd'',c2s8O
r   c                      fd}t               }	 t        d      5 }|j                  |       ddd        |d|        |||       |j                  d	      rit         d
      r\|j                  d	      D ]G  \  }}|j                  d      d    j                  vs' j                  j                  |dz   |z          I yyy# 1 sw Y   xY w# t        $ r(}t	        d d|j
                  d           Y d}~d}~ww xY w)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                 r   |j                  |       r$t        |j                  |             }d|j                         v rt	        |j                  d            |d<   dddd}t        |      D ]F  }d|v r$|j                  |      ||j                  dd      <   ||v s0|j                  |      |||   <   H |j                         D ]m  \  }}t        |t              r|d	k7  r|j                  d
d      }|j                  vrt        d| d|  d       Nj                  ||      }t        ||       o y y )Nr`   	verbositylabelplugoptsprofiles)nameplugin_optionprofile-_keywords r   zUnknown option 'z' in section 'r6   )has_sectionr/   rO   rM   rd   popr   replacer.   r9   rL   printro   r"   )sectionconfigodictrename_optsrm   r	   config_filer%   s         r   _update_from_sectionz9SoSOptions.update_from_conf.<locals>._update_from_section   sD   !!'*V\\'23

,),UYYy-A)BE+&
 $%/)
  ; ACcz7<yy~ckk#s34k)27))C.k#./	A !& ,HC "#s+z0A!kk#r2$"3"33  0^G9ANO //S+FCD#s+,' +r   zutf-8)encodingNz+WARNING: Unable to read configuration file z :    globalplugin_optionsrt   .r   rb   )r   open	read_fileOSErrorr   r>   r}   r   rO   rj   skip_pluginsrt   rP   )	r%   r   	componentr   r   ferm   r	   s	   ``       r   update_from_confzSoSOptions.update_from_conf   s    	,D 	kG4 1  K01 	Xv.Y/./GD*4M"LL)9: :Syy~a(D,=,==MM((sS9: 5N/1 1 	=k]#66!9+ 	s-   C C	C 	CC 	DDDc                     | j                   D ]1  }t        ||      st        ||      |r| j                  ||d       3 y)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)r1   r   r    r+   )r%   r'   skip_defaultr2   s       r   mergezSoSOptions.merge   sC     >> 	1C3$sC ,LS%0		1r   c                 ^    i }| j                   D ]  }t        | |      }|r|dv rd}|||<    |S )zReturn this ``SoSOptions`` option values as a dictionary of
            argument name to value mappings.

            :returns: a name:value dictionary of option values.
        
add_preset
del_presetdescnoteN)r1   r    )r%   preset_filterr   r2   values        r   r/   zSoSOptions.dict   sI     >> 	CD#&EFF EE#J	 r   c                       fdfd}d }t         j                         j                         d       }|D cg c]  \  }} |||      s |||       c}}S c c}}w )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                     d}|r||v ry| dk(  r|ry| j                   v r%t        |      t        j                   |          k(  ryy)z. Test for non-null option values.
            )FalseNonez[]z""z''0Frt   T)rL   r9   )rv   r   null_valuesr%   s      r   	has_valuez%SoSOptions.to_args.<locals>.has_value  sU     CKE[0z!et(((u:T%6%6t%<!== r   c                 4    | dv ry| dv r|dk(  ry | |      S )z8 Filter out preset and null-valued options.
            r   F)log_sizeplugin_timeoutcmd_timeoutr   Tr   )rv   r   r   s     r   
filter_optz&SoSOptions.to_args.<locals>.filter_opt   s1     CCDDA:T5))r   c                     | j                  d      rdt        |      dz  z   }|S | j                  dd      } t        |      rdj	                  |      n|}|dur|  d| }n| }t        |      dkD  rd	|z   }|S d|z   }|S )
zD Convert sos option notation to command line arguments.
            rr   ry   rA   rz   r5   Tr|   r   ra   )
startswithrd   r   r   r8   len)rv   r   r2   r&   s       r   argifyz"SoSOptions.to_args.<locals>.argify+  s     {+CJ,,
<<S)D'.u~CHHUO5ED aw' #C1$*CJ 36)CJr   c                     | d   S )Nr   r   )xs    r   <lambda>z$SoSOptions.to_args.<locals>.<lambda>?  s
    ad r   )rm   )sortedr/   rO   )r%   r   r   	opt_itemsnrA   r   s   `     @r   to_argszSoSOptions.to_args
  sV    			*	( 499;,,.NC	+4I!Q
1a8Hq!IIIs   A A N)Fr|   r   r   )T)__name__
__module____qualname__r+   r3   rE   rG   rJ   rS   classmethodrW   rh   ro   r   r   r/   r   r   r   r   r   r      sk    80282& %' &0 *, 
 
 " "$2;:z1 6Jr   r   c                       e Zd ZdZddZy)SosListOptionz0Allow to specify comma delimited list of pluginsNc                     t        |j                  d            }t        || j                        r|t        || j                        z  }t	        || j                  |       y )Nr5   )r   rj   r    destr"   )r%   parser	namespacevaluesoption_stringrO   s         r   __call__zSosListOption.__call__G  sH    V\\#&'9dii(WY		22E	499e,r   r-   )r   r   r   __doc__r   r   r   r   r   r   C  s
    :-r   r   c                       e Zd ZdZddZy)ClusterOptionz6Used to store/manipulate options for cluster profiles.Nc                 J    || _         || _        || _        || _        || _        y r-   )rv   r   opt_typeclusterdescription)r%   rv   r   r   r   r   s         r   rS   zClusterOption.__init__Q  s&    	
 &r   r-   )r   r   r   r   rS   r   r   r   r   r   N  s
    @'r   r   N)	argparser   configparserr   r   r   r   r   r   r   r   r   <module>r      s<     %1cJ cJL	-F -' 'r   