
    wBfF              	      v   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z>m?Z? ddl@mAZA ddlBmCZC 	 dd lDmEZEmDZD dd!lDmFZG dd"lDmHZI e eG       vr
 eIed#        [G[Ie"rdd&lmMZM dd'l!mNZNmOZOmPZPmQZQ  eeR      ZS eD       ZTdod(ZUdod)ZVd* ZW G d+ d,e-      ZX G d- d.eX      ZY G d/ d0eX      ZZ G d1 d2eZ      Z[ G d3 d4eZ      Z\ G d5 d6eZ      Z] G d7 d8e.eX      Z^d9 Z_ G d: d;e      Z` G d< d=e>      Za G d? d@ea      Zb G dA dBea      Zc G dC dDea      Zd G dE dFea      Ze e<dGdH      dpdI       Zf G dJ dKe>      Zg G dL dMeg      Zh G dN dOeg      Zi G dP dQeg      Zj G dR dSeg      Zk G dT dU      Zl G dV dWe>      Zm G dX dYem      Zn G dZ d[em      Zo G d\ d]em      Zp G d^ d_em      Zq G d` da      Zr G db dces      ZtddZudeZv edfe j                   dge j                   dhe j                   dieez  j      Zxi f	 	 	 	 	 dqdkZy G dl dmet>      ZzdrdnZ{y# eJ$ r dd$lKmDZD dd%l/mLZE Y w xY w)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wraps)chain)	getLogger)environ)
expandvars)Path)
IGNORECASEVERBOSEcompile)Template)TYPE_CHECKING)
IndexedSet)CommentedMapCommentedSeq)ReaderError)ScannerError   )
CondaErrorCondaMultiError)AttrDictfirstlast)ThisShouldNeverHappenError)TypeCoercionErrortypifytypify_data_structure)unique)
deprecated   )
isiterableprimitive_types)NULL)yaml_round_trip_load)
deepfreeze
frozendict)getFreezeConversionMap)registerc                    | S N xs    :lib/python3.12/site-packages/conda/common/configuration.py<lambda>r6   9   s    !     )r-   )make_immutable)Match)AnyHashableIterableSequencec                    t        |       s| g} 	 dj                  fd| D              S # t        $ r t        | g      cY S w xY w)N
c              3  ,   K   | ]  } d |   yw)z- Nr2   ).0itempaddings     r5   	<genexpr>zpretty_list.<locals>.<genexpr>N   s     C$G9Btf-Cs   )r(   join	TypeErrorpretty_list)iterablerC   s    `r5   rG   rG   J   sJ    h:0yyC(CCC 0H:w//0s   + AAc                T    dj                  fd| j                         D              S )Nr?   c              3  6   K   | ]  \  }} | d |   yw): Nr2   )rA   keyvaluerC   s      r5   rD   zpretty_map.<locals>.<genexpr>T   s$     UJCyRw/Us   )rE   items)
dictionaryrC   s    `r5   
pretty_maprP   S   s!    99U*BRBRBTUUUr7   c                H    t        | t        t        f      rt        |       S | S r1   )
isinstancestrbytesr   )
unexpandeds    r5   expand_environment_variablesrV   W   s!    *sEl+*%%r7   c                      e Zd Zy)ConfigurationErrorN)__name__
__module____qualname__r2   r7   r5   rX   rX   ^   s    r7   rX   c                        e Zd Zd fd	Z xZS )ConfigurationLoadErrorc                4    d}t        |   ||z   fd|i| y )Nz4Unable to load configuration file.
  path: %(path)s
pathsuper__init__)selfr_   message_additionkwargsmessage	__class__s        r5   rb   zConfigurationLoadError.__init__c   s%    J#33I$I&Ir7   ) rY   rZ   r[   rb   __classcell__rg   s   @r5   r]   r]   b   s    J Jr7   r]   c                        e Zd Zd fd	Z xZS )ValidationErrorc                P    || _         || _        || _        t        |   |fi | y r1   )parameter_nameparameter_valuesourcera   rb   )rc   ro   rp   rq   msgre   rg   s         r5   rb   zValidationError.__init__i   s,    ,.''r7   r1   ri   rk   s   @r5   rm   rm   h   s    ( (r7   rm   c                       e Zd Z fdZ xZS )MultipleKeysErrorc                r    || _         || _        d| dt        |       d| d}t        |   |d ||       y )NzMultiple aliased keys in file z:
z 
Must declare only one. Prefer ''rr   )rq   keysrG   ra   rb   )rc   rq   rx   preferred_keyrr   rg   s        r5   rb   zMultipleKeysError.__init__q   sS    	,VHC4 ! "..;_A? 	
 	f#>r7   ri   rk   s   @r5   rt   rt   p   s    ? ?r7   rt   c                  "     e Zd Z	 d fd	Z xZS )InvalidTypeErrorc                    || _         || _        |d| d|d| d| dt        |       
}t        |   ||||       y )N
Parameter  =  declared in z
 has type z.
Valid types:
rw   )
wrong_typevalid_typesrG   ra   rb   )rc   ro   rp   rq   r   r   rr   rg   s          r5   rb   zInvalidTypeError.__init__}   sk     %&;^,C/B-PVxWablam n!!,[!9 :<  	&cJr7   r1   ri   rk   s   @r5   r{   r{   |   s    TX
K 
Kr7   r{   c                       e Zd Z fdZ xZS )CustomValidationErrorc                D    t         |   |||d| d|d| d|        y )Nr}   r~   r   z is invalid.
rw   r`   )rc   ro   rp   rq   custom_messagerg   s        r5   rb   zCustomValidationError.__init__   s@    ^,C/B-(.(8: 	 	
r7   ri   rk   s   @r5   r   r      s    	
 	
r7   r   c                       e Zd Z fdZ xZS )MultiValidationErrorc                ,    t        |   |g|i | y r1   r`   )rc   errorsargsre   rg   s       r5   rb   zMultiValidationError.__init__   s    1$1&1r7   ri   rk   s   @r5   r   r      s    2 2r7   r   c                D    | syt        |       dk(  r| d   t        |       )NTr'   r   )lenr   )r   s    r5   raise_errorsr      s(    	V	Qi"6**r7   c                  N    e Zd ZdZdZdZd Zed        Zed        Z	ed        Z
y)	ParameterFlagfinaltopbottomc                     d| j                   z  S )Nz%srM   rc   s    r5   __str__zParameterFlag.__str__   s    djj  r7   c                    | |   S r1   r2   )clsnames     r5   	from_namezParameterFlag.from_name   s    4yr7   c                     | |      S r1   r2   )r   rM   s     r5   
from_valuezParameterFlag.from_value   s    5zr7   c                r    	 |j                  d      }| j                  |      S # t        t        f$ r Y y w xY w)Nz!#)stripr   
ValueErrorAttributeError)r   strings     r5   from_stringzParameterFlag.from_string   s;    	\\$'F>>&))N+ 		s   !$ 66N)rY   rZ   r[   r   r   r   r   classmethodr   r   r   r2   r7   r5   r   r      sR    E
CF!      r7   r   c                  X    e Zd Zd Zd Zed        Zed        Zed        Ze	d        Z
y)RawParameterc                z    || _         || _        	 |j                  d      | _        y # t        $ r
 || _        Y y w xY w)Nzutf-8)rq   rL   decode
