
    DIe(              	         d Z ddlmZ ddlZddlZddlmZ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 dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# e!rddl m$Z$m%Z%m&Z&m'Z' 	 ddl(m)Z) n# e*$ r	 ddl+m)Z) Y nw xY wddl,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:m;Z; ddl<m=Z= ddl>m?Z?m@Z@ ddlAmBZB ddlCmDZD 	 ddlEmFZFmGZG ddlHmIZI dd lJmKZK n5# e*$ r- 	 ddlLmFZFmGZG ddlMmIZI dd lNmKZK n# e*$ r  e*d!          w xY wY nw xY w eeO          ZP e0            ZQdqd#ZRdqd$ZSd% ZT G d& d'e-          ZU G d( d)eU          ZV G d* d+eU          ZW G d, d-eW          ZX G d. d/eW          ZY G d0 d1eW          ZZ G d2 d3e.eU          Z[d4 Z\ G d5 d6e          Z] G d7 d8e9          Z^ G d: d;e^          Z_ G d< d=e^          Z` G d> d?e^          Za G d@ dAe^          Zb e#dBdC          drdH            Zc G dI dJe9          Zd G dK dLed          Ze G dM dNed          Zf G dO dPed          Zg G dQ dRed          Zh G dS dT          Zi G dU dVe9          Zj G dW dXej          Zk G dY dZej          Zl G d[ d\ej          Zm G d] d^ej          Zn G d_ d`          Zo G da dbep          ZqdcZrddZs edeejt         dfejt         dgejt         dheez  i          Zui fdsdnZv G do dpeq9          ZwdS )tz
A generalized application configuration utility.

Features include:
  - lazy eval
  - merges configuration files
  - parameter type validation, with custom validation
  - parameter aliases

Easily extensible to other source formats, e.g. json and ini

    )annotationsN)ABCMetaabstractmethod)defaultdict)Mapping)EnumEnumMeta)chain)	getLogger)environ)
expandvars)Path)
IGNORECASEVERBOSEMatchcompile)Template)TYPE_CHECKING   )
deprecated)AnyHashableIterableSequence)
IndexedSet)
CondaErrorCondaMultiError)
frozendict)AttrDictfirstlastmake_immutable)ThisShouldNeverHappenError)TypeCoercionErrortypifytypify_data_structure)unique   )
isiterableprimitive_typesNULL)yaml_round_trip_load)CommentedMapCommentedSeq)ReaderError)ScannerErrorz@No yaml library available. To proceed, conda install ruamel.yaml  c                    t          |           s| g} 	 d                    fd| D                       S # t          $ r t          | g          cY S w xY w)N
c              3  &   K   | ]} d | V  dS )z- N ).0itempaddings     :lib/python3.11/site-packages/conda/common/configuration.py	<genexpr>zpretty_list.<locals>.<genexpr>K   s1      CC$G--t--CCCCCC    )r)   join	TypeErrorpretty_list)iterabler9   s    `r:   r?   r?   G   sy    h :0yyCCCC(CCCCCC 0 0 0H:w/////0s    6 AAc                j    d                     fd|                                 D                       S )Nr4   c              3  0   K   | ]\  }} | d | V  dS ): Nr6   )r7   keyvaluer9   s      r:   r;   zpretty_map.<locals>.<genexpr>Q   s:      UUJC/////UUUUUUr<   )r=   items)
dictionaryr9   s    `r:   
pretty_maprH   P   s6    99UUUU*BRBRBTBTUUUUUUr<   c                \    t          | t          t          f          rt          |           S | S N)
isinstancestrbytesr   )
unexpandeds    r:   expand_environment_variablesrO   T   s,    *sEl++ *%%%r<   c                      e Zd ZdS )ConfigurationErrorN)__name__
__module____qualname__r6   r<   r:   rQ   rQ   [   s        Dr<   rQ   c                        e Zd Zd fd	Z xZS )ConfigurationLoadError c                J    d} t                      j        ||z   fd|i| d S )Nz4Unable to load configuration file.
  path: %(path)s
