
    si              	      `   % S r SSKJr  SSKrSSKrSSKJrJr  SSKJ	r	  SSK
Jr  SSKJrJr  SSKJrJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJrJrJr  SSK J!r!  SSK"J#r#  SSK$J%r%  SSK&J'r'J&r&  SSK&J(r)  SSK&J*r+  SSK,J-r-J.r.  SSK/J0r0  SSK1J2r2  SSK3J4r4J5r5  SSK6J7r7J8r8J9r9  SSK:J;r;  SSK<J=r=J>r>J?r?  SSK@JArAJBrB  SSKCJDrD  SS KEJFrFJGrG  SS!KHJIrI  SS"KJJKrK  \\)" 5       ;  a
  \+" \S# 5        C)C+\#(       a  SS$K
JLrLJMrMJNrN  SS%KJOrO  SS&K"JPrPJQrQ  SS'KRJSrS  \" \T5      rU\&" 5       rVSpS( jrWSpS) jrXS* rY " S+ S,\45      rZ " S- S.\Z5      r[ " S/ S0\Z5      r\ " S1 S2\\5      r] " S3 S4\\5      r^ " S5 S6\\5      r_ " S7 S8\5\Z5      r`S9 ra " S: S;\5      rb " S< S=\S>9rc " S? S@\c5      rd " SA SB\c5      re " SC SD\c5      rf " SE SF\c5      rg " SG SH\S>9rh " SI SJ\h5      ri " SK SL\h5      rj " SM SN\h5      rk " SO SP\h5      rl " SQ SR5      rm " SS ST\S>9rn " SU SV\n5      ro " SW SX\n5      rp " SY SZ\n5      rq " S[ S\\n5      rr " S] S^5      rs " S_ S`\t5      ruSarvSb\wSc'   SdrxSb\wSe'   \v\x4rySfrz\" Sg\!R                   Sh\!R                   Si\!R                   Sj3\\-  Sk9r|0 4     SqSl jjr} " Sm Sn\uS>9r~SrSo jrg)sz
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)cachewraps)chain)	getLogger)environ)
expandvars)Path)
IGNORECASEVERBOSEcompile)Template)TYPE_CHECKING)
IndexedSet)
deepfreeze
frozendict)getFreezeConversionMap)register)CommentedMapCommentedSeq)ReaderError)ScannerError   )
CondaErrorCondaMultiError)AttrDictfirstlast)ThisShouldNeverHappenError)TypeCoercionErrortypifytypify_data_structure)CMD_LINE_SOURCEENV_VARS_SOURCE)unique   )
isiterableprimitive_types)NULL)yamlc                    U $ N xs    :lib/python3.13/site-packages/conda/common/configuration.py<lambda>r7   7   s    a    )HashableIterableSequence)Match)AnyFinal)	PathsTypec                   ^ [        U 5      (       d  U /n  SR                  U4S jU  5       5      $ ! [         a    [        U /T5      s $ f = f)N
c              3  2   >#    U  H  nT S U 3v   M     g7f)z- Nr3   ).0itempaddings     r6   	<genexpr>pretty_list.<locals>.<genexpr>L   s     C($G9Btf-(s   )r-   join	TypeErrorpretty_list)iterablerE   s    `r6   rJ   rJ   H   sM    h:0yyC(CCC 0H:w//0s   1 A
Ac                V   ^ SR                  U4S jU R                  5        5       5      $ )NrA   c              3  :   >#    U  H  u  pT U S U 3v   M     g7f): Nr3   )rC   keyvaluerE   s      r6   rF   pretty_map.<locals>.<genexpr>R   s$     UBTJCyRw/BTs   )rH   items)
dictionaryrE   s    `r6   
pretty_maprT   Q   s!    99U*BRBRBTUUUr8   c                R    [        U [        [        45      (       a  [        U 5      $ U $ r2   )
isinstancestrbytesr   )
unexpandeds    r6   expand_environment_variablesrZ   U   s$    *sEl++*%%r8   c                      \ rS rSrSrg)ConfigurationError\   r3   N)__name__
__module____qualname____firstlineno____static_attributes__r3   r8   r6   r\   r\   \   s    r8   r\   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )ConfigurationLoadError`   c                4   > Sn[         TU ]  " XB-   4SU0UD6  g )Nz4Unable to load configuration file.
  path: %(path)s
pathsuper__init__)selfrg   message_additionkwargsmessage	__class__s        r6   rj   ConfigurationLoadError.__init__a   s"    J3I$I&Ir8   r3   ) r^   r_   r`   ra   rj   rb   __classcell__ro   s   @r6   rd   rd   `   s    J Jr8   rd   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )ValidationErrorf   c                L   > Xl         X l        X0l        [        TU ]  " U40 UD6  g r2   )parameter_nameparameter_valuesourceri   rj   )rk   ry   rz   r{   msgrm   ro   s         r6   rj   ValidationError.__init__g   s&    ,.''r8   )ry   rz   r{   r2   rr   rt   s   @r6   rv   rv   f   s    ( (r8   rv   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )MultipleKeysErrorn   c                f   > Xl         X l        SU S[        U5       SU S3n[        TU ]  US XS9  g )NzMultiple aliased keys in file z:
z 
Must declare only one. Prefer ''r|   )r{   keysrJ   ri   rj   )rk   r{   r   preferred_keyr|   ro   s        r6   rj   MultipleKeysError.__init__o   sM    	,VHC4 ! "..;_A? 	
 	f>r8   )r   r{   rr   rt   s   @r6   r   r   n   s    ? ?r8   r   c                  .   ^  \ rS rSr SU 4S jjrSrU =r$ )InvalidTypeErrorz   c                v   > X@l         XPl        Uc  SU SU< SU SU S[        U5       3
n[        TU ]  XX6S9  g )N
Parameter  =  declared in z
 has type z.
Valid types:
r   )
wrong_typevalid_typesrJ   ri   rj   )rk   ry   rz   r{   r   r   r|   ro   s          r6   rj   InvalidTypeError.__init__{   sc     %&;^,C/B-PVxWablam n!!,[!9 :<  	&Jr8   )r   r   r2   rr   rt   s   @r6   r   r   z   s    TX
K 
Kr8   r   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )CustomValidationError   c                @   > [         TU ]  UUUSU SU< SU SU 3S9  g )Nr   r   r   z is invalid.
r   rh   )rk   ry   rz   r{   custom_messagero   s        r6   rj   CustomValidationError.__init__   s@    ^,C/B-(.(8: 	 	
r8   r3   rr   rt   s   @r6   r   r      s    	
 	
r8   r   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )MultiValidationError   c                .   > [         TU ]  " U/UQ70 UD6  g r2   rh   )rk   errorsargsrm   ro   s       r6   rj   MultiValidationError.__init__   s    1$1&1r8   r3   rr   rt   s   @r6   r   r      s    2 2r8   r   c                P    U (       d  g[        U 5      S:X  a  U S   e[        U 5      e)NTr,   r   )lenr   )r   s    r6   raise_errorsr      s(    	V	Qi"6**r8   c                  V    \ rS rSrSrSrSrS r\S 5       r	\S 5       r
\S 5       rS	rg
)ParameterFlag   finaltopbottomc                    U R                    $ r2   rP   rk   s    r6   __str__ParameterFlag.__str__   s    **r8   c                
    X   $ r2   r3   )clsnames     r6   	from_nameParameterFlag.from_name   s
    yr8   c                    U " U5      $ r2   r3   )r   rP   s     r6   