_raw_valuer   )rc   rq   rL   	raw_values       r5   rb   zRawParameter.__init__   s=    	('..w7DO 	('DO	(s   ' ::c                *    t        t        |             S r1   )rS   varsr   s    r5   __repr__zRawParameter.__repr__   s    4:r7   c                    t               r1   NotImplementedErrorrc   parameter_objs     r5   rM   zRawParameter.value       !##r7   c                    t               r1   r   r   s    r5   keyflagzRawParameter.keyflag   r   r7   c                    t               r1   r   r   s     r5   
valueflagszRawParameter.valueflags   r   r7   c           
     T    |r|D ci c]  }| | ||||          c}S t         S c c}w r1   )	EMPTY_MAPr   rq   from_maprL   s       r5   make_raw_parametersz RawParameter.make_raw_parameters   s4    DLMSCVS(3-88MM Ns   %N)rY   rZ   r[   rb   r   r   rM   r   r   r   r   r2   r7   r5   r   r      s\    ( $ $ $ $ $ $  r7   r   )	metaclassc                  N     e Zd ZdZd Zd Zd Zed        Ze	 fd       Z
 xZS )EnvRawParameterenvvarsc                    t        |d      r\t         j                  t              sJ t	        |d      }t         fdd  j                  j                  |      D        D              S  j                  d   j                         S )Nstring_delimiterc              3  l   K   | ]+  }|r't        t         j                  j                  |       - y wr1   )r   rq   rL   )rA   vrc   s     r5   rD   z(EnvRawParameter.value.<locals>.<genexpr>   s/         6 6!Ds   14c              3  <   K   | ]  }|j                           y wr1   )r   )rA   vvs     r5   rD   z(EnvRawParameter.value.<locals>.<genexpr>   s     W"((*W   r   )	hasattrrR   r   rS   getattrtuplesplit'_EnvRawParameter__important_split_valuer   rc   r   r   s   `  r5   rM   zEnvRawParameter.value   s}     ="45doos333&}6HI Wt/D/DEU/VW   //288::r7   c                V    t        | j                        dk\  rt        j                  S d S Nr   )r   r   r   r   r   s    r5   r   zEnvRawParameter.keyflag   s&    &)$*F*F&G1&L}""VRVVr7   c                    t        |d      r7t        |d      }t        d | j                  j	                  |      D              S | j
                  d   j                         S )Nr   c              3      K   | ]  }d   yw)rh   Nr2   )rA   _s     r5   rD   z-EnvRawParameter.valueflags.<locals>.<genexpr>   s     MM   r   )r   r   r   r   r   r   r   r   s      r5   r   zEnvRawParameter.valueflags   sV    ="45&}6HIMT__%:%:;K%LMMM//288::r7   c                8    | j                   j                  d      S )Nz
!important)r   r   r   s    r5   __important_split_valuez'EnvRawParameter.__important_split_value   s    $$\22r7   c           	         |j                          d}t        j                         D ci c]8  \  }}|j                  |      r"|j	                  |dd      j                         |: }}}t        |   t        j                  |      S c c}}w )Nr   rh   r'   )
upperr   rN   
startswithreplacelowerra   r   r   rq   )r   appnamekeystartkr   raw_envrg   s         r5   r   z#EnvRawParameter.make_raw_parameters   s    mmo&a(  
1||H% IIhA&,,.1
 

 w*?+A+A7KK
s   =B
)rY   rZ   r[   rq   rM   r   r   propertyr   r   r   rj   rk   s   @r5   r   r      sB    F;W; 3 3 L Lr7   r   c                  >     e Zd ZdZd Zd Zd Ze fd       Z xZ	S )ArgParseRawParametercmd_linec           	     0   t        | j                        rmg }t        t        | j                              D ]?  }|j	                  t        | j                  | j                  | j                  |                A t        |      S t        | j                        S r1   )
r(   r   ranger   appendr   rq   rL   r   r,   )rc   r   children_valuesis       r5   rM   zArgParseRawParameter.value  sz     doo& O3t/0 &&(dhhPQ@RS ))doo..r7   c                     y r1   r2   r   s    r5   r   zArgParseRawParameter.keyflag      r7   c                *    t        |t              rd S dS Nr2   )rR   PrimitiveLoadedParameterr   s     r5   r   zArgParseRawParameter.valueflags  s    !-1IJtRPRRr7   c                @    t         |   t        j                  |      S r1   )ra   r   r   rq   )r   args_from_argparserg   s     r5   r   z(ArgParseRawParameter.make_raw_parameters   s!    w* '');
 	
r7   )
rY   rZ   r[   rq   rM   r   r   r   r   rj   rk   s   @r5   r   r   
  s,    F/S 
 
r7   r   c                       e Zd Z fdZd Zd Zd Zed        Ze	d        Z
ed        Zed        Ze	d	        Ze	d
        Z xZS )YamlRawParameterc           
     R   || _         t        
| 	  |||       t        | j                  t
              r| j                  | j                        }t        d |D              | _        g }t        t        | j                              D ]C  }|j                  t        | j                  | j                  | j                  |   ||                E t        |      | _        y t        | j                  t               r| j#                  | j                        }|j%                         D 	ci c]  \  }}	|	|t&        j)                  |	       c}	}| _        i }| j                  j%                         D ]-  \  }}	t        | j                  | j                  |	||         ||<   / t+        |      | _        y t        | j                  t,              rd | _        | j                  | _        y t/        t1        | j                        | j                  t2        j4                         t7               c c}	}w )Nc              3  F   K   | ]  }t         j                  |        y wr1   )r   r   )rA   ss     r5   rD   z,YamlRawParameter.__init__.<locals>.<genexpr>0  s       &12))!,&   !)file)_key_commentra   rb   rR   r   r   _get_yaml_list_commentsr   _value_flagsr   r   r   r   rq   rL   _valuer   _get_yaml_map_commentsrN   r   r   r-   r)   printtypesysstderrr!   )rc   rq   rL   r   key_commentvalue_commentsr   r   r   r   rg   s             r5   rb   zYamlRawParameter.__init__*  s   'i0doo|4!99$//JN % &6D& !D !O3t/0 &&$TXXtq/A>RSCT  0DK6!88IN +002!Aq= =,,Q//!D
 !O--/ 1%5KK1nQ.?&" %_5DK9 $D//DK$t'szzJ,..!!s   %"H#c                    | j                   S r1   r   r   s     r5   rM   zYamlRawParameter.valueO      {{r7   c                @    t         j                  | j                        S r1   )r   r   r   r   s    r5   r   zYamlRawParameter.keyflagR  s    (():):;;r7   c                    | j                   S r1   )r   r   s     r5   r   zYamlRawParameter.valueflagsU  s       r7   c                    	 | j                   j                  |   d   j                  j                         S # t        t
        f$ r Y y w xY wr   carN   rM   r   r   KeyError)commented_dictrL   s     r5   _get_yaml_key_commentz&YamlRawParameter._get_yaml_key_commentX  sI    	!$$**3/288>>@@) 		s   36 AAc                   g }t        t        |            D ]:  }	 |j                  | j                  |j                  j
                  |                < t        |      S # t        t        t        t        f$ r |j                  d        Y tw xY wr1   )r   r   r   _get_yaml_list_comment_itemr  rN   r   
IndexErrorr  rF   r   )r   rM   list_commentsr   s       r5   r   z(YamlRawParameter._get_yaml_list_comments_  s    
 s5z" 	+A+$$S%D%DUXX^^TUEV%WX	+
 ]## #J)D +$$T*+s   7A*BBc                    | d   r!| d   j                   j                         xs d S | d   d   j                   j                         xs d S )Nr   r'   )rM   r   )rB   s    r5   r  z,YamlRawParameter._get_yaml_list_comment_iteml  sI     77==&&(0D071:##))+3t3r7   c                    i }| D ]>  }	 | j                   j                  |   d   j                  j                         xs d ||<   @ |S # t        t
        f$ r d ||<   Y Yw xY wr   r  )rM   map_commentsrL   s      r5   r   z'YamlRawParameter._get_yaml_map_commentsu  ss     	)C)$)HHNN3$7$:$@$@$F$F$H$PDS!	)
  #H- )$(S!)s   ;AAAc                v    |r-|D ci c]!  }| | ||||   | j                  ||            # c}S t        S c c}w r1   )r
  r   r   s       r5   r   z$YamlRawParameter.make_raw_parameters  sX    
 $	  SC#0I0I(TW0X   s   &6c                X   t        |      5 }	 t        |      }| j                  ||      xs t        cd d d        S # t        $ r4}|j                  }t	        |d|j
                  |j                        d }~wt        $ r}t	        |d|j                        d }~ww xY w# 1 sw Y   y xY w)Nz:  reason: invalid yaml at line %(line)s, column %(column)s)linecolumnz/  reason: invalid yaml at position %(position)s)position)openr+   r   problem_markr]   r  r  r   r  r   r   )r   filepathfhyaml_objerrmarks         r5   make_raw_parameters_from_filez.YamlRawParameter.make_raw_parameters_from_file  s    (^ 	Lr/3 **8X>K)#	L 	L   '',P;;	   ,E \\ 	L 	Ls7   B <B 	B/A44B BBB  B))rY   rZ   r[   rb   rM   r   r   staticmethodr
  r   r   r  r   r   r  rj   rk   s   @r5   r   r   '  s    #/J<!   
$ 
$ 4 4     L Lr7   r   c                  4     e Zd ZdZ fdZd Zd Zd Z xZS )DefaultValueRawParameterzFWraps a default value as a RawParameter, for usage in ParameterLoader.c           	        t         
|   |||       t        | j                  t              rYi }| j                  j                         D ])  \  }}t        | j                  | j                  |      ||<   + t        |      | _
        y t        | j                        rsg }t        t        | j                              D ]?  }|j                  t        | j                  | j                  | j                  |                A t        |      | _
        y t        | j                  t               rx| j                  | _
        t#        | j                        j                         D ]@  \  }}	| j                  j%                  |t        | j                  | j                  |	             B y t        | j                  t&              r| j                  | _
        y t        | j                  t(              r| j                  | _
        y t+               r1   )ra   rb   rR   r   r   rN   r!  rq   rL   r-   r   r(   r   r   r   r   ConfigurationObjectr   __setattr__r   r)   r!   )rc   rq   rL   r   r   r   r   r   	attr_name
attr_valuerg   s             r5   rb   z!DefaultValueRawParameter.__init__  s   i0doow/ O--/ X1%=dkk488UV%W"X$_5DK( O3t/0 &&,T[[$((DOOTUDVW  0DK)<=//DK)-doo)>)D)D)F %	:'',T[[$((JO
 .//DK9//DK,..r7   c                    | j                   S r1   r  r   s     r5   rM   zDefaultValueRawParameter.value  r  r7   c                     y r1   r2   r   s    r5   r   z DefaultValueRawParameter.keyflag  r   r7   c                ,   t        | j                  t              r
t               S t	        | j                        ryt        | j                  t
              ry t        | j                  t              ry t        | j                  t              ry t               r   )	rR   r   r   r-   r(   r#  r   r)   r!   r   s     r5   r   z#DefaultValueRawParameter.valueflags  sd    doow/<()<=.9,..r7   )	rY   rZ   r[   __doc__rb   rM   r   r   rj   rk   s   @r5   r!  r!    s    P/:/r7   r!  z24.3z24.9c                j    t        j                  | fi |}t        t         j                  |            S r1   )Configuration_expand_search_pathdict_load_search_path)search_pathre   expanded_pathss      r5   load_file_configsr2    s-    "66{MfMN//?@@r7   c                  ~    e Zd ZdZdZddZd Zd ZddZd Z	e
d        Zd Zedd	       Zed
        Zed        Zy)LoadedParameterNc                J    || _         || _        || _        || _        || _        y)aJ  
        Represents a Parameter that has been loaded with configuration value.

        Args:
            name (str): name of the loaded parameter
            value (LoadedParameter or primitive): the value of the loaded parameter
            key_flag (ParameterFlag or None): priority flag for the parameter itself
            value_flags (Any or None): priority flags for the parameter values
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.
        N)_namerM   key_flagvalue_flags_validation)rc   r   rM   r7  r8  
validations         r5   rb   zLoadedParameter.__init__  s)     

 &%r7   c                b    t        |      t        |       u r| j                  |j                  k(  S yNFr   rM   rc   others     r5   __eq__zLoadedParameter.__eq__  (    ;$t*$::,,r7   c                ,    t        | j                        S r1   hashrM   r   s    r5   __hash__zLoadedParameter.__hash__      DJJr7   c           
        g }t        || j                        sG|j                  t        | j                  ||t        | j                        | j                               |S | j                  t| j                  |      }|du r(|j                  t        | j                  ||             |S t        |t              r'|j                  t        | j                  |||             |S )a.  
        Validate a LoadedParameter typed value.

        Args:
            instance (Configuration): the instance object used to create the LoadedParameter.
            typed_value (Any): typed value to validate.
            source (str): string description for the source of the typed_value.
        F)rR   _typer   r{   r6  r   rM   r9  rm   rS   r   )rc   instancetyped_valuerq   r   results         r5   collect_errorszLoadedParameter.collect_errors  s     +tzz2MM JJVT$**5Etzz  )%%k2Fodjj+vNO
 	 FC()$**k66R r7   c                   t        | j                  t              r; t        | j                        d | j                  j	                         D              }nt        | j                        r- t        | j                        d | j                  D              }nt        | j                  t              rrt        | j                        j	                         D ]@  \  }}t        |t              s| j                  j                  ||j                                B | j                  S t        | j                        }|| _        | S )zw
        Recursively expands any environment values in the Loaded Parameter.

        Returns: LoadedParameter
        c              3  F   K   | ]  \  }}||j                         f  y wr1   expand)rA   r   r   s      r5   rD   z)LoadedParameter.expand.<locals>.<genexpr>  s     (XTQ!QXXZ(Xr   c              3  <   K   | ]  }|j                           y wr1   rO  )rA   r   s     r5   rD   z)LoadedParameter.expand.<locals>.<genexpr>!  s     (H(Hr   )rR   rM   r   r   rN   r(   r#  r   r4  r$  rP  rV   )rc   	new_valuer%  r&  s       r5   rP  zLoadedParameter.expand  s     djj'*(TZZ((XTZZEUEUEW(XXI

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

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

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

        Returns: LoadedParameter
        r   )rc   matchess     r5   mergezLoadedParameter.merge,  s     "##r7   c                   | j                   }	 t        j                  | j                  ||      S # t        $ r}t        |      }t        |t              rRdj                  t        dj                  |j                  j                                     }|d| j                   d| z  }t        | j                  |j                  ||      d}~ww xY w)z
        Recursively types a LoadedParameter.

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

        Returns: a primitive, sequence, or map representing the typed value.
        , '{}'
Valid choices for rK   N)_element_typer4  _typify_data_structurerM   r"   rS   
issubclassr   rE   mapformat__members__valuesr6  r   )rc   rq   element_typeerr   choicess         r5   r#   zLoadedParameter.typify8  s     ))	J"99

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

AGGVSII	Js    / 	CBCCc                   t        | t              r( t        |       fd| j                         D              S t	        |       r t        |       fd| D              S t        | t
              rUt        |       j                         D ]7  \  }}t        |t              s| j                  ||j                               9 | S t        | t              r(t        |t              rt        |t              r ||       S t        | |      S )Nc              3  J   K   | ]  \  }}||j                        f  y wr1   r#   )rA   r   r   rq   s      r5   rD   z9LoadedParameter._typify_data_structure.<locals>.<genexpr>R  s#     OA188F#34Os    #c              3  @   K   | ]  }|j                          y wr1   rf  )rA   r   rq   s     r5   rD   z9LoadedParameter._typify_data_structure.<locals>.<genexpr>T  s     ?Aqxx/?s   )rR   r   r   rN   r(   r#  r   r4  r$  r#   rS   r\  )rM   rq   	type_hintr%  r&  s    `   r5   r[  z&LoadedParameter._typify_data_structureO  s    eW%4;OOOO4;????23)-e):):)< L%	:j/:%%i1B1B61JKL Luc"9d+9c*
 U##%++r7   c                :    | j                   t        j                  u S r1   )r7  r   r   )loaded_parameters    r5   _match_key_is_importantz'LoadedParameter._match_key_is_importantf  s    ((M,?,???r7   c                L    t        t        |       d d       }|| S | d |dz    S )Nc                2    t         j                  | d         S )Nr'   )r4  rk  r3   s    r5   r6   z:LoadedParameter._first_important_matches.<locals>.<lambda>n  s    o==adC r7   c                    | d   S )Nr   r2   r3   s    r5   r6   z:LoadedParameter._first_important_matches.<locals>.<lambda>o  s
    AaD r7   )applyr'   )r   	enumerate)rT  idxs     r5   _first_important_matchesz(LoadedParameter._first_important_matchesj  s6    gC 

 +w=79S1W+==r7   r1   
