
    \Zi              	      X   % 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%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/J0r0  SSK1J2r2J3r3  SSK4J5r5J6r6J7r7  SSK8J9r9  SSK:J;r;J<r<J=r=  SSK>J?r?J@r@  SSKAJBrB  SSKCJDrDJErE  SS KFJGrG  SS!KHJIrI  \\'" 5       ;  a
  \)" \S" 5        C'C)\#(       a   SS#K
JJrJJKrKJLrLJMrM  SS$KJNrN  SS%K"JOrOJPrP  SS&KQJRrR  \" \S5      rT\$" 5       rUSoS' jrVSoS( jrWS) rX " S* S+\25      rY " S, S-\Y5      rZ " S. S/\Y5      r[ " S0 S1\[5      r\ " S2 S3\[5      r] " S4 S5\[5      r^ " S6 S7\3\Y5      r_S8 r` " S9 S:\5      ra " S; S<\S=9rb " S> S?\b5      rc " S@ SA\b5      rd " SB SC\b5      re " SD SE\b5      rf " SF SG\S=9rg " SH SI\g5      rh " SJ SK\g5      ri " SL SM\g5      rj " SN SO\g5      rk " SP SQ5      rl " SR SS\S=9rm " ST SU\m5      rn " SV SW\m5      ro " SX SY\m5      rp " SZ S[\m5      rq " S\ S]5      rr " S^ S_\s5      rtS`ruSa\vSb'   ScrwSa\vSd'   \u\w4rxSery\" Sf\!R                   Sg\!R                   Sh\!R                   Si3\\-  Sj9r{0 4     SpSk jjr| " Sl Sm\tS=9r}SqSn jr~g)rz
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)
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>r6   6   s    a    )Callable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- Nr2   ).0itempaddings     r5   	<genexpr>pretty_list.<locals>.<genexpr>K   s     C($G9Btf-(s   )r,   join	TypeErrorpretty_list)iterablerE   s    `r5   rJ   rJ   G   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): Nr2   )rC   keyvaluerE   s      r5   rF   pretty_map.<locals>.<genexpr>Q   s$     UBTJCyRw/BTs   )rH   items)
dictionaryrE   s    `r5   
pretty_maprT   P   s!    99U*BRBRBTUUUr7   c                R    [        U [        [        45      (       a  [        U 5      $ U $ r1   )
isinstancestrbytesr   )
unexpandeds    r5   expand_environment_variablesrZ   T   s$    *sEl++*%%r7   c                      \ rS rSrSrg)ConfigurationError[   r2   N)__name__
__module____qualname____firstlineno____static_attributes__r2   r7   r5   r\   r\   [   s    r7   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        r5   rj   ConfigurationLoadError.__init__`   s"    J3I$I&Ir7   r2   ) r^   r_   r`   ra   rj   rb   __classcell__ro   s   @r5   rd   rd   _   s    J Jr7   rd   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )ValidationErrore   c                L   > Xl         X l        X0l        [        TU ]  " U40 UD6  g r1   )parameter_nameparameter_valuesourceri   rj   )rk   ry   rz   r{   msgrm   ro   s         r5   rj   ValidationError.__init__f   s&    ,.''r7   )ry   rz   r{   r1   rr   rt   s   @r5   rv   rv   e   s    ( (r7   rv   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )MultipleKeysErrorm   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        r5   rj   MultipleKeysError.__init__n   sM    	,VHC4 ! "..;_A? 	
 	f>r7   )r   r{   rr   rt   s   @r5   r   r   m   s    ? ?r7   r   c                  .   ^  \ rS rSr SU 4S jjrSrU =r$ )InvalidTypeErrory   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          r5   rj   InvalidTypeError.__init__z   sc     %&;^,C/B-PVxWablam n!!,[!9 :<  	&Jr7   )r   r   r1   rr   rt   s   @r5   r   r   y   s    TX
K 
Kr7   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        r5   rj   CustomValidationError.__init__   s@    ^,C/B-(.(8: 	 	
r7   r2   rr   rt   s   @r5   r   r      s    	
 	
r7   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 r1   rh   )rk   errorsargsrm   ro   s       r5   rj   MultiValidationError.__init__   s    1$1&1r7   r2   rr   rt   s   @r5   r   r      s    2 2r7   r   c                P    U (       d  g[        U 5      S:X  a  U S   e[        U 5      e)NTr+   r   )lenr   )r   s    r5   raise_errorsr      s(    	V	Qi"6**r7   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                    $ r1   rP   rk   s    r5   __str__ParameterFlag.__str__   s    **r7   c                
    X   $ r1   r2   )clsnames     r5   	from_nameParameterFlag.from_name   s
    yr7   c                    U " U5      $ r1   r2   )r   rP   s     r5   
from_valueParameterFlag.from_value   s    5zr7   c                t     UR                  S5      nU R                  U5      $ ! [        [        4 a     g f = f)Nz!#)stripr   
ValueErrorAttributeError)r   strings     r5   from_stringParameterFlag.from_string   s;    	\\$'F>>&))N+ 		s   !$ 77r2   N)r^   r_   r`   ra   r   r   r   r   classmethodr   r   r   rb   r2   r7   r5   r   r      sR    E
CF      r7   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       r5   rj   RawParameter.__init__   s7    	('..w7DO 	('O	(s   % 88c                *    [        [        U 5      5      $ r1   )rW   varsr   s    r5   __repr__RawParameter.__repr__   s    4:r7   c                    [        5       er1   NotImplementedErrorrk   parameter_objs     r5   rP   RawParameter.value       !##r7   c                    [        5       er1   r   r   s    r5   keyflagRawParameter.keyflag   r   r7   c                    [        5       er1   r   r   s     r5   
valueflagsRawParameter.valueflags   r   r7   c           
     ^    U(       a  U Vs0 s H  o3U " XX#   5      _M     sn$ [         $ s  snf r1   )	EMPTY_MAPr   r{   from_maprO   s       r5   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   r2   r7   r5   r   r      s\    ( $ $ $ $ $ $  r7   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r1   )r   r{   rO   )rC   vrk   s     r5   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r1   )r   )rC   vvs     r5   rF   r      s     W/V((**/V   r   )
hasattrrV   r   rW   rI   getattrtuplesplit'_EnvRawParameter__important_split_valuer   rk   r   r   s   `  r5   rP   EnvRawParameter.value   s     ="455doos33 899&}6HI Wt/D/DEU/VW   //288::r7   c                X    [        U R                  5      S:  a  [        R                  $ S $ Nr   )r   r   r   r   r   s    r5   r   EnvRawParameter.keyflag   s&    &)$*F*F&G1&L}""VRVVr7   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   Nr2   )rC   _s     r5   rF   -EnvRawParameter.valueflags.<locals>.<genexpr>   s     M%L%Ls   r   )r   r   r   r   r   r   r   r   s      r5   r   EnvRawParameter.valueflags   sY    ="455&}6HIMT__%:%:;K%LMMM//288::r7   c                8    U R                   R                  S5      $ )Nz
!important)r   r   r   s    r5   __important_split_value'EnvRawParameter.__important_split_value   s    $$\22r7   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         r5   r   #EnvRawParameter.make_raw_parameters   s    mmo&a(  
'||H% 2AIIhA&,,.1' 	 

 w*?+A+A7KK
s   B&Br2   )r^   r_   r`   ra   r)   r{   rP   r   r   propertyr   r   r   rb   rs   rt   s   @r5   r   r      sB    F; W; 3 3 L Lr7   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      $ r1   )
r,   r   ranger   appendr  r{   rO   r   r   )rk   r   children_valuesis       r5   rP   ArgParseRawParameter.value  sx     doo&& O3t/0&&(dhhPQ@RS 1 ))doo..r7   c                    g r1   r2   r   s    r5   r   ArgParseRawParameter.keyflag      r7   c                4    [        U[        5      (       a  S $ S$ Nr2   )rV   PrimitiveLoadedParameterr   s     r5   r   ArgParseRawParameter.valueflags  s    !-1IJJtRPRRr7   c                @   > [         TU ]  [        R                  U5      $ r1   )ri   r   r  r{   )r   args_from_argparsero   s     r5   r   (ArgParseRawParameter.make_raw_parameters  s!    w* '');
 	
r7   r2   )r^   r_   r`   ra   r(   r{   rP   r   r   r   r   rb   rs   rt   s   @r5   r  r    s,    F/S 
 
r7   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r1   )r   r   )rC   ss     r5   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             r5   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                   $ r1   r   r   s     r5   rP   YamlRawParameter.valueM      {{r7   c                @    [         R                  U R                  5      $ r1   )r   r   r  r   s    r5   r   YamlRawParameter.keyflagP  s    (():):;;r7   c                    U R                   $ r1   )r  r   s     r5   r   YamlRawParameter.valueflagsS  s       r7   c                     U R                   R                  U   S   R                  R                  5       $ ! [        [
        4 a     g f = fr   carR   rP   r   r   KeyError)commented_dictrO   s     r5   _get_yaml_key_comment&YamlRawParameter._get_yaml_key_commentV  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r1   )r  r   r  _get_yaml_list_comment_itemr3  rR   r   
IndexErrorr4  rI   r   )r   rP   list_commentsr
  s       r5   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    r5   r9  ,YamlRawParameter._get_yaml_list_comment_itemj  sI     77==&&(0D071:##))+3t3r7   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      r5   r!  'YamlRawParameter._get_yaml_map_commentss  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 r1   )r6  r   r   s       r5   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)openr/   loadsr   problem_markrd   rE  rF  r   rG  r   r   )r   filepathfhyaml_objerrmarks         r5   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 r1   )rP  cache_clearr   s    r5   rS  YamlRawParameter.cache_clear  s    ))557r7   )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   @r5   r  r  %  s    #/J<!   
$ 
$ 4 4     
L  L< 8 8r7   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r1   )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             r5   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,..r7   c                    U R                   $ r1   r*  r   s     r5   rP   DefaultValueRawParameter.value  r,  r7   c                    g r1   r2   r   s    r5   r    DefaultValueRawParameter.keyflag  r  r7   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     r5   r   #DefaultValueRawParameter.valueflags  ss    doow//<(()<==..99,..r7   r*  )r^   r_   r`   ra   __doc__rj   rP   r   r   rb   rs   rt   s   @r5   rZ  rZ    s    P/:/ /r7   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         r5   rj   LoadedParameter.__init__  s     

 &%r7   c                d    [        U5      [        U 5      L a  U R                  UR                  :H  $ gNFr#  rP   rk   others     r5   __eq__LoadedParameter.__eq__  (    ;$t*$::,,r7   c                ,    [        U R                  5      $ r1   hashrP   r   s    r5   __hash__LoadedParameter.__hash__       DJJr7   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         r5   collect_errorsLoadedParameter.collect_errors  s     +zz22MM JJT$**5Etzz  )%%k2Fodjj+NO
 	 FC(()$**k6R r7   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r1   expand)rC   r   r   s      r5   rF   )LoadedParameter.expand.<locals>.<genexpr>&  s     (XEWTQ!XXZEWs    "c              3  @   #    U  H  oR                  5       v   M     g 7fr1   r  )rC   r   s     r5   rF   r  (  s     (HZZr   )rV   rP   r   r#  rR   r,   r\  r   ri  r]  r  rZ   )rk   	new_valuer^  r_  s       r5   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
r7   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     r5   mergeLoadedParameter.merge3  s     "##r7   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         r5   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r1   r&   )rC   r   r   r{   s      r5   rF   9LoadedParameter._typify_data_structure.<locals>.<genexpr>Y  s     O88F#34   !$c              3  D   >#    U  H  oR                  T5      v   M     g 7fr1   r  )rC   r   r{   s     r5   rF   r  [  s     ?Axx//s    )rV   r   r#  rR   r,   r\  r   ri  r]  r&   rW   r  )rP   r{   	type_hintr^  r_  s    `   r5   r  &LoadedParameter._typify_data_structureV  s    eW%%;OOOO;????233)-e):):)<%	j/::%%i1B1B61JK *= Luc""9d++9c**
 U##%++r7   c                :    U R                   [        R                  L $ r1   )rl  r   r   )loaded_parameters    r5   _match_key_is_important'LoadedParameter._match_key_is_importantm  s    ((M,?,???r7   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  r3   s    r5   r6   :LoadedParameter._first_important_matches.<locals>.<lambda>u  s    o==adCr7   c                    U S   $ )Nr   r2   r3   s    r5   r6   r  v  s    AaDr7   )applyr+   )r"   	enumerate)r  idxs     r5   _first_important_matches(LoadedParameter._first_important_matchesq  s6    gC 

 +w=79S1W+==r7   )rk  rn  rl  rP   rm  r1   
<<merged>>)r^   r_   r`   ra   r  r  rj   rv  r|  r  r  r   r  r&   rX  r  r  r  rb   r2   r7   r5   ri  ri    s    E M&$
 4, 	$ 	$J. , ,, @ @ > >r7   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          r5   rj   !PrimitiveLoadedParameter.__init__  s!     "
)hZHr7   c                d    [        U5      [        U 5      L a  U R                  UR                  :H  $ grr  rs  rt  s     r5   rv  PrimitiveLoadedParameter.__eq__  rx  r7   c                ,    [        U R                  5      $ r1   rz  r   s    r5   r|  !PrimitiveLoadedParameter.__hash__  r~  r7   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$ r1   r2   r3   s    r5   r6   0PrimitiveLoadedParameter.merge.<locals>.<lambda>  s    Qd]r7   )r"   ri  r  r#   r$   )rk   r  important_match
last_matchs       r5   r  PrimitiveLoadedParameter.merge  sK    _<<d
 &""'#:DI
!(**r7   r  r  r1   )r^   r_   r`   ra   rg  rj   rv  r|  r  rb   rs   rt   s   @r5   r  r  {  s)     LP
I
 
+ 
+r7   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          r5   rj   MapLoadedParameter.__init__       *hZHr7   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$ r1   )ri   r  rP   rV   r   rR   extendrk   r  r  r{   r   rO   rP   ro   s          r5   r  !MapLoadedParameter.collect_errors  sg    'tzzJ djj'**"jj..0
e228=MvVW 1r7   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
             r5   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  r1   r  )r  zSequence[MapLoadedParameter]rV  r  )r^   r_   r`   ra   rg  r   r  rj   r  r  rb   rs   rt   s   @r5   r  r    s'    PE LP
I.
 .
r7   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          r5   rj    SequenceLoadedParameter.__init__  r  r7   c                   > [         TU ]  XU R                  5      n[        U R                  5       H)  u  pVUR	                  UR                  XU   U5      5        M+     U$ r1   )ri   r  rP   r  r  )rk   r  r  r{   r   r  elementro   s          r5   r  &SequenceLoadedParameter.collect_errors   sP    'tzzJ%djj1LCMM'00s;KVTU 2r7   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r1   r   )rC   matchs     r5   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r1   r2   )rC   rE  flagmarkers      r5   rF   JSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>  s#      &I
v~ D&Is   	r2   )r   ziprP   rm  )r  r  s    `r5   get_marked_lines7SequenceLoadedParameter.merge.<locals>.get_marked_lines  s?       &)%++u7H7H&I  r7   c              3  V   >#    U  H  u  pT" U[         R                  5      v   M      g 7fr1   )r   r   )rC   mr   r  s      r5   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r1   )r   r   )rC   r  r   r  s      r5   rF   r  -  s*        EHE !(<(<== Er  c              3  *   #    U  H	  u  pUv   M     g 7fr1   r2   )rC   r   r   s      r5   rF   r  5  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              @r5   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''
 	
r7   r  r1   r  )r^   r_   r`   ra   rg  r   r  rj   r  r  rb   rs   rt   s   @r5   r  r    s)    UE LP
IF
 F
r7   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$ )
ObjectLoadedParameteriP  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          r5   rj   ObjectLoadedParameter.__init__U  r  r7   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$ r1   )	ri   r  rP   rV   r\  r   rR   ri  r  r  s          r5   r  $ObjectLoadedParameter.collect_errorsa  s    'tzzJ djj"566"4::.446
e_55MM,,X37GP 7
 r7   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
             r5   r  ObjectLoadedParameter.mergem  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  r1   r  )r  zSequence[ObjectLoadedParameter]rV  r  )r^   r_   r`   ra   rg  objectr  rj   r  r  rb   rs   rt   s   @r5   r  r  P  s7    VE LP
I
*
9*
	*
 *
r7   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       r5   to_jsonConfigurationObject.to_json  s2     :++-KD!& . r7   r2   N)r^   r_   r`   ra   rg  r  rb   r2   r7   r5   r\  r\    s
    S	r7   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      r5   rj   Parameter.__init__  s      %r7   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     r5   r  Parameter.default  s'     39iWyyO44r7   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
             r5   get_all_matchesParameter.get_all_matches  su      (0(9(9(?(?(A$H*LL^LE  u%u#**51 )B ++r7   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      r5   r  Parameter.load  s     "##r7   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           r5   r&   Parameter.typify  s    ))		D(==  	Da&C,--))|'?'?'F'F'HI -dV2gY??'ggvCC	Ds   
 
B&A>B!!B&r  r1   )r^   r_   r`   ra   r  r  rj   r  r  r%  r   r  r&   rb   r2   r7   r5   r  r    sF    E M& 5 5
,. 
$ 
$Dr7   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       r5   rj   PrimitiveParameter.__init__  s0     '3&:T']
!ZZ-r7   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      r5   r  PrimitiveParameter.load	  sQ    'JJKK**+MMOT//0''
 	