pathsuper__init__)selfrY   message_additionkwargsmessage	__class__s        r:   r\   zConfigurationLoadError.__init__`   s8    J#33II$I&IIIIIr<   )rW   rR   rS   rT   r\   __classcell__ra   s   @r:   rV   rV   _   sG        J J J J J J J J J Jr<   rV   c                        e Zd Zd fd	Z xZS )ValidationErrorNc                f    || _         || _        || _         t                      j        |fi | d S rJ   )parameter_nameparameter_valuesourcer[   r\   )r]   rh   ri   rj   msgr_   ra   s         r:   r\   zValidationError.__init__f   s?    ,.'''''''r<   rJ   rb   rd   s   @r:   rf   rf   e   s=        ( ( ( ( ( ( ( ( ( (r<   rf   c                       e Zd Z fdZ xZS )MultipleKeysErrorc                    || _         || _        d|dt          |          d|d}t                                          |d ||           d S )NzMultiple aliased keys in file z:
z 
Must declare only one. Prefer ''rk   )rj   keysr?   r[   r\   )r]   rj   rq   preferred_keyrk   ra   s        r:   r\   zMultipleKeysError.__init__n   se    		
 vv{4((((---9 	 	f#>>>>>r<   rb   rd   s   @r:   rm   rm   m   s8        	? 	? 	? 	? 	? 	? 	? 	? 	?r<   rm   c                  "     e Zd Z	 d fd	Z xZS )InvalidTypeErrorNc                    || _         || _        |d|d|d|d|dt          |          
}t                                          ||||           d S )N
Parameter  =  declared in z
 has type z.
Valid types:
rp   )
wrong_typevalid_typesr?   r[   r\   )r]   rh   ri   rj   ry   rz   rk   ra   s          r:   r\   zInvalidTypeError.__init__{   sz     %&;;
 #NN#OOFFJJ,,,  	&cJJJJJr<   rJ   rb   rd   s   @r:   rt   rt   z   sJ        TXK K K K K K K K K Kr<   rt   c                       e Zd Z fdZ xZS )CustomValidationErrorc                n    d|d|d|d|}t                                          ||||           d S )Nrv   rw   rx   z is invalid.
rp   rZ   )r]   rh   ri   rj   custom_messagerk   ra   s         r:   r\   zCustomValidationError.__init__   sO     NNOOFFN	
 	&cJJJJJr<   rb   rd   s   @r:   r|   r|      sA        K K K K K K K K Kr<   r|   c                       e Zd Z fdZ xZS )MultiValidationErrorc                B     t                      j        |g|R i | d S rJ   rZ   )r]   errorsargsr_   ra   s       r:   r\   zMultiValidationError.__init__   s0    1$111&11111r<   rb   rd   s   @r:   r   r      s8        2 2 2 2 2 2 2 2 2r<   r   c                ^    | sdS t          |           dk    r| d         t          |           )NTr(   r   )lenr   )r   s    r:   raise_errorsr      s7     +t	V		Qi"6***r<   c                  b    e Zd ZdZdZdZd Zed             Zed             Z	ed             Z
dS )	ParameterFlagfinaltopbottomc                    d| j         z  S )Nz%srE   r]   s    r:   __str__zParameterFlag.__str__   s    dj  r<   c                    | |         S rJ   r6   )clsnames     r:   	from_namezParameterFlag.from_name   s    4yr<   c                     | |          S rJ   r6   )r   rE   s     r:   
from_valuezParameterFlag.from_value   s    s5zzr<   c                    	 |                     d          }|                     |          S # t          t          f$ r Y d S w xY w)Nz!#)stripr   
ValueErrorAttributeError)r   strings     r:   from_stringzParameterFlag.from_string   sQ    	\\$''F>>&)))N+ 	 	 	44	s   ), A AN)rR   rS   rT   r   r   r   r   classmethodr   r   r   r6   r<   r:   r   r      s        E
CF! ! !   [   [   [  r<   r   c                  r    e Zd Zd Zd Zed             Zed             Zed             Ze	d             Z
dS )RawParameterc                    || _         || _        	 |                    d          | _        d S # t          $ r || _        Y d S w xY w)Nzutf-8)rj   rD   decode
_raw_valuer   )r]   rj   rD   	raw_values       r:   r\   zRawParameter.__init__   sV    	('..w77DOOO 	( 	( 	('DOOOO	(s   , A Ac                :    t          t          |                     S rJ   )rL   varsr   s    r:   __repr__zRawParameter.__repr__   s    4::r<   c                    t                      rJ   NotImplementedErrorr]   parameter_objs     r:   rE   zRawParameter.value       !###r<   c                    t                      rJ   r   r   s    r:   keyflagzRawParameter.keyflag   r   r<   c                    t                      rJ   r   r   s     r:   
valueflagszRawParameter.valueflags   r   r<   c                :     r fdD             S t           S )Nc           	     8    i | ]}| ||                   S r6   r6   r7   rD   r   from_maprj   s     r:   
<dictcomp>z4RawParameter.make_raw_parameters.<locals>.<dictcomp>   s-    MMMSCVS(3-88MMMr<   	EMPTY_MAPr   rj   r   s   ```r:   make_raw_parametersz RawParameter.make_raw_parameters   s4     	NMMMMMMHMMMMr<   N)rR   rS   rT   r\   r   r   rE   r   r   r   r   r6   r<   r:   r   r      s        ( ( (   $ $ ^$ $ $ ^$ $ $ ^$   [  r<   r   )	metaclassc                  Z     e Zd ZdZd Zd Zd Zed             Ze	 fd            Z
 xZS )EnvRawParameterenvvarsc                4    t          |d          rit           j        t                    sJ t	          |d          }t           fdd  j                            |          D             D                       S  j        d                                         S )Nstring_delimiterc              3  \   K   | ]&}|t          t           j        j        |          V  'd S rJ   )r   rj   rD   )r7   vr]   s     r:   r;   z(EnvRawParameter.value.<locals>.<genexpr>   sN         6!DD     r<   c              3  >   K   | ]}|                                 V  d S rJ   )r   )r7   vvs     r:   r;   z(EnvRawParameter.value.<locals>.<genexpr>   s*      WW"((**WWWWWWr<   r   )	hasattrrK   r   rL   getattrtuplesplit'_EnvRawParameter__important_split_valuer   r]   r   r   s   `  r:   rE   zEnvRawParameter.value   s     ="455 
	;dos33333&}6HII    WWt/D/DEU/V/VWWW      /288:::r<   c                N    t          | j                  dk    rt          j        nd S Nr   )r   r   r   r   r   s    r:   r   zEnvRawParameter.keyflag   s&    &)$*F&G&G1&L&L}""RVVr<   c                    t          |d          rAt          |d          }t          d | j                            |          D                       S | j        d                                         S )Nr   c              3     K   | ]}d V  dS )rW   Nr6   )r7   _s     r:   r;   z-EnvRawParameter.valueflags.<locals>.<genexpr>   s"      MMMMMMMMr<   r   )r   r   r   r   r   r   r   r   s      r:   r   zEnvRawParameter.valueflags   sn    ="455 	;&}6HIIMMT_%:%:;K%L%LMMMMMM/288:::r<   c                6    | j                             d          S )Nz
!important)r   r   r   s    r:   __important_split_valuez'EnvRawParameter.__important_split_value   s    $$\222r<   c                    |                                  dfdt          j                    D             }t                                          t
          j        |          S )Nr   c                    i | ]D\  }}|                               |                    d d                                          |ES )rW   r(   )
startswithreplacelower)r7   kr   keystarts      r:   r   z7EnvRawParameter.make_raw_parameters.<locals>.<dictcomp>  s]     
 
 
1||H%%
IIhA&&,,..
 
 
r<   )upperr   rF   r[   r   r   rj   )r   appnameraw_envr   ra   s      @r:   r   z#EnvRawParameter.make_raw_parameters  sg    mmoo(((
 
 
 

 
 

 ww**?+A7KKKr<   )rR   rS   rT   rj   rE   r   r   propertyr   r   r   rc   rd   s   @r:   r   r      s        F; ; ;W W W; ; ; 3 3 X3 L L L L [L L L L Lr<   r   c                  D     e Zd ZdZd Zd Zd Ze fd            Z xZ	S )ArgParseRawParametercmd_linec           	     .   t          | j                  rng }t          t          | j                            D ];}|                    t          | j        | j        | j        |                              <t          |          S t          | j                  S rJ   )
r)   r   ranger   appendr   rj   rD   r   r"   )r]   r   children_valuesis       r:   rE   zArgParseRawParameter.value  s     do&& 	3 O3t//00  &&(dhPQ@RSS    )))!$/222r<   c                    d S rJ   r6   r   s    r:   r   zArgParseRawParameter.keyflag      tr<   c                4    t          |t                    rd ndS Nr6   )rK   PrimitiveLoadedParameterr   s     r:   r   zArgParseRawParameter.valueflags   s    !-1IJJRttPRRr<   c                \    t                                          t          j        |          S rJ   )r[   r   r   rj   )r   args_from_argparsera   s     r:   r   z(ArgParseRawParameter.make_raw_parameters#  s(    ww** ');
 
 	
r<   )
rR   rS   rT   rj   rE   r   r   r   r   rc   rd   s   @r:   r   r     sy        F3 3 3  S S S 
 
 
 
 [
 
 
 
 
r<   r   c                       e Zd Z fdZd Zd Zd Zed             Ze	d             Z
ed             Zed             Ze	d	             Ze	d
             Z xZS )YamlRawParameterc           
     :   || _         t                                          |||           t          | j        t
                    r|                     | j                  }t          d |D                       | _        g }t          t          | j                            D ]B}|                    t          | j        | j        | j        |         ||                              Ct          |          | _        d S t          | j        t                     r|                     | j                  }d |                                D             | _        i }| j                                        D ]*\  }}	t          | j        | j        |	||                   ||<   +t'          |          | _        d S t          | j        t(                    rd | _        | j        | _        d S t+          t-          | j                  | j        t.          j                   t3                      )Nc              3  J   K   | ]}t                               |          V  d S rJ   r   r   )r7   ss     r:   r;   z,YamlRawParameter.__init__.<locals>.<genexpr>3  sA       & &12))!,,& & & & & &r<   c                N    i | ]"\  }}||t                               |          #S rJ   r   r7   r   r   s      r:   r   z-YamlRawParameter.__init__.<locals>.<dictcomp>@  s9     ! ! !Aq= =,,Q// ==r<   )file)_key_commentr[   r\   rK   r   r/   _get_yaml_list_commentsr   _value_flagsr   r   r   r   rj   rD   _valuer.   _get_yaml_map_commentsrF   r   r*   printtypesysstderrr#   )r]   rj   rD   r   key_commentvalue_commentsr   r   r   r   ra   s             r:   r\   zYamlRawParameter.__init__-  s   'i000do|44 	/!99$/JJN % & &6D& & & ! !D !O3t//00  &&$TXtq/A>RSCT    
  00DKKK66 	/!88IIN! !*0022! ! !D
 !O--//  1%5K1nQ.?& &"" %_55DKKK99 	/ $D/DKKK$t''szJJJJ,...r<   c                    | j         S rJ   r   r   s     r:   rE   zYamlRawParameter.valueR  
    {r<   c                @    t                               | j                  S rJ   )r   r   r   r   s    r:   r   zYamlRawParameter.keyflagU  s    (():;;;r<   c                    | j         S rJ   )r   r   s     r:   r   zYamlRawParameter.valueflagsX  s      r<   c                    	 | j         j        |         d         j                                        S # t          t
          f$ r Y d S w xY wr   carF   rE   r   r   KeyError)commented_dictrD   s     r:   _get_yaml_key_commentz&YamlRawParameter._get_yaml_key_comment[  sS    	!$*3/28>>@@@) 	 	 	44	s   .1 AAc                D   g }t          t          |                    D ]s}	 |                    |                     |j        j        |                              <# t          t          t          t          f$ r |                    d            Y pw xY wt          |          S rJ   )r   r   r   _get_yaml_list_comment_itemr  rF   r   
IndexErrorr  r>   r   )r   rE   list_commentsr   s       r:   r   z(YamlRawParameter._get_yaml_list_commentsb  s    
 s5zz"" 	+ 	+A+$$S%D%DUX^TUEV%W%WXXXX"J)D + + +$$T*****+]###s   8A2BBc                    | d         r!| d         j                                         pd S | d         d         j                                         pd S )Nr   r(   )rE   r   )r8   s    r:   r
  z,YamlRawParameter._get_yaml_list_comment_itemo  sO     7 	47=&&((0D071:#))++3t3r<   c                    i }| D ]S}	 | j         j        |         d         j                                        pd ||<   8# t          t
          f$ r d ||<   Y Pw xY w|S r   r  )rE   map_commentsrD   s      r:   r   z'YamlRawParameter._get_yaml_map_commentsx  s     	) 	)C)$)HN3$7$:$@$F$F$H$H$PDS!!"H- ) ) )$(S!!!)s   4=AAc                :     r fdD             S t           S )Nc                b    i | ]+}| ||                              |                    ,S r6   )r  r   s     r:   r   z8YamlRawParameter.make_raw_parameters.<locals>.<dictcomp>  sW         SSC#0I0I(TW0X0X   r<   r   r   s   ```r:   r   z$YamlRawParameter.make_raw_parameters  sL     	      $	    r<   c                d   t          |          5 }	 t          |          }nZ# t          $ r)}|j        }t	          |d|j        |j                  d }~wt          $ r}t	          |d|j                  d }~ww xY w| 	                    ||          pt          cd d d            S # 1 swxY w Y   d S )Nz:  reason: invalid yaml at line %(line)s, column %(column)s)linecolumnz/  reason: invalid yaml at position %(position)s)position)openr-   r1   problem_markrV   r  r  r0   r  r   r   )r   filepathfhyaml_objerrmarks         r:   make_raw_parameters_from_filez.YamlRawParameter.make_raw_parameters_from_file  s8   (^^ 	Lr/33   ',P;	       ,E \    **8X>>K)#	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls<   B%"B%
