
    $TXg              	      R   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 ddlmZmZmZ ddl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-m.Z. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mAZA 	 ddlBmCZCmBZB dd lBmDZE dd!lBmFZG e eE       vr
 eGed"        [E[Ge"rdd%l
mKZKmLZLmMZM dd&lmNZN dd'l!mOZO  eeP      ZQ eB       ZRdld(ZSdld)ZTd* ZU G d+ d,e-      ZV G d- d.eV      ZW G d/ d0eV      ZX G d1 d2eX      ZY G d3 d4eX      ZZ G d5 d6eX      Z[ G d7 d8e.eV      Z\d9 Z] G d: d;e      Z^ G d< d=e>      Z_ G d? d@e_      Z` G dA dBe_      Za G dC dDe_      Zb G dE dFe_      Zc G dG dHe>      Zd G dI dJed      Ze G dK dLed      Zf G dM dNed      Zg G dO dPed      Zh G dQ dR      Zi G dS dTe>      Zj G dU dVej      Zk G dW dXej      Zl G dY dZej      Zm G d[ d\ej      Zn G d] d^      Zo G d_ d`ep      ZqdaZrdbZs edce j                   dde j                   dee j                   dfeez  g      Zui f	 	 	 	 	 dmdhZv G di djeq>      ZwdndkZxy# eH$ r dd#lImBZB dd$l/mJZC Y w xY w)oz
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wraps)chain)	getLogger)environ)
expandvars)Path)
IGNORECASEVERBOSEcompile)Template)TYPE_CHECKING)
IndexedSet)CommentedMapCommentedSeq)ReaderError)ScannerError   )
CondaErrorCondaMultiError)AttrDictfirstlast)ThisShouldNeverHappenError)TypeCoercionErrortypifytypify_data_structure)unique   )
isiterableprimitive_types)NULL)yaml_round_trip_load)
deepfreeze
frozendict)getFreezeConversionMap)registerc                    | S N xs    :lib/python3.12/site-packages/conda/common/configuration.py<lambda>r5   8   s    !    )r,   )make_immutable)HashableIterableSequence)Match)Anyc                    t        |       s| g} 	 dj                  fd| D              S # t        $ r t        | g      cY S w xY w)N
c              3  ,   K   | ]  } d |   yw)z- Nr1   ).0itempaddings     r4   	<genexpr>zpretty_list.<locals>.<genexpr>N   s     C($G9Btf-(s   )r'   join	TypeErrorpretty_list)iterablerB   s    `r4   rF   rF   J   sJ    h:0yyC(CCC 0H:w//0s   + AAc                T    dj                  fd| j                         D              S )Nr>   c              3  6   K   | ]  \  }} | d |   yw): Nr1   )r@   keyvaluerB   s      r4   rC   zpretty_map.<locals>.<genexpr>T   s'     UBTJCyRw/BTs   )rD   items)
dictionaryrB   s    `r4   
pretty_maprO   S   s!    99U*BRBRBTUUUr6   c                H    t        | t        t        f      rt        |       S | S r0   )
isinstancestrbytesr   )
unexpandeds    r4   expand_environment_variablesrU   W   s!    *sEl+*%%r6   c                      e Zd Zy)ConfigurationErrorN)__name__
__module____qualname__r1   r6   r4   rW   rW   ^   s    r6   rW   c                        e Zd Zd fd	Z xZS )ConfigurationLoadErrorc                4    d}t        |   ||z   fd|i| y )Nz4Unable to load configuration file.
  path: %(path)s
pathsuper__init__)selfr^   message_additionkwargsmessage	__class__s        r4   ra   zConfigurationLoadError.__init__c   s%    J#33I$I&Ir6   ) rX   rY   rZ   ra   __classcell__rf   s   @r4   r\   r\   b   s    J Jr6   r\   c                        e Zd Zd fd	Z xZS )ValidationErrorc                P    || _         || _        || _        t        |   |fi | y r0   )parameter_nameparameter_valuesourcer`   ra   )rb   rn   ro   rp   msgrd   rf   s         r4   ra   zValidationError.__init__i   s,    ,.''r6   r0   rh   rj   s   @r4   rl   rl   h   s    ( (r6   rl   c                       e Zd Z fdZ xZS )MultipleKeysErrorc                r    || _         || _        d| dt        |       d| d}t        |   |d ||       y )NzMultiple aliased keys in file z:
z 
Must declare only one. Prefer ''rq   )rp   keysrF   r`   ra   )rb   rp   rw   preferred_keyrq   rf   s        r4   ra   zMultipleKeysError.__init__q   sS    	,VHC4 ! "..;_A? 	
 	f#>r6   rh   rj   s   @r4   rs   rs   p   s    ? ?r6   rs   c                  "     e Zd Z	 d fd	Z xZS )InvalidTypeErrorc                    || _         || _        |d| d|d| d| dt        |       
}t        |   ||||       y )N
Parameter  =  declared in z
 has type z.
Valid types:
rv   )
wrong_typevalid_typesrF   r`   ra   )rb   rn   ro   rp   r   r   rq   rf   s          r4   ra   zInvalidTypeError.__init__}   sk     %&;^,C/B-PVxWablam n!!,[!9 :<  	&cJr6   r0   rh   rj   s   @r4   rz   rz   |   s    TX
K 
Kr6   rz   c                       e Zd Z fdZ xZS )CustomValidationErrorc                D    t         |   |||d| d|d| d|        y )Nr|   r}   r~   z is invalid.
rv   r_   )rb   rn   ro   rp   custom_messagerf   s        r4   ra   zCustomValidationError.__init__   s@    ^,C/B-(.(8: 	 	
r6   rh   rj   s   @r4   r   r      s    	
 	
r6   r   c                       e Zd Z fdZ xZS )MultiValidationErrorc                ,    t        |   |g|i | y r0   r_   )rb   errorsargsrd   rf   s       r4   ra   zMultiValidationError.__init__   s    1$1&1r6   rh   rj   s   @r4   r   r      s    2 2r6   r   c                D    | syt        |       dk(  r| d   t        |       )NTr&   r   )lenr   )r   s    r4   raise_errorsr      s(    	V	Qi"6**r6   c                  N    e Zd ZdZdZdZd Zed        Zed        Z	ed        Z
y)	ParameterFlagfinaltopbottomc                    | j                    S r0   rL   rb   s    r4   __str__zParameterFlag.__str__   s    **r6   c                    | |   S r0   r1   )clsnames     r4   	from_namezParameterFlag.from_name   s    4yr6   c                     | |      S r0   r1   )r   rL   s     r4   
from_valuezParameterFlag.from_value   s    5zr6   c                r    	 |j                  d      }| j                  |      S # t        t        f$ r Y y w xY w)Nz!#)stripr   
ValueErrorAttributeError)r   strings     r4   from_stringzParameterFlag.from_string   s;    	\\$'F>>&))N+ 		s   !$ 66N)rX   rY   rZ   r   r   r   r   classmethodr   r   r   r1   r6   r4   r   r      sR    E
CF      r6   r   c                  X    e Zd Zd Zd Zed        Zed        Zed        Ze	d        Z
y)RawParameterc                z    || _         || _        	 |j                  d      | _        y # t        $ r
 || _        Y y w xY w)Nzutf-8)rp   rK   decode