r7   r  NN)	r^   r_   r`   ra   rg  rj   r  rb   rs   rt   s   @r5   r-  r-    s    	.
 
r7   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       r5   rj   MapParameter.__init__  s1     *1j1AZ\8r7   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r1   r   rC   r  s     r5   rF   /MapParameter.get_all_matches.<locals>.<genexpr>&       G7all7   	ri   r%  r   rk   r   r!  r  r  
exceptionsro   s         r5   r%  MapParameter.get_all_matches#  0    #g5d8LG7GG""r7   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           r5   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''
 	
r7   r  )r^   r_   r`   ra   rg  r   r  rj   r%  r  rb   rs   rt   s   @r5   r5  r5    s&    ^E-7\d 9#
 
r7   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$ )SequenceParameteriI  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        r5   rj   SequenceParameter.__init__N  s     * 0-r7   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r1   r;  r<  s     r5   rF   4SequenceParameter.get_all_matches.<locals>.<genexpr>^  r>  r?  r@  rA  s         r5   r%  !SequenceParameter.get_all_matchesY  s2     $g5d8LG7GG""r7   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$ )Nr2   r  )rP   r  r  r   rn  r,   r   r{   ro   r^   r  r  r  r   r   )rk   r   r  rP   loaded_sequencerG  rH  s          r5   r  SequenceParameter.loada  s   D!=*""++  %  "U\\5??+C+CTZZEXEX   K!%!3!3!8!8!K""#56 ! '/"MMOT//0''
 	