A9$AA9A44A99B%%B),B))rR   rS   rT   r\   rE   r   r   staticmethodr  r   r   r
  r   r   r  rc   rd   s   @r:   r   r   *  s       #/ #/ #/ #/ #/J  < < <! ! !   \ 
$ 
$ [
$ 4 4 \4   \   [ L L [L L L L Lr<   r   c                  4     e Zd ZdZ fdZd Zd Zd Z xZS )DefaultValueRawParameterzFWraps a default value as a RawParameter, for usage in ParameterLoader.c           	        t                                          |||           t          | j        t                    rUi }| j                                        D ]#\  }}t          | j        | j        |          ||<   $t          |          | _
        d S t          | j                  rug }t          t          | j                            D ];}|                    t          | j        | j        | j        |                              <t          |          | _
        d S t          | j        t                     rn| j        | _
        t#          | j                                                  D ]9\  }}	| j
                            |t          | j        | j        |	                     :d S t          | j        t&                    r| j        | _
        d S t          | j        t(                    r| j        | _
        d S t+                      rJ   )r[   r\   rK   r   r   rF   r   rj   rD   r   r   r)   r   r   r   r   ConfigurationObjectr   __setattr__r   r*   r#   )r]   rj   rD   r   r   r   r   r   	attr_name
attr_valuera   s             r:   r\   z!DefaultValueRawParameter.__init__  s   i000dow// 	/ O--// X X1%=dk48UV%W%W""$_55DKKK(( 	/ O3t//00  &&,T[$(DOTUDVWW     00DKKK)<== 	//DK)-do)>)>)D)D)F)F  %	:'',T[$(JOO    
 .. 	//DKKK99 	//DKKK,...r<   c                    | j         S rJ   r   r   s     r:   rE   zDefaultValueRawParameter.value  r   r<   c                    d S rJ   r6   r   s    r:   r   z DefaultValueRawParameter.keyflag  r   r<   c                B   t          | j        t                    rt                      S t	          | j                  rdS t          | j        t
                    rd S t          | j        t                    rd S t          | j        t                    rd S t                      r   )	rK   r   r   r   r)   r"  r   r*   r#   r   s     r:   r   z#DefaultValueRawParameter.valueflags  s    dow// 	/<<(( 		/2)<== 	/4.. 	/499 	/4,...r<   )	rR   rS   rT   __doc__r\   rE   r   r   rc   rd   s   @r:   r   r     sk        PP/ / / / /:    / / / / / / /r<   r   z24.3z24.9search_pathIterable[Path | str]returndict[Path, dict]c                t    t          j        | fi |}t          t                               |                    S rJ   )Configuration_expand_search_pathdict_load_search_path)r*  r_   expanded_pathss      r:   load_file_configsr4    s6    "6{MMfMMN//??@@@r<   c                      e Zd ZdZdZddZd Zd ZddZd Z	e
d             Zd	 Zedd
            Zed             Zed             ZdS )LoadedParameterNc                L    || _         || _        || _        || _        || _        dS )aJ  
        Represents a Parameter that has been loaded with configuration value.

        Args:
            name (str): name of the loaded parameter
            value (LoadedParameter or primitive): the value of the loaded parameter
            key_flag (ParameterFlag or None): priority flag for the parameter itself
            value_flags (Any or None): priority flags for the parameter values
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.
        N)_namerE   key_flagvalue_flags_validation)r]   r   rE   r9  r:  
validations         r:   r\   zLoadedParameter.__init__  s/     

 &%r<   c                b    t          |          t          |           u r| j        |j        k    S dS NFr   rE   r]   others     r:   __eq__zLoadedParameter.__eq__  -    ;;$t**$$:,,ur<   c                *    t          | j                  S rJ   hashrE   r   s    r:   __hash__zLoadedParameter.__hash__      DJr<   
<<merged>>c           
        g }t          || j                  sC|                    t          | j        ||t          | j                  | j                             n| j        |                     |          }|du r*|                    t          | j        ||                     n?t          |t                    r*|                    t          | j        |||                     |S )a.  
        Validate a LoadedParameter typed value.

        Args:
            instance (Configuration): the instance object used to create the LoadedParameter.
            typed_value (Any): typed value to validate.
            source (str): string description for the source of the typed_value.
        NF)rK   _typer   rt   r8  r   rE   r;  rf   rL   r|   )r]   instancetyped_valuerj   r   results         r:   collect_errorszLoadedParameter.collect_errors  s     +tz22 	MM JVT$*5E5Etz    
 )%%k22Fodj+vNNOOOOFC(( )$*k66RR   r<   c                   t          | j        t                    r? t          | j                  d | j                                        D                       }nt          | j                  r- t          | j                  d | j        D                       }nt          | j        t                    rut          | j                                                  D ]G\  }}t          |t                    r-| j        	                    ||
                                           H| j        S t          | j                  }|| _        | S )zw
        Recursively expands any environment values in the Loaded Parameter.

        Returns: LoadedParameter
        c              3  H   K   | ]\  }}||                                 fV  d S rJ   expandr   s      r:   r;   z)LoadedParameter.expand.<locals>.<genexpr>"  s2      (X(XTQ!QXXZZ(X(X(X(X(X(Xr<   c              3  >   K   | ]}|                                 V  d S rJ   rR  )r7   r   s     r:   r;   z)LoadedParameter.expand.<locals>.<genexpr>$  s*      (H(H(H(H(H(H(H(Hr<   )rK   rE   r   r   rF   r)   r"  r   r6  r#  rS  rO   )r]   	new_valuer$  r%  s       r:   rS  zLoadedParameter.expand  s-    dj'** 
	A(TZ(((X(XTZEUEUEWEW(X(X(XXXII
## 	A(TZ(((H(HTZ(H(H(HHHII
$788 	A)-dj)9)9)?)?)A)A K K%	:j/:: KJ**9j6G6G6I6IJJJ:4TZ@@I
r<   c                    t                      )z
        Recursively merges matches into one LoadedParameter.

        Args:
            matches (List<LoadedParameter>): list of matches of this parameter.

        Returns: LoadedParameter
        r   )r]   matchess     r:   mergezLoadedParameter.merge/  s     "###r<   c                   | j         }	 t                              | j        ||          S # t          $ r}t          |          }t          |t                    rOd                    t          dj
        |j                                                            }|d| j         d| z  }t          | j        |j        ||          d}~ww xY w)z
        Recursively types a LoadedParameter.

        Args:
            source (str): string describing the source of the LoadedParameter.

        Returns: a primitive, sequence, or map representing the typed value.
        , '{}'