<<merged>>)rY   rZ   r[   rH  rZ  rb   r@  rE  rL  rP  r   rU  r#   r  r[  rk  rr  r2   r7   r5   r4  r4    s    E M&$
 4, 	$ 	$J. , ,, @ @ > >r7   r4  c                  8     e Zd ZdZ	 d fd	Zd Zd Zd Z xZS )r   z
    LoadedParameter type that holds a single python primitive value.

    The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
    python 2 has long and unicode types.
    c                H    || _         || _        t        |   |||||       y)z
        Args:
            element_type (type or tuple[type]): Type-validation of parameter's value.
            value (primitive value): primitive python value.
        N)rH  rZ  ra   rb   )rc   r   ra  rM   r7  r8  r:  rg   s          r5   rb   z!PrimitiveLoadedParameter.__init__|  s)     "
)uhZHr7   c                b    t        |      t        |       u r| j                  |j                  k(  S yr<  r=  r>  s     r5   r@  zPrimitiveLoadedParameter.__eq__  rA  r7   c                ,    t        | j                        S r1   rC  r   s    r5   rE  z!PrimitiveLoadedParameter.__hash__  rF  r7   c                |    t        |t        j                  d       }||S t        |d d       }||S t	               )N)defaultc                
    | d uS r1   r2   r3   s    r5   r6   z0PrimitiveLoadedParameter.merge.<locals>.<lambda>  s
    Qd] r7   )r   r4  rk  r    r!   )rc   rT  important_match