_raw_valuer   )rb   rp   rK   	raw_values       r4   ra   zRawParameter.__init__   s=    	('..w7DO 	('DO	(s   ' ::c                *    t        t        |             S r0   )rR   varsr   s    r4   __repr__zRawParameter.__repr__   s    4:r6   c                    t               r0   NotImplementedErrorrb   parameter_objs     r4   rL   zRawParameter.value       !##r6   c                    t               r0   r   r   s    r4   keyflagzRawParameter.keyflag   r   r6   c                    t               r0   r   r   s     r4   
valueflagszRawParameter.valueflags   r   r6   c           
     T    |r|D ci c]  }| | ||||          c}S t         S c c}w r0   )	EMPTY_MAPr   rp   from_maprK   s       r4   make_raw_parametersz RawParameter.make_raw_parameters   s8    DLMHSCVS(3-88HMM Ns   %N)rX   rY   rZ   ra   r   r   rL   r   r   r   r   r1   r6   r4   r   r      s\    ( $ $ $ $ $ $  r6   r   )	metaclassc                  N     e Zd ZdZd Zd Zd Zed        Ze	 fd       Z
 xZS )EnvRawParameterenvvarsc                    t        |d      r\t         j                  t              sJ t	        |d      }t         fdd  j                  j                  |      D        D              S  j                  d   j                         S )Nstring_delimiterc              3  l   K   | ]+  }|r't        t         j                  j                  |       - y wr0   )r   rp   rK   )r@   vrb   s     r4   rC   z(EnvRawParameter.value.<locals>.<genexpr>   s/      WA   6 6!DWs   14c              3  <   K   | ]  }|j                           y wr0   )r   )r@   vvs     r4   rC   z(EnvRawParameter.value.<locals>.<genexpr>   s     W/V"((*/V   r   )	hasattrrQ   r   rR   getattrtuplesplit'_EnvRawParameter__important_split_valuer   rb   r   r   s   `  r4   rL   zEnvRawParameter.value   s}     ="45doos333&}6HI Wt/D/DEU/VW   //288::r6   c                V    t        | j                        dk\  rt        j                  S d S Nr   )r   r   r   r   r   s    r4   r   zEnvRawParameter.keyflag   s&    &)$*F*F&G1&L}""VRVVr6   c                    t        |d      r7t        |d      }t        d | j                  j	                  |      D              S | j
                  d   j                         S )Nr   c              3      K   | ]  }d   yw)rg   Nr1   )r@   _s     r4   rC   z-EnvRawParameter.valueflags.<locals>.<genexpr>   s     M%L%L   r   )r   r   r   r   r   r   r   r   s      r4   r   zEnvRawParameter.valueflags   sV    ="45&}6HIMT__%:%:;K%LMMM//288::r6   c                8    | j                   j                  d      S )Nz
!important)r   r   r   s    r4   __important_split_valuez'EnvRawParameter.__important_split_value   s    $$\22r6   c           	         |j                          d}t        j                         D ci c]8  \  }}|j                  |      r"|j	                  |dd      j                         |: }}}t        |   t        j                  |      S c c}}w )Nr   rg   r&   )
upperr   rM   
startswithreplacelowerr`   r   r   rp   )r   appnamekeystartkr   raw_envrf   s         r4   r   z#EnvRawParameter.make_raw_parameters   s    mmo&a(  
'1||H% IIhA&,,.1' 	 

 w*?+A+A7KK
s   =B
)rX   rY   rZ   rp   rL   r   r   propertyr   r   r   ri   rj   s   @r4   r   r      sB    F;W; 3 3 L Lr6   r   c                  >     e Zd ZdZd Zd Zd Ze fd       Z xZ	S )ArgParseRawParametercmd_linec           	     0   t        | j                        rmg }t        t        | j                              D ]?  }|j	                  t        | j                  | j                  | j                  |                A t        |      S t        | j                        S r0   )
r'   r   ranger   appendr   rp   rK   r   r+   )rb   r   children_valuesis       r4   rL   zArgParseRawParameter.value  su     doo& O3t/0&&(dhhPQ@RS 1 ))doo..r6   c                     y r0   r1   r   s    r4   r   zArgParseRawParameter.keyflag      r6   c                *    t        |t              rd S dS Nr1   )rQ   PrimitiveLoadedParameterr   s     r4   r   zArgParseRawParameter.valueflags  s    !-1IJtRPRRr6   c                @    t         |   t        j                  |      S r0   )r`   r   r   rp   )r   args_from_argparserf   s     r4   r   z(ArgParseRawParameter.make_raw_parameters   s!    w* '');
 	
r6   )
rX   rY   rZ   rp   rL   r   r   r   r   ri   rj   s   @r4   r   r   
  s,    F/S 
 
r6   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           
     R   || _         t        
| 	  |||       t        | j                  t
              r| j                  | j                        }t        d |D              | _        g }t        t        | j                              D ]C  }|j                  t        | j                  | j                  | j                  |   ||                E t        |      | _        y t        | j                  t               r| j#                  | j                        }|j%                         D 	ci c]  \  }}	|	|t&        j)                  |	       c}	}| _        i }| j                  j%                         D ]-  \  }}	t        | j                  | j                  |	||         ||<   / t+        |      | _        y t        | j                  t,              rd | _        | j                  | _        y t/        t1        | j                        | j                  t2        j4                         t7               c c}	}w )Nc              3  F   K   | ]  }t         j                  |        y wr0   )r   r   )r@   ss     r4   rC   z,YamlRawParameter.__init__.<locals>.<genexpr>0  s      &6D))!,n   !)file)_key_commentr`   ra   rQ   r   r   _get_yaml_list_commentsr   _value_flagsr   r   r   r   rp   rK   _valuer   _get_yaml_map_commentsrM   r   r   r,   r(   printtypesysstderrr!   )rb   rp   rK   r   key_commentvalue_commentsr   r   r   r   rf   s             r4   ra   zYamlRawParameter.__init__*  s   'i0doo|4!99$//JN % &6D& !D !O3t/0&&$TXXtq/A>RSCT 1  0DK6!88IN +002!2DAq= =,,Q//2!D
 !O--/1%5KK1nQ.?&" 0 %_5DK9 $D//DK$t'szzJ,..!!s   %"H#c                    | j                   S r0   r   r   s     r4   rL   zYamlRawParameter.valueO      {{r6   c                @    t         j                  | j                        S r0   )r   r   r   r   s    r4   r   zYamlRawParameter.keyflagR  s    (():):;;r6   c                    | j                   S r0   )r   r   s     r4   r   zYamlRawParameter.valueflagsU  s       r6   c                    	 | j                   j                  |   d   j                  j                         S # t        t
        f$ r Y y w xY wr   carM   rL   r   r   KeyError)commented_dictrK   s     r4   _get_yaml_key_commentz&YamlRawParameter._get_yaml_key_commentX  sI    	!$$**3/288>>@@) 		s   36 AAc                   g }t        t        |            D ]:  }	 |j                  | j                  |j                  j
                  |                < t        |      S # t        t        t        t        f$ r |j                  d        Y tw xY wr0   )r   r   r   _get_yaml_list_comment_itemr  rM   r   