r7   )r  r   )r2   N,)r^   r_   r`   ra   rg  r   r  rj   r%  r  rb   rs   rt   s   @r5   rK  rK  I  s    cE	.#
 
r7   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       r5   rj   ObjectParameter.__init__  s     *-r7   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r1   r;  r<  s     r5   rF   2ObjectParameter.get_all_matches.<locals>.<genexpr>  r>  r?  r@  rA  s         r5   r%  ObjectParameter.get_all_matches  rD  r7   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               r5   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   @r5   rW  rW    s'    ^E-@-Bt .#0
 0
r7   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       r5   rj   ParameterLoader.__init__  s"     
"	%r7   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r1   r2   )rC   r4   s     r5   rF   ,ParameterLoader._set_name.<locals>.<genexpr>  s     C&B1&Bs   )rk  	frozensetr   ri  rh  )rk   r   rh  s      r5   	_set_nameParameterLoader._set_name  s0     
CeDLL4'&BCCr7   c                H    U R                   c
  [        5       eU R                   $ r1   )rk  r$   r   s    r5   r   ParameterLoader.name  s    ::,..zzr7   c                H    U R                   c
  [        5       eU R                   $ r1   )rh  r$   r   s    r5   r!  ParameterLoader.names  s    ;;,..{{r7   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              r5   __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      $ r1   )r  r   r   r!  )rk   r#  s     r5   "_raw_parameters_from_single_source2ParameterLoader._raw_parameters_from_single_source  s$    @@IItzz>
 	
r7   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          r5   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)r2   F)r^   r_   r`   ra   rg  rj   rp  r  r   r!  r|  r  rX  r   rb   r2   r7   r5   r  r    sW    
&    <

  r7   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r1   )rV   r  rp  )rC   r   ps      r5   rF   -ConfigurationType.__init__.<locals>.<genexpr>0  s1      $