last_matchs       r5   rU  zPrimitiveLoadedParameter.merge  sK    _<<d
 &""'#:DI
!(**r7   r1   )	rY   rZ   r[   r*  rb   r@  rE  rU  rj   rk   s   @r5   r   r   t  s$     LP
I
 
+r7   r   c                  >     e Zd ZdZeZ	 d fd	Zd fd	ZddZ xZ	S )MapLoadedParameterzFLoadedParameter type that holds a map (i.e. dict) of LoadedParameters.c                :    || _         t        | 	  |||||       y)z
        Args:
            value (Mapping): Map of string keys to LoadedParameter values.
            element_type (Parameter): The Parameter type that is held in value.
            value_flags (Mapping): Map of priority value flags.
        NrZ  ra   rb   rc   r   rM   ra  r7  r8  r:  rg   s          r5   rb   zMapLoadedParameter.__init__  "     *uhZHr7   c                    t         |   ||| j                        }t        | j                  t              rG| j                  j                         D ]*  \  }}|j                  |j                  |||   |             , |S r1   )ra   rL  rM   rR   r   rN   extendrc   rI  rJ  rq   r   rL   rM   rg   s          r5   rL  z!MapLoadedParameter.collect_errors  sq    '+tzzJ djj'*"jj..0 X
Ue228[=MvVWXr7   c           	        t         j                  |      }|D ]{  }t        |j                  t              rt        | j                  |j                  |j                  |j                  j                  j                  | j                  j                         t        |      D ci c]S  }|j                  j                         D ]4  \  }}|j                  j                  |      t        j                   k(  r||6 U }}}}i }|D ]E  }|j                  j                         D ]&  \  }}|j#                  |g       j%                  |       ( G |j                         D ci c]  \  }}||d   j'                  |       }}}t)        i ||      }	t+        | j,                  |	| j.                  | j0                  | j                  | j2                        S c c}}}w c c}}w Nr   r:  )r4  rr  rR   rM   r   r{   r   rq   rg   rY   rH  reversedrN   r8  getr   r   
setdefaultr   rU  r-   r  r6  rZ  r7  r9  
rc   
parameters	parameterrL   rM   	final_mapgrouped_mapr`  
merged_mapmerged_values
             r5   rU  zMapLoadedParameter.merge  s    %==jI
 $ 	Iioow7&IIOO$$OO--66JJ'' 	 &j1
 
'oo335
 U$$((-1D1DD J

	 
 # 	>I'oo335 >
U&&sB/66u=>	> =H<M<M<O
-8S&C((

 

 ""=Z"=9"=> "JJMM''
 	
+

s   %AG Gr1   rs  )r  zSequence[MapLoadedParameter]returnr  )
rY   rZ   r[   r*  r-   rH  rb   rL  rU  rj   rk   s   @r5   r  r    s"    PE LP
I.
r7   r  c                  <     e Zd ZdZeZ	 d fd	Zd fd	Zd Z xZ	S )SequenceLoadedParameterzKLoadedParameter type that holds a sequence (i.e. list) of LoadedParameters.c                :    || _         t        | 	  |||||       y)z
        Args:
            value (Sequence): Sequence of LoadedParameter values.
            element_type (Parameter): The Parameter type that is held in the sequence.
            value_flags (Sequence): Sequence of priority value_flags.
        Nr  r  s          r5   rb   z SequenceLoadedParameter.__init__  r  r7   c                    t         |   ||| j                        }t        | j                        D ]*  \  }}|j	                  |j                  |||   |             , |S r1   )ra   rL  rM   rp  r  )rc   rI  rJ  rq   r   rq  elementrg   s          r5   rL  z&SequenceLoadedParameter.collect_errors  s]    '+tzzJ%djj1 	VLCMM'00;s;KVTU	Vr7   c                :   t        d t        j                  |      D              }|D ]`  \  }}t        |t               rt	        | j
                  ||j                  |j                  j                  | j                  j                         d t        j                  fd|D              }t        t        j                  fdt        |      D                    }t        j                  d t        |      D              }t        t        g ||            }t        t        g t        |      t        |                  }	t        t        |	            }