Valid choices for rC   N)_element_typer6  _typify_data_structurerE   r$   rL   
issubclassr   r=   mapformat__members__valuesr8  r|   )r]   rj   element_typeerk   choicess         r:   r%   zLoadedParameter.typify;  s     )	J"99
FL   ! 	J 	J 	Ja&&C,-- F))|'?'F'F'H'HII  EdjEEGEEE'
AGVSIII	Js    * 
CBCCc                   t          | t                    r6 t          |           fd|                                 D                       S t	          |           r$ t          |           fd| D                       S t          | t
                    rgt          |                                           D ]C\  }}t          |t                    r)|                     ||	                                         D| S t          | t                    r5t          |t                    r t          |t                    r ||           S t          | |          S )Nc              3  L   K   | ]\  }}||                               fV  d S rJ   r%   )r7   r   r   rj   s      r:   r;   z9LoadedParameter._typify_data_structure.<locals>.<genexpr>U  s8      OOA188F#3#34OOOOOOr<   c              3  B   K   | ]}|                               V  d S rJ   ri  )r7   r   rj   s     r:   r;   z9LoadedParameter._typify_data_structure.<locals>.<genexpr>W  s/      ??Aqxx//??????r<   )rK   r   r   rF   r)   r"  r   r6  r#  r%   rL   r_  )rE   rj   	type_hintr$  r%  s    `   r:   r^  z&LoadedParameter._typify_data_structureR  sU   eW%% 	,4;;OOOOOOOOOO 	,4;;??????????233 	,)-e):):)<)< L L%	:j/:: L%%i1B1B61J1JKKKLuc""
	,9d++
	, 9c**
	, 9U###%+++r<   c                (    | j         t          j        u S rJ   )r9  r   r   )loaded_parameters    r:   _match_key_is_importantz'LoadedParameter._match_key_is_importanti  s    (M,???r<   c                f    t          t          |           d d           }|| n| d |dz            S )Nc                B    t                               | d                   S )Nr(   )r6  rn  xs    r:   <lambda>z:LoadedParameter._first_important_matches.<locals>.<lambda>q  s    o==adCC r<   c                    | d         S )Nr   r6   rq  s    r:   rs  z:LoadedParameter._first_important_matches.<locals>.<lambda>r  s
    AaD r<   )applyr(   )r    	enumerate)rW  idxs     r:   _first_important_matchesz(LoadedParameter._first_important_matchesm  sI    gCC .
 
 

 +ww79S1W9+==r<   rJ   rI  )rR   rS   rT   rK  r]  r\   rB  rG  rO  rS  r   rX  r%   r  r^  rn  rx  r6   r<   r:   r6  r6    s        E M& & & &$  
        4  , 	$ 	$ ^	$J J J. , , , \,, @ @ \@ > > \> > >r<   r6  c                  8     e Zd ZdZ	 d fd	Zd Zd Zd Z xZS )r   z
    LoadedParameter type that holds a single python primitive value.

    The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
    python 2 has long and unicode types.
    Nc                n    || _         || _        t                                          |||||           dS )z
        Args:
            element_type (type or tuple[type]): Type-validation of parameter's value.
            value (primitive value): primitive python value.
        N)rK  r]  r[   r\   )r]   r   rd  rE   r9  r:  r<  ra   s          r:   r\   z!PrimitiveLoadedParameter.__init__  s:     "
)uhZHHHHHr<   c                b    t          |          t          |           u r| j        |j        k    S dS r>  r?  r@  s     r:   rB  zPrimitiveLoadedParameter.__eq__  rC  r<   c                *    t          | j                  S rJ   rE  r   s    r:   rG  z!PrimitiveLoadedParameter.__hash__  rH  r<   c                    t          |t          j        d           }||S t          |d d           }||S t	                      )N)defaultc                
    | d uS rJ   r6   rq  s    r:   rs  z0PrimitiveLoadedParameter.merge.<locals>.<lambda>  s
    Qd] r<   )r    r6  rn  r!   r#   )r]   rW  important_match
last_matchs       r:   rX  zPrimitiveLoadedParameter.merge  s^    _<d
 
 
 &""'#:#:DIII
!(***r<   rJ   )	rR   rS   rT   r)  r\   rB  rG  rX  rc   rd   s   @r:   r   r   w  s          LP
I 
I 
I 
I 
I 
I  
     
+ 
+ 
+ 
+ 
+ 
+ 
+r<   r   c                  >     e Zd ZdZeZ	 d
 fd	Zd fd	Zdd	Z xZ	S )MapLoadedParameterzFLoadedParameter type that holds a map (i.e. dict) of LoadedParameters.Nc                `    || _         t                                          |||||           dS )z
        Args:
            value (Mapping): Map of string keys to LoadedParameter values.
            element_type (Parameter): The Parameter type that is held in value.
            value_flags (Mapping): Map of priority value flags.
        Nr]  r[   r\   r]   r   rE   rd  r9  r:  r<  ra   s          r:   r\   zMapLoadedParameter.__init__  3     *uhZHHHHHr<   rI  c                *   t                                          ||| j                  }t          | j        t                    rO| j                                        D ]5\  }}|                    |                    |||         |                     6|S rJ   )r[   rO  rE   rK   r   rF   extendr]   rL  rM  rj   r   rD   rE   ra   s          r:   rO  z!MapLoadedParameter.collect_errors  s    ''+tzJJ dj'** 	X"j..00 X X
Ue228[=MvVVWWWWr<   
parametersSequence[MapLoadedParameter]r,  c                x   t                               |          }|D ]W}t          |j        t                    s;t          | j        |j        |j        |j        j        j	        | j
        j	                  Xd t          |          D             }i }|D ]J}|j                                        D ].\  }}|                    |g                               |           /Kd |                                D             }t          i ||          }t!          | j        || j        | j        | j        | j                  S )Nc                    i | ]L}|j                                         D ]0\  }}|j                            |          t          j        k    -||1MS r6   )rE   rF   r:  getr   r   r7   	parameterrD   rE   s       r:   r   z,MapLoadedParameter.merge.<locals>.<dictcomp>  sm     
 
 
'o3355
 
 U$((--1DDD  EDDDr<   c                L    i | ]!\  }}||d                               |          "S r   rX  r7   rD   rc  s      r:   r   z,MapLoadedParameter.merge.<locals>.<dictcomp>  ;     
 
 
-8S&C((
 
 
r<   r<  )r6  rx  rK   rE   r   rt   r   rj   ra   rR   rK  reversedrF   
setdefaultr   r   r  r8  r]  r9  r:  r;  )	r]   r  r  	final_mapgrouped_maprD   rE   
merged_mapmerged_values	            r:   rX  zMapLoadedParameter.merge  s{    %==jII
 $ 	 	Iiow77 &IO$O-6J'  
 
%j11
 
 
	 # 	> 	>I'o3355 > >
U&&sB//66u====>
 
<G<M<M<O<O
 
 


 ""=Z"=9"=>> "JM'
 
 
 	
r<   rJ   ry  )r  r  r,  r  )
rR   rS   rT   r)  r   rK  r\   rO  rX  rc   rd   s   @r:   r  r    s        PPE LP
I 
I 
I 
I 
I 
I     .
 .
 .
 .
 .
 .
 .
 .
r<   r  c                  <     e Zd ZdZeZ	 d fd	Zd fd	Zd Z xZ	S )	SequenceLoadedParameterzKLoadedParameter type that holds a sequence (i.e. list) of LoadedParameters.Nc                `    || _         t                                          |||||           dS )z
        Args:
            value (Sequence): Sequence of LoadedParameter values.
            element_type (Parameter): The Parameter type that is held in the sequence.
            value_flags (Sequence): Sequence of priority value_flags.
        Nr  r  s          r:   r\   z SequenceLoadedParameter.__init__  r  r<   rI  c                    t                                          ||| j                  }t          | j                  D ]5\  }}|                    |                    |||         |                     6|S rJ   )r[   rO  rE   rv  r  )r]   rL  rM  rj   r   rw  elementra   s          r:   rO  z&SequenceLoadedParameter.collect_errors  sp    ''+tzJJ%dj11 	V 	VLCMM'00;s;KVTTUUUUr<   c                ^   t          d t                              |          D                       }|D ]K\  }}t          |t                     s1t	          | j        ||j        |j        j        | j	        j                  Ld t          j        fd|D                       }t          t          j        fdt          |          D                                 }t          j        d t          |          D                       }t          t          g ||R                     }t          t          g t          |          t          |          R                     }	t          t          |	                    }
t          | j        |
| j        | j        | j        | j                  S )Nc              3  (   K   | ]}||j         fV  d S rJ   r   )r7   matchs     r:   r;   z0SequenceLoadedParameter.merge.<locals>.<genexpr>  s=       ,
 ,
 EK ,
 ,
 ,
 ,
 ,
 ,