/!_- AKK/s   99)ri   rj   r   __dict__rR   parameter_names _set_parameter_names_and_aliases)r   r   basesr  ro   s       r5   rj   ConfigurationType.__init__,  sI    d+ $ $
<<--/$
 
 	,,.r7   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 r1   )r  rR   rV   r  )r   r   params      r5   _parameter_loaders$ConfigurationType._parameter_loaders9  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$ r1   )ri   __call__r  )r   r   rm   rk   ro   s       r5   r  ConfigurationType.__call__A  s*    w00"%"8"8r7   )r  )rV  zdict[str, ParameterLoader])r^   r_   r`   ra   rg  rj   r  r  r  rb   rs   rt   s   @r5   r  r  )  s)    %/ 
 
 r7   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    r5   convert"custom_expandvars.<locals>.convertt  sM    KKG$VH(=VXAV
 	
r7   )r  r<   )_RE_CUSTOM_EXPANDVARSsub)templater  rm   r  s    `  r5   custom_expandvarsr  Z  s,    0 $#F#G
 !$$W77r7   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        0 U l        [        [        5      U l        U R                  " U40 UD6  U R                  U5        U R                  U5        g r1   )	r  rw  _reset_callbacksr   list_validation_errors_set_search_path_set_env_vars_set_argparse_args)rk   search_pathapp_nameargparse_argsrm   s        r5   rj   Configuration.__init__  sV     68"-d"3k4V48$.r7   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)r2   Nrh  )rC   r  
alias_names      r5   rF   AConfiguration._set_parameter_names_and_aliases.<locals>.<genexpr>  s.      0
4 xx~2~
 - 4s   ,.N)r   r  r  parameter_names_and_aliasesrT  s    r5   r  .Configuration._set_parameter_names_and_aliases  s-     +0 0
++2240
 +
'r7   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r1   )is_filesuffixYAML_EXTENSIONS)rC   subpaths     r5   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        r5   _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5       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*   r  rP  rd   logwarning)r   r  rg   rN  s       r5   _load_search_pathConfiguration._load_search_path  s]     
 ;'D,JJ4PPP ( * H s*   A0A
AAAAAc                    U R                   " U40 UD6U l        U R                  [        U R	                  U R                  5      5      5        U R                  5         U $ r1   )r  _search_path_set_raw_datadictr  _reset_cache)rk   r  rm   s      r5   r  Configuration._set_search_path  sO     44[KFK4 6 6t7H7H IJKr7   c                    Xl         [        R                  nX R                  ;   a  U R                  U	 U(       a"  [        R	                  U5      U R                  U'   U R                  5         U $ r1   )	_app_namer   r{   r  r   r  )rk   r  r{   s      r5   r  Configuration._set_env_vars  sW    ! !'']]"f%$3$G$G$QDMM&!r7   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  r2   )r   r   rR   r!   r.   _argparse_argsr  r{   r  r   r  )rk   r  rR   r   r   r{   s         r5   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 $ r1   )r  updater  )rk   r  s     r5   r  Configuration._set_raw_data  s%    X&r7   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     r5   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    ``r5   name_for_aliasConfiguration.name_for_alias  s3    0 00779 
 	
r7   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  r2   N)r  ro   r  rR   rV   r  rk  r   )rk   ry   loadersprivate_namer   r  s         r5   _get_parameter_loader#Configuration._get_parameter_loader  s    ))$** ^+"((  >>2288:KD%11ekk^6S%11nxI 7  ; r7   c                H    0 U l         U R                   H
  nU" 5         M     U $ r1   )rw  r  rk   callbacks     r5   r  Configuration._reset_cache-  s#    --HJ .r7   c                <    U R                   R                  US 5        g r1   )r  r  r  s     r5   register_reset_callaback&Configuration.register_reset_callaback3  s    ((48r7   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r1   )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                r5   check_sourceConfiguration.check_source6  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     r5   rF   -Configuration.validate_all.<locals>.<genexpr>c  s$       ;H!!&)!,=r  )r  r   r  r  r   validate_configuration)rk   r  s   ` r5   validate_allConfiguration.validate_alla  sD       ;?==  

 	&'##%r7   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   r2   )r\   r   r   )funcr   rm   r  s       r5   _collect_validation_error'Configuration._collect_validation_errorj  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r1   )r  r  r   )rC   r   rk   s     r5   rF   7Configuration.validate_configuration.<locals>.<genexpr>s  s*      %