t        | j                  |
| j                   | j"                  | j$                  | j&                        S )Nc              3  8   K   | ]  }||j                   f  y wr1   r   )rA   matchs     r5   rD   z0SequenceLoadedParameter.merge.<locals>.<genexpr>  s!      ,
 EKK ,
s   c                p    | r2t        fdt        | j                  | j                        D              S dS )Nc              3  0   K   | ]  \  }}|u r|  y wr1   r2   )rA   r  flagmarkers      r5   rD   zJSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>  s$      "dv~ s   r2   )r   ziprM   r8  )r  r  s    `r5   get_marked_linesz7SequenceLoadedParameter.merge.<locals>.get_marked_lines  s?       &)%++u7H7H&I  r7   c              3  R   K   | ]  \  }} |t         j                           y wr1   )r   r   )rA   mr   r  s      r5   rD   z0SequenceLoadedParameter.merge.<locals>.<genexpr>  s*      (
1 Q 1 12(
   $'c              3  R   K   | ]  \  }} |t         j                           y wr1   )r   r   )rA   r  r   r  s      r5   rD   z0SequenceLoadedParameter.merge.<locals>.<genexpr>&  s*       E1 !(<(<= r  c              3  &   K   | ]	  \  }}|  y wr1   r2   )rA   r   r   s      r5   rD   z0SequenceLoadedParameter.merge.<locals>.<genexpr>.  s      (
!QA(
s   r  )r   r4  rr  rR   r{   r   rq   rg   rY   rH  r   from_iterabler  r%   r  r6  rZ  r7  r8  r9  )rc   rT  relevant_matches_and_valuesr  rM   	top_linesbottom_lines	all_linestop_dedupedbottom_dedupedmerged_valuesr  s              @r5   rU  zSequenceLoadedParameter.merge   s    ', ,
(AA'J,
 '
# 8 	LE5eU+&IILLOO,,JJ'' 			 '' (
3(
 
	    ()D E  
 '' (
"#>?(
 
	
 F#;Y#;#;<= DXl+Dh{.CDE
 h~67&JJMM''
 	
r7   r1   rs  )
rY   rZ   r[   r*  r   rH  rb   rL  rU  rj   rk   s   @r5   r  r    s#    UE LP
IF
r7   r  c                  F     e Zd ZdZeZ	 d fd	Zd fd	Z	 	 	 	 ddZ xZ	S )ObjectLoadedParameterzLLoadedParameter type that holds a mapping (i.e. object) of LoadedParameters.c                :    || _         t        | 	  |||||       y)z
        Args:
            value (Sequence): Object with LoadedParameter fields.
            element_type (object): The Parameter type that is held in the sequence.
            value_flags (Sequence): Sequence of priority value_flags.
        Nr  r  s          r5   rb   zObjectLoadedParameter.__init__N  r  r7   c                4   t         |   ||| j                        }t        | j                  t              rat        | j                        j                         D ];  \  }}t        |t              s|j                  |j                  |||   |             = |S r1   )	ra   rL  rM   rR   r#  r   rN   r4  r  r  s          r5   rL  z$ObjectLoadedParameter.collect_errorsZ  s    '+tzzJ djj"56"4::.446 