from_valueParameterFlag.from_value   s    5zr8   c                t     UR                  S5      nU R                  U5      $ ! [        [        4 a     g f = f)Nz!#)stripr   
ValueErrorAttributeError)r   strings     r6   from_stringParameterFlag.from_string   s;    	\\$'F>>&))N+ 		s   !$ 77r3   N)r^   r_   r`   ra   r   r   r   r   classmethodr   r   r   rb   r3   r8   r6   r   r      sR    E
CF      r8   r   c                  `    \ rS rSrS rS r\S 5       r\S 5       r\S 5       r	\
S 5       rSrg	)
RawParameter   c                v    Xl         X l         UR                  S5      U l        g ! [         a	    X0l         g f = f)Nzutf-8)r{   rO   decode
_raw_valuer   )rk   r{   rO   	raw_values       r6   rj   RawParameter.__init__   s7    	('..w7DO 	('O	(s   % 88c                *    [        [        U 5      5      $ r2   )rW   varsr   s    r6   __repr__RawParameter.__repr__   s    4:r8   c                    [        5       er2   NotImplementedErrorrk   parameter_objs     r6   rP   RawParameter.value       !##r8   c                    [        5       er2   r   r   s    r6   keyflagRawParameter.keyflag   r   r8   c                    [        5       er2   r   r   s     r6   
valueflagsRawParameter.valueflags   r   r8   c           
     ^    U(       a  U Vs0 s H  o3U " XX#   5      _M     sn$ [         $ s  snf r2   )	EMPTY_MAPr   r{   from_maprO   s       r6   make_raw_parameters RawParameter.make_raw_parameters   s2    DLMHSV(-88HMM Ns   *)r   rO   r{   N)r^   r_   r`   ra   rj   r   r   rP   r   r   r   r   rb   r3   r8   r6   r   r      s\    ( $ $ $ $ $ $  r8   r   )	metaclassc                  X   ^  \ rS rSr\rS rS rS r\	S 5       r