, 33GT4HH,s   (+)r   r  r  post_build_validationr   r   )rk   r   post_errorss   `  r5   r  $Configuration.validate_configurationr  sQ    $$ %
,,%
 
 002U5../DEFGr7   c                    gr  r2   r   s    r5   r  #Configuration.post_build_validationz  s    r7   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 r1   )r  r  r   r   r   r  r  rR   )rk   r  r  r{   r   r   s         r5   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r1   r2   )rC   r  r   s     r5   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     r5   rF   r    s5      "SUC&&,,.66{BGGSUs   A Ac              3  8   #    U  H  oR                   v   M     g 7fr1   )r^   r  s     r5   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
            @r5   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&'r7   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r1   r  )rC   r  r   s      r5   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     r5   rF   r&    s     N9MKK,,9Ms   )r   r  fromkeysr  r  r  r  )rk   ri  s     r5   list_parametersConfiguration.list_parameters  sX     "&"9"9"@"@"B  
 VN9M9MNNOOr7   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         r5   typify_parameterConfiguration.typify_parameter  s    !5!55 >1N55nE#>**$))	)Y//((LM  >>r7   c                    [        5       er1   r   r   s    r5   r  Configuration.get_descriptions  s    !##r7   )r  r  rw  r  r  r  r  )r2   NN)r  r?   rV  Iterable[Path])r  r0  rV  zIterable[tuple[Path, dict]])r  r?   r1   )r  zMapping[Hashable, dict])T)r  rW   r  boolrV  z
str | None)rV  zdict[str | Path, dict])F)ri  r1  )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   r2   r7   r5   r  r    s    
/ 
 
  
 0 # 
% :
 
D,9)/V&  H</bP?"$r7   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         r5   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7r7   )r   )r  r9  r8  s   ` r5   
inner_wrap'unique_sequence_map.<locals>.inner_wrap  s     	t	8 
	82 r7   r2   )r8  r;  s   ` r5   unique_sequence_mapr=    s    : r7   )z  )r  rW   r  zMapping[str, Any]rV  rW   )r8  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   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.   	serializer/   r8   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=  r2   r7   r5   <module>r[     s   #  
 ' # #  "      + +    - H , ; * , * 5 5 : S S = % /  &(( dK FF!'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
%r7   