IndexErrorr  rE   r   )r   rL   list_commentsr   s       r4   r   z(YamlRawParameter._get_yaml_list_comments_  s}    
 s5z"A+$$S%D%DUXX^^TUEV%WX #
 ]## #J)D +$$T*+s   7A*BBc                    | d   r!| d   j                   j                         xs d S | d   d   j                   j                         xs d S )Nr   r&   )rL   r   )rA   s    r4   r  z,YamlRawParameter._get_yaml_list_comment_iteml  sI     77==&&(0D071:##))+3t3r6   c                    i }| D ]>  }	 | j                   j                  |   d   j                  j                         xs d ||<   @ |S # t        t
        f$ r d ||<   Y Yw xY wr   r  )rL   map_commentsrK   s      r4   r   z'YamlRawParameter._get_yaml_map_commentsu  sn    C)$)HHNN3$7$:$@$@$F$F$H$PDS! 
  #H- )$(S!)s   ;AAAc                v    |r-|D ci c]!  }| | ||||   | j                  ||            # c}S t        S c c}w r0   )r	  r   r   s       r4   r   z$YamlRawParameter.make_raw_parameters  s_    
 $	 $C SC#0I0I(TW0X  $	  s   &6c                X   t        |      5 }	 t        |      }| j                  ||      xs t        cd d d        S # t        $ r4}|j                  }t	        |d|j
                  |j                        d }~wt        $ r}t	        |d|j                        d }~ww xY w# 1 sw Y   y xY w)Nz:  reason: invalid yaml at line %(line)s, column %(column)s)linecolumnz/  reason: invalid yaml at position %(position)s)position)openr*   r   problem_markr\   r  r  r   r  r   r   )r   filepathfhyaml_objerrmarks         r4   make_raw_parameters_from_filez.YamlRawParameter.make_raw_parameters_from_file  s    (^r/3 **8X>K)# ^   '',P;;	   ,E \\  ^s7   B <B 	B/A44B BBB  B))rX   rY   rZ   ra   rL   r   r   staticmethodr	  r   r   r  r   r   r  ri   rj   s   @r4   r   r   '  s    #/J<!   
$ 
$ 4 4     L Lr6   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              rYi }| j                  j                         D ])  \  }}t        | j                  | j                  |      ||<   + t        |      | _
        y t        | j                        rsg }t        t        | j                              D ]?  }|j                  t        | j                  | j                  | j                  |                A t        |      | _
        y t        | j                  t               rx| j                  | _
        t#        | j                        j                         D ]@  \  }}	| j                  j%                  |t        | j                  | j                  |	             B y t        | j                  t&              r| j                  | _
        y t        | j                  t(              r| j                  | _
        y t+               r0   )r`   ra   rQ   r   r   rM   r   rp   rK   r,   r   r'   r   r   r   r   ConfigurationObjectr   __setattr__r   r(   r!   )rb   rp   rK   r   r   r   r   r   	attr_name
attr_valuerf   s             r4   ra   z!DefaultValueRawParameter.__init__  so   i0doow/ O--/1%=dkk488UV%W" 0$_5DK( O3t/0&&,T[[$((DOOTUDVW 1  0DK)<=//DK)-doo)>)D)D)F%	:'',T[[$((JO *G
 .//DK9//DK,..r6   c                    | j                   S r0   r   r   s     r4   rL   zDefaultValueRawParameter.value  r  r6   c                     y r0   r1   r   s    r4   r   z DefaultValueRawParameter.keyflag  r   r6   c                ,   t        | j                  t              r
t               S t	        | j                        ryt        | j                  t
              ry t        | j                  t              ry t        | j                  t              ry t               r   )	rQ   r   r   r,   r'   r"  r   r(   r!   r   s     r4   r   z#DefaultValueRawParameter.valueflags  sd    doow/<()<=.9,..r6   )	rX   rY   rZ   __doc__ra   rL   r   r   ri   rj   s   @r4   r   r     s    P/:/r6   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y)LoadedParameterNc                J    || _         || _        || _        || _        || _        y)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)_namerL   key_flagvalue_flags_validation)rb   r   rL   r.  r/  
validations         r4   ra   zLoadedParameter.__init__  s)     

 &%r6   c                b    t        |      t        |       u r| j                  |j                  k(  S yNFr   rL   rb   others     r4   __eq__zLoadedParameter.__eq__  (    ;$t*$::,,r6   c                ,    t        | j                        S r0   hashrL   r   s    r4   __hash__zLoadedParameter.__hash__      DJJr6   c           
        g }t        || j                        sG|j                  t        | j                  ||t        | j                        | j                               |S | j                  t| j                  |      }|du r(|j                  t        | j                  ||             |S t        |t              r'|j                  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.
        F)rQ   _typer   rz   r-  r   rL   r0  rl   rR   r   )rb   instancetyped_valuerp   r   results         r4   collect_errorszLoadedParameter.collect_errors  s     +tzz2MM JJVT$**5Etzz  )%%k2Fodjj+vNO
 	 FC()$**k66R r6   c                   t        | j                  t              r; t        | j                        d | j                  j	                         D              }nt        | j                        r- t        | j                        d | j                  D              }nt        | j                  t              rrt        | j                        j	                         D ]@  \  }}t        |t              s| j                  j                  ||j                                B | j                  S t        | j                        }|| _        | S )zw
        Recursively expands any environment values in the Loaded Parameter.

        Returns: LoadedParameter
        c              3  F   K   | ]  \  }}||j                         f  y wr0   expand)r@   r   r   s      r4   rC   z)LoadedParameter.expand.<locals>.<genexpr>  s!     (XEWTQ!QXXZEWr   c              3  <   K   | ]  }|j                           y wr0   rF  )r@   r   s     r4   rC   z)LoadedParameter.expand.<locals>.<genexpr>  s     (HZZr   )rQ   rL   r   r   rM   r'   r"  r   r+  r#  rG  rU   )rb   	new_valuer$  r%  s       r4   rG  zLoadedParameter.expand  s     djj'*(TZZ((XTZZEUEUEW(XXI

#(TZZ((HTZZ(HHI

$78)-djj)9)?)?)A%	:j/:JJ**9j6G6G6IJ *B ::4TZZ@I
r6   c                    t               )z
        Recursively merges matches into one LoadedParameter.

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

        Returns: LoadedParameter
        r   )rb   matchess     r4   mergezLoadedParameter.merge&  s     "##r6   c                   | j                   }	 t        j                  | j                  ||      S # t        $ r}t        |      }t        |t              rRdj                  t        dj                  |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 rJ   N)_element_typer+  _typify_data_structurerL   r"   rR   
issubclassr   rD   mapformat__members__valuesr-  r   )rb   rp   element_typeerq   choicess         r4   r#   zLoadedParameter.typify2  s     ))	J"99

FL  ! 	Ja&C,-))|'?'?'F'F'HI -djj\G9EE'

AGGVSII	Js    / 	CBCCc                   t        | t              r( t        |       fd| j                         D              S t	        |       r t        |       fd| D              S t        | t
              rUt        |       j                         D ]7  \  }}t        |t              s| j                  ||j                               9 | S t        | t              r(t        |t              rt        |t              r ||       S t        | |      S )Nc              3  J   K   | ]  \  }}||j                        f  y wr0   r#   )r@   r   r   rp   s      r4   rC   z9LoadedParameter._typify_data_structure.<locals>.<genexpr>L  s$     OA188F#34s    #c              3  @   K   | ]  }|j                          y wr0   r]  )r@   r   rp   s     r4   rC   z9LoadedParameter._typify_data_structure.<locals>.<genexpr>N  s     ?Aqxx/s   )rQ   r   r   rM   r'   r"  r   r+  r#  r#   rR   rS  )rL   rp   	type_hintr$  r%  s    `   r4   rR  z&LoadedParameter._typify_data_structureI  s    eW%4;OOOO4;????23)-e):):)<%	:j/:%%i1B1B61JK *= Luc"9d+9c*
 U##%++r6   c                :    | j                   t        j                  u S r0   )r.  r   r   )loaded_parameters    r4   _match_key_is_importantz'LoadedParameter._match_key_is_important`  s    ((M,?,???r6   c                L    t        t        |       d d       }|| S | d |dz    S )Nc                2    t         j                  | d         S )Nr&   )r+  rb  r2   s    r4   r5   z:LoadedParameter._first_important_matches.<locals>.<lambda>h  s    o==adCr6   c                    | d   S )Nr   r1   r2   s    r4   r5   z:LoadedParameter._first_important_matches.<locals>.<lambda>i  s    AaDr6   )applyr&   )r   	enumerate)rK  idxs     r4   _first_important_matchesz(LoadedParameter._first_important_matchesd  s6    gC 

 +w=79S1W+==r6   r0   