r<   c                r    | r3t          fdt          | j        | j                  D                       ndS )Nc              3  *   K   | ]\  }}|u 	|V  d S rJ   r6   )r7   r  flagmarkers      r:   r;   zJSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>  s9        "dv~~ %~~~ r<   r6   )r   ziprE   r:  )r  r  s    `r:   get_marked_linesz7SequenceLoadedParameter.merge.<locals>.get_marked_lines  s]         &)%+u7H&I&I      r<   c              3  J   K   | ]\  }} |t           j                  V  d S rJ   )r   r   )r7   mr   r  s      r:   r;   z0SequenceLoadedParameter.merge.<locals>.<genexpr>!  sK       (
 (
1 Q 122(
 (
 (
 (
 (
 (
r<   c              3  J   K   | ]\  }} |t           j                  V  d S rJ   )r   r   )r7   r  r   r  s      r:   r;   z0SequenceLoadedParameter.merge.<locals>.<genexpr>)  sK          E1 ! (<==           r<   c              3      K   | ]	\  }}|V  
d S rJ   r6   )r7   r   r   s      r:   r;   z0SequenceLoadedParameter.merge.<locals>.<genexpr>1  s7       (
 (
!QA(
 (
 (
 (
 (
 (
r<   r  )r   r6  rx  rK   rt   r   rj   ra   rR   rK  r
   from_iterabler  r'   r  r8  r]  r9  r:  r;  )r]   rW  relevant_matches_and_valuesr  rE   	top_linesbottom_lines	all_linestop_dedupedbottom_dedupedmerged_valuesr  s              @r:   rX  zSequenceLoadedParameter.merge  s    ', ,
 ,
(AA'JJ,
 ,
 ,
 '
 '
# 8 	 	LE5eU++ &ILO,J'  		 		 		 ' (
 (
 (
 (
3(
 (
 (
 
 
	          ()D E E       
 
 ' (
 (
"#>??(
 (
 (
 
 
	
 F#;Y#;#;#;<<== DXl++Dh{.C.CDDEE
 
 h~6677&JM'
 
 
 	
r<   rJ   ry  )
rR   rS   rT   r)  r   rK  r\   rO  rX  rc   rd   s   @r:   r  r    s        UUE LP
I 
I 
I 
I 
I 
I     F
 F
 F
 F
 F
 F
 F
r<   r  c                  >     e Zd ZdZeZ	 d
 fd	Zd fd	Zdd	Z xZ	S )ObjectLoadedParameterzLLoadedParameter type that holds a mapping (i.e. object) of LoadedParameters.Nc                `    || _         t                                          |||||           dS )z
        Args:
            value (Sequence): Object with LoadedParameter fields.
            element_type (object): The Parameter type that is held in the sequence.
            value_flags (Sequence): Sequence of priority value_flags.
        Nr  r  s          r:   r\   zObjectLoadedParameter.__init__Q  r  r<   rI  c                n   t                                          ||| j                  }t          | j        t                    rqt          | j                                                  D ]J\  }}t          |t                    r0|                    |                    |||         |                     K|S rJ   )	r[   rO  rE   rK   r"  r   rF   r6  r  r  s          r:   rO  z$ObjectLoadedParameter.collect_errors]  s    ''+tzJJ dj"566 	"4:..4466  
Ue_55 MM,,X{37GPP   r<   r  Sequence[ObjectLoadedParameter]r,  c                R   t                               |          }d t          |          D             }i }|D ]W}t          |j                                                  D ].\  }}|                    |g                               |           /Xd |                                D             }t          j	        | j
                  }i ||                                D ]\  }}|                    ||           t          | j        || j
        | j        | j        | j                  S )Nc                    i | ]n}t          |j                                                  D ]E\  }}t          |t                    r+|j                            |          t          j        k    B||FoS r6   )	r   rE   rF   rK   r6  r:  r  r   r   r  s       r:   r   z/ObjectLoadedParameter.merge.<locals>.<dictcomp>r  s     
 
 
"9?3399;;
 
 U5/22
 )--c22m6III 
 JIIIr<   c                L    i | ]!\  }}||d                               |          "S r  r  r  s      r:   r   z/ObjectLoadedParameter.merge.<locals>.<dictcomp>  r  r<   r  )r6  rx  r  r   rE   rF   r  r   copydeepcopyr]  r#  r  r8  r9  r:  r;  )	r]   r  r  r  r  rD   rE   r  r  s	            r:   rX  zObjectLoadedParameter.mergei  s`   
 %==jII

 
%j11
 
 
	 # 	> 	>I"9?3399;; > >
U&&sB//66u====>
 
<G<M<M<O<O
 
 


 }T%7885Z595;;== 	1 	1JC$$S%0000 %JM'
 
 
 	
r<   rJ   ry  )r  r  r,  r  )
rR   rS   rT   r)  objectrK  r\   rO  rX  rc   rd   s   @r:   r  r  L  s        VVE LP
I 
I 
I 
I 
I 
I
 
 
 
 
 
*
 *
 *
 *
 *
 *
 *
 *
r<   r  c                      e Zd ZdZdS )r"  zIDummy class to mark whether a Python object has config parameters within.N)rR   rS   rT   r)  r6   r<   r:   r"  r"    s        SSSSr<   r"  c                  V    e Zd ZdZdZddZed             Zd Ze	d             Z
d ZdS )	ParameterNc                "    || _         || _        dS )a  
        The Parameter class represents an unloaded configuration parameter, holding type, default
        and validation information until the parameter is loaded with a configuration.

        Args:
            default (Any): the typed, python representation default value given if the Parameter
                is not found in a Configuration.
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.
        N)_defaultr;  )r]   r  r<  s      r:   r\   zParameter.__init__  s      %r<   c                Z    t          dd| j                  }|                     d|          S )zGReturns a DefaultValueRawParameter that wraps the actual default value.r  )r   r  load)r]   wrapped_defaults     r:   r  zParameter.default  s+     39iWWyyO444r<   c                    g }g }|j                                         D ]R\  }}t                              |||          \  }}	||                    |           |	r|                    |	           S||fS )a  
        Finds all matches of a Parameter in a Configuration instance

        Args:
            name (str): canonical name of the parameter to search for
            names (tuple(str)): alternative aliases of the parameter
            instance (Configuration): instance of the configuration to search within

        Returns (List(RawParameter)): matches of the parameter found in the configuration.
        )raw_datarF   ParameterLoader!raw_parameters_from_single_sourcer   )