Ue_5MM,,X{37GP
 r7   c           
        t         j                  |      }t        |      D ci c]l  }t        |j                        j                         D ]D  \  }}t        |t               r/|j                  j                  |      t        j                  k(  r||F n }}}}i }|D ]N  }t        |j                        j                         D ]&  \  }}|j                  |g       j                  |       ( P |j                         D ci c]  \  }}||d   j                  |       }}}t        j                  | j                         }	i ||j                         D ]  \  }}|	j#                  ||        t%        | j&                  |	| j                   | j(                  | j                  | j*                        S c c}}}w c c}}w r  )r4  rr  r  r   rM   rN   rR   r8  r  r   r   r  r   rU  copydeepcopyrZ  r$  r  r6  r7  r9  r  s
             r5   rU  zObjectLoadedParameter.mergef  s   
 %==jI
 &j1
 
"9??399;
 U5/2))--c2m6I6II J

	 
 # 	>I"9??399; >
U&&sB/66u=>	> =H<M<M<O
-8S&C((

 

 }}T%7%785Z595;;= 	1JC$$S%0	1 %JJMM''
 	
5
 
s   A1F4F;r1   rs  )r  zSequence[ObjectLoadedParameter]r  r  )
rY   rZ   r[   r*  objectrH  rb   rL  rU  rj   rk   s   @r5   r  r  I  s2    VE LP
I
*
9*
	*
r7   r  c                      e Zd ZdZy)r#  zIDummy class to mark whether a Python object has config parameters within.N)rY   rZ   r[   r*  r2   r7   r5   r#  r#    s    Sr7   r#  c                  H    e Zd ZdZdZddZed        Zd Ze	d        Z
d Zy)	ParameterNc                     || _         || _        y)a  
        The Parameter class represents an unloaded configuration parameter, holding type, default
        and validation information until the parameter is loaded with a configuration.

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

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

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

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

        Returns a LoadedParameter
        r   rc   r   r  s      r5   r  zParameter.load  s     "##r7   c                L   | j                   }	 t        ||      S # t        $ r}t        |      }t	        |t
              rHdj                  t        dj                  |j                  j                                     }|d| d| z  }t        ||j                  ||      d }~ww xY w)NrW  rX  rY  rK   )rZ  r$   r"   rS   r\  r   rE   r]  r^  r_  r`  r   rM   )rc   r   rq   rM   ra  rb  rr   rc  s           r5   r#   zParameter.typify  s    ))		D(==  	Da&C,-))|'?'?'F'F'HI -dV2gY??'aggvsCC	Ds    	B#A;BB#r1   )rY   rZ   r[   rH  rZ  rb   r   rz  r  r   r  r#   r2   r7   r5   r  r    sF    E M& 5 5
,. 
$ 
$Dr7   r  c                  *     e Zd ZdZd fd	Zd Z xZS )PrimitiveParameterz
    Parameter type for a Configuration class that holds a single python primitive value.

    The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
    python 2 has long and unicode types.
    c                p    |t        |      n|| _        | j                  | _        t        |   ||       y)z
        Args:
            default (primitive value): default value if the Parameter is not found.
            element_type (type or tuple[type]): Type-validation of parameter's value. If None,
                type(default) is used.
        N)r   rH  rZ  ra   rb   )rc   rz  ra  r:  rg   s       r5   rb   zPrimitiveParameter.__init__  s2     '3&:T']
!ZZ*-r7   c           	         t        || j                  |j                  | j                        |j	                         |j                  | j                        | j                        S Nr  )r   rH  rM   rZ  r   r   r9  r  s      r5   r  zPrimitiveParameter.load  sQ    'JJKK**+MMOT//0''
 	
r7   NN)rY   rZ   r[   r*  rb   r  rj   rk   s   @r5   r  r    s    	.
r7   r  c                  F     e Zd ZdZeZ e       df fd	Z fdZd Z xZ	S )MapParameterzTParameter type for a Configuration class that holds a map (i.e. dict) of Parameters.Nc                l    || _         |xr t        |      xs
 t               }t        |   ||       y)z
        Args:
            element_type (Parameter): The Parameter type held in the MapParameter.
            default (Mapping):  The parameter's default value. If None, will be an empty dict.
        r  N)rZ  r-   ra   rb   rc   ra  rz  r:  rg   s       r5   rb   zMapParameter.__init__  s5     *1j1AZ\Z8r7   c                X    t         |   |||      \  }}t        d |D              }||fS )Nc              3  :   K   | ]  }|j                   |  y wr1   r   rA   r  s     r5   rD   z/MapParameter.get_all_matches.<locals>.<genexpr>       Gaall.FG   ra   r  r   rc   r   r  rI  rT  
exceptionsrg   s         r5   r  zMapParameter.get_all_matches  6    #g5dE8LG7GG
""r7   c           	        |j                  | j                        }|Ct        |t               | j                  |j	                         t               | j
                        S t        |t              sAt        |||j                  |j                  j                  | j                  j                        i }|j                  | j                        j                         D ]&  \  }}| j                  j                  ||      }|||<   ( t        |t        |      | j                  |j	                         |j                  | j                        | j
                        S r  )rM   rZ  r  r-   r   r9  rR   r   r{   rq   rg   rY   rH  rN   r  r   )rc   r   r  rM   