<<merged>>)rX   rY   rZ   r?  rQ  ra   r7  r<  rC  rG  r   rL  r#   r  rR  rb  ri  r1   r6   r4   r+  r+    s    E M&$
 4, 	$ 	$J. , ,, @ @ > >r6   r+  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.
    c                H    || _         || _        t        |   |||||       y)z
        Args:
            element_type (type or tuple[type]): Type-validation of parameter's value.
            value (primitive value): primitive python value.
        N)r?  rQ  r`   ra   )rb   r   rX  rL   r.  r/  r1  rf   s          r4   ra   z!PrimitiveLoadedParameter.__init__v  s)     "
)uhZHr6   c                b    t        |      t        |       u r| j                  |j                  k(  S yr3  r4  r5  s     r4   r7  zPrimitiveLoadedParameter.__eq__  r8  r6   c                ,    t        | j                        S r0   r:  r   s    r4   r<  z!PrimitiveLoadedParameter.__hash__  r=  r6   c                |    t        |t        j                  d       }||S t        |d d       }||S t	               )N)defaultc                
    | d uS r0   r1   r2   s    r4   r5   z0PrimitiveLoadedParameter.merge.<locals>.<lambda>  s    Qd]r6   )r   r+  rb  r    r!   )rb   rK  important_match
last_matchs       r4   rL  zPrimitiveLoadedParameter.merge  sK    _<<d
 &""'#:DI
!(**r6   r0   )	rX   rY   rZ   r)  ra   r7  r<  rL  ri   rj   s   @r4   r   r   n  s$     LP
I
 
+r6   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.c                :    || _         t        | 	  |||||       y)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rQ  r`   ra   rb   r   rL   rX  r.  r/  r1  rf   s          r4   ra   zMapLoadedParameter.__init__  "     *uhZHr6   c                    t         |   ||| j                        }t        | j                  t              rG| j                  j                         D ]*  \  }}|j                  |j                  |||   |             , |S r0   )r`   rC  rL   rQ   r   rM   extendrb   r@  rA  rp   r   rK   rL   rf   s          r4   rC  z!MapLoadedParameter.collect_errors  sj    '+tzzJ djj'*"jj..0
Ue228[=MvVW 1r6   c           	        t         j                  |      }|D ]{  }t        |j                  t              rt        | j                  |j                  |j                  |j                  j                  j                  | j                  j                         t        |      D ci c]S  }|j                  j                         D ]4  \  }}|j                  j                  |      t        j                   k(  r||6 U }}}}i }|D ]E  }|j                  j                         D ]&  \  }}|j#                  |g       j%                  |       ( G |j                         D ci c]  \  }}||d   j'                  |       }}}t)        i ||      }	t+        | j,                  |	| j.                  | j0                  | j                  | j2                        S c c}}}w c c}}w Nr   r1  )r+  ri  rQ   rL   r   rz   r   rp   rf   rX   r?  reversedrM   r/  getr   r   
setdefaultr   rL  r,   rv  r-  rQ  r.  r0  
rb   
parameters	parameterrK   rL   	final_mapgrouped_maprW  
merged_mapmerged_values
             r4   rL  zMapLoadedParameter.merge  s    %==jI
 $Iioow7&IIOO$$OO--66JJ''  $ &j1
1	'oo335
U$$((-1D1DD J5 1 	 
 #I'oo335
U&&sB/66u= 6 $ =H<M<M<O
<O[S&C((<O 	 

 ""=Z"=9"=> "JJMM''
 	
+

s   %AG Gr0   rj  )r  zSequence[MapLoadedParameter]returnrv  )
rX   rY   rZ   r)  r,   r?  ra   rC  rL  ri   rj   s   @r4   rv  rv    s"    PE LP
I.
r6   rv  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.c                :    || _         t        | 	  |||||       y)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.
        Nrx  ry  s          r4   ra   z SequenceLoadedParameter.__init__  rz  r6   c                    t         |   ||| j                        }t        | j                        D ]*  \  }}|j	                  |j                  |||   |             , |S r0   )r`   rC  rL   rg  r|  )rb   r@  rA  rp   r   rh  elementrf   s          r4   rC  z&SequenceLoadedParameter.collect_errors  sV    '+tzzJ%djj1LCMM'00;s;KVTU 2r6   c                :   t        d t        j                  |      D              }|D ]`  \  }}t        |t               rt	        | j
                  ||j                  |j                  j                  | j                  j                         d t        j                  fd|D              }t        t        j                  fdt        |      D                    }t        j                  d t        |      D              }t        t        g ||            }t        t        g t        |      t        |                  }	t        t        |	            }