r]   r   namesrL  rW  multikey_exceptionsr  raw_parametersr  errors
             r:   get_all_matcheszParameter.get_all_matches  s      (0(9(?(?(A(A 	2 	2$Hn*LLe^ LE5  u%%% 2#**5111+++r<   c                    t                      )z
        Loads a Parameter with the value in a RawParameter.

        Args:
            name (str): name of the parameter to pass through
            match (RawParameter): the value of the RawParameter match

        Returns a LoadedParameter
        r   r]   r   r  s      r:   r  zParameter.load  s     "###r<   c                `   | j         }	 t          ||          S # t          $ r}t          |          }t	          |t
                    rJd                    t          dj        |j	        
                                                    }|d| d| z  }t          ||j        ||          d }~ww xY w)NrZ  r[  r\  rC   )r]  r&   r$   rL   r_  r   r=   r`  ra  rb  rc  r|   rE   )r]   r   rj   rE   rd  re  rk   rf  s           r:   r%   zParameter.typify  s    )		D(===  	D 	D 	Da&&C,-- @))|'?'F'F'H'HII  ?d??g???'agvsCCC	Ds    
B-BB((B-rJ   )rR   rS   rT   rK  r]  r\   r   r  r  r   r  r%   r6   r<   r:   r  r    s        E M& & & & 5 5 X5
, , ,. 
$ 
$ ^
$D D D D Dr<   r  c                  *     e Zd ZdZd fd	Zd Z xZS )PrimitiveParameterz
    Parameter type for a Configuration class that holds a single python primitive value.

    The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
    python 2 has long and unicode types.
    Nc                    |t          |          n|| _        | j        | _        t                                          ||           dS )z
        Args:
            default (primitive value): default value if the Parameter is not found.
            element_type (type or tuple[type]): Type-validation of parameter's value. If None,
                type(default) is used.
        N)r   rK  r]  r[   r\   )r]   r  rd  r<  ra   s       r:   r\   zPrimitiveParameter.__init__  sE     '3&:T']]]
!Z*-----r<   c           	         t          || j        |                    | j                  |                                |                    | j                  | j                  S Nr  )r   rK  rE   r]  r   r   r;  r  s      r:   r  zPrimitiveParameter.load  sX    'JKK*++MMOOT/00'
 
 
 	
r<   NN)rR   rS   rT   r)  r\   r  rc   rd   s   @r:   r  r    sV         	. 	. 	. 	. 	. 	.
 
 
 
 
 
 
r<   r  c                  L     e Zd ZdZeZ e            df fd	Z fdZd Z xZ	S )MapParameterzTParameter type for a Configuration class that holds a map (i.e. dict) of Parameters.Nc                    || _         |rt          |          pt                      }t                                          ||           dS )z
        Args:
            element_type (Parameter): The Parameter type held in the MapParameter.
            default (Mapping):  The parameter's default value. If None, will be an empty dict.
        r  N)r]  r   r[   r\   r]   rd  r  r<  ra   s       r:   r\   zMapParameter.__init__
  sK     *1j11AZ\\Z88888r<   c                    t                                          |||          \  }}t          d |D                       }||fS )Nc              3  (   K   | ]}|j         	|V  d S rJ   r   r7   r  s     r:   r;   z/MapParameter.get_all_matches.<locals>.<genexpr>  )      GGaal.F.F.F.F.FGGr<   r[   r  r   r]   r   r  rL  rW  
exceptionsra   s         r:   r  zMapParameter.get_all_matches  J    #gg55dE8LLGG7GGGGG
""r<   c           	        |                     | j                  }|It          |t                      | j        |                                t                      | j                  S t          |t                    s,t          |||j	        |j
        j        | j        j                  i }|                     | j                                                  D ]%\  }}| j                            ||          }|||<   &t          |t          |          | j        |                                |                    | j                  | j                  S r  )rE   r]  r  r   r   r;  rK   r   rt   rj   ra   rR   rK  rF   r  r   )r]   r   r  rE   
loaded_maprD   child_valueloaded_child_values           r:   r  zMapParameter.load  sA   D.//=%"+    %)) 	"eU\5?+CTZEX   
 %D,> ? ? E E G G 	1 	1C!%!3!8!8{!K!K0JsOO!z""MMOOT/00'
 
 
 	
r<   )
rR   rS   rT   r)  r   rK  r\   r  r  rc   rd   s   @r:   r  r    s{        ^^E-7Z\\d 9 9 9 9 9 9# # # # #
 
 
 
 
 
 
r<   r  c                  8     e Zd ZdZeZd fd	Z fdZd Z xZ	S )	SequenceParameterzYParameter type for a Configuration class that holds a sequence (i.e. list) of Parameters.r6   N,c                h    || _         || _        t                                          ||           dS )a  
        Args:
            element_type (Parameter): The Parameter type that is held in the sequence.
            default (Sequence): default value, empty tuple if not given.
            string_delimiter (str): separation string used to parse string into sequence.
        N)r]  r   r[   r\   )r]   rd  r  r<  r   ra   s        r:   r\   zSequenceParameter.__init__?  s5     * 0*-----r<   c                    t                                          |||          \  }}t          d |D                       }||fS )Nc              3  (   K   | ]}|j         	|V  d S rJ   r  r  s     r:   r;   z4SequenceParameter.get_all_matches.<locals>.<genexpr>O  r  r<   r  r  s         r:   r  z!SequenceParameter.get_all_matchesJ  sL     $gg55dE8LLGG7GGGGG
""r<   c           	     "   |                     |           }|1t          |d| j        |                                d| j                  S t          |          s,t          |||j        |j        j	        | j
        j	                  g }|D ]2}| j                            ||          }|                    |           3t          |t          |          | j        |                                |                    | j                  | j                  S )Nr6   r  )rE   r  r]  r   r;  r)   rt   rj   ra   rR   rK  r  r   r   r   )r]   r   r  rE   loaded_sequencer  r  s          r:   r  zSequenceParameter.loadR  s!   D!!=*"+    %   	"eU\5?+CTZEX     	7 	7K!%!3!8!8{!K!K""#56666&/""MMOOT/00'
 
 
 	
r<   )r6   Nr  )
rR   rS   rT   r)  r   rK  r\   r  r  rc   rd   s   @r:   r  r  :  sp        ccE	. 	. 	. 	. 	. 	.# # # # #
 
 
 
 
 
 
r<   r  c                  L     e Zd ZdZeZ e            df fd	Z fdZd Z	 xZ
S )ObjectParameterzTParameter type for a Configuration class that holds an object with Parameter fields.Nc                Z    || _         t                                          ||           dS )z
        Args:
            element_type (object): The object type with parameter fields held in ObjectParameter.
            default (Sequence): default value, empty tuple if not given.
        Nr  r  s       r:   r\   zObjectParameter.__init__w  s-     **-----r<   c                    t                                          |||          \  }}t          d |D                       }||fS )Nc              3  (   K   | ]}|j         	|V  d S rJ   r  r  s     r:   r;   z2ObjectParameter.get_all_matches.<locals>.<genexpr>  r  r<   r  r  s         r:   r  zObjectParameter.get_all_matches  r  r<   c           	        |                     | j                  1t          |d | j        |                                d | j                  S t          t          t          f          s,t          ||j	        j
        j        | j        j                  t          t                    rt                    fdt          | j                                                  D             }i }|                                D ]5\  }}                    |          }|                    ||          }|||<   6t#          j        | j                  }	|                                D ]\  }}
|	                    ||
           t          ||	| j        |                                |                    | j                  | j                  S )Nr  c                r    i | ]3\  }}t          |t                    r|                                v 0||4S r6   )rK   r  rq   )r7   r$  parameter_typerE   s      r:   r   z(ObjectParameter.load.<locals>.<dictcomp>  sQ     "
 "
 "
)	>.)44"
 :Cejjll9R9R ~9R9R9Rr<   )rE   r]  r  r   r;  rK   r   r"  rt   rj   ra   rR   rK  r   rF   r  r  r  r  r#  r   )r]   r   r  object_parameter_attrsloaded_attrsr$  r  raw_child_valuer  object_copyloaded_child_parameterrE   s              @r:   r  zObjectParameter.load  s   D.//=("+    %'+>!?@@ 	"eU\5?+CTZEX  
 e011 	 KKE"
 "
 "
 "
-1$2D-E-E-K-K-M-M"
 "
 "
 )?)E)E)G)G 	9 	9%I~#ii	22O!/!4!4T?!K!K&8L## mD$6771=1C1C1E1E 	G 	G-I-##I/EFFFF$MMOOT/00'
 
 
 	
r<   )rR   rS   rT   r)  r  rK  r"  r\   r  r  rc   rd   s   @r:   r  r  r  s~        ^^E-@-@-B-Bt . . . . . .# # # # #.
 .
 .
 .
 .
 .
 .
r<   r  c                  n    e Zd ZdZddZd Zed             Zed             Zd Z	d	 Z
ed
             ZdS )r  zq
    ParameterLoader class contains the top level logic needed to load a parameter from start to
    finish.
    r6   Fc                L    d| _         d| _        || _        || _        || _        dS )a  
        Args:
            parameter_type (Parameter): the type of Parameter that is stored in the loader.
            aliases (tuple(str)): alternative aliases for the Parameter
            expandvars (bool): whether or not to recursively expand environmental variables.
        N)r8  _namesr   aliases_expandvars)r]   r  r  r   s       r:   r\   zParameterLoader.__init__  s.     
"	%r<   c                |    || _         t          d t          | j        |f          D                       }|| _        |S )Nc              3     K   | ]}|V  d S rJ   r6   )r7   rr  s     r:   r;   z,ParameterLoader._set_name.<locals>.<genexpr>  s"      CC1CCCCCCr<   )r8  	frozensetr
   r  r  )r]   r   r  s      r:   	_set_namezParameterLoader._set_name  sA     
CCeDL4'&B&BCCCCCr<   c                :    | j         t                      | j         S rJ   )r8  r#   r   s    r:   r   zParameterLoader.name  s    :,...zr<   c                :    | j         t                      | j         S rJ   )r  r#   r   s    r:   r  zParameterLoader.names  s    ;,...{r<   c                X     j         |j        v r|j         j                  S  j                             j          j        |          \  }} fd|D             }|r|d                             |          n j        j        } j        r|                                n|}	 |	                    d          }|
                    |                    ||d                     n,# t          $ r}	|                    |	           Y d }	~	nd }	~	ww xY wt          |           ||j         j         <   |S )Nc                P    g | ]"}j                             j        |          #S r6   )r   r  r   )r7   r  r]   s     r:   
<listcomp>z+ParameterLoader.__get__.<locals>.<listcomp>  s+    MMM49>>$)U33MMMr<   r   rI  )r   _cache_r   r  r  rX  r  r  rS  r%   r  rO  r|   r   r   )
r]   rL  instance_typeraw_matchesr   rW  mergedexpandedrN  re  s
   `         r:   __get__zParameterLoader.__get__  sN    9(((#DI.. #i77	4:xXXV NMMMMMM /6L!!'***49;L
 '+&6B6==???F	S__\22F MM(11(FLQQRRRR % 	 	 	MM!	 	V&,#s    C   
D	*DD	c                N    t                               | j        | j        |          S rJ   )r  r  r   r  )r]   r  s     r:   "_raw_parameters_from_single_sourcez2ParameterLoader._raw_parameters_from_single_source  s%    @@Itz>
 
 	
r<   c           	        |t                                                    z  }fd|D             }t          |          }|dk    rdS |dk    r0t          t	          |                                                    d fS | |v r>||          t          t          t	          |                             j        ||           fS d t          t          t	          |                             j        ||           fS )Nc                "    i | ]}||         S r6   r6   )r7   rD   r  s     r:   r   zEParameterLoader.raw_parameters_from_single_source.<locals>.<dictcomp>  s     <<<3s+<<<r<   r   r  r(   )r  rq   r   nextiterrc  rm   rj   )r   r  r  rq   rW  numkeyss     `   r:   r  z1ParameterLoader.raw_parameters_from_single_source  s     y!4!4!6!6777<<<<t<<<d))a<<:\\W^^--..//55T\\4="3tDJJ//07t# #   *tDJJ//07t   r<   N)r6   F)rR   rS   rT   r)  r\   r  r   r   r  r  r  r  r  r6   r<   r:   r  r    s         
& & & &     X   X  <
 
 

   \  r<   r  c                  "     e Zd ZdZ fdZ xZS )ConfigurationTypezmetaclass for Configurationc                    t                                          |||           t          d | j                                        D                       | _        d S )Nc              3  p   K   | ]1\  }}t          |t                    |                    |          V  2d S rJ   )rK   r  r  )r7   r   ps      r:   r;   z-ConfigurationType.__init__.<locals>.<genexpr>  sV       $
 $