loaded_maprL   child_valueloaded_child_values           r5   r  zMapParameter.load  s*   D../=%""++  %)"eU\\5??+C+CTZZEXEX  
 %D,>,> ? E E G 	1C!%!3!3!8!8{!K0JsO	1 "z"MMOT//0''
 	
r7   )
rY   rZ   r[   r*  r-   rH  rb   r  r  rj   rk   s   @r5   r  r    s!    ^E-7\d 9#
r7   r  c                  8     e Zd ZdZeZd fd	Z fdZd Z xZ	S )SequenceParameterzYParameter type for a Configuration class that holds a sequence (i.e. list) of Parameters.c                B    || _         || _        t        |   ||       y)a  
        Args:
            element_type (Parameter): The Parameter type that is held in the sequence.
            default (Sequence): default value, empty tuple if not given.
            string_delimiter (str): separation string used to parse string into sequence.
        N)rZ  r   ra   rb   )rc   ra  rz  r:  r   rg   s        r5   rb   zSequenceParameter.__init__<  s$     * 0*-r7   c                X    t         |   |||      \  }}t        d |D              }||fS )Nc              3  :   K   | ]  }|j                   |  y wr1   r  r  s     r5   rD   z4SequenceParameter.get_all_matches.<locals>.<genexpr>L  r  r  r  r  s         r5   r  z!SequenceParameter.get_all_matchesG  s8     $g5dE8LG7GG
""r7   c           	     <   |j                  |       }|3t        |d| j                  |j                         d| j                        S t        |      sAt        |||j                  |j                  j                  | j                  j                        g }|D ]/  }| j                  j                  ||      }|j                  |       1 t        |t        |      | j                  |j                         |j                  | j                        | j                        S )Nr2   r  )rM   r  rZ  r   r9  r(   r{   rq   rg   rY   rH  r  r   r   r   )rc   r   r  rM   loaded_sequencer  r  s          r5   r  zSequenceParameter.loadO  s   D!=*""++  % "eU\\5??+C+CTZZEXEX    	7K!%!3!3!8!8{!K""#56	7 '/"MMOT//0''
 	
r7   )r2   N,)
rY   rZ   r[   r*  r   rH  rb   r  r  rj   rk   s   @r5   r  r  7  s    cE	.#
r7   r  c                  F     e Zd ZdZeZ e       df fd	Z fdZd Z	 xZ
S )ObjectParameterzTParameter type for a Configuration class that holds an object with Parameter fields.Nc                4    || _         t        | 	  ||       y)z
        Args:
            element_type (object): The object type with parameter fields held in ObjectParameter.
            default (Sequence): default value, empty tuple if not given.
        Nr  r  s       r5   rb   zObjectParameter.__init__t  s     **-r7   c                X    t         |   |||      \  }}t        d |D              }||fS )Nc              3  :   K   | ]  }|j                   |  y wr1   r  r  s     r5   rD   z2ObjectParameter.get_all_matches.<locals>.<genexpr>  r  r  r  r  s         r5   r  zObjectParameter.get_all_matches}  r  r7   c           	        |j                  | j                        }|3t        |d | j                  |j                         d | j                        S t        |t        t        f      sAt        |||j                  |j                  j                  | j                  j                        t        |t              rt        |      }t        | j                        j                         D ci c]*  \  }}t        |t              r||j!                         v r||, }}}i }|j                         D ]-  \  }}|j#                  |      }|j%                  ||      }	|	||<   / t'        j(                  | j                        }
|j                         D ]  \  }}|
j+                  ||        t        ||
| j                  |j                         |j-                  | j                        | j                        S c c}}w r  )rM   rZ  r  r   r9  rR   r   r#  r{   rq   rg   rY   rH  r   rN   r  rx   r  r  r  r  r$  r   )rc   r   r  rM   r%  parameter_typeobject_parameter_attrsloaded_attrsraw_child_valuer  object_copyloaded_child_parameters               r5   r  zObjectParameter.load  s   D../=(""++  %'+>!?@"eU\\5??+C+CTZZEXEX 
 e01KE .2$2D2D-E-K-K-M"
)	>.)4ejjl9R ~%"
 "
 )?)E)E)G 	9%I~#ii	2O!/!4!4T?!K&8L#	9 mmD$6$671=1C1C1E 	G-I-##I/EF	G %MMOT//0''
 	
%"
s   )/G2)rY   rZ   r[   r*  r  rH  r#  rb   r  r  rj   rk   s   @r5   r  r  o  s"    ^E-@-Bt .#.
r7   r  c                  Z    e Zd ZdZd
dZd Zed        Zed        Zd Z	d Z
ed        Zy	)r  zq
    ParameterLoader class contains the top level logic needed to load a parameter from start to
    finish.
    c                J    d| _         d| _        || _        || _        || _        y)a  
        Args:
            parameter_type (Parameter): the type of Parameter that is stored in the loader.
            aliases (tuple(str)): alternative aliases for the Parameter
            expandvars (bool): whether or not to recursively expand environmental variables.
        N)r6  _namesr   aliases_expandvars)rc   r  r  r   s       r5   rb   zParameterLoader.__init__  s(     
"	%r7   c                p    || _         t        d t        | j                  |f      D              }|| _        |S )Nc              3      K   | ]  }|  y wr1   r2   )rA   r4   s     r5   rD   z,ParameterLoader._set_name.<locals>.<genexpr>  s     C1Cr   )r6  	frozensetr   r  r  )rc   r   r  s      r5   	_set_namezParameterLoader._set_name  s4     
CeDLL4'&BCCr7   c                F    | j                   
t               | j                   S r1   )r6  r!   r   s    r5   r   zParameterLoader.name  s    ::,..zzr7   c                F    | j                   
t               | j                   S r1   )r  r!   r   s    r5   r  zParameterLoader.names  s    ;;,..{{r7   c                   | j                   |j                  v r|j                  | j                      S | j                  j                  | j                   | j                  |      \  }}|D cg c](  }| j                  j                  | j                   |      * }}|r|d   j                  |      n| j                  j                  }| j                  r|j                         n|}	 |j                  d      }	|j                  |j                  ||	d             t        |       	|j                  | j                   <   |	S c c}w # t        $ r}
|j                  |
       Y d }