t        | j                  |
| j                   | j"                  | j$                  | j&                        S )Nc              3  8   K   | ]  }||j                   f  y wr0   r   )r@   matchs     r4   rC   z0SequenceLoadedParameter.merge.<locals>.<genexpr>  s!      ,
J EKK Js   c                p    | r2t        fdt        | j                  | j                        D              S dS )Nc              3  0   K   | ]  \  }}|u r|  y wr0   r1   )r@   r  flagmarkers      r4   rC   zJSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>  s$      &I
dv~ &Is   r1   )r   ziprL   r/  )r  r  s    `r4   get_marked_linesz7SequenceLoadedParameter.merge.<locals>.get_marked_lines  s?       &)%++u7H7H&I  r6   c              3  R   K   | ]  \  }} |t         j                           y wr0   )r   r   )r@   mr   r  s      r4   rC   z0SequenceLoadedParameter.merge.<locals>.<genexpr>  s*      (
31 Q 1 123   $'c              3  R   K   | ]  \  }} |t         j                           y wr0   )r   r   )r@   r  r   r  s      r4   rC   z0SequenceLoadedParameter.merge.<locals>.<genexpr>   s*        EHE1 !(<(<= Er  c              3  &   K   | ]	  \  }}|  y wr0   r1   )r@   r   r   s      r4   rC   z0SequenceLoadedParameter.merge.<locals>.<genexpr>(  s      (
?$!QA?s   r  )r   r+  ri  rQ   rz   r   rp   rf   rX   r?  r   from_iterabler  r%   r  r-  rQ  r.  r/  r0  )rb   rK  relevant_matches_and_valuesr  rL   	top_linesbottom_lines	all_linestop_dedupedbottom_dedupedmerged_valuesr  s              @r4   rL  zSequenceLoadedParameter.merge  s    ', ,
(AA'J,
 '
# 8LE5eU+&IILLOO,,JJ''  8		 '' (
3(
 
	    ()D E  
 '' (
"#>?(
 
	
 F#;Y#;#;<= DXl+Dh{.CDE
 h~67&JJMM''
 	
r6   r0   rj  )
rX   rY   rZ   r)  r   r?  ra   rC  rL  ri   rj   s   @r4   r  r    s#    UE LP
IF
r6   r  c                  F     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.c                :    || _         t        | 	  |||||       y)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.
        Nrx  ry  s          r4   ra   zObjectLoadedParameter.__init__H  rz  r6   c                4   t         |   ||| j                        }t        | j                  t              rat        | j                        j                         D ];  \  }}t        |t              s|j                  |j                  |||   |             = |S r0   )	r`   rC  rL   rQ   r"  r   rM   r+  r|  r}  s          r4   rC  z$ObjectLoadedParameter.collect_errorsT  s    '+tzzJ djj"56"4::.446
Ue_5MM,,X{37GP 7
 r6   c           
        t         j                  |      }t        |      D ci c]l  }t        |j                        j                         D ]D  \  }}t        |t               r/|j                  j                  |      t        j                  k(  r||F n }}}}i }|D ]N  }t        |j                        j                         D ]&  \  }}|j                  |g       j                  |       ( P |j                         D ci c]  \  }}||d   j                  |       }}}t        j                  | j                         }	i ||j                         D ]  \  }}|	j#                  ||        t%        | j&                  |	| j                   | j(                  | j                  | j*                        S c c}}}w c c}}w r  )r+  ri  r  r   rL   rM   rQ   r/  r  r   r   r  r   rL  copydeepcopyrQ  r#  r  r-  r.  r0  r  s
             r4   rL  zObjectLoadedParameter.merge`  s   
 %==jI
 &j1
1	"9??399;
U5/2))--c2m6I6II J; 1 	 
 #I"9??399;
U&&sB/66u= < $ =H<M<M<O
<O[S&C((<O 	 

 }}T%7%785Z595;;=JC$$S%0 > %JJMM''
 	
5
 
s   A1F4F;r0   rj  )r  zSequence[ObjectLoadedParameter]r  r  )
rX   rY   rZ   r)  objectr?  ra   rC  rL  ri   rj   s   @r4   r  r  C  s2    VE LP
I
*
9*
	*
r6   r  c                      e Zd ZdZd Zy)r"  zIDummy class to mark whether a Python object has config parameters within.c                V    i }t        |       j                         D ]
  \  }}|||<    |S )zF
        Return a serializable object with defaults filled in
        )r   rM   )rb   serializableattrrL   s       r4   to_jsonzConfigurationObject.to_json  s6     :++-KD%!&L . r6   N)rX   rY   rZ   r)  r  r1   r6   r4   r"  r"    s
    S	r6   r"  c                  H    e Zd ZdZdZddZed        Zd Ze	d        Z
d Zy)	ParameterNc                     || _         || _        y)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)_defaultr0  )rb   rq  r1  s      r4   ra   zParameter.__init__  s      %r6   c                T    t        dd| j                        }| j                  d|      S )zGReturns a DefaultValueRawParameter that wraps the actual default value.rq  )r   r  load)rb   wrapped_defaults     r4   rq  zParameter.default  s'     39iWyyO44r6   c                    g }g }|j                   j                         D ]F  \  }}t        j                  |||      \  }}	||j	                  |       |	s6|j	                  |	       H ||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_datarM   ParameterLoader!raw_parameters_from_single_sourcer   )
rb   r   namesr@  rK  multikey_exceptionsr  raw_parametersr  errors
             r4   get_all_matcheszParameter.get_all_matches  s|      (0(9(9(?(?(A$Hn*LLe^LE5  u%#**51 )B +++r6   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   rb   r   r  s      r4   r  zParameter.load  s     "##r6   c                L   | j                   }	 t        ||      S # t        $ r}t        |      }t	        |t
              rHdj                  t        dj                  |j                  j                                     }|d| d| z  }t        ||j                  ||      d }~ww xY w)NrN  rO  rP  rJ   )rQ  r$   r"   rR   rS  r   rD   rT  rU  rV  rW  r   rL   )rb   r   rp   rL   rX  rY  rq   rZ  s           r4   r#   zParameter.typify  s    ))		D(==  	Da&C,-))|'?'?'F'F'HI -dV2gY??'aggvsCC	Ds    	B#A;BB#r0   )rX   rY   rZ   r?  rQ  ra   r   rq  r  r   r  r#   r1   r6   r4   r  r    sF    E M& 5 5
,. 
$ 
$Dr6   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.
    c                p    |t        |      n|| _        | j                  | _        t        |   ||       y)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   r?  rQ  r`   ra   )rb   rq  rX  r1  rf   s       r4   ra   zPrimitiveParameter.__init__  s2     '3&:T']
!ZZ*-r6   c           	         t        || j                  |j                  | j                        |j	                         |j                  | j                        | j                        S Nr  )r   r?  rL   rQ  r   r   r0  r  s      r4   r  zPrimitiveParameter.load  sQ    'JJKK**+MMOT//0''
 	
r6   NN)rX   rY   rZ   r)  ra   r  ri   rj   s   @r4   r  r    s    	.
r6   r  c                  F     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                l    || _         |xr t        |      xs
 t               }t        |   ||       y)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)rQ  r,   r`   ra   rb   rX  rq  r1  rf   s       r4   ra   zMapParameter.__init__  s5     *1j1AZ\Z8r6   c                X    t         |   |||      \  }}t        d |D              }||fS )Nc              3  :   K   | ]  }|j                   |  y wr0   r   r@   r  s     r4   rC   z/MapParameter.get_all_matches.<locals>.<genexpr>       G7aall.F7   r`   r  r   rb   r   r  r@  rK  