\U 4S j5       rSrU =r$ )EnvRawParameter   c                6  ^  [        US5      (       ak  [        T R                  [        5      (       d  [	        S5      e[        US5      n[        U 4S jS T R                  R                  U5       5        5       5      $ T R                  S   R                  5       $ )Nstring_delimiterzValue is not a string.c              3     >#    U  H3  nU(       d  M  [        [         R                  TR                  U5      v   M5     g 7fr2   )r   r{   rO   )rC   vrk   s     r6   rF   (EnvRawParameter.value.<locals>.<genexpr>   s4      WA E 6 6!DDWs   >,>c              3  @   #    U  H  oR                  5       v   M     g 7fr2   )r   )rC   vvs     r6   rF   r      s     W/V((**/V   r   )
hasattrrV   r   rW   rI   getattrtuplesplit'_EnvRawParameter__important_split_valuer   rk   r   r   s   `  r6   rP   EnvRawParameter.value   s     ="455doos33 899&}6HI Wt/D/DEU/VW   //288::r8   c                X    [        U R                  5      S:  a  [        R                  $ S $ Nr   )r   r   r   r   r   s    r6   r   EnvRawParameter.keyflag   s&    &)$*F*F&G1&L}""VRVVr8   c                    [        US5      (       a7  [        US5      n[        S U R                  R	                  U5       5       5      $ U R
                  S   R                  5       $ )Nr   c              3  &   #    U  H  nS v   M	     g7f)rq   Nr3   )rC   _s     r6   rF   -EnvRawParameter.valueflags.<locals>.<genexpr>   s     M%L%Ls   r   )r   r   r   r   r   r   r   r   s      r6   r   EnvRawParameter.valueflags   sY    ="455&}6HIMT__%:%:;K%LMMM//288::r8   c                8    U R                   R                  S5      $ )Nz
!important)r   r   r   s    r6   __important_split_value'EnvRawParameter.__important_split_value   s    $$\22r8   c           	     4  > UR                  5        S3n[        R                  " 5        VVs0 s H?  u  p4UR                  U5      (       d  M  UR	                  USS5      R                  5       U_MA     nnn[        TU ]  [        R                  U5      $ s  snnf )Nr   rq   r,   )
upperr   rR   
startswithreplacelowerri   r   r   r{   )r   appnamekeystartkr   raw_envro   s         r6   r   #EnvRawParameter.make_raw_parameters   s    mmo&a(  
'||H% 2AIIhA&,,.1' 	 

 w*?+A+A7KK
s   B&Br3   )r^   r_   r`   ra   r*   r{   rP   r   r   propertyr   r   r   rb   rs   rt   s   @r6   r   r      sB    F; W; 3 3 L Lr8   r   c                  H   ^  \ rS rSr\rS rS rS r\	U 4S j5       r
SrU =r$ )ArgParseRawParameteri	  c           	     >   [        U R                  5      (       ao  / n[        [        U R                  5      5       H@  nUR	                  [        U R                  U R                  U R                  U   5      5        MB     [        U5      $ [        U R                  5      $ r2   )
r-   r   ranger   appendr  r{   rO   r   r   )rk   r   children_valuesis       r6   rP   ArgParseRawParameter.value  sx     doo&& O3t/0&&(dhhPQ@RS 1 ))doo..r8   c                    g r2   r3   r   s    r6   r   ArgParseRawParameter.keyflag      r8   c                4    [        U[        5      (       a  S $ S$ Nr3   )rV   PrimitiveLoadedParameterr   s     r6   r   ArgParseRawParameter.valueflags  s    !-1IJJtRPRRr8   c                @   > [         TU ]  [        R                  U5      $ r2   )ri   r   r  r{   )r   args_from_argparsero   s     r6   r   (ArgParseRawParameter.make_raw_parameters  s!    w* '');
 	
r8   r3   )r^   r_   r`   ra   r)   r{   rP   r   r   r   r   rb   rs   rt   s   @r6   r  r  	  s,    F/S 
 
r8   r  c                     ^  \ rS rSrU 4S jrS rS rS r\S 5       r	\
S 5       r\S 5       r\S	 5       r\
S
 5       r\
\S 5       5       r\
SS j5       rSrU =r$ )YamlRawParameteri&  c           
     p  > X@l         [        T
U ]	  XU5        [        U R                  [
        5      (       a  U R                  U R                  5      n[        S U 5       5      U l        / n[        [        U R                  5      5       HC  nUR                  [        U R                  U R                  U R                  U   XW   5      5        ME     [        U5      U l        g [        U R                  [         5      (       a  U R#                  U R                  5      nUR%                  5        VV	s0 s H   u  pU	c  M
  U[&        R)                  U	5      _M"     sn	nU l        0 nU R                  R%                  5        H+  u  p[        U R                  U R                  XU   5      Xh'   M-     [+        U5      U l        g [        U R                  [,        5      (       a  S U l        U R                  U l        g [/        [1        U R                  5      U R                  [2        R4                  S9  [7        5       es  sn	nf )Nc              3  L   #    U  H  n[         R                  U5      v   M     g 7fr2   )r   r   )rC   ss     r6   rF   ,YamlRawParameter.__init__.<locals>.<genexpr>/  s!      &6D))!,,ns   "$)file)_key_commentri   rj   rV   r   r   _get_yaml_list_commentsr   _value_flagsr  r   r  r  r{   rO   _valuer   _get_yaml_map_commentsrR   r   r   r   r.   printtypesysstderrr%   )rk   r{   rO   r   key_commentvalue_commentsr	  r
  r   r   ro   s             r6   rj   YamlRawParameter.__init__)  s   'i0doo|44!99$//JN % &6D& !D !O3t/0&&$TXXtq/A>CT 1  0DK66!88IN +002!2DA 0=,,Q//2!D
 !O--/%5KK1Q.?&" 0 %_5DK99 $D//DK$t'szzJ,..!!s   .	H2;H2c                    U R                   $ r2   r   r   s     r6   rP   YamlRawParameter.valueN      {{r8   c                @    [         R                  U R                  5      $ r2   )r   r   r  r   s    r6   r   YamlRawParameter.keyflagQ  s    (():):;;r8   c                    U R                   $ r2   )r  r   s     r6   r   YamlRawParameter.valueflagsT  s       r8   c                     U R                   R                  U   S   R                  R                  5       $ ! [        [
        4 a     g f = fr   carR   rP   r   r   KeyError)commented_dictrO   s     r6   _get_yaml_key_comment&YamlRawParameter._get_yaml_key_commentW  sI    	!$$**3/288>>@@) 		s   36 A	A	c                &   / n[        [        U5      5       H;  n UR                  U R                  UR                  R
                  U   5      5        M=     [        U5      $ ! [        [        [        [        4 a    UR                  S 5         Mx  f = fr2   )r  r   r  _get_yaml_list_comment_itemr3  rR   r   
IndexErrorr4  rI   r   )r   rP   list_commentsr
  s       r6   r  (YamlRawParameter._get_yaml_list_comments^  s}    
 s5z"A+$$S%D%DUXX^^TUEV%WX #
 ]## #J)D +$$T*+s   7A!!+BBc                    U S   (       a&  U S   R                   R                  5       =(       d    S $ U S   S   R                   R                  5       =(       d    S $ )Nr   r,   )rP   r   )rD   s    r6   r9  ,YamlRawParameter._get_yaml_list_comment_itemk  sI     77==&&(0D071:##))+3t3r8   c                    0 nU  HC  n U R                   R                  U   S   R                  R                  5       =(       d    S X'   ME     U$ ! [        [
        4 a    S X'    M`  f = fr   r2  )rP   map_commentsrO   s      r6   r!  'YamlRawParameter._get_yaml_map_commentst  sj    C)$)HHNN3$7$:$@$@$F$F$H$PD! 
  #H- )$(!)s   ?AA&%A&c                ~    U(       a,  U Vs0 s H  nX0" XX#   U R                  X#5      5      _M      sn$ [        $ s  snf r2   )r6  r   r   s       r6   r   $YamlRawParameter.make_raw_parameters~  sX    
 $	 $C S0I0I(0X  $	  s   %:c           	     x   [        U5       n [        R                  " U5      nU R                  X5      =(       d    [        sSSS5        $ ! [         a1  nUR                  n[        USUR                  UR                  S9eSnAf[         a  n[        USUR                  S9eSnAff = f! , (       d  f       g= f)a  
Read the provided file path and convert the contents into configuration parameters.

This function will cache the result for each filepath. In order to re-read the same
file path with updated content, be sure to clear this cache.

For example::

    YamlRawParameter.cache_clear()
z:  reason: invalid yaml at line %(line)s, column %(column)s)linecolumnNz/  reason: invalid yaml at position %(position)s)position)openr0   loadsr   problem_markrd   rE  rF  r   rG  r   r   )r   filepathfhyaml_objerrmarks         r6   make_raw_parameters_from_file.YamlRawParameter.make_raw_parameters_from_file  s     (^r::b> **8>K)# ^   '',P;;	   ,E \\  ^s9   B+AB+
B(,BB(B##B((B++
B9c                8    U R                   R                  5         g r2   )rP  cache_clearr   s    r6   rS  YamlRawParameter.cache_clear  s    ))557r8   )r  r   r  )returnNone)r^   r_   r`   ra   rj   rP   r   r   staticmethodr6  r   r  r9  r!  r   r
   rP  rS  rb   rs   rt   s   @r6   r  r  &  s    #/J<!   
$ 
$ 4 4     
L  L< 8 8r8   r  c                  >   ^  \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )DefaultValueRawParameteri  zFWraps a default value as a RawParameter, for usage in ParameterLoader.c           	     :  > [         T
U ]  XU5        [        U R                  [        5      (       aY  0 nU R                  R                  5        H(  u  pV[        U R                  U R                  U5      XE'   M*     [        U5      U l
        g [        U R                  5      (       au  / n[        [        U R                  5      5       H@  nUR                  [        U R                  U R                  U R                  U   5      5        MB     [        U5      U l
        g [        U R                  [         5      (       ay  U R                  U l
        [#        U R                  5      R                  5        H@  u  pU R                  R%                  U[        U R                  U R                  U	5      5        MB     g [        U R                  [&        5      (       a  U R                  U l
        g [        U R                  [(        5      (       a  U R                  U l
        g [+        5       er2   )ri   rj   rV   r   r   rR   rZ  r{   rO   r   r   r-   r  r   r  r   ConfigurationObjectr   __setattr__r   r.   r%   )rk   r{   rO   r   r	  r   r   r
  	attr_name
attr_valuero   s             r6   rj   !DefaultValueRawParameter.__init__  sv   i0doow// O--/%=dkk488UV%W" 0$_5DK(( O3t/0&&,T[[$((DOOTUDVW 1  0DK)<==//DK)-doo)>)D)D)F%	'',T[[$((JO *G
 ..//DK99//DK,..r8   c                    U R                   $ r2   r*  r   s     r6   rP   DefaultValueRawParameter.value  r,  r8   c                    g r2   r3   r   s    r6   r    DefaultValueRawParameter.keyflag  r  r8   c                ^   [        U R                  [        5      (       a
  [        5       $ [	        U R                  5      (       a  g[        U R                  [
        5      (       a  g [        U R                  [        5      (       a  g [        U R                  [        5      (       a  g [        5       er  )	rV   r   r   r   r-   r\  r   r.   r%   r   s     r6   r   #DefaultValueRawParameter.valueflags  ss    doow//<(()<==..99,..r8   r*  )r^   r_   r`   ra   __doc__rj   rP   r   r   rb   rs   rt   s   @r6   rZ  rZ    s    P/:/ /r8   rZ  c                      \ rS rSrSrSrSS jrS rS rSS jr	S r
\S 5       rS	 r\SS
 j5       r\S 5       r\S 5       rSrg)LoadedParameteri  Nc                @    Xl         X l        X0l        X@l        XPl        g)a  
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)_namerP   key_flagvalue_flags_validation)rk   r   rP   rl  rm  
validations         r6   rj   LoadedParameter.__init__  s     

 &%r8   c                d    [        U5      [        U 5      L a  U R                  UR                  :H  $ gNFr#  rP   rk   others     r6   __eq__LoadedParameter.__eq__  (    ;$t*$::,,r8   c                ,    [        U R                  5      $ r2   hashrP   r   s    r6   __hash__LoadedParameter.__hash__      DJJr8   c           
        / n[        X R                  5      (       dF  UR                  [        U R                  X#[        U R                  5      U R                  5      5        U$ U R                  bx  U R                  U5      nUSL a'  UR                  [        U R                  X#5      5        U$ [        U[        5      (       a&  UR                  [        U R                  X#U5      5        U$ )z
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)rV   _typer  r   rk  r#  rP   rn  rv   rW   r   )rk   instancetyped_valuer{   r   results         r6   collect_errorsLoadedParameter.collect_errors  s     +zz22MM JJT$**5Etzz  )%%k2Fodjj+NO
 	 FC(()$**k6R r8   c                   [        U R                  [        5      (       a;  [        U R                  5      " S U R                  R	                  5        5       5      nO[        U R                  5      (       a-  [        U R                  5      " S U R                   5       5      nO[        U R                  [        5      (       ax  [        U R                  5      R	                  5        HE  u  p#[        U[        5      (       d  M  U R                  R                  X#R                  5       5        MG     U R                  $ [        U R                  5      nXl        U $ )z^
Recursively expands any environment values in the Loaded Parameter.

Returns LoadedParameter
c              3  H   #    U  H  u  pXR                  5       4v   M     g 7fr2   expand)rC   r   r   s      r6   rF   )LoadedParameter.expand.<locals>.<genexpr>'  s     (XEWTQ!XXZEWs    "c              3  @   #    U  H  oR                  5       v   M     g 7fr2   r  )rC   r   s     r6   rF   r  )  s     (HZZr   )rV   rP   r   r#  rR   r-   r\  r   ri  r]  r  rZ   )rk   	new_valuer^  r_  s       r6   r  LoadedParameter.expand  s     djj'**TZZ((XTZZEUEUEW(XXI

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

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

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

Returns: LoadedParameter
r   )rk   matchess     r6   mergeLoadedParameter.merge4  s     "##r8   c                   U R                   n [        R                  U R                  X5      $ ! [         a  n[        U5      n[        U[        5      (       aR  SR                  [        SR                  UR                  R                  5       5      5      nUSU R                   SU 3-  n[        U R                  UR                  X5      eSnAff = f)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 rN   N)_element_typeri  _typify_data_structurerP   r&   rW   
issubclassr   rH   mapformat__members__valuesrk  r   )rk   r{   element_typeer|   choicess         r6   r'   LoadedParameter.typify@  s     ))	J"99

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

AGGVII	Js   . 
CBCCc                Z  ^ [        U [        5      (       a)  [        U 5      " U4S jU R                  5        5       5      $ [	        U 5      (       a  [        U 5      " U4S jU  5       5      $ [        U [
        5      (       a[  [        U 5      R                  5        H<  u  p4[        U[        5      (       d  M  U R                  X4R                  T5      5        M>     U $ [        U [        5      (       a2  [        U[        5      (       a  [        U[        5      (       a  U" U 5      $ [        X5      $ )Nc              3  L   >#    U  H  u  pXR                  T5      4v   M     g 7fr2   r'   )rC   r   r   r{   s      r6   rF   9LoadedParameter._typify_data_structure.<locals>.<genexpr>Z  s     O88F#34   !$c              3  D   >#    U  H  oR                  T5      v   M     g 7fr2   r  )rC   r   r{   s     r6   rF   r  \  s     ?Axx//s    )rV   r   r#  rR   r-   r\  r   ri  r]  r'   rW   r  )rP   r{   	type_hintr^  r_  s    `   r6   r  &LoadedParameter._typify_data_structureW  s    eW%%;OOOO;????233)-e):):)<%	j/::%%i1B1B61JK *= Luc""9d++9c**
 U##%++r8   c                :    U R                   [        R                  L $ r2   )rl  r   r   )loaded_parameters    r6   _match_key_is_important'LoadedParameter._match_key_is_importantn  s    ((M,?,???r8   c                H    [        [        U 5      S S S9nUc  U $ U S US-    $ )Nc                2    [         R                  U S   5      $ )Nr,   )ri  r  r4   s    r6   r7   :LoadedParameter._first_important_matches.<locals>.<lambda>v  s    o==adCr8   c                    U S   $ )Nr   r3   r4   s    r6   r7   r  w  s    AaDr8   )applyr,   )r#   	enumerate)r  idxs     r6   _first_important_matches(LoadedParameter._first_important_matchesr  s6    gC 

 +w=79S1W+==r8   )rk  rn  rl  rP   rm  r2   
<<merged>>)r^   r_   r`   ra   r  r  rj   rv  r|  r  r  r   r  r'   rX  r  r  r  rb   r3   r8   r6   ri  ri    s    E M&$
 4, 	$ 	$J. , ,, @ @ > >r8   ri  c                  D   ^  \ rS rSrSr SU 4S jjrS rS rS rSr	U =r
$ )	r  i|  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                @   > X l         X l        [        TU ]  XXEU5        g)z
Args:
    element_type (type or tuple[type]): Type-validation of parameter's value.
    value (primitive value): primitive python value.
N)r  r  ri   rj   )rk   r   r  rP   rl  rm  ro  ro   s          r6   rj   !PrimitiveLoadedParameter.__init__  s!     "
)hZHr8   c                d    [        U5      [        U 5      L a  U R                  UR                  :H  $ grr  rs  rt  s     r6   rv  PrimitiveLoadedParameter.__eq__  rx  r8   c                ,    [        U R                  5      $ r2   rz  r   s    r6   r|  !PrimitiveLoadedParameter.__hash__  r~  r8   c                t    [        U[        R                  S S9nUb  U$ [        US S S9nUb  U$ [	        5       e)N)defaultc                
    U S L$ r2   r3   r4   s    r6   r7   0PrimitiveLoadedParameter.merge.<locals>.<lambda>  s    Qd]r8   )r#   ri  r  r$   r%   )rk   r  important_match
last_matchs       r6   r  PrimitiveLoadedParameter.merge  sK    _<<d
 &""'#:DI
!(**r8   r  r  r2   )r^   r_   r`   ra   rg  rj   rv  r|  r  rb   rs   rt   s   @r6   r  r  |  s)     LP
I
 
+ 
+r8   r  c                  P   ^  \ rS rSrSr\r SU 4S jjrSU 4S jjrS	S jr	Sr
U =r$ )
MapLoadedParameteri  zFLoadedParameter type that holds a map (i.e. dict) of LoadedParameters.c                4   > X0l         [        TU ]	  XXEU5        g)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  ri   rj   rk   r   rP   r  rl  rm  ro  ro   s          r6   rj   MapLoadedParameter.__init__       *hZHr8   c                  > [         TU ]  XU R                  5      n[        U R                  [        5      (       aG  U R                  R                  5        H)  u  pVUR                  UR                  XU   U5      5        M+     U$ r2   )ri   r  rP   rV   r   rR   extendrk   r  r  r{   r   rO   rP   ro   s          r6   r  !MapLoadedParameter.collect_errors  sg    'tzzJ djj'**"jj..0
e228=MvVW 1r8   c           	        [         R                  U5      nU H  n[        UR                  [        5      (       a  M$  [        U R                  UR                  UR                  UR                  R                  R                  U R                  R                  5      e   [        U5       VVVs0 s HX  nUR                  R                  5         H6  u  p4UR                  R                  U5      [        R                   :X  d  M4  X4_M8     MZ     nnnn0 nU HG  nUR                  R                  5        H&  u  p4UR#                  U/ 5      R%                  U5        M(     MI     UR                  5        VVs0 s H  u  p7X7S   R'                  U5      _M     nnn[)        0 UEUE5      n	[+        U R,                  U	U R.                  U R0                  U R                  U R2                  S9$ s  snnnf s  snnf Nr   ro  )ri  r  rV   rP   r   r   r   r{   ro   r^   r  reversedrR   rm  getr   r   
setdefaultr  r  r   r  rk  r  rl  rn  
rk   
parameters	parameterrO   rP   	final_mapgrouped_mapr  
merged_mapmerged_values
             r6   r  MapLoadedParameter.merge  s    %==jI
 $Iioow77&IIOO$$OO--66JJ''  $ &j1
1	'oo335
$$((-1D1DD CJ5 1 	 
 #I'oo335
&&sB/66u= 6 $ =H<M<M<O
<O[SC((<O 	 

 ""=Z"=9"=> "JJMM''
 	
+

s   ,AG#
G#1 G*r  r2   r  )r  zSequence[MapLoadedParameter]rV  r  )r^   r_   r`   ra   rg  r   r  rj   r  r  rb   rs   rt   s   @r6   r  r    s'    PE LP
I.
 .
r8   r  c                  L   ^  \ rS rSrSr\r SU 4S jjrSU 4S jjrS r	Sr
U =r$ )	SequenceLoadedParameteri  zKLoadedParameter type that holds a sequence (i.e. list) of LoadedParameters.c                4   > X0l         [        TU ]	  XXEU5        g)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          r6   rj    SequenceLoadedParameter.__init__  r  r8   c                   > [         TU ]  XU R                  5      n[        U R                  5       H)  u  pVUR	                  UR                  XU   U5      5        M+     U$ r2   )ri   r  rP   r  r  )rk   r  r  r{   r   r  elementro   s          r6   r  &SequenceLoadedParameter.collect_errors  sP    'tzzJ%djj1LCMM'00s;KVTU 2r8   c           	     J  ^ [        S [        R                  U5       5       5      nU He  u  p4[        U[         5      (       a  M  [	        U R
                  UUR                  UR                  R                  U R                  R                  5      e   S m[        R                  " U4S jU 5       5      n[        [        R                  " U4S j[        U5       5       5      5      n[        R                  " S [        U5       5       5      n[        [        / UQUQ75      5      n[        [        / [        U5      Q[        U5      Q75      5      n	[        [        U	5      5      n
[        U R                  U
U R                   U R"                  U R$                  U R&                  S9$ )Nc              3  <   #    U  H  nXR                   4v   M     g 7fr2   r   )rC   matchs     r6   rF   0SequenceLoadedParameter.merge.<locals>.<genexpr>  s      ,
J KK Js   c                |   ^ U (       a3  [        U4S j[        U R                  U R                  5       5       5      $ S$ )Nc              3  :   >#    U  H  u  pUTL d  M  Uv   M     g 7fr2   r3   )rC   rE  flagmarkers      r6   rF   JSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>  s#      &I
v~ D&Is   	r3   )r   ziprP   rm  )r  r  s    `r6   get_marked_lines7SequenceLoadedParameter.merge.<locals>.get_marked_lines  s?       &)%++u7H7H&I  r8   c              3  V   >#    U  H  u  pT" U[         R                  5      v   M      g 7fr2   )r   r   )rC   mr   r  s      r6   rF   r  &  s*      (
3 Q 1 1223   &)c              3  V   >#    U  H  u  pT" U[         R                  5      v   M      g 7fr2   )r   r   )rC   r  r   r  s      r6   rF   r  .  s*        EHE !(<(<== Er  c              3  *   #    U  H	  u  pUv   M     g 7fr2   r3   )rC   r   r   s      r6   rF   r  6  s      (
?$!A?s   r  )r   ri  r  rV   r   r   r{   ro   r^   r  r   from_iterabler  r+   r  rk  r  rl  rm  rn  )rk   r  relevant_matches_and_valuesr  rP   	top_linesbottom_lines	all_linestop_dedupedbottom_dedupedmerged_valuesr  s              @r6   r  SequenceLoadedParameter.merge  s    ', ,
(AA'J,
 '
# 8LEeU++&IILLOO,,JJ''  8		 '' (
3(
 
	    ()D E  
 '' (
"#>?(
 
	
 F#;Y#;#;<= DXl+Dh{.CDE
 h~67&JJMM''
 	
r8   r  r2   r  )r^   r_   r`   ra   rg  r   r  rj   r  r  rb   rs   rt   s   @r6   r  r    s)    UE LP
IF
 F
r8   r  c                  X   ^  \ rS rSrSr\r SU 4S jjrSU 4S jjr    S	S jr	Sr
U =r$ )
ObjectLoadedParameteriQ  zLLoadedParameter type that holds a mapping (i.e. object) of LoadedParameters.c                4   > X0l         [        TU ]	  XXEU5        g)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          r6   rj   ObjectLoadedParameter.__init__V  r  r8   c                H  > [         TU ]  XU R                  5      n[        U R                  [        5      (       ag  [        U R                  5      R                  5        H@  u  pV[        U[        5      (       d  M  UR                  UR                  XU   U5      5        MB     U$ r2   )	ri   r  rP   rV   r\  r   rR   ri  r  r  s          r6   r  $ObjectLoadedParameter.collect_errorsb  s    'tzzJ djj"566"4::.446
e_55MM,,X37GP 7
 r8   c           
        [         R                  U5      n[        U5       VVVs0 s Hx  n[        UR                  5      R                  5         HM  u  p4[        U[         5      (       d  M  UR                  R                  U5      [        R                  :X  d  MK  X4_MO     Mz     nnnn0 nU HP  n[        UR                  5      R                  5        H&  u  p4UR                  U/ 5      R                  U5        M(     MR     UR                  5        VVs0 s H  u  p7X7S   R                  U5      _M     nnn[        R                  " U R                   5      n	0 UEUER                  5        H  u  p4U	R#                  X45        M     [%        U R&                  U	U R                   U R(                  U R                  U R*                  S9$ s  snnnf s  snnf r  )ri  r  r  r   rP   rR   rV   rm  r  r   r   r  r  r  copydeepcopyr  r]  r  rk  rl  rn  r  s
             r6   r  ObjectLoadedParameter.mergen  s   
 %==jI
 &j1
1	"9??399;
5/2	 
 ))--c2m6I6II CJ; 1 	 
 #I"9??399;
&&sB/66u= < $ =H<M<M<O
<O[SC((<O 	 

 }}T%7%785Z595;;=JC$$S0 > %JJMM''
 	
5
 
s   AG++G
G Gr  r2   r  )r  zSequence[ObjectLoadedParameter]rV  r  )r^   r_   r`   ra   rg  objectr  rj   r  r  rb   rs   rt   s   @r6   r  r  Q  s7    VE LP
I
*
9*
	*
 *
r8   r  c                      \ rS rSrSrS rSrg)r\  i  zIDummy class to mark whether a Python object has config parameters within.c                V    0 n[        U 5      R                  5        H	  u  p#X1U'   M     U$ )z6
Return a serializable object with defaults filled in
)r   rR   )rk   serializableattrrP   s       r6   to_jsonConfigurationObject.to_json  s2     :++-KD!& . r8   r3   N)r^   r_   r`   ra   rg  r  rb   r3   r8   r6   r\  r\    s
    S	r8   r\  c                  R    \ rS rSrSrSrS	S jr\S 5       rS r	\
S 5       rS rSrg)
	Parameteri  Nc                    Xl         X l        g)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_defaultrn  )rk   r  ro  s      r6   rj   Parameter.__init__  s      %r8   c                T    [        SSU R                  5      nU R                  SU5      $ )zGReturns a DefaultValueRawParameter that wraps the actual default value.r  )rZ  r  load)rk   wrapped_defaults     r6   r  Parameter.default  s'     39iWyyO44r8   c                    / n/ nUR                   R                  5        HK  u  pg[        R                  XU5      u  pUb  UR	                  U5        U	(       d  M:  UR	                  U	5        MM     XE4$ )aa  
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_datarR   ParameterLoader!raw_parameters_from_single_sourcer  )
rk   r   namesr  r  multikey_exceptionsrK  raw_parametersr  errors
             r6   get_all_matchesParameter.get_all_matches  su      (0(9(9(?(?(A$H*LL^LE  u%u#**51 )B ++r8   c                    [        5       e)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   rk   r   r  s      r6   r  Parameter.load  s     "##r8   c                R   U R                   n [        X45      $ ! [         a  n[        U5      n[	        U[
        5      (       aH  SR                  [        SR                  UR                  R                  5       5      5      nUSU SU 3-  n[        XR                  X&5      eS nAff = f)Nr  r  r  rN   )r  r(   r&   rW   r  r   rH   r  r  r  r  r   rP   )rk   r   r{   rP   r  r  r|   r  s           r6   r'   Parameter.typify  s    ))		D(==  	Da&C,--))|'?'?'F'F'HI -dV2gY??'ggvCC	Ds   
 
B&A>B!!B&r  r2   )r^   r_   r`   ra   r  r  rj   r  r  r%  r   r  r'   rb   r3   r8   r6   r  r    sF    E M& 5 5
,. 
$ 
$Dr8   r  c                  6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )PrimitiveParameteri  z
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   > Uc  [        U5      OUU l        U R                  U l        [        TU ]  X5        g)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  r  ri   rj   )rk   r  r  ro  ro   s       r6   rj   PrimitiveParameter.__init__  s0     '3&:T']
!ZZ-r8   c           	         [        UU R                  UR                  U R                  5      UR	                  5       UR                  U R                  5      U R                  S9$ Nr  )r  r  rP   r  r   r   rn  r(  s      r6   r  PrimitiveParameter.load
  sQ    'JJKK**+MMOT//0''
 	
r8   r  NN)	r^   r_   r`   ra   rg  rj   r  rb   rs   rt   s   @r6   r-  r-    s    	.
 
r8   r-  c                  T   ^  \ rS rSrSr\r\" 5       S4U 4S jjrU 4S jrS r	Sr
U =r$ )MapParameteri  zTParameter type for a Configuration class that holds a map (i.e. dict) of Parameters.Nc                v   > Xl         U=(       a    [        U5      =(       d
    [        5       n[        TU ]  X#S9  g)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   ri   rj   rk   r  r  ro  ro   s       r6   rj   MapParameter.__init__  s1     *1j1AZ\8r8   c                R   > [         TU ]  XU5      u  pE[        S U 5       5      nXE4$ )Nc              3  B   #    U  H  oR                   c  M  Uv   M     g 7fr2   r   rC   r  s     r6   rF   /MapParameter.get_all_matches.<locals>.<genexpr>'       G7all7   	ri   r%  r   rk   r   r!  r  r  
exceptionsro   s         r6   r%  MapParameter.get_all_matches$  0    #g5d8LG7GG""r8   c           	        UR                  U R                  5      nUc@  [        U[        5       U R                  UR	                  5       [        5       U R
                  S9$ [        U[        5      (       d@  [        XUR                  UR                  R                  U R                  R                  5      e0 nUR                  U R                  5      R                  5        H$  u  pVU R                  R                  X5      nXtU'   M&     [        U[        U5      U R                  UR	                  5       UR                  U R                  5      U R
                  S9$ r1  )rP   r  r  r   r   rn  rV   r   r   r{   ro   r^   r  rR   r  r   )rk   r   r  rP   
loaded_maprO   child_valueloaded_child_values           r6   r  MapParameter.load*  s!   D../=%""++  %))"U\\5??+C+CTZZEXEX  
 %D,>,> ? E E GC!%!3!3!8!8!K0sO !H "z"MMOT//0''
 	
r8   r  )r^   r_   r`   ra   rg  r   r  rj   r%  r  rb   rs   rt   s   @r6   r5  r5    s&    ^E-7\d 9#
 
r8   r5  c                  F   ^  \ rS rSrSr\rSU 4S jjrU 4S jrS r	Sr
U =r$ )SequenceParameteriJ  zYParameter type for a Configuration class that holds a sequence (i.e. list) of Parameters.c                <   > Xl         X@l        [        TU ]  X#5        g)z
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   ri   rj   )rk   r  r  ro  r   ro   s        r6   rj   SequenceParameter.__init__O  s     * 0-r8   c                R   > [         TU ]  XU5      u  pE[        S U 5       5      nXE4$ )Nc              3  B   #    U  H  oR                   c  M  Uv   M     g 7fr2   r;  r<  s     r6   rF   4SequenceParameter.get_all_matches.<locals>.<genexpr>_  r>  r?  r@  rA  s         r6   r%  !SequenceParameter.get_all_matchesZ  s2     $g5d8LG7GG""r8   c           	     <   UR                  U 5      nUc0  [        USU R                  UR                  5       SU R                  S9$ [        U5      (       d@  [        XUR                  UR                  R                  U R                  R                  5      e/ nU H/  nU R                  R                  X5      nUR                  U5        M1     [        U[        U5      U R                  UR                  5       UR                  U R                  5      U R                  S9$ )Nr3   r  )rP   r  r  r   rn  r-   r   r{   ro   r^   r  r  r  r   r   )rk   r   r  rP   loaded_sequencerG  rH  s          r6   r  SequenceParameter.loadb  s   D!=*""++  %  "U\\5??+C+CTZZEXEX   K!%!3!3!8!8!K""#56 ! '/"MMOT//0''
 	
r8   )r  r   )r3   N,)r^   r_   r`   ra   rg  r   r  rj   r%  r  rb   rs   rt   s   @r6   rK  rK  J  s    cE	.#
 
r8   rK  c                  T   ^  \ rS rSrSr\r\" 5       S4U 4S jjrU 4S jr	S r
SrU =r$ )ObjectParameteri  zTParameter type for a Configuration class that holds an object with Parameter fields.Nc                0   > Xl         [        TU ]	  X#5        g)z
Args:
    element_type (object): The object type with parameter fields held in ObjectParameter.
    default (Sequence): default value, empty tuple if not given.
Nr  r7  s       r6   rj   ObjectParameter.__init__  s     *-r8   c                R   > [         TU ]  XU5      u  pE[        S U 5       5      nXE4$ )Nc              3  B   #    U  H  oR                   c  M  Uv   M     g 7fr2   r;  r<  s     r6   rF   2ObjectParameter.get_all_matches.<locals>.<genexpr>  r>  r?  r@  rA  s         r6   r%  ObjectParameter.get_all_matches  rD  r8   c           	        UR                  U R                  5      nUc0  [        US U R                  UR                  5       S U R                  S9$ [        U[        [        45      (       d@  [        XUR                  UR                  R                  U R                  R                  5      e[        U[        5      (       a  [        U5      n[        U R                  5      R                  5        VVs0 s H  u  pE[        U[        5      (       d  M  XE_M      nnn0 nUR                  5        H?  u  pEUR!                  U5      =n(       a  UR#                  X5      n	OUR$                  n	XU'   MA     [&        R(                  " U R                  5      n
UR                  5        H  u  pKU
R+                  XK5        M     [        UU
U R                  UR                  5       UR-                  U R                  5      U R                  S9$ s  snnf r1  )rP   r  r  r   rn  rV   r   r\  r   r{   ro   r^   r  r   rR   r  r  r  r  r	  r
  r]  r   )rk   r   r  rP   r^  parameter_typeobject_parameter_attrsloaded_attrsraw_child_valuerH  object_copyloaded_child_parameters               r6   r  ObjectParameter.load  s   D../=(""++  %'+>!?@@"U\\5??+C+CTZZEXEX 
 e011KE .2$2D2D-E-K-K-M"
-M)	.)4 &I%-M 	 "
 )?)E)E)G%I"'))I"666%3%8%8%O"%3%;%;"&8# *H mmD$6$671=1C1C1E-I##IF 2F %MMOT//0''
 	
)"
s   0H H r  )r^   r_   r`   ra   rg  r  r  r\  rj   r%  r  rb   rs   rt   s   @r6   rW  rW    s'    ^E-@-Bt .#0
 0
r8   rW  c                  d    \ rS rSrSrSS jrS r\S 5       r\S 5       r	S r
S r\S	 5       rS
rg)r  i  ze
ParameterLoader class contains the top level logic needed to load a parameter from start to
finish.
c                D    SU l         SU l        Xl        X l        X0l        g)z
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)rk  _namesr#  aliases_expandvars)rk   r_  ri  r   s       r6   rj   ParameterLoader.__init__  s"     
"	%r8   c                l    Xl         [        S [        U R                  U45       5       5      nX l        U$ )Nc              3  $   #    U  H  ov   M     g 7fr2   r3   )rC   r5   s     r6   rF   ,ParameterLoader._set_name.<locals>.<genexpr>  s     C&B1&Bs   )rk  	frozensetr   ri  rh  )rk   r   rh  s      r6   	_set_nameParameterLoader._set_name  s0     
CeDLL4'&BCCr8   c                H    U R                   c
  [        5       eU R                   $ r2   )rk  r%   r   s    r6   r   ParameterLoader.name  s    ::,..zzr8   c                H    U R                   c
  [        5       eU R                   $ r2   )rh  r%   r   s    r6   r!  ParameterLoader.names  s    ;;,..{{r8   c                   U R                   UR                  ;   a  UR                  U R                      $ U R                  R                  U R                   U R                  U5      u  p4U Vs/ s H(  oPR                  R                  U R                   U5      PM*     nnU(       a  US   R                  U5      OU R                  R                  nU R                  (       a  UR                  5       OUn UR                  S5      n	UR                  UR                  XS5      5        [        U5        W	UR                  U R                   '   U	$ s  snf ! [         a  n
UR                  U
5         S n
A
NKS n
A
ff = f)Nr   r  )r   _cache_r#  r%  r!  r  r  r  rj  r  r'   r  r  r   r  r   )rk   r  instance_typeraw_matchesr   r  r  mergedexpandedr  r  s              r6   __get__ParameterLoader.__get__  s+    99(((##DII.. #ii77		4::xX BMM99>>$))U3M /6!!'*499;L;L
 '+&6&66==?F	S__\2F MM(11(LQRV&,## N % 	MM!	s   +/E	1E 
E3E..E3c                X    [         R                  U R                  U R                  U5      $ r2   )r  r   r   r!  )rk   r#  s     r6   "_raw_parameters_from_single_source2ParameterLoader._raw_parameters_from_single_source  s$    @@IItzz>
 	
r8   c           	        U[        UR                  5       5      -  nU Vs0 s H  oDX$   _M	     nn[        U5      nUS:X  a  gUS:X  a$  [        [	        UR                  5       5      5      S 4$ X;   a/  XP   [        U[        [	        U5      5         R                  X05      4$ S [        U[        [	        U5      5         R                  X05      4$ s  snf )Nr   r3  r,   )ro  r   r   nextiterr  r   r{   )r   r!  r#  r   rO   r  numkeyss          r6   r   1ParameterLoader.raw_parameters_from_single_source  s     y!4!4!6777;<t++t<d)a<\W^^-./55\="3tDJ/077#   *tDJ/077   =s   C)rj  rk  rh  ri  r#  N)r3   F)r^   r_   r`   ra   rg  rj   rp  r  r   r!  r|  r  rX  r   rb   r3   r8   r6   r  r    sW    
&    <

  r8   r  c                  L   ^  \ rS rSrSrU 4S jr\SS j5       rU 4S jrSr	U =r
$ )ConfigurationTypei*  zmetaclass for Configurationc                   > [         TU ]  XU5        [        S U R                  R	                  5        5       5      U l        U R                  5         g )Nc              3  v   #    U  H/  u  p[        U[        5      (       d  M  UR                  U5      v   M1     g 7fr2   )rV   r  rp  )rC   r   ps      r6   rF   -ConfigurationType.__init__.<locals>.<genexpr>1  s1      $
/!_- AKK/s   99)ri   rj   r   __dict__rR   parameter_names _set_parameter_names_and_aliases)r   r   basesr  ro   s       r6   rj   ConfigurationType.__init__-  sI    d+ $ $
<<--/$
 
 	,,.r8   c                    U R                   R                  5        VVs0 s H  u  p[        U[        5      (       d  M  X_M      snn$ s  snnf r2   )r  rR   rV   r  )r   r   params      r6   _parameter_loaders$ConfigurationType._parameter_loaders:  sF      #||113
3%1 DK3
 	
 
s
   AAc                J   > [         TU ]  " U0 UD6nU R                  Ul        U$ r2   )ri   __call__r  )r   r   rm   rk   ro   s       r6   r  ConfigurationType.__call__B  s*    w00"%"8"8r8   )r  )rV  zdict[str, ParameterLoader])r^   r_   r`   ra   rg  rj   r  r  r  rb   rs   rt   s   @r6   r  r  *  s)    %/ 
 
 r8   r  z.condarcr>   DEFAULT_CONDARC_FILENAMEcondarcALTERNATIVE_CONDARC_FILENAME)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               J   ^ 0 TEUEmSU4S jjn[         R                  X05      $ )u  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R                  U R                  S5      =(       d)    U R                  S5      =(       d    U R                  S5      U R                  5       5      5      $ )Nnamedbracedpadded)rW   r  group)r  mappings    r6   convert"custom_expandvars.<locals>.convertu  sM    KKG$VH(=VXAV
 	
r8   )r  r<   )_RE_CUSTOM_EXPANDVARSsub)templater  rm   r  s    `  r6   custom_expandvarsr  [  s,    0 $#F#G
 !$$W77r8   c                      \ rS rSrSS jr\S 5       r\    SS j5       r\    SS j5       r	SS jr
SS jrS	 rSS
 jrS S!S jjrS rS rS rS rS r\S 5       rS rS rS"S jrS rS#S$S jjrS rS rSrg)%Configurationi  Nc                    0 U l         0 U l        [        5       U l        [	        [
        5      U l        U R                  " U40 UD6  U R                  U5        U R                  U5        g r2   )
r  rw  r   _reset_callbacksr   list_validation_errors_set_search_path_set_env_vars_set_argparse_args)rk   search_pathapp_nameargparse_argsrm   s        r6   rj   Configuration.__init__  sX      *"-d"3k4V48$.r8   c                b    [        S U R                  R                  5        5       5      U l        g)zEBuild parameter_names_and_aliases from the class's parameter loaders.c              3  `   #    U  H$  nUR                   =(       d    S   H  nUv   M	     M&     g7f)r3   Nrh  )rC   r  
alias_names      r6   rF   AConfiguration._set_parameter_names_and_aliases.<locals>.<genexpr>  s.      0
4 xx~2~
 - 4s   ,.N)r   r  r  parameter_names_and_aliasesrT  s    r6   r  .Configuration._set_parameter_names_and_aliases  s-     +0 0
++2240
 +
'r8   c              +    #    U  H  n[        U[        5      (       a  UnO3[        [        U5      [        40 UD6n[        U5      R                  5       nUR                  5       (       a.  UR                  [        ;   d  UR                  [        ;   a  Uv   M  UR                  5       (       d  M  S [        UR                  5       5       5        S h  vN   M     g  N	7f)Nc              3     #    U  H4  nUR                  5       (       d  M  UR                  [        ;   d  M0  Uv   M6     g 7fr2   )is_filesuffixYAML_EXTENSIONS)rC   subpaths     r6   rF   4Configuration._expand_search_path.<locals>.<genexpr>  s4      #9( -4^^-N G#9s   >>	>)rV   r   r  rW   r   
expanduserr  r   CONDARC_FILENAMESr  r  is_dirsortediterdir)r  rm   searchrg   r  s        r6   _expand_search_path!Configuration._expand_search_path  s     
 "F &$'',S['LVLH~002||~~		..$++2P
#)$,,.#9   "s   B'C-#CC
Cc              #     #    U H  n U[         R                  U5      4v   M     g ! [         a"  n[        R	                  SUU5         S nAMI  S nAff = f7f)Nz1Ignoring configuration file (%s) due to error:
%s)r  rP  rd   logwarning)r   r  rg   rN  s       r6   _load_search_pathConfiguration._load_search_path  sX     
  D,JJ4PPP   * H s*   A'A
AAAAAc                    [        U R                  " U40 UD65      U l        U R                  [	        U R                  U R                  5      5      5        U R                  5         U $ r2   )r   r  _search_path_set_raw_datadictr  _reset_cache)rk   r  rm   s      r6   r  Configuration._set_search_path  sT    &t'?'?'Vv'VW4 6 6t7H7H IJKr8   c                    Xl         [        R                  nX R                  ;   a  U R                  U	 U(       a"  [        R	                  U5      U R                  U'   U R                  5         U $ r2   )	_app_namer   r{   r  r   r  )rk   r  r{   s      r6   r  Configuration._set_env_vars  sW    ! !'']]"f%$3$G$G$QDMM&!r8   c                   [        US5      (       a  [        U5      R                  5       nOU(       d  SnOUR                  5       n[        U VVs0 s H  u  p4U[        Ld  M  X4_M     snn5      =U l        n[        R                  nXPR                  ;   a  U R                  U	 [        R                  U5      U R                  U'   U R                  5         U $ s  snnf )Nr  r3   )r   r   rR   r"   r/   _argparse_argsr  r{   r  r   r  )rk   r  rR   r   r   r{   s         r6   r   Configuration._set_argparse_args  s     =*-- '--/EE "'')E.6#5edaq}TQTe5/
 	
m
 &,,]]"f% 4 H H Wf 6s   C
#C
c                \    U R                   R                  U5        U R                  5         U $ r2   )r  updater  )rk   r  s     r6   r  Configuration._set_raw_data  s%    X&r8   c                d   ^^ [        UU4S jU R                  R                  5        5       S5      $ )a(  
Find the canonical parameter name for a given alias.

This method searches through all configuration parameters to find the canonical
parameter name that corresponds to the given alias. It's useful for resolving
parameter aliases to their primary names in configuration contexts.

Args:
    alias (str): The parameter alias to look up.
    ignore_private (bool, optional): If True (default), exclude private parameters
        (those starting with underscore) from the search. If False, include all
        parameters regardless of privacy.

Returns:
    str | None: The canonical parameter name if the alias is found, otherwise None.

Example:
    >>> config = Configuration()
    >>> config.name_for_alias("channel_priority")
    'channel_priority'
    >>> config.name_for_alias("unknown_alias")
    None
c              3     >#    U  HL  nTUR                   ;   d  M  T(       a"  UR                  R                  S 5      (       a  M>  UR                  v   MN     g7fr   N)ri  rk  r   )rC   r  aliasignore_privates     r6   rF   /Configuration.name_for_alias.<locals>.<genexpr>  sE      9AAII%  (qww/A/A#/F 9s   A%AAN)r  r  r  )rk   r  r  s    ``r6   name_for_aliasConfiguration.name_for_alias  s3    0 00779 
 	
r8   c                N   U R                   nX;   a  X!   $ SU-   nX2;   a  X#   $ U R                  R                  R                  5        HZ  u  pE[	        U[
        5      (       a  UR                  U:X  a  Us  $ [	        U[
        5      (       d  ME  U[        USS5      ;   d  MX  Us  $    g)z:Get parameter loader with fallback for missing parameters.r   rh  r3   N)r  ro   r  rR   rV   r  rk  r   )rk   ry   loadersprivate_namer   r  s         r6   _get_parameter_loader#Configuration._get_parameter_loader  s    ))$** ^+"((  >>2288:KD%11ekk^6S%11nxI 7  ; r8   c                H    0 U l         U R                   H
  nU" 5         M     U $ r2   )rw  r  rk   callbacks     r6   r  Configuration._reset_cache.  s#    --HJ .r8   c                :    U R                   R                  U5        g r2   )r  addr  s     r6   register_reset_callaback&Configuration.register_reset_callaback4  s    !!(+r8   c                (   0 n/ nU R                   U   nU R                   H  nU R                  U5      nUc  M  UR                  U5      u  pxU(       a  UR	                  U5        Ub}  UR
                  R                  XW5      n	 U	R                  UR                  5      n
U	R                  X
UR                  5      nU(       a  UR                  U5        M  XUR                  '   M  M     X#4$ ! [         a  nUR	                  U5         S nAM  S nAff = fr2   )r  r  r  r  r  r#  r  r'   r{   r  r  rO   r   )rk   r{   typed_valuesvalidation_errorsr#  rO   r  r  multikey_errorr  r  collected_errorsr  s                r6   check_sourceConfiguration.check_source7  s    v.''C2237I $-$P$P%!E !((8 #,>>#6#6s#B >"2"9"9%,,"GK (8'F'F5<<($ ()001AB2=UYY/ E (F .. - 0%,,Q//0s   C++
D5DDc                   ^  [        [        R                  " U 4S jT R                   5       5      5      n[	        U5        T R                  5         g )Nc              3  L   >#    U  H  nTR                  U5      S    v   M     g7f)r,   N)r  )rC   r{   rk   s     r6   rF   -Configuration.validate_all.<locals>.<genexpr>d  s$       ;H!!&)!,=r  )r  r   r  r  r   validate_configuration)rk   r  s   ` r6   validate_allConfiguration.validate_allb  sD       ;?==  

 	&'##%r8   c                     U " U0 UD6  g! [          a*  n[        US5      (       a  UR                  OU4s S nA$ S nAff = f)Nr   r3   )r\   r   r   )funcr   rm   r  s       r6   _collect_validation_error'Configuration._collect_validation_errork  sF    	>$!&!  " 	> '8 4 4AHH!==	>s    
?:??c                   ^  [         R                  " U 4S jT R                   5       5      nT R                  5       n[	        [        [         R                  " X45      5      5        g )Nc              3  Z   >#    U  H   n[         R                  [        TU5      v   M"     g 7fr2   )r  r  r   )rC   r   rk   s     r6   rF   7Configuration.validate_configuration.<locals>.<genexpr>t  s*      %
, 33GT4HH,s   (+)r   r  r  post_build_validationr   r   )rk   r   post_errorss   `  r6   r  $Configuration.validate_configurations  sQ    $$ %
,,%
 
 002U5../DEFGr8   c                    gr  r3   r   s    r6   r	  #Configuration.post_build_validation{  s    r8   c                4   0 n0 nU R                    H  nU R                  U5      u  X'   X#'   M     [        [        [        R
                  " UR                  5       5      5      5        UR                  5        VVs0 s H  u  pEU(       d  M  XE_M     snn$ s  snnf r2   )r  r  r   r   r   r  r  rR   )rk   r  r  r{   r   r   s         r6   collect_allConfiguration.collect_all~  s    mmF>B>O>OPV>W;L "3"; $U5../@/G/G/IJKL!-!3!3!5;!5!5;;;s   9B
Bc           	       ^	 XR                   ;  a  SU-   nU R                  U5      nUc  [        U5      eUR                  n[	        U[
        5      (       d  [        SU S35      eUR                  R                  S5      m	[        U	4S jUR                   5       5      nU R                  5       R                  T	S5      nUR                  n[        U5      [        :X  a  U/n[        U5      (       d  U/n[	        UR                  [
        5      (       d  [	        UR                  [         5      (       a  [        S U 5       5      nO[        S U 5       5      nUR"                  R$                  R'                  5       R)                  SS5      T	UUUR*                  R-                  S	5      UR)                  S
S5      R/                  5       S.n[	        U[0        5      (       a  UR2                  US'   U$ )Nr   Name '$' did not return a Parameter object.c              3  6   >#    U  H  oT:w  d  M
  Uv   M     g 7fr2   r3   )rC   r  r   s     r6   rF   3Configuration.describe_parameter.<locals>.<genexpr>  s     U+C%PT}+Cs   		rq   c              3     #    U  H8  oR                   R                  R                  5       R                  S S5      v   M:     g7f)r  rq   N)ro   r^   r   r   rC   _ets     r6   rF   r    s5      "SUC&&,,.66{BGGSUs   A Ac              3  8   #    U  H  oR                   v   M     g 7fr2   )r^   r  s     r6   rF   r    s     !="3,,"s   r  z<<describe>>rA    )r_  r   ri  element_typesdefault_valuedescriptionr   )r  r  r4  r#  rV   r  rI   r   lstripr   ri  get_descriptionsr  r  r	   r-   r\  ro   r^   r   r   r  r'   r   rK  r   )
rk   ry   parameter_loaderr  ri  r  etr  detailsr   s
            @r6   describe_parameter Configuration.describe_parameter  s   !5!55 >1N55nE#>**$))	)Y//((LM 
  $$++C0U+;+C+CUU++-11$;$$8xB"~~Bi--y99Z##%8>
 >
 " "SU" M "!="!==M (11::@@BJJR *&..55nE&..tS9??A	
 i!233*3*D*DG&'r8   c                    U(       a=  [        [        R                  S U R                  R	                  5        5       5      5      $ [        [        S U R                   5       5      5      $ )Nc              3  J   #    U  H  oR                     H  o"v   M     M     g 7fr2   r  )rC   r  r   s      r6   rF   0Configuration.list_parameters.<locals>.<genexpr>  s      "BQxxtDxD"Bs   !#c              3  B   #    U  H  oR                  S 5      v   M     g7fr  )r  )rC   r   s     r6   rF   r'    s     N9MKK,,9Ms   )r   r  fromkeysr  r  r  r  )rk   ri  s     r6   list_parametersConfiguration.list_parameters  sX     "&"9"9"@"@"B  
 VN9M9MNNOOr8   c                    XR                   ;  a  SU-   nU R                  U5      nUc  [        U5      eUR                  n[	        U[
        5      (       d  [        SU S35      eUR                  XU5      $ )Nr   r  r  )r  r  r4  r#  rV   r  rI   r'   )rk   ry   rP   r{   r   r  s         r6   typify_parameterConfiguration.typify_parameter  s    !5!55 >1N55nE#>**$))	)Y//((LM  >>r8   c                    [        5       er2   r   r   s    r6   r  Configuration.get_descriptions  s    !##r8   )r  r  rw  r  r  r  r  )r3   NN)r  r?   rV  Iterable[Path])r  r1  rV  zIterable[tuple[Path, dict]])r  r?   r2   )r  zMapping[Hashable, dict])T)r  rW   r  boolrV  z
str | None)rV  zdict[str | Path, dict])F)ri  r2  )r^   r_   r`   ra   rj   r   r  rX  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r	  r  r#  r*  r-  r  rb   r3   r8   r6   r  r    s    
/ 
 
  
 0 # 
% :
 
D,,)/V&  H</bP?"$r8   r  c                   ^  U 4S jnU$ )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                4   >^  [        T 5      U U4S j5       nU$ )Nc            
     B  > T" U 0 UD6n0 nU Hv  nUR                  T5      nUc+  [        R                  SU STR                   ST S35        MB  XS;   a+  [        R                  SU STR                   SU S35        Mr  XCU'   Mx     [	        UR                  5       5      $ )NzConfiguration: skipping z for "z"; unique key "z" not present on mappingz
"; value "z" already present)r  r  r$  r^   r   r  )r   rm   sequence_mapnew_sequence_mappingr  unique_key_valuer  
unique_keys         r6   wrapper8unique_sequence_map.<locals>.inner_wrap.<locals>.wrapper  s    00L#% '#*;;z#: #+II27)6$-- Q&<'?A #;II27)6$-- Q,-->@ 9@%56# (& -44677r8   )r   )r  r:  r9  s   ` r6   
inner_wrap'unique_sequence_map.<locals>.inner_wrap  s     	t	8 
	82 r8   r3   )r9  r<  s   ` r6   unique_sequence_mapr>    s    : r8   )z  )r  rW   r  zMapping[str, Any]rV  rW   )r9  rW   )rg  
__future__r   r	  r$  abcr   r   collectionsr   collections.abcr   enumr   r	   	functoolsr
   r   	itertoolsr   loggingr   osr   os.pathr   pathlibr   rer   r   r   r   r   typingr   boltons.setutilsr   r   r   r   _getFreezeConversionMapr   	_registerruamel.yaml.commentsr   r   ruamel.yaml.readerr   ruamel.yaml.scannerr   rq   r    r!   auxlib.collectionr"   r#   r$   auxlib.exceptionsr%   auxlib.type_coercionr&   r'   r(   base.constantsr)   r*   common.iteratorsr+   compatr-   r.   	constantsr/   	serializer0   r9   r:   r;   r<   r=   r>   common.pathr?   r^   r  r   rJ   rT   rZ   r\   rd   rv   r   r   r   r   r   r   r   r   r  r  rZ  ri  r  r  r  r  r\  r  r-  r5  rK  rW  r  r#  r  r  __annotations__r  r  r  	idpatternr  r  r  r>  r3   r8   r6   <module>r]     s   #  
 ' # #  "      + +    ' - H , ; * , * 5 5 : S S = % /  &(( dK <<!'L	0V	 	J/ J(( (	? 	?K K

O 

2?,> 2
+D 2W @*Ll *LZ
< 
:E8| E8P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 < #- % ,&/ e /-/KL #
##$ % &&' ( ##$ %	 w
   13"8"8-"8"8JR$/ R$j
%r8   