~
Jd }
~
ww xY w)Nr   rt  )r   _cache_r   r  r  r  rU  rz  r  rP  r#   r  rL  r   r   r   )rc   rI  instance_typeraw_matchesr   r  rT  mergedexpandedrK  rb  s              r5   __get__zParameterLoader.__get__  s0    99(((##DII.. #ii77		4::xXV BMM499>>$))U3MM /6!!'*499;L;L
 '+&6&66==?F	S__\2F MM(11(FLQRV&,## N % 	MM!	s   *-D=$E 	E&E!!E&c                X    t         j                  | j                  | j                  |      S r1   )r  r  r   r  )rc   r  s     r5   "_raw_parameters_from_single_sourcez2ParameterLoader._raw_parameters_from_single_source  s$    @@IItzz>
 	
r7   c           	        |t        |j                               z  }|D ci c]  }|||   
 }}t        |      }|dk(  ry|dk(  r$t        t	        |j                                     d fS | |v r1||    t        |t        t	        |               j                  ||       fS d t        |t        t	        |               j                  ||       fS c c}w )Nr   r  r'   )r  rx   r   nextiterr`  rt   rq   )r   r  r  rx   rL   rT  numkeyss          r5   r  z1ParameterLoader.raw_parameters_from_single_source   s     y!4!4!6777;<3s++<<d)a<\W^^-./55T\4="3tDJ/077t#   *tDJ/077t   =s   CN)r2   F)rY   rZ   r[   r*  rb   r   r   r   r  r	  r  r  r  r2   r7   r5   r  r    sW    
&    <

  r7   r  c                  "     e Zd ZdZ fdZ xZS )ConfigurationTypezmetaclass for Configurationc                    t         |   |||       t        d | j                  j	                         D              | _        y )Nc              3  d   K   | ](  \  }}t        |t              r|j                  |       * y wr1   )rR   r  r   )rA   r   ps      r5   rD   z-ConfigurationType.__init__.<locals>.<genexpr>  s/      $
a!_- KK$
   .0)ra   rb   r   __dict__rN   parameter_names)r   r   basesattrrg   s       r5   rb   zConfigurationType.__init__  s=    ud+ $ $
<<--/$
 
r7   )rY   rZ   r[   r*  rb   rj   rk   s   @r5   r  r    s    %
 
r7   r  )z.condarccondarc)z.ymlz.yamlz9
    # delimiter and a Python identifier
    \$(?P<named>z?) |

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

    # delimiter padded identifier
    %(?P<padded>z)%
    )flagsc               H    i |dfd}t         j                  ||       S )u9  Expand variables in a string.

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

    Expands POSIX and Windows CMD environment variables as follows:

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

    Invalid substitutions are left as-is:

    - $MISSING → $MISSING
    - ${MISSING} → ${MISSING}
    - %MISSING% → %MISSING%
    - $$ → $$
    - %% → %%
    - $ → $
    - % → %
    c                    t        j                  | j                  d      xs$ | j                  d      xs | j                  d      | j                                     S )Nnamedbracedpadded)rS   r  group)r  mappings    r5   convertz"custom_expandvars.<locals>.convertN  sM    KKG$VH(=VXAV
 	
r7   )r  r9   )_RE_CUSTOM_EXPANDVARSsub)templater"  re   r#  s    `  r5   custom_expandvarsr'  4  s.    0 $#F#G
 !$$Wh77r7   c                      e Zd ZddZe	 	 	 	 dd       Ze	 	 	 	 dd       ZddZddZ	d Z
ddZd	 Zd
 Zd Zd Zed        Zd Zd Zd Zd Zd Zd Zd Zy)r,  Nc                    i | _         i | _        t               | _        t	        t
              | _         | j                  |fi | | j                  |       | j                  |       y r1   )
r  r  r   _reset_callbacksr   list_validation_errors_set_search_path_set_env_vars_set_argparse_args)rc   r0  app_nameargparse_argsre   s        r5   rb   zConfiguration.__init__Z  sZ      *"-d"3k4V48$.r7   c              +  |  K   | D ]  }t        |t              r|}n*t        |t        fi |}t        |      j	                         }|j                         r)|j                  t        v s|j                  t        v r| y|j                         sd t        |j                               D        E d {     y 7 w)Nc              3  d   K   | ](  }|j                         r|j                  t        v r| * y wr1   )is_filesuffixYAML_EXTENSIONS)rA   subpaths     r5   rD   z4Configuration._expand_search_path.<locals>.<genexpr>y  s-      (W^^-N r  )rR   r   r'  r   
expanduserr4  r   CONDARC_FILENAMESr5  r6  is_dirsortediterdir)r0  re   searchr_   r&  s        r5   r-  z!Configuration._expand_search_pathf  s     
 " 	F &$',VWGGH~002||~		..$++2P
#)$,,.#9  	s   BB<#B<2B:3B<c              #     K   |D ]  }	 |t         j                  |      f  y # t        $ r!}t        j	                  d||       Y d }~Ed }~ww xY ww)Nz1Ignoring configuration file (%s) due to error:
%s)r   r  r]   logwarning)r   r0  r_   r  s       r5   r/  zConfiguration._load_search_path  s^     
   	D,JJ4PPP	 * H s*   A%A	AA
A
AAc                    t         | j                  |fi |      | _        | j                  t	        | j                  | j                                     | j                          | S r1   )r   r-  _search_path_set_raw_datar.  r/  _reset_cache)rc   r0  re   s      r5   r-  zConfiguration._set_search_path  sW    &'?t'?'?'Vv'VW4 6 6t7H7H IJKr7   c                    || _         t        j                  }|| j                  v r| j                  |= |r"t        j	                  |      | j                  |<   | j                          | S r1   )	_app_namer   rq   r  r   rD  )rc   r0  rq   s      r5   r.  zConfiguration._set_env_vars  s[    ! !''T]]"f%$3$G$G$QDMM&!r7   c                   t        |d      rt        |      j                         }n|sd}n|j                         }t        |D ci c]  \  }}|t        us|| c}}      x| _        }t        j                  }|| j                  v r| j                  |= t        j                  |      | j                  |<   | j                          | S c c}}w )Nr  r2   )r   r   rN   r   r*   _argparse_argsr   rq   r  r   rD  )rc   r1  rN   r   r   rq   s         r5   r/  z Configuration._set_argparse_args  s     =*- '--/EE "'')E.6#5daq}QT5/
 	
m
 &,,T]]"f% 4 H H Wf 6s   C

C

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