exceptionsrf   s         r4   r  zMapParameter.get_all_matches  6    #g5dE8LG7GG
""r6   c           	        |j                  | j                        }|Ct        |t               | j                  |j	                         t               | j
                        S t        |t              sAt        |||j                  |j                  j                  | j                  j                        i }|j                  | j                        j                         D ]&  \  }}| j                  j                  ||      }|||<   ( t        |t        |      | j                  |j	                         |j                  | j                        | j
                        S r  )rL   rQ  rv  r,   r   r0  rQ   r   rz   rp   rf   rX   r?  rM   r  r   )rb   r   r  rL   
loaded_maprK   child_valueloaded_child_values           r4   r  zMapParameter.load  s&   D../=%""++  %)"eU\\5??+C+CTZZEXEX  
 %D,>,> ? E E GC!%!3!3!8!8{!K0JsO !H "z"MMOT//0''
 	
r6   )
rX   rY   rZ   r)  r,   r?  ra   r  r  ri   rj   s   @r4   r  r    s!    ^E-7\d 9#
r6   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.c                B    || _         || _        t        |   ||       y)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)rQ  r   r`   ra   )rb   rX  rq  r1  r   rf   s        r4   ra   zSequenceParameter.__init__A  s$     * 0*-r6   c                X    t         |   |||      \  }}t        d |D              }||fS )Nc              3  :   K   | ]  }|j                   |  y wr0   r  r  s     r4   rC   z4SequenceParameter.get_all_matches.<locals>.<genexpr>Q  r  r  r  r  s         r4   r  z!SequenceParameter.get_all_matchesL  s8     $g5dE8LG7GG
""r6   c           	     <   |j                  |       }|3t        |d| j                  |j                         d| j                        S t        |      sAt        |||j                  |j                  j                  | j                  j                        g }|D ]/  }| j                  j                  ||      }|j                  |       1 t        |t        |      | j                  |j                         |j                  | j                        | j                        S )Nr1   r  )rL   r  rQ  r   r0  r'   rz   rp   rf   rX   r?  r  r   r   r   )rb   r   r  rL   loaded_sequencer  r  s          r4   r  zSequenceParameter.loadT  s   D!=*""++  % "eU\\5??+C+CTZZEXEX   K!%!3!3!8!8{!K""#56 ! '/"MMOT//0''
 	
r6   )r1   N,)
rX   rY   rZ   r)  r   r?  ra   r  r  ri   rj   s   @r4   r  r  <  s    cE	.#
r6   r  c                  F     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                4    || _         t        | 	  ||       y)z
        Args:
            element_type (object): The object type with parameter fields held in ObjectParameter.
            default (Sequence): default value, empty tuple if not given.
        Nrx  r  s       r4   ra   zObjectParameter.__init__y  s     **-r6   c                X    t         |   |||      \  }}t        d |D              }||fS )Nc              3  :   K   | ]  }|j                   |  y wr0   r  r  s     r4   rC   z2ObjectParameter.get_all_matches.<locals>.<genexpr>  r  r  r  r  s         r4   r  zObjectParameter.get_all_matches  r  r6   c           	        |j                  | j                        }|3t        |d | j                  |j                         d | j                        S t        |t        t        f      sAt        |||j                  |j                  j                  | j                  j                        t        |t              rt        |      }t        | j                        j                         D ci c]  \  }}t        |t              r|| }}}i }|j                         D ]<  \  }}|j!                  |      x}r|j#                  ||      }	n|j$                  }	|	||<   > t'        j(                  | j                        }
|j                         D ]  \  }}|
j+                  ||        t        ||
| j                  |j                         |j-                  | j                        | j                        S c c}}w r  )rL   rQ  r  r   r0  rQ   r   r"  rz   rp   rf   rX   r?  r   rM   r  r  r  rq  r  r  r#  r   )rb   r   r  rL   r$  parameter_typeobject_parameter_attrsloaded_attrsraw_child_valuer  object_copyloaded_child_parameters               r4   r  zObjectParameter.load  s   D../=(""++  %'+>!?@"eU\\5??+C+CTZZEXEX 
 e01KE .2$2D2D-E-K-K-M"
-M)	>.)4 ~%-M 	 "
 )?)E)E)G%I~"'))I"666%3%8%8%O"%3%;%;"&8L# *H mmD$6$671=1C1C1E-I-##I/EF 2F %MMOT//0''
 	
)"
s   )G/)rX   rY   rZ   r)  r  r?  r"  ra   r  r  ri   rj   s   @r4   r  r  t  s"    ^E-@-Bt .#0
r6   r  c                  Z    e Zd ZdZd
dZd Zed        Zed        Zd Z	d Z
ed        Zy	)r  zq
    ParameterLoader class contains the top level logic needed to load a parameter from start to
    finish.
    c                J    d| _         d| _        || _        || _        || _        y)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)r-  _namesr   aliases_expandvars)rb   r  r  r   s       r4   ra   zParameterLoader.__init__  s(     
"	%r6   c                p    || _         t        d t        | j                  |f      D              }|| _        |S )Nc              3      K   | ]  }|  y wr0   r1   )r@   r3   s     r4   rC   z,ParameterLoader._set_name.<locals>.<genexpr>  s     C&B1&Br   )r-  	frozensetr   r  r  )rb   r   r  s      r4   	_set_namezParameterLoader._set_name  s4     
CeDLL4'&BCCr6   c                F    | j                   
t               | j                   S r0   )r-  r!   r   s    r4   r   zParameterLoader.name  s    ::,..zzr6   c                F    | j                   
t               | j                   S r0   )r  r!   r   s    r4   r  zParameterLoader.names  s    ;;,..{{r6   c                   | j                   |j                  v r|j                  | j                      S | j                  j                  | j                   | j                  |      \  }}|D cg c](  }| j                  j                  | j                   |      * }}|r|d   j                  |      n| j                  j                  }| j                  r|j                         n|}	 |j                  d      }	|j                  |j                  ||	d             t        |       	|j                  | j                   <   |	S c c}w # t        $ r}
|j                  |
       Y d }
~
Jd }
~
ww xY w)Nr   rk  )r   _cache_r   r  r  r  rL  rq  r  rG  r#   r|  rC  r   r   r   )rb   r@  instance_typeraw_matchesr   r  rK  mergedexpandedrB  rY  s              r4   __get__zParameterLoader.__get__  s1    99(((##DII.. #ii77		4::xXV BMM499>>$))U3M /6!!'*499;L;L
 '+&6&66==?F	S__\2F MM(11(FLQRV&,## N % 	MM!	s   *-D=$E 	E&E!!E&c                X    t         j                  | j                  | j                  |      S r0   )r  r  r   r  )rb   r  s     r4   "_raw_parameters_from_single_sourcez2ParameterLoader._raw_parameters_from_single_source  s$    @@IItzz>
 	
r6   c           	        |t        |j                               z  }|D ci c]  }|||   
 }}t        |      }|dk(  ry|dk(  r$t        t	        |j                                     d fS | |v r1||    t        |t        t	        |               j                  ||       fS d t        |t        t	        |               j                  ||       fS c c}w )Nr   r  r&   )r  rw   r   nextiterrW  rs   rp   )r   r  r  rw   rK   rK  numkeyss          r4   r  z1ParameterLoader.raw_parameters_from_single_source  s     y!4!4!6777;<t3s++t<d)a<\W^^-./55T\4="3tDJ/077t#   *tDJ/077t   =s   CN)r1   F)rX   rY   rZ   r)  ra   r  r   r   r  r  r  r  r  r1   r6   r4   r  r    sW    
&    <

  r6   r  c                  "     e Zd ZdZ fdZ xZS )ConfigurationTypezmetaclass for Configurationc                    t         |   |||       t        d | j                  j	                         D              | _        y )Nc              3  d   K   | ](  \  }}t        |t              r|j                  |       * y wr0   )rQ   r  r  )r@   r   ps      r4   rC   z-ConfigurationType.__init__.<locals>.<genexpr>#  s/      $
/a!_- KK/   .0)r`   ra   r   __dict__rM   parameter_names)r   r   basesr  rf   s       r4   ra   zConfigurationType.__init__  s=    ud+ $ $
<<--/$
 