a!_--$
KK$
 $
 $
 $
 $
 $
r<   )r[   r\   r   __dict__rF   parameter_names)r   r   basesattrra   s       r:   r\   zConfigurationType.__init__  sc    ud+++ $ $
 $
<--//$
 $
 $
 
 
r<   )rR   rS   rT   r)  r\   rc   rd   s   @r:   r   r     s>        %%
 
 
 
 
 
 
 
 
r<   r   )z.condarccondarc)z.ymlz.yamlz9
    # delimiter and a Python identifier
    \$(?P<named>z?) |

    # delimiter and a braced identifier
    \${(?P<braced>z8)} |

    # delimiter padded identifier
    %(?P<padded>z)%
    )flagstemplaterL   mappingMapping[str, Any]c               R    i |dfd}t                               ||           S )u9  Expand variables in a string.

    Inspired by `string.Template` and modified to mirror `os.path.expandvars` functionality
    allowing custom variables without mutating `os.environ`.

    Expands POSIX and Windows CMD environment variables as follows:

    - $VARIABLE → value of VARIABLE
    - ${VARIABLE} → value of VARIABLE
    - %VARIABLE% → value of VARIABLE

    Invalid substitutions are left as-is:

    - $MISSING → $MISSING
    - ${MISSING} → ${MISSING}
    - %MISSING% → %MISSING%
    - $$ → $$
    - %% → %%
    - $ → $
    - % → %
    r  r   c                    t                              |                     d          p)|                     d          p|                     d          |                                                     S )Nnamedbracedpadded)rL   r  group)r  r+  s    r:   convertz"custom_expandvars.<locals>.convertQ  sb    KKG$$VH(=(=VXAVAV 
 
 	