r6   )rX   rY   rZ   r)  ra   ri   rj   s   @r4   r  r    s    %
 
r6   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)%
    )flagsc               H    i |dfd}t         j                  ||       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%
    - $$ → $$
    - %% → %%
    - $ → $
    - % → %
    c                    t        j                  | j                  d      xs$ | j                  d      xs | j                  d      | j                                     S )Nnamedbracedpadded)rR   r  group)r  mappings    r4   convertz"custom_expandvars.<locals>.convertU  sM    KKG$VH(=VXAV
 	
r6   )r  r;   )_RE_CUSTOM_EXPANDVARSsub)templater  rd   r  s    `  r4   custom_expandvarsr!  ;  s.    0 $#F#G
 !$$Wh77r6   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y)ConfigurationNc                    i | _         i | _        t               | _        t	        t
              | _         | j                  |fi | | j                  |       | j                  |       y r0   )
r  r  r   _reset_callbacksr   list_validation_errors_set_search_path_set_env_vars_set_argparse_args)rb   search_pathapp_nameargparse_argsrd   s        r4   ra   zConfiguration.__init__a  sZ      *"-d"3k4V48$.r6   c              +  |  K   | D ]  }t        |t              r|}n*t        |t        fi |}t        |      j	                         }|j                         r)|j                  t        v s|j                  t        v r| y|j                         sd t        |j                               D        E d {     y 7 w)Nc              3  d   K   | ](  }|j                         r|j                  t        v r| * y wr0   )is_filesuffixYAML_EXTENSIONS)r@   subpaths     r4   rC   z4Configuration._expand_search_path.<locals>.<genexpr>  s-      #9(W^^-N #9r  )rQ   r   r!  r   
expanduserr0  r   CONDARC_FILENAMESr1  r2  is_dirsortediterdir)r+  rd   searchr^   r   s        r4   _expand_search_pathz!Configuration._expand_search_pathm  s     
 "F &$',VWGGH~002||~		..$++2P
#)$,,.#9   "s   BB<#B<2B:3B<c              #     K   |D ]  }	 |t         j                  |      f  y # t        $ r!}t        j	                  d||       Y d }~Ed }~ww xY ww)Nz1Ignoring configuration file (%s) due to error:
%s)r   r  r\   logwarning)r   r+  r^   r  s       r4   _load_search_pathzConfiguration._load_search_path  sY     
  D,JJ4PPP   * H s*   A%A	AA
A
AAc                    t         | j                  |fi |      | _        | j                  t	        | j                  | j                                     | j                          | S r0   )r   r:  _search_path_set_raw_datadictr>  _reset_cache)rb   r+  rd   s      r4   r(  zConfiguration._set_search_path  sW    &'?t'?'?'Vv'VW4 6 6t7H7H IJKr6   c                    || _         t        j                  }|| j                  v r| j                  |= |r"t        j	                  |      | j                  |<   | j                          | S r0   )	_app_namer   rp   r  r   rC  )rb   r,  rp   s      r4   r)  zConfiguration._set_env_vars  s[    ! !''T]]"f%$3$G$G$QDMM&!r6   c                   t        |d      rt        |      j                         }n|sd}n|j                         }t        |D ci c]  \  }}|t        us|| c}}      x| _        }t        j                  }|| j                  v r| j                  |= t        j                  |      | j                  |<   | j                          | S c c}}w )Nr  r1   )r   r   rM   r   r)   _argparse_argsr   rp   r  r   rC  )rb   r-  rM   r   r   rp   s         r4   r*  z Configuration._set_argparse_args  s     =*- '--/EE "'')E.6#5edaq}QTe5/
 	
m
 &,,T]]"f% 4 H H Wf 6s   C

C

c                \    | j                   j                  |       | j                          | S r0   )r  updaterC  )rb   r  s     r4   rA  zConfiguration._set_raw_data  s%    X&r6   c                D    i | _         | j                  D ]	  } |         | S r0   )r  r%  rb   callbacks     r4   rC  zConfiguration._reset_cache  s#    --HJ .r6   c                :    | j                   j                  |       y r0   )r%  addrK  s     r4   register_reset_callabackz&Configuration.register_reset_callaback  s    !!(+r6   c                   i }g }| j                   |   }| j                  D ]  }| j                  j                  |   }|j	                  |      \  }}|r|j                  |       |y|j                  j                  ||      }		 |	j                  |j                        }
|	j                  | |
|j                        }|r|j                  |       |
||j                  <    ||fS # t        $ r}|j                  |       Y d }~d }~ww xY wr0   )r  r  rf   r  r  r   r   r  r#   rp   rC  r|  rK   r   )rb   rp   typed_valuesvalidation_errorsr  rK   r  r  multikey_errorra  rA  collected_errorsrY  s                r4   check_sourcezConfiguration.check_source  s    v.''C//4I$-$P$P%!E> !((8 #,>>#6#6sE#B >"2"9"9%,,"GK (8'F'Fk5<<($ ()001AB2=UYY/ ? (@ ... - 0%,,Q//0s   C$$	D-DDc                     t        t        j                   fd j                  D                    }t	        |        j                          y )Nc              3  F   K   | ]  }j                  |      d      yw)r&   N)rU  )r@   rp   rb   s     r4   rC   z-Configuration.validate_all.<locals>.<genexpr>   s%       ;H!!&)!,=s   !)r&  r   r  r  r   validate_configuration)rb   rR  s   ` r4   validate_allzConfiguration.validate_all  sD       ;?==  

 	&'##%r6   c                x    	  | |i | y# t         $ r%}t        |d      r|j                  n|fcY d }~S d }~ww xY w)Nr   r1   )rW   r   r   )funcr   rd   rY  s       r4   _collect_validation_errorz'Configuration._collect_validation_error  sC    	>$!&!  " 	> '8 4AHH!==	>s    	9499c                     t        j                   fd j                  D              } j                         }t	        t        t        j                  ||f                   y )Nc              3  T   K   | ]  }t         j                  t        |       ! y wr0   )r#  r\  r   )r@   r   rb   s     r4   rC   z7Configuration.validate_configuration.<locals>.<genexpr>  s(      %
, 33GT4H,s   %()r   r  r  post_build_validationr   r   )rb   r   post_errorss   `  r4   rX  z$Configuration.validate_configuration  sS    $$ %
,,%
 
 002U5../DEFGr6   c                     yr   r1   r   s    r4   r_  z#Configuration.post_build_validation  s    r6   c                $   i }i }| j                   D ]  }| j                  |      \  ||<   ||<    t        t        t	        j
                  |j                                            |j                         D ci c]  \  }}|s	|| c}}S c c}}w r0   )r  rU  r   r   r   r  rW  rM   )rb   rQ  rR  rp   r   r   s         r4   collect_allzConfiguration.collect_all  s    mmF>B>O>OPV>W;L "3F"; $U5../@/G/G/IJKL!-!3!3!5;!5A1!5;;;s   8
BBc           	       	 || j                   vrd|z   }| j                  j                  |   }|j                  }t	        |t
              sJ |j                  j                  d      	t        	fd|j                  D              }| j                         j                  	d      }|j                  }t        |      t        k(  r|g}t        |      s|g}t	        |j                  t
              st	        |j                  t              rt        d |D              }nt        d |D              }|j                  j                   j#                         j%                  dd      	|||j&                  j)                  d      |j%                  dd	      j+                         d
}t	        |t,              r|j.                  |d<   |S )Nr   c              3  .   K   | ]  }|k7  s	|  y wr0   r1   )r@   aliasr   s     r4   rC   z3Configuration.describe_parameter.<locals>.<genexpr>,  s     U+C%uPT}+Cs   
rg   c              3     K   | ]8  }|j                   j                  j                         j                  d d       : yw)r  rg   N)rf   rX   r   r   r@   _ets     r4   rC   z3Configuration.describe_parameter.<locals>.<genexpr>8  s5      "SUC&&,,.66{BGSUs   >A c              3  4   K   | ]  }|j                     y wr0   )rX   rh  s     r4   rC   z3Configuration.describe_parameter.<locals>.<genexpr><  s     !="3#,,"s   r  z<<describe>>r>    )r  r   r  element_typesdefault_valuedescriptionr   )r  rf   r  r   rQ   r  r   lstripr   r  get_descriptionsr  rQ  r	   r'   r"  rX   r   r   rq  r#   r   r  r   )
rb   rn   parameter_loaderr  r  rn  etrl  detailsr   s
            @r4   describe_parameterz Configuration.describe_parameter"  s   !5!55 >1N>>22>B$))	)Y///  $$++C0U+;+C+CUU++-11$;$$8xB"~Bi--y9Z##%8>
 " "SU" M "!="!==M (11::@@BJJR *&..55nE&..tS9??A	
 i!23*3*D*DG&'r6   c                L    t        t        d | j                  D                    S )Nc              3  >   K   | ]  }|j                  d         yw)r   N)ro  )r@   r   s     r4   rC   z0Configuration.list_parameters.<locals>.<genexpr>M  s     N9MDKK,9Ms   )r   r7  r  r   s    r4   list_parameterszConfiguration.list_parametersL  s    VN9M9MNNOOr6   c                    || j                   vrd|z   }| j                  j                  |   }|j                  }t	        |t
              sJ |j                  |||      S )Nr   )r  rf   r  r   rQ   r  r#   )rb   rn   rL   rp   rq  r  s         r4   typify_parameterzConfiguration.typify_parameterO  s_    !5!55 >1N>>22>B$))	)Y///>>r6   c                    t               r0   r   r   s    r4   rp  zConfiguration.get_descriptionsY  s    !##r6   )r1   NN)r+  Iterable[Path | str]r  Iterable[Path])r+  r|  r  zIterable[tuple[Path, dict]])r+  r{  r0   )r  zMapping[Hashable, dict])rX   rY   rZ   ra   r  r:  r   r>  r(  r)  r*  rA  rC  rO  rU  rY  r\  rX  r_  rc  rt  rw  ry  rp  r1   r6   r4   r#  r#  `  s    
/ ) 
 0 # 
% :
,&/P&  H<(TP?$r6   r#  c                      fd}|S )a!  
    Used to validate properties on :class:`Configuration` subclasses defined as a
    ``SequenceParameter(MapParameter())`` where the map contains a single key that
    should be regarded as unique. This decorator will handle removing duplicates and
    merging to a single sequence.
    c                2     t                fd       }|S )Nc            
     8    | i |}i }|D ]r  }|j                        }|*t        j                  d| dj                   d d       @||v r*t        j                  d| dj                   d| d       n|||<   t t	        |j                               S )NzConfiguration: skipping z for "z"; unique key "z" not present on mappingz
"; value "z" already present)r  r<  r  rX   r   rW  )r   rd   sequence_mapnew_sequence_mappingr  unique_key_valuer[  
unique_keys         r4   wrapperz8unique_sequence_map.<locals>.inner_wrap.<locals>.wrapperf  s    00L#% '#*;;z#: #+II27)6$-- Q&<'?A #';;II27)6$-- Q,-->@ 9@$%56# (& -44677r6   r
   )r[  r  r  s   ` r4   
inner_wrapz'unique_sequence_map.<locals>.inner_wrape  s     	t	8 
	82 r6   r1   )r  r  s   ` r4   unique_sequence_mapr  ]  s    : r6   )z  )r   rR   r  zMapping[str, Any]r  rR   )r  rR   )yr)  
__future__r   r  r   abcr   r   collectionsr   collections.abcr   enumr   r	   	functoolsr   	itertoolsr   loggingr   osr   os.pathr   pathlibr   rer   r   r   r   r   typingr   boltons.setutilsr   ruamel.yaml.commentsr   r   ruamel.yaml.readerr   ruamel.yaml.scannerr   rg   r   r   auxlib.collectionr   r   r    auxlib.exceptionsr!   auxlib.type_coercionr"   r#   r$   common.iteratorsr%   compatr'   r(   	constantsr)   	serializer*   r,   r+   r-   _getFreezeConversionMapr.   	_registerImportError_vendor.frozendictr7   r8   r9   r:   r;   r<   rX   r<  r   rF   rO   rU   rW   r\   rl   rs   rz   r   r   r   r   r   r   r   r   r   r+  r   rv  r  r  r"  r  r  r  r  r  r  r   r  r5  r2  	idpatternr  r!  r#  r  r1   r6   r4   <module>r     s   #  
 ' # #        + +    ' ; * , * 5 5 : S S % /  +A1L0*,, 	$$
 <<L	0V	 	J/ J(( (	? 	?K K

O 

2?,> 2
+D 2W @)Ll )LX
< 
:vL| vLr2/| 2/jV> V>r&+ &+RH
 H
V^
o ^
BG
O G
T JD' JDZ
 
<2
9 2
j5
	 5
pD
i D
N^ ^B
 
 , #
##$ % &&' ( ##$ %	 w
   13"8"8-"8"8Jz$/ z$z%C1  A/@@As   >)J J&%J&