r<   )r  r   )_RE_CUSTOM_EXPANDVARSsub)r*  r+  r_   r3  s    `  r:   custom_expandvarsr6  7  sJ    0 $#F#G
 
 
 
 
 
 !$$Wh777r<   c                      e Zd ZddZedd            Zedd
            Zd dZd!dZ	d Z
d"dZd Zd Zd Zd Zed             Zd Zd Zd Zd Zd Zd Zd ZdS )#r/  r6   Nc                    i | _         i | _        t                      | _        t	          t
                    | _         | j        |fi | |                     |           | 	                    |           d S rJ   )
r  r  r   _reset_callbacksr   list_validation_errors_set_search_path_set_env_vars_set_argparse_args)r]   r*  app_nameargparse_argsr_   s        r:   r\   zConfiguration.__init__]  sw      *"-d"3"3k44V4448$$$.....r<   r*  r+  r,  Iterable[Path]c              +    K   | D ]}t          |t                    r|}n4t          |t          fi |}t          |                                          }|                                r!|j        t          v s|j        t          v r|V  |
                                r1d t          |                                          D             E d {V  d S )Nc              3  ^   K   | ](}|                                 r|j        t          v $|V  )d S rJ   )is_filesuffixYAML_EXTENSIONS)r7   subpaths     r:   r;   z4Configuration._expand_search_path.<locals>.<genexpr>|  sO        (( .5^-N-N -N-N-N-N r<   )rK   r   r6  r   
expanduserrD  r   CONDARC_FILENAMESrE  rF  is_dirsortediterdir)r*  r_   searchrY   r*  s        r:   r0  z!Configuration._expand_search_pathi  s      
 " 	 	F &$'' 3,VWGGGGH~~0022||~~ 		...$+2P2P



  #)$,,..#9#9         	 	r<   Iterable[tuple[Path, dict]]c              #     K   |D ]T}	 |t                               |          fV  "# t          $ r&}t                              d||           Y d }~Md }~ww xY wd S )Nz1Ignoring configuration file (%s) due to error:
%s)r   r  rV   logwarning)r   r*  rY   r  s       r:   r2  zConfiguration._load_search_path  s      
   	 	D,JJ4PPPPPPP)   H       	 	s   '
AAAc                    t           | j        |fi |          | _        |                     t	          |                     | j                                       |                                  | S rJ   )r   r0  _search_path_set_raw_datar1  r2  _reset_cache)r]   r*  r_   s      r:   r<  zConfiguration._set_search_path  sl    &'?t'?'V'Vv'V'VWW4 6 6t7H I IJJKKKr<   c                    || _         t          j        }|| j        v r| j        |= |r"t                              |          | j        |<   |                                  | S rJ   )	_app_namer   rj   r  r   rU  )r]   r?  rj   s      r:   r=  zConfiguration._set_env_vars  sd    ! !'T]""f% 	R$3$G$G$Q$QDM&!r<   c                   t          |d          r"t          |                                          }n|sd}n|                                }t          d |D                       x| _        }t
          j        }|| j        v r| j        |= t
                              |          | j        |<   | 	                                 | S )Nr$  r6   c                ,    i | ]\  }}|t           u||S r6   r+   r   s      r:   r   z4Configuration._set_argparse_args.<locals>.<dictcomp>  s#    666eaQr<   )
r   r   rF   r   _argparse_argsr   rj   r  r   rU  )r]   r@  rF   rj   s       r:   r>  z Configuration._set_argparse_args  s     =*-- 
	* ''--//EE 	*EE "''))E.666u666/
 /
 	
m
 &,T]""f% 4 H H W Wfr<   r  Mapping[Hashable, dict]c                b    | j                             |           |                                  | S rJ   )r  updaterU  )r]   r  s     r:   rT  zConfiguration._set_raw_data  s/    X&&&r<   c                <    i | _         | j        D ]} |             | S rJ   )r  r9  r]   callbacks     r:   rU  zConfiguration._reset_cache  s-    - 	 	HHJJJJr<   c                :    | j                             |           d S rJ   )r9  addr_  s     r:   register_reset_callabackz&Configuration.register_reset_callaback  s    !!(+++++r<   c                   i }g }| j         |         }| j        D ]}| j        j        |         }|                    |          \  }}|r|                    |           ||j                            ||          }		 |	                    |j	                  }
|	
                    | |
|j	                  }|r|                    |           |
||j        <   # t          $ r}|                    |           Y d }~d }~ww xY w||fS rJ   )r  r%  ra   r$  r  r   r   r  r%   rj   rO  r  rD   r|   )r]   rj   typed_valuesvalidation_errorsr  rD   r  r  multikey_errorrm  rM  collected_errorsre  s                r:   check_sourcezConfiguration.check_source  sV    v.' 	 	C/4I$-$P$P% %!E>  9!((888 #,>#6#6sE#B#B >"2"9"9%,"G"GK (8'F'Fk5<( ($ ( >)001ABBBB2=UY// - 0 0 0%,,Q////////0 ...s   :C
C<C77C<c                     t          t          j         fd j        D                                 }t	          |                                             d S )Nc              3  N   K   | ]}                     |          d          V   dS )r(   N)ri  )r7   rj   r]   s     r:   r;   z-Configuration.validate_all.<locals>.<genexpr>  sG          17!!&))!,           r<   )r:  r
   r  r  r   validate_configuration)r]   rf  s   ` r:   validate_allzConfiguration.validate_all  st             ;?=       
 

 	&'''##%%%%%r<   c                |    	  | |i | n1# t           $ r$}t          |d          r|j        n|fcY d }~S d }~ww xY wdS )Nr   r6   )rQ   r   r   )funcr   r_   re  s       r:   _collect_validation_errorz'Configuration._collect_validation_error  sp    	>D$!&!!!!! 	> 	> 	> '8 4 4;AHH!=======	>rs    
9499c                     t          j         fd j        D                       }                                 }t	          t          t          j        ||f                               d S )Nc              3  Z   K   | ]%}t                               t          |          V  &d S rJ   )r/  rp  r   )r7   r   r]   s     r:   r;   z7Configuration.validate_configuration.<locals>.<genexpr>  sI       %
 %
 33GT4HH%
 %
 %
 %
 %
 %
r<   )r
   r  r%  post_build_validationr   r   )r]   r   post_errorss   `  r:   rl  z$Configuration.validate_configuration  s}    $ %
 %
 %
 %
,%
 %
 %
 
 
 0022U5./DEEFFGGGGGr<   c                    dS r   r6   r   s    r:   rs  z#Configuration.post_build_validation  s    rr<   c                   i }i }| j         D ] }|                     |          \  ||<   ||<   !t          t          t	          j        |                                                               d |                                D             S )Nc                    i | ]
\  }}|||S r6   r6   r   s      r:   r   z-Configuration.collect_all.<locals>.<dictcomp>  s#    ;;;A;1;;;r<   )r  ri  r   r   r
   r  rc  rF   )r]   re  rf  rj   s       r:   collect_allzConfiguration.collect_all  s    m 	X 	XF>B>O>OPV>W>W;L "3F";";U5./@/G/G/I/IJJKKLLL;;!3!3!5!5;;;;r<   c           	     v  	 || j         vrd|z   }| j        j        |         }|j        }t	          |t
                    sJ |j                            d          	t          	fd|j	        D                       }| 
                                                    	d          }|j        }t          |          t          k    r|g}t          |          s|g}t	          |j        t
                    rt          d |D                       }nt          d |D                       }|j        j                                                            dd          	|||j                            d          |                    dd	                                          d
}t	          |t*                    r
|j        |d<   |S )Nr   c              3  (   K   | ]}|k    |V  d S rJ   r6   )r7   aliasr   s     r:   r;   z3Configuration.describe_parameter.<locals>.<genexpr>(  s(      UU%uPT}}}}}}UUr<   rW   c              3  z   K   | ]6}|j         j                                                            d d          V  7dS )r  rW   N)ra   rR   r   r   r7   _ets     r:   r;   z3Configuration.describe_parameter.<locals>.<genexpr>2  sT       " "LO&,,..66{BGG" " " " " "r<   c              3  $   K   | ]}|j         V  d S rJ   )rR   r}  s     r:   r;   z3Configuration.describe_parameter.<locals>.<genexpr>6  s$      !=!=3#,!=!=!=!=!=!=r<   r  z<<describe>>r4    )r  r   r  element_typesdefault_valuedescriptionr   )r%  ra   r$  r   rK   r  r   lstripr   r  get_descriptionsr  r]  r	   r)   rR   r   r   r  r%   r   r  r   )
r]   rh   parameter_loaderr  r  r  etr  detailsr   s
            @r:   describe_parameterz Configuration.describe_parameter  s   !555 >1N>2>B$)	)Y/////  $++C00UUUU+;+CUUUUU++--11$;;$88xB"~~ 	Bi-y99 	>! " "SU" " "  MM "!=!="!=!=!===M (1:@@BBJJR  *&.55nEE&..tS99??AA	
 	
 i!233 	E*3*DG&'r<   c                X    t          t          d | j        D                                 S )Nc              3  @   K   | ]}|                     d           V  dS )r   N)r  )r7   r   s     r:   r;   z0Configuration.list_parameters.<locals>.<genexpr>G  s.      NNDKK,,NNNNNNr<   )r   rK  r%  r   s    r:   list_parameterszConfiguration.list_parametersF  s*    VNN9MNNNNNOOOr<   c                    || j         vrd|z   }| j        j        |         }|j        }t	          |t
                    sJ |                    |||          S )Nr   )r%  ra   r$  r   rK   r  r%   )r]   rh   rE   rj   r  r  s         r:   typify_parameterzConfiguration.typify_parameterI  s`    !555 >1N>2>B$)	)Y/////>>>r<   c                    t                      rJ   r   r   s    r:   r  zConfiguration.get_descriptionsS  s    !###r<   )r6   NN)r*  r+  r,  rA  )r*  rA  r,  rN  )r*  r+  rJ   )r  r[  )rR   rS   rT   r\   r  r0  r   r2  r<  r=  r>  rT  rU  rc  ri  rm  rp  rl  rs  rx  r  r  r  r  r6   r<   r:   r/  r/  \  s{       
/ 
/ 
/ 
/    \0    [        :   
  , , ,&/ &/ &/P& & &   \H H H  < < <& & &PP P P? ? ?$ $ $ $ $r<   r/  )r2   )r*  r+  r,  r-  )r*  rL   r+  r,  r,  rL   )xr)  
__future__r   r  r   abcr   r   collectionsr   collections.abcr   enumr   r	   	itertoolsr
   loggingr   osr   os.pathr   pathlibr   rer   r   r   r   r   r   typingr   deprecationsr   r   r   r   r   boltons.setutilsr   ImportError_vendor.boltons.setutilsrW   r   r   _vendor.frozendictr   auxlib.collectionr   r    r!   r"   auxlib.exceptionsr#   auxlib.type_coercionr$   r%   r&   common.iteratorsr'   compatr)   r*   	constantsr,   	serializer-   ruamel.yaml.commentsr.   r/   ruamel.yaml.readerr0   ruamel.yaml.scannerr1   ruamel_yaml.commentsruamel_yaml.readerruamel_yaml.scannerrR   rP  r   r?   rH   rO   rQ   rV   rf   rm   rt   r|   r   r   r   r   r   r   r   r   r4  r6  r   r  r  r  r"  r  r  r  r  r  r  r   r   rI  rF  	idpatternr4  r6  r/  r6   r<   r:   <module>r     s	    # " " " " "  



 ' ' ' ' ' ' ' ' # # # # # # # # # # # #                                       2 2 2 2 2 2 2 2 2 2 2 2                   % % % % % % 98888888888886+++++++ 6 6 6555555556 + * * * * * * * + + + + + + E E E E E E E E E E E E : : : : : : S S S S S S S S S S % % % % % % / / / / / / / /       + + + + + +
????????......0000000 
 
 

CCCCCCCC2222224444444 
 
 
kN
 
 	

 	54	
 iJLL	0 0 0 0V V V V  	 	 	 	 	 	 	 	J J J J J/ J J J( ( ( ( (( ( ( (
? 
? 
? 
? 
? 
? 
? 
?K K K K K K K K*K K K K KO K K K2 2 2 2 2?,> 2 2 2
+ + +    D   2    W    @)L )L )L )L )Ll )L )L )LX
 
 
 
 
< 
 
 
:vL vL vL vL vL| vL vL vLr2/ 2/ 2/ 2/ 2/| 2/ 2/ 2/j FFA A A A
V> V> V> V> V> V> V> V> V>r&+ &+ &+ &+ &+ &+ &+ &+RH
 H
 H
 H
 H
 H
 H
 H
V^
 ^
 ^
 ^
 ^
o ^
 ^
 ^
BG
 G
 G
 G
 G
O G
 G
 G
TT T T T T T T TJD JD JD JD JD' JD JD JD JDZ
 
 
 
 
 
 
 
<2
 2
 2
 2
 2
9 2
 2
 2
j5
 5
 5
 5
 5
	 5
 5
 5
pB
 B
 B
 B
 B
i B
 B
 B
J^ ^ ^ ^ ^ ^ ^ ^B
 
 
 
 
 
 
 
 , #	#	 	
 &	 	 #	 	 	 w
     13"8 "8 "8 "8 "8Jx$ x$ x$ x$ x$/ x$ x$ x$ x$ x$ x$s<   8A? ?BBC* *D0DDDDD