U
    b                     @   s  d Z ddlmZmZmZmZ ddlmZmZ ddl	m
Z
 ddlm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mZ ddlmZmZ ddlmZmZmZ ddl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.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZB z,ddlCmDZDmEZE ddlFmGZG ddlHmIZI W n> eJk
r   ddlKmDZDmEZE ddlLmGZG ddlMmIZI Y nX eeNZOe9 ZPdaddZQdbd d!ZRd"d# ZSG d$d% d%e+ZTG d&d' d'eTZUG d(d) d)eTZVG d*d+ d+eVZWG d,d- d-eVZXG d.d/ d/eXZYG d0d1 d1eVZZG d2d3 d3e,eTZ[d4d5 Z\G d6d7 d7eZ]G d8d9 d9ed:Z^G d;d< d<e^Z_G d=d> d>e^Z`G d?d@ d@e^ZaG dAdB dBe^ZbdCdD ZcG dEdF dFed:ZdG dGdH dHedZeG dIdJ dJedZfG dKdL dLedZgG dMdN dNedZhG dOdP dPeiZjG dQdR dRed:ZkG dSdT dTekZlG dUdV dVekZmG dWdX dXekZnG dYdZ dZekZoG d[d\ d\eiZpG d]d^ d^eqZrG d_d` d`erd:ZsdS )cz
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

    )absolute_importdivisionprint_functionunicode_literals)ABCMetaabstractmethod)defaultdict)MappingN)EnumEnumMeta)chain)	getLogger)environscandirstat)basename
expandvars)S_IFDIRS_IFMTS_IFREG   )
isiterableodictprimitive_typesNULLexpand)yaml_round_trip_load   )
CondaErrorCondaMultiError)AttrDictfirstlastmake_immutable)ThisShouldNeverHappenError)TypeCoercionErrortypifytypify_data_structure)
frozendict)
IndexedSet)concatconcatvexceptsmerge
merge_withunique)CommentedSeqCommentedMap)ReaderError)ScannerError  c                    sN   t | s| g} zd fdd| D W S  tk
rH   t| g  Y S X d S )N
c                 3   s   | ]}d  |f V  qdS )z%s- %sN ).0itempaddingr8   9lib/python3.8/site-packages/conda/common/configuration.py	<genexpr><   s     zpretty_list.<locals>.<genexpr>)r   join	TypeErrorpretty_list)iterabler<   r8   r;   r=   rA   8   s    rA   c                    s   d  fdd|  D S )Nr7   c                 3   s    | ]\}}d  ||f V  qdS )z%s%s: %sNr8   )r9   keyvaluer;   r8   r=   r>   B   s     zpretty_map.<locals>.<genexpr>)r?   items)Z
dictionaryr<   r8   r;   r=   
pretty_mapA   s    rF   c                 C   s   t | ttfrt| S | S d S N)
isinstancestrbytesr   )Z
unexpandedr8   r8   r=   expand_environment_variablesE   s    rK   c                   @   s   e Zd ZdS )ConfigurationErrorN)__name__
__module____qualname__r8   r8   r8   r=   rL   L   s   rL   c                       s   e Zd Zd fdd	Z  ZS )ConfigurationLoadError c                    s(   d}t t| j|| fd|i| d S )Nz4Unable to load configuration file.
  path: %(path)s
path)superrP   __init__)selfrR   Zmessage_additionkwargsmessage	__class__r8   r=   rT   Q   s    zConfigurationLoadError.__init__)rQ   rM   rN   rO   rT   __classcell__r8   r8   rX   r=   rP   P   s   rP   c                       s   e Zd Zd fdd	Z  ZS )ValidationErrorNc                    s*   || _ || _|| _tt| j|f| d S rG   )parameter_nameparameter_valuesourcerS   r\   rT   )rU   r]   r^   r_   msgrV   rX   r8   r=   rT   Y   s    zValidationError.__init__)NrZ   r8   r8   rX   r=   r\   W   s   r\   c                       s   e Zd Z fddZ  ZS )MultipleKeysErrorc                    s:   || _ || _d|t||f }tt| j|d ||d d S )NzFMultiple aliased keys in file %s:
%sMust declare only one. Prefer '%s'r`   )r_   keysrA   rS   ra   rT   )rU   r_   rc   Zpreferred_keyr`   rX   r8   r=   rT   b   s    zMultipleKeysError.__init__rZ   r8   r8   rX   r=   ra   `   s   ra   c                       s   e Zd Zd fdd	Z  ZS )InvalidTypeErrorNc                    sF   || _ || _|d kr*d||||t|f }tt| j||||d d S )Nz=Parameter %s = %r declared in %s has type %s.
Valid types:
%srb   )
wrong_typevalid_typesrA   rS   rd   rT   )rU   r]   r^   r_   re   rf   r`   rX   r8   r=   rT   l   s      zInvalidTypeError.__init__)NrZ   r8   r8   rX   r=   rd   k   s   rd   c                       s   e Zd Z fddZ  ZS )InvalidElementTypeErrorc           	         sJ   t |trdnd}d|||||t|f }tt| j||||||d d S )Nzat indexzfor keyzRParameter %s declared in %s has invalid element %r %s %s.
Valid element types:
%s.rb   )rH   intrA   rS   rg   rT   )	rU   r]   r^   r_   re   rf   Zindex_or_keyZ	qualifierr`   rX   r8   r=   rT   w   s       z InvalidElementTypeError.__init__rZ   r8   r8   rX   r=   rg   v   s   rg   c                       s   e Zd Z fddZ  ZS )CustomValidationErrorc                    s,   d||||f }t t| j||||d d S )Nz/Parameter %s = %r declared in %s is invalid.
%srb   )rS   ri   rT   )rU   r]   r^   r_   Zcustom_messager`   rX   r8   r=   rT      s    
zCustomValidationError.__init__rZ   r8   r8   rX   r=   ri      s   ri   c                       s   e Zd Z fddZ  ZS )MultiValidationErrorc                    s   t t| j|f|| d S rG   )rS   rj   rT   )rU   errorsargsrV   rX   r8   r=   rT      s    zMultiValidationError.__init__rZ   r8   r8   rX   r=   rj      s   rj   c                 C   s*   | sdS t | dkr| d nt| d S )NTr   r   )lenrj   )rk   r8   r8   r=   raise_errors   s
    
rn   c                   @   sD   e Zd ZdZdZdZdd Zedd Zedd	 Z	ed
d Z
dS )ParameterFlagfinaltopbottomc                 C   s
   d| j  S )Nz%srD   rU   r8   r8   r=   __str__   s    zParameterFlag.__str__c                 C   s   | | S rG   r8   )clsnamer8   r8   r=   	from_name   s    zParameterFlag.from_namec                 C   s   | |S rG   r8   )rv   rD   r8   r8   r=   
from_value   s    zParameterFlag.from_valuec              	   C   s6   z| d}| |W S  ttfk
r0   Y d S X d S )Nz!#)stripry   
ValueErrorAttributeError)rv   stringr8   r8   r=   from_string   s
    
zParameterFlag.from_stringN)rM   rN   rO   rp   rq   rr   ru   classmethodrx   ry   r~   r8   r8   r8   r=   ro      s   

ro   c                   @   sL   e Zd Zdd Zdd Zedd Zedd Zed	d
 Ze	dd Z
dS )RawParameterc                 C   s8   || _ || _zt|d| _W n   || _Y nX d S )Nzutf-8)r_   rC   Zunicodedecode
_raw_value)rU   r_   rC   	raw_valuer8   r8   r=   rT      s    zRawParameter.__init__c                 C   s   t t| S rG   )rI   varsrt   r8   r8   r=   __repr__   s    zRawParameter.__repr__c                 C   s
   t  d S rG   NotImplementedErrorrU   parameter_objr8   r8   r=   rD      s    zRawParameter.valuec                 C   s
   t  d S rG   r   rt   r8   r8   r=   keyflag   s    zRawParameter.keyflagc                 C   s
   t  d S rG   r   r   r8   r8   r=   
valueflags   s    zRawParameter.valueflagsc                    s"   rt  fddD S tS )Nc                 3   s"   | ]}| || fV  qd S rG   r8   r9   rC   rv   from_mapr_   r8   r=   r>      s     z3RawParameter.make_raw_parameters.<locals>.<genexpr>dict	EMPTY_MAPrv   r_   r   r8   r   r=   make_raw_parameters   s    z RawParameter.make_raw_parametersN)rM   rN   rO   rT   r   r   rD   r   r   r   r   r8   r8   r8   r=   r      s   	


r   )	metaclassc                       sH   e Zd ZdZdd Zdd Zdd Zedd	 Ze	 fd
dZ
  ZS )EnvRawParameterZenvvarsc                    s^   t |drLt jtstt|d}t fdddd  j|D D S  jd 	 S d S )Nstring_delimiterc                 3   s"   | ]}|rt t j j|V  qd S rG   )r   r_   rC   r9   vrt   r8   r=   r>      s   z(EnvRawParameter.value.<locals>.<genexpr>c                 s   s   | ]}|  V  qd S rG   )rz   )r9   Zvvr8   r8   r=   r>      s     r   )
hasattrrH   r   rI   AssertionErrorgetattrtuplesplit'_EnvRawParameter__important_split_valuerz   rU   r   r   r8   rt   r=   rD      s    

zEnvRawParameter.valuec                 C   s   t | jdkrtjS d S Nr   )rm   r   ro   rp   rt   r8   r8   r=   r      s    zEnvRawParameter.keyflagc                 C   s@   t |dr.t|d}tdd | j|D S | jd  S d S )Nr   c                 s   s   | ]
}d V  qdS )rQ   Nr8   )r9   _r8   r8   r=   r>      s     z-EnvRawParameter.valueflags.<locals>.<genexpr>r   )r   r   r   r   r   r   rz   r   r8   r8   r=   r      s    

zEnvRawParameter.valueflagsc                 C   s   | j dS )Nz
!important)r   r   rt   r8   r8   r=   Z__important_split_value   s    z'EnvRawParameter.__important_split_valuec                    s<   d |  t fddt D }tt| tj|S )Nz{0}_c                 3   s2   | ]*\}}|  r| d d |fV  qdS )rQ   r   N)
startswithreplacelowerr9   kr   Zkeystartr8   r=   r>      s    
z6EnvRawParameter.make_raw_parameters.<locals>.<genexpr>)	formatupperr   r   rE   rS   r   r   r_   )rv   ZappnameZraw_envrX   r   r=   r      s
    z#EnvRawParameter.make_raw_parameters)rM   rN   rO   r_   rD   r   r   propertyr   r   r   r[   r8   r8   rX   r=   r      s   
r   c                       s<   e Zd ZdZdd Zdd Zdd Ze fdd	Z  Z	S )
ArgParseRawParameterZcmd_linec                 C   sT   t | jrFg }tt| jD ] }|t| j| j| j|  qt|S t	| jS d S rG   )
r   r   rangerm   appendr   r_   rC   r   r%   )rU   r   children_valuesir8   r8   r=   rD      s    
  zArgParseRawParameter.valuec                 C   s   d S rG   r8   rt   r8   r8   r=   r     s    zArgParseRawParameter.keyflagc                 C   s   t |trd S dS Nr8   )rH   PrimitiveLoadedParameterr   r8   r8   r=   r     s    zArgParseRawParameter.valueflagsc                    s   t t| tj|S rG   )rS   r   r   r_   )rv   Zargs_from_argparserX   r8   r=   r     s    z(ArgParseRawParameter.make_raw_parameters)
rM   rN   rO   r_   rD   r   r   r   r   r[   r8   r8   rX   r=   r      s   r   c                       s|   e Zd Z fddZdd Zdd Zdd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Z  ZS )YamlRawParameterc           
   	      s:  || _ tt| ||| t| jtr| | j}tdd |D | _	g }t
t| jD ]&}|t| j| j| j| ||  qXt|| _nt| jtr| | j}tdd | D | _	i }| j D ]"\}}	t| j| j|	|| ||< qt|| _n<t| jtrd | _	| j| _ntt| j| jtjd t d S )Nc                 s   s   | ]}t |V  qd S rG   ro   r~   )r9   sr8   r8   r=   r>     s     z,YamlRawParameter.__init__.<locals>.<genexpr>c                 s   s(   | ] \}}|d k	r|t |fV  qd S rG   r   r   r8   r8   r=   r>   %  s    )file)_key_commentrS   r   rT   rH   r   r2   _get_yaml_list_commentsr   _value_flagsr   rm   r   r_   rC   _valuer3   _get_yaml_map_commentsr   rE   r*   r   printtypesysstderrr&   )
rU   r_   rC   r   Zkey_commentZvalue_commentsr   r   r   r   rX   r8   r=   rT     s8       

zYamlRawParameter.__init__c                 C   s   | j S rG   r   r   r8   r8   r=   rD   2  s    zYamlRawParameter.valuec                 C   s   t | jS rG   )ro   r~   r   rt   r8   r8   r=   r   5  s    zYamlRawParameter.keyflagc                 C   s   | j S rG   )r   r   r8   r8   r=   r   8  s    zYamlRawParameter.valueflagsc              	   C   s8   z| j j| d j W S  ttfk
r2   Y d S X d S r   )carE   rD   rz   r|   KeyError)Zcommented_dictrC   r8   r8   r=   _get_yaml_key_comment;  s    z&YamlRawParameter._get_yaml_key_commentc                    s*   | j j t fddtt| D }|S )Nc                 3   s2   | ]*}t ttttf fd ddd |V  qdS )c                    s   t  |  S rG   )r   _get_yaml_list_comment_item)qrE   r8   r=   <lambda>F  s   zDYamlRawParameter._get_yaml_list_comments.<locals>.<genexpr>.<lambda>c                 S   s   d S rG   r8   r   r8   r8   r=   r   H      N)r.   r|   
IndexErrorr   r@   )r9   r   r   r8   r=   r>   E  s   
z;YamlRawParameter._get_yaml_list_comments.<locals>.<genexpr>)r   rE   r   r   rm   )rD   Zraw_comment_linesr8   r   r=   r   B  s
    
z(YamlRawParameter._get_yaml_list_commentsc                 C   s4   | d r| d j  pd S | d d j  p.d S d S )Nr   r   )rD   rz   )r:   r8   r8   r=   r   M  s    z,YamlRawParameter._get_yaml_list_comment_itemc                    s   t  fdd D S )Nc                 3   s2   | ]*}|t ttf fd ddd |fV  qdS )c                    s    j j|  d j pd S r   )r   rE   rD   rz   )r   rs   r8   r=   r   Y  r   zCYamlRawParameter._get_yaml_map_comments.<locals>.<genexpr>.<lambda>c                 S   s   d S rG   r8   r   r8   r8   r=   r   Z  r   N)r.   r|   r   r   rs   r8   r=   r>   X  s   

z:YamlRawParameter._get_yaml_map_comments.<locals>.<genexpr>)r   rs   r8   rs   r=   r   V  s    z'YamlRawParameter._get_yaml_map_commentsc                    s"   rt  fddD S tS )Nc              
   3   s,   | ]$}| ||   |fV  qd S rG   )r   r   r   r8   r=   r>   a  s   
z7YamlRawParameter.make_raw_parameters.<locals>.<genexpr>r   r   r8   r   r=   r   ^  s
    z$YamlRawParameter.make_raw_parametersc                 C   s   t |d}zt|}W nl tk
rT } z|j}t|d|j|jdW 5 d }~X Y n2 tk
r } zt|d|jdW 5 d }~X Y nX | 	||pt
W  5 Q R  S Q R X d S )Nrz:  reason: invalid yaml at line %(line)s, column %(column)s)linecolumnz/  reason: invalid yaml at position %(position)s)position)openr   r5   Zproblem_markrP   r   r   r4   r   r   r   )rv   filepathZfhZyaml_objerrZmarkr8   r8   r=   make_raw_parameters_from_filef  s"    z.YamlRawParameter.make_raw_parameters_from_file)rM   rN   rO   rT   rD   r   r   staticmethodr   r   r   r   r   r   r   r[   r8   r8   rX   r=   r     s    





r   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
DefaultValueRawParameterzP
    Wraps a default value as a RawParameter, for usage in ParameterLoader.
    c           
         s$  t t| ||| t| jtrXi }| j D ]\}}t| j| j|||< q.t	|| _
nt| jrg }tt| jD ] }|t| j| j| j|  qtt|| _
n~t| jtr| j| _
t| j D ]"\}}	| j
|t| j| j|	 qn6t| jtr| j| _
nt| jtr| j| _
nt d S rG   )rS   r   rT   rH   r   r	   rE   r_   rC   r*   r   r   r   rm   r   r   ConfigurationObjectr   __setattr__r
   r   r&   )
rU   r_   rC   r   r   r   r   r   	attr_name
attr_valuerX   r8   r=   rT     s6    
  

z!DefaultValueRawParameter.__init__c                 C   s   | j S rG   r   r   r8   r8   r=   rD     s    zDefaultValueRawParameter.valuec                 C   s   d S rG   r8   rt   r8   r8   r=   r     s    z DefaultValueRawParameter.keyflagc                 C   s\   t | jtrt S t| jr"t S t | jtr2d S t | jtrBd S t | jtrRd S t	 d S rG   )
rH   r   r	   r*   r   r   r   r
   r   r&   r   r8   r8   r=   r     s    
z#DefaultValueRawParameter.valueflags)	rM   rN   rO   __doc__rT   rD   r   r   r[   r8   r8   rX   r=   r   z  s
   r   c                    s|   dd }dd }t |t|idd  tdd | D } fd	d|D }fd
dt||D }tdd t|D }|S )Nc                 s   s2   |  dsdt| kst| | t| fV  d S )N).yml.yamlZcondarc)endswithr   r   r   r   )fullpathr8   r8   r=   _file_loader  s    z'load_file_configs.<locals>._file_loaderc                 s   s:   t dd dd t| D D D ]}|t|fV  q d S )Nc                 s   s2   | ]*}|d d dks&|dd dkr|V  qdS )Nr   r   r8   )r9   pr8   r8   r=   r>     s    z9load_file_configs.<locals>._dir_loader.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S rG   rR   )r9   entryr8   r8   r=   r>     s     )sortedr   r   r   )r   r   r8   r8   r=   _dir_loader  s    z&load_file_configs.<locals>._dir_loaderc                 S   s,   zt t| jW S  tk
r&   Y d S X d S rG   )r   r   st_modeOSErrorr   r8   r8   r=   _get_st_mode  s    z'load_file_configs.<locals>._get_st_modec                 s   s   | ]}t |V  qd S rG   r   r9   rR   r8   r8   r=   r>     s     z$load_file_configs.<locals>.<genexpr>c                 3   s   | ]} |V  qd S rG   r8   r   )r   r8   r=   r>     s     c                 3   s&   | ]\}}|d k	r | |V  qd S rG   r8   )r9   rR   r   )_loaderr8   r=   r>     s   c                 s   s   | ]
}|V  qd S rG   r8   )r9   Zkvr8   r8   r=   r>     s     )r   r   r   zipr   r   from_iterable)search_pathr   r   Zexpanded_pathsZ
stat_pathsZ
load_pathsraw_datar8   )r   r   r=   load_file_configs  s    	  
r   c                   @   sz   e Zd ZdZdZdddZdd Zdd Zdd	d
Zdd Z	e
dd Zdd ZedddZedd Zedd ZdS )LoadedParameterNc                 C   s"   || _ || _|| _|| _|| _dS )aJ  
        Represents a Parameter that has been loaded with configuration value.

        Args:
            name (str): name of the loaded parameter
            value (LoadedParameter or primitive): the value of the loaded parameter
            key_flag (ParameterFlag or None): priority flag for the parameter itself
            value_flags (Any or None): priority flags for the parameter values
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.
        N)_namerD   key_flagvalue_flags_validation)rU   rw   rD   r   r   
validationr8   r8   r=   rT     s
    zLoadedParameter.__init__c                 C   s    t |t | kr| j|jkS dS NFr   rD   rU   otherr8   r8   r=   __eq__  s    zLoadedParameter.__eq__c                 C   s
   t | jS rG   hashrD   rt   r8   r8   r=   __hash__  s    zLoadedParameter.__hash__
<<merged>>c                 C   s   g }t || js2|t| j||t| j| j nR| jdk	r| |}|dkrd|t| j|| n t |t	r|t
| j||| |S )a.  
        Validate a LoadedParameter typed value.

        Args:
            instance (Configuration): the instance object used to create the LoadedParameter.
            typed_value (Any): typed value to validate.
            source (str): string description for the source of the typed_value.
        NF)rH   _typer   rd   r   r   rD   r   r\   rI   ri   )rU   instancetyped_valuer_   rk   resultr8   r8   r=   collect_errors  s    	


zLoadedParameter.collect_errorsc                 C   s   t | jtr,t| jdd | j D }nvt| jrRt| jdd | jD }nPt | jtrt| j D ]$\}}t |trl| j	||
  ql| jS t| j}|| _| S )zw
        Recursively expands any environment values in the Loaded Parameter.

        Returns: LoadedParameter
        c                 s   s   | ]\}}||  fV  qd S rG   r   r   r8   r8   r=   r>     s     z)LoadedParameter.expand.<locals>.<genexpr>c                 s   s   | ]}|  V  qd S rG   r   r   r8   r8   r=   r>     s     )rH   rD   r	   r   rE   r   r   r   r   r   r   rK   )rU   Z	new_valuer   r   r8   r8   r=   r   	  s     


zLoadedParameter.expandc                 C   s
   t  dS )z
        Recursively merges matches into one LoadedParameter.

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

        Returns: LoadedParameter
        Nr   )rU   matchesr8   r8   r=   r/     s    
zLoadedParameter.mergec              
   C   s   | j }zt| j||W S  tk
r } zRt|}t|trfdt	dj
|j }|d
| j|7 }t| j|j||W 5 d}~X Y nX dS )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 {}: {}N)_element_typer   _typify_data_structurerD   r'   rI   
issubclassr
   r?   mapr   __members__valuesr   ri   )rU   r_   element_typeer`   choicesr8   r8   r=   r(   +  s    	
zLoadedParameter.typifyc                    s   t | tr(t|  fdd|  D S t| rJt|  fdd| D S t | trt|  D ]$\}}t |tr`| ||	  q`| S t | t
rt |trt|t
r|| S t	| |S d S )Nc                 3   s    | ]\}}||  fV  qd S rG   r(   r   r_   r8   r=   r>   A  s     z9LoadedParameter._typify_data_structure.<locals>.<genexpr>c                 3   s   | ]}|  V  qd S rG   r  r   r  r8   r=   r>   C  s     )rH   r	   r   rE   r   r   r   r   r   r(   rI   r	  )rD   r_   Z	type_hintr   r   r8   r  r=   r  >  s     



z&LoadedParameter._typify_data_structurec                 C   s   | j tjkS rG   )r   ro   rp   )loaded_parameterr8   r8   r=   _match_key_is_importantR  s    z'LoadedParameter._match_key_is_importantc                 C   s6   t t| dd dd d}|d kr&| S | d |d  S )Nc                 S   s   t | d S )Nr   )r   r  xr8   r8   r=   r   Y  r   z:LoadedParameter._first_important_matches.<locals>.<lambda>c                 S   s   | d S Nr   r8   r  r8   r8   r=   r   Z  r   )Zapplyr   )r#   	enumerate)r  idxr8   r8   r=   _first_important_matchesV  s
    z(LoadedParameter._first_important_matches)N)r   )N)rM   rN   rO   r   r  rT   r   r   r  r   r   r/   r(   r   r  r  r  r8   r8   r8   r=   r     s    



r   c                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )r   z
    LoadedParameter type that holds a single python primitive value.

    The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
    python 2 has long and unicode types.
    Nc                    s(   || _ || _tt| ||||| dS )z
        Args:
            element_type (type or Tuple[type]): Type-validation of parameter's value.
            value (primitive value): primitive python value.
        N)r   r  rS   r   rT   )rU   rw   r  rD   r   r   r   rX   r8   r=   rT   f  s    
    z!PrimitiveLoadedParameter.__init__c                 C   s    t |t | kr| j|jkS dS r   r   r   r8   r8   r=   r   q  s    zPrimitiveLoadedParameter.__eq__c                 C   s
   t | jS rG   r   rt   r8   r8   r=   r   v  s    z!PrimitiveLoadedParameter.__hash__c                 C   sD   t |tjd d}|d k	r|S t|dd d d}|d k	r:|S t d S )N)defaultc                 S   s   | d k	S rG   r8   r  r8   r8   r=   r   ~  r   z0PrimitiveLoadedParameter.merge.<locals>.<lambda>)r#   r   r  r$   r&   )rU   r  Zimportant_matchZ
last_matchr8   r8   r=   r/   y  s    zPrimitiveLoadedParameter.merge)N)	rM   rN   rO   r   rT   r   r   r/   r[   r8   r8   rX   r=   r   ^  s
   r   c                       s<   e Zd ZdZeZd
 fdd	Zd fdd	Zdd	 Z  Z	S )MapLoadedParameterzP
    LoadedParameter type that holds a map (i.e. dict) of LoadedParameters.
    Nc                    s"   || _ tt| ||||| dS )z
        Args:
            value (Mapping): Map of string keys to LoadedParameter values.
            element_type (Parameter): The Parameter type that is held in value.
            value_flags (Mapping): Map of priority value flags.
        N)r  rS   r  rT   rU   rw   rD   r  r   r   r   rX   r8   r=   rT     s    zMapLoadedParameter.__init__r   c                    sR   t t| ||| j}t| jtrN| j D ] \}}||||| | q,|S rG   )rS   r  r  rD   rH   r	   rE   extendrU   r   r   r_   rk   rC   rD   rX   r8   r=   r    s
    z!MapLoadedParameter.collect_errorsc                    s   t dd t|D }|D ].\}}t|tst| j||j|jj	| j
j	qdd  t  fdd|D }ttdd dd |D }ttt|gt|}t| j|| j| j| j| jd	S )
Nc                 s   s   | ]}||j fV  qd S rG   rs   r9   matchr8   r8   r=   r>     s     z+MapLoadedParameter.merge.<locals>.<genexpr>c                 S   s   | j |tjkS rG   r   getro   rp   r   rC   r8   r8   r=   key_is_important  s    z2MapLoadedParameter.merge.<locals>.key_is_importantc                 3   s.   | ]&\ }t  fd d| D V  qdS )c                 3   s$   | ]\}} |r||fV  qd S rG   r8   r   r$  r   r8   r=   r>     s   
z5MapLoadedParameter.merge.<locals>.<genexpr>.<genexpr>Nr   rE   r9   match_valuer$  r   r=   r>     s   c                 S   s   | d  | S r  r/   Zvalue_matchesr8   r8   r=   r     r   z*MapLoadedParameter.merge.<locals>.<lambda>c                 s   s   | ]\}}|V  qd S rG   r8   r9   r   r(  r8   r8   r=   r>     s     r   )r   r   r  rH   r	   rd   rw   r_   rY   rM   r   r*   r0   r/   r-   reversedr  r   r  r   r   r   )rU   r  relevant_matches_and_valuesr   rD   important_mapsmerged_values#merged_values_important_overwrittenr8   r)  r=   r/     s6    
zMapLoadedParameter.merge)N)r   )
rM   rN   rO   r   r*   r   rT   r  r/   r[   r8   r8   rX   r=   r    s
   
	r  c                       s<   e Zd ZdZeZd
 fdd	Zd fdd	Zdd	 Z  Z	S )SequenceLoadedParameterU
    LoadedParameter type that holds a sequence (i.e. list) of LoadedParameters.
    Nc                    s"   || _ tt| ||||| dS )z
        Args:
            value (Sequence): Sequence of LoadedParameter values.
            element_type (Parameter): The Parameter type that is held in the sequence.
            value_flags (Sequence): Sequence of priority value_flags.
        N)r  rS   r4  rT   r  rX   r8   r=   rT     s    
    z SequenceLoadedParameter.__init__r   c                    sF   t t| ||| j}t| jD ] \}}||||| | q |S rG   )rS   r4  r  rD   r  r  )rU   r   r   r_   rk   r  elementrX   r8   r=   r    s    
  z&SequenceLoadedParameter.collect_errorsc                    s   t dd t|D }|D ].\}}t|t st| j||j|jj| j	jqdd  t
 fdd|D }t
 fddt|D }t
dd t|D }t tt||}tttt |t|}	t tt |	}
t| j|
| j| j| j| jdS )	Nc                 s   s   | ]}||j fV  qd S rG   rs   r  r8   r8   r=   r>     s     z0SequenceLoadedParameter.merge.<locals>.<genexpr>c                    s(   | r$t  fddt| j| jD S dS )Nc                 3   s   | ]\}}| kr|V  qd S rG   r8   )r9   r   flagmarkerr8   r=   r>     s   zJSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>r8   )r   r   rD   r   )r   r9  r8   r8  r=   get_marked_lines  s    z7SequenceLoadedParameter.merge.<locals>.get_marked_linesc                 3   s   | ]\}} |t jV  qd S rG   )ro   rq   r9   mr   r:  r8   r=   r>     s     c                 3   s   | ]\}} |t jV  qd S rG   )ro   rr   r;  r=  r8   r=   r>     s     c                 s   s   | ]\}}|V  qd S rG   r8   )r9   r   r   r8   r8   r=   r>     s     r.  )r   r   r  rH   rd   rw   r_   rY   rM   r   r,   r/  r1   r-   r4  r   r  r   r   r   )rU   r  r0  r   rD   Z	top_linesZbottom_linesZ	all_linesZtop_dedupedZbottom_dedupedr2  r8   r=  r=   r/     s6    
zSequenceLoadedParameter.merge)N)r   )
rM   rN   rO   r   r   r   rT   r  r/   r[   r8   r8   rX   r=   r4    s
   r4  c                       s<   e Zd ZdZeZd
 fdd	Zd fdd	Zdd	 Z  Z	S )ObjectLoadedParameterr5  Nc                    s"   || _ tt| ||||| dS )z
        Args:
            value (Sequence): Object with LoadedParameter fields.
            element_type (object): The Parameter type that is held in the sequence.
            value_flags (Sequence): Sequence of priority value_flags.
        N)r  rS   r>  rT   r  rX   r8   r=   rT     s    
    zObjectLoadedParameter.__init__r   c                    s`   t t| ||| j}t| jtr\t| j D ]*\}}t|tr0|	|||| | q0|S rG   )
rS   r>  r  rD   rH   r   r   rE   r   r  r  rX   r8   r=   r  !  s    
  
z$ObjectLoadedParameter.collect_errorsc                    s   t dd t|D }|D ].\}}t|tst| j||j|jj	| j
j	qdd  t  fdd|D }ttdd dd |D }ttt|gt|}t| j}| D ]\}	}
||	|
 qt| j|| j| j| j| jd	S )
Nc                 s   s*   | ]"}|d d t |j D fV  qdS )c                 S   s    i | ]\}}t |tr||qS r8   )rH   r   r   r8   r8   r=   
<dictcomp>0  s    
 z9ObjectLoadedParameter.merge.<locals>.<genexpr>.<dictcomp>N)r   rD   rE   r  r8   r8   r=   r>   /  s   z.ObjectLoadedParameter.merge.<locals>.<genexpr>c                 S   s   | j |tjkS rG   r!  r#  r8   r8   r=   r$  <  s    z5ObjectLoadedParameter.merge.<locals>.key_is_importantc                 3   s.   | ]&\ }t  fd d| D V  qdS )c                 3   s$   | ]\}} |r||fV  qd S rG   r8   r   r%  r8   r=   r>   >  s   
z8ObjectLoadedParameter.merge.<locals>.<genexpr>.<genexpr>Nr&  r'  r)  r*  r=   r>   >  s   c                 S   s   | d  | S r  r+  r,  r8   r8   r=   r   E  r   z-ObjectLoadedParameter.merge.<locals>.<lambda>c                 s   s   | ]\}}|V  qd S rG   r8   r-  r8   r8   r=   r>   F  s     r.  )r   r   r  rH   r	   rd   rw   r_   rY   rM   r   r*   r0   r/   r-   r/  copydeepcopyr  rE   r   r>  r   r   r   r   )rU   r  r0  r   rD   r1  r2  r3  object_copyr   loaded_child_parameterr8   r)  r=   r/   ,  s<    
zObjectLoadedParameter.merge)N)r   )
rM   rN   rO   r   objectr   rT   r  r/   r[   r8   r8   rX   r=   r>    s
   r>  c                   @   s   e Zd ZdZdS )r   zS
    Dummy class to mark whether a Python object has config parameters within.
    N)rM   rN   rO   r   r8   r8   r8   r=   r   \  s   r   c                   @   sF   e Zd ZdZdZdddZedd Zdd Ze	dd	 Z
d
d ZdS )	ParameterNc                 C   s   || _ || _dS )a  
        The Parameter class represents an unloaded configuration parameter, holding type, default
        and validation information until the parameter is loaded with a configuration.

        Args:
            default (Any): the typed, python representation default value given if the Parameter
                is not found in a Configuration.
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.
        N)_defaultr   )rU   r  r   r8   r8   r=   rT   j  s    zParameter.__init__c                 C   s   t dd| j}| d|S )zY
        Returns a DefaultValueRawParameter that wraps the actual default value.
        r  )r   rF  load)rU   Zwrapped_defaultr8   r8   r=   r  x  s    zParameter.defaultc           
      C   sV   g }g }|j  D ]:\}}t|||\}}	|dk	r>|| |	r||	 q||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.
        N)r   rE   ParameterLoader!raw_parameters_from_single_sourcer   )
rU   rw   namesr   r  Zmultikey_exceptionsr   raw_parametersr   errorr8   r8   r=   get_all_matches  s      
zParameter.get_all_matchesc                 C   s
   t  dS )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
        Nr   rU   rw   r   r8   r8   r=   rG    s    zParameter.loadc              
   C   s   | j }zt||W S  tk
r~ } zNt|}t|tr^dtdj|j	
 }|d||7 }t||j||W 5 d }~X Y nX d S )Nr  r  r  )r  r)   r'   rI   r	  r
   r?   r
  r   r  r  ri   rD   )rU   rw   r_   rD   r  r  r`   r  r8   r8   r=   r(     s    
zParameter.typify)N)rM   rN   rO   r   r  rT   r   r  rM  r   rG  r(   r8   r8   r8   r=   rE  c  s   


rE  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )PrimitiveParameterz
    Parameter type for a Configuration class that holds a single python primitive value.

    The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
    python 2 has long and unicode types.
    Nc                    s4   |dkrt |n|| _| j| _tt| || dS )z
        Args:
            default (primitive value): default value if the Parameter is not found.
            element_type (type or Tuple[type]): Type-validation of parameter's value. If None,
                type(default) is used.
        N)r   r   r  rS   rO  rT   )rU   r  r  r   rX   r8   r=   rT     s    zPrimitiveParameter.__init__c                 C   s,   t || j|| j| || j| jdS Nr.  )r   r   rD   r  r   r   r   rN  r8   r8   r=   rG    s    

zPrimitiveParameter.load)NN)rM   rN   rO   r   rT   rG  r[   r8   r8   rX   r=   rO    s   rO  c                       s@   e Zd ZdZeZe df fdd	Z fddZdd Z  Z	S )	MapParameterz^
    Parameter type for a Configuration class that holds a map (i.e. dict) of Parameters.
    Nc                    s0   || _ |rt|pt }tt| j||d dS )z
        Args:
            element_type (Parameter): The Parameter type held in the MapParameter.
            default (Mapping):  The parameter's default value. If None, will be an empty dict.
        r.  N)r  r*   rS   rQ  rT   rU   r  r  r   rX   r8   r=   rT     s    zMapParameter.__init__c                    s2   t t| |||\}}tdd |D }||fS )Nc                 s   s   | ]}|j d k	r|V  qd S rG   r   r9   r<  r8   r8   r=   r>     s     
 z/MapParameter.get_all_matches.<locals>.<genexpr>)rS   rQ  rM  r   rU   rw   rJ  r   r  
exceptionsrX   r8   r=   rM    s    zMapParameter.get_all_matchesc                 C   s   | | j}|d kr4t|t | j| t | jdS t|tsXt|||j	|j
j| jji }| | j D ]\}}| j||}|||< qlt|t|| j| || j| jdS rP  )rD   r  r  r*   r   r   rH   r	   rd   r_   rY   rM   r   rE   rG  r   )rU   rw   r   rD   Z
loaded_maprC   child_valueloaded_child_valuer8   r8   r=   rG    s4    


zMapParameter.load)
rM   rN   rO   r   r*   r   rT   rM  rG  r[   r8   r8   rX   r=   rQ    s
   
rQ  c                       s:   e Zd ZdZeZd fdd	Z fddZd	d
 Z  Z	S )SequenceParameterzc
    Parameter type for a Configuration class that holds a sequence (i.e. list) of Parameters.
    r8   N,c                    s"   || _ || _tt| || dS )a  
        Args:
            element_type (Parameter): The Parameter type that is held in the sequence.
            default (Sequence): default value, empty tuple if not given.
            string_delimiter (str): separation string used to parse string into sequence.
        N)r  r   rS   rY  rT   )rU   r  r  r   r   rX   r8   r=   rT     s    zSequenceParameter.__init__c                    s2   t t| |||\}}tdd |D }||fS )Nc                 s   s   | ]}|j d k	r|V  qd S rG   rS  rT  r8   r8   r=   r>     s     
 z4SequenceParameter.get_all_matches.<locals>.<genexpr>)rS   rY  rM  r   rU  rX   r8   r=   rM    s    z!SequenceParameter.get_all_matchesc                 C   s   | | }|d kr2t|t | j| t | jdS t|sTt|||j|j	j
| jj
g }|D ]}| j||}|| q\t|t|| j| || j| jdS rP  )rD   r4  r   r  r   r   r   rd   r_   rY   rM   r   rG  r   r   )rU   rw   r   rD   Zloaded_sequencerW  rX  r8   r8   r=   rG    s4    

zSequenceParameter.load)r8   NrZ  )
rM   rN   rO   r   r   r   rT   rM  rG  r[   r8   r8   rX   r=   rY     s
   rY  c                       s@   e Zd ZdZeZe df fdd	Z fddZdd Z	  Z
S )	ObjectParameterz^
    Parameter type for a Configuration class that holds an object with Parameter fields.
    Nc                    s   || _ tt| || dS )z
        Args:
            element_type (object): The object type with parameter fields held in ObjectParameter.
            default (Sequence): default value, empty tuple if not given.
        N)r  rS   r[  rT   rR  rX   r8   r=   rT   =  s    zObjectParameter.__init__c                    s2   t t| |||\}}tdd |D }||fS )Nc                 s   s   | ]}|j d k	r|V  qd S rG   rS  rT  r8   r8   r=   r>   I  s     
 z2ObjectParameter.get_all_matches.<locals>.<genexpr>)rS   r[  rM  r   rU  rX   r8   r=   rM  F  s    zObjectParameter.get_all_matchesc                    s  | | j  d kr0t|d | j| d | jdS t ts^t ts^t| |j	 j
j| jjt trpt   fddt| j D }i }| D ]&\}} |}|||}|||< qt| j}	| D ]\}}
|	||
 qt||	| j| || j| jdS )Nr.  c                    s,   i | ]$\}}t |tr|  kr||qS r8   )rH   rE  rc   )r9   r   parameter_typers   r8   r=   r?  `  s
   
 z(ObjectParameter.load.<locals>.<dictcomp>)rD   r  r>  r   r   rH   r	   r   rd   r_   rY   rM   r   r   rE   r"  rG  r@  rA  r   r   )rU   rw   r   Zobject_parameter_attrsZloaded_attrsr   r\  Zraw_child_valuerX  rB  rC  r8   rs   r=   rG  L  sF    




zObjectParameter.load)rM   rN   rO   r   rD  r   r   rT   rM  rG  r[   r8   r8   rX   r=   r[  7  s
   	r[  c                   @   sV   e Zd ZdZdddZdd Zedd	 Zed
d Zdd Z	dd Z
edd ZdS )rH  zq
    ParameterLoader class contains the top level logic needed to load a parameter from start to
    finish.
    r8   Fc                 C   s"   d| _ d| _|| _|| _|| _dS )a  
        Args:
            parameter_type (Parameter): the type of Parameter that is stored in the loader.
            aliases (tuple(str)): alternative aliases for the Parameter
            expandvars (bool): whether or not to recursively expand environmental variables.
        N)r   _namesr   aliases_expandvars)rU   r\  r^  r   r8   r8   r=   rT     s
    zParameterLoader.__init__c                 C   s,   || _ tdd t| j|fD }|| _|S )Nc                 s   s   | ]
}|V  qd S rG   r8   )r9   r  r8   r8   r=   r>     s     z,ParameterLoader._set_name.<locals>.<genexpr>)r   	frozensetr   r^  r]  )rU   rw   r]  r8   r8   r=   	_set_name  s    zParameterLoader._set_namec                 C   s   | j d krt | j S rG   )r   r&   rt   r8   r8   r=   rw     s    
zParameterLoader.namec                 C   s   | j d krt | j S rG   )r]  r&   rt   r8   r8   r=   rJ    s    
zParameterLoader.namesc           
   
      s    j |jkr|j j  S  j j  j|\}} fdd|D }|rT|d |n jj} jrj| n|}z|	d}W n, t
k
r }	 z||	 W 5 d }	~	X Y nX ||||d t| ||j j < |S )Nc                    s   g | ]} j  j|qS r8   )r   rG  rw   r  rt   r8   r=   
<listcomp>  s     z+ParameterLoader.__get__.<locals>.<listcomp>r   r   )rw   _cache_r   rM  rJ  r/   r  r_  r   r(   ri   r   r  r  rn   )
rU   r   Zinstance_typeZraw_matchesrk   r  ZmergedZexpandedr  r  r8   rt   r=   __get__  s    zParameterLoader.__get__c                 C   s   t | j| j|S rG   )rH  rI  rw   rJ  )rU   rK  r8   r8   r=   "_raw_parameters_from_single_source  s
      z2ParameterLoader._raw_parameters_from_single_sourcec                    s   |t   @ } fdd|D }t|}|dkr6dS |dkrRtt| d fS | |kr|||  t tt| j|| fS d t tt| j|| fS d S )Nc                    s   i | ]}| | qS r8   r8   r   rK  r8   r=   r?    s      zEParameterLoader.raw_parameters_from_single_source.<locals>.<dictcomp>r   )NNr   )r`  rc   rm   nextiterr  ra   r_   )rw   rJ  rK  rc   r  Znumkeysr8   rf  r=   rI    s"       z1ParameterLoader.raw_parameters_from_single_sourceN)r8   F)rM   rN   rO   r   rT   ra  r   rw   rJ  rd  re  r   rI  r8   r8   r8   r=   rH  {  s   


rH  c                       s    e Zd ZdZ fddZ  ZS )ConfigurationTypezmetaclass for Configurationc                    s2   t t| ||| tdd | j D | _d S )Nc                 s   s&   | ]\}}t |tr||V  qd S rG   )rH   rH  ra  )r9   rw   r   r8   r8   r=   r>     s    
z-ConfigurationType.__init__.<locals>.<genexpr>)rS   ri  rT   r   __dict__rE   parameter_names)rv   rw   basesattrrX   r8   r=   rT     s    zConfigurationType.__init__)rM   rN   rO   r   rT   r[   r8   r8   rX   r=   ri    s   ri  c                   @   s   e Zd Zd%ddZdd Zd&ddZd	d
 Zdd Zdd Zdd Z	dd Z
dd Zedd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )'Configurationr8   Nc                 C   sD   t  | _t | _t | _tt| _| 	| | 
| | | d S rG   )r   r   r   rc  r+   _reset_callbacksr   listZ_validation_errors_set_search_path_set_env_vars_set_argparse_args)rU   r   app_nameargparse_argsr8   r8   r=   rT     s    


zConfiguration.__init__c                 C   s$   t || _| t| |   | S rG   )r+   Z_search_path_set_raw_datar   _reset_cache)rU   r   r8   r8   r=   rq    s    
zConfiguration._set_search_pathc                 C   s,   || _ |s| S t|| jtj< |   | S rG   )Z	_app_namer   r   r   r_   rw  )rU   rt  r8   r8   r=   rr    s    zConfiguration._set_env_varsc                 C   sr   t |dr(tdd t| D | _n&|s6t | _ntdd | D | _tj}t| j| j|< | 	  | S )Nrj  c                 s   s"   | ]\}}|t k	r||fV  qd S rG   r   r   r8   r8   r=   r>     s    z3Configuration._set_argparse_args.<locals>.<genexpr>c                 s   s"   | ]\}}|t k	r||fV  qd S rG   r   r   r8   r8   r=   r>     s    )
r   r"   r   rE   Z_argparse_argsr   r_   r   r   rw  )rU   ru  r_   r8   r8   r=   rs     s    

z Configuration._set_argparse_argsc                 C   s   | j | |   | S rG   )r   updaterw  )rU   r   r8   r8   r=   rv    s    zConfiguration._set_raw_datac                 C   s   t  | _| jD ]
}|  q| S rG   )r   rc  ro  rU   callbackr8   r8   r=   rw    s    
zConfiguration._reset_cachec                 C   s   | j | d S rG   )ro  addry  r8   r8   r=   register_reset_callaback!  s    z&Configuration.register_reset_callabackc                 C   s   i }g }| j | }| jD ]}| jj| }||\}}|rD|| |d k	r|j||}	z|	|j	}
W n, t
k
r } z|| W 5 d }~X Y qX |	| |
|j	}|r|| q|
||j< qq||fS rG   )r   rk  rY   rj  re  r   r   rG  r(   r_   ri   r  r  rC   )rU   r_   typed_valuesvalidation_errorsrK  rC   	parameterr   Zmultikey_errorr  r   r  Zcollected_errorsr8   r8   r=   check_source$  s0    


  zConfiguration.check_sourcec                    s2   t t fdd jD }t|    d S )Nc                 3   s   | ]}  |d  V  qdS )r   N)r  )r9   r_   rt   r8   r=   r>   J  s   z-Configuration.validate_all.<locals>.<genexpr>)rp  r   r   r   rn   validate_configuration)rU   r~  r8   rt   r=   validate_allI  s
    
zConfiguration.validate_allc              
   O   sP   z| || W n< t k
rJ } zt|dr0|jn|f W Y S d }~X Y nX dS )Nrk   r8   )rL   r   rk   )funcrl   rV   r  r8   r8   r=   _collect_validation_errorO  s
    ,z'Configuration._collect_validation_errorc                    s<   t  fdd jD }  }ttt ||f d S )Nc                 3   s   | ]}t t |V  qd S rG   )rn  r  r   r9   rw   rt   r8   r=   r>   X  s   z7Configuration.validate_configuration.<locals>.<genexpr>)r   r   rk  post_build_validationrn   r   )rU   rk   Zpost_errorsr8   rt   r=   r  W  s
    z$Configuration.validate_configurationc                 C   s   dS r   r8   rt   r8   r8   r=   r  ]  s    z#Configuration.post_build_validationc                 C   sZ   t  }t  }| jD ]}| |\||< ||< qttt|  t dd | D S )Nc                 s   s   | ]\}}|r||fV  qd S rG   r8   r   r8   r8   r=   r>   f  s      z,Configuration.collect_all.<locals>.<genexpr>)	r   r   r  rn   r   r   r   r  rE   )rU   r}  r~  r_   r8   r8   r=   collect_all`  s    
zConfiguration.collect_allc           	   	      s  || j krd| }| jj| }|j}t|ts2t|jd t	 fdd|j
D }|   d}|j}t|tkr~|g}t|s|g}t|jtrt	dd |D }nt	dd |D }|jj dd |||jd|d	d
 d}t|tr
|j|d< |S )Nr   c                 3   s   | ]}| kr|V  qd S rG   r8   )r9   aliasrw   r8   r=   r>   r  s      z3Configuration.describe_parameter.<locals>.<genexpr>rQ   c                 s   s"   | ]}|j j d dV  qdS )r  rQ   N)rY   rM   r   r   r9   Z_etr8   r8   r=   r>   |  s    c                 s   s   | ]}|j V  qd S rG   )rM   r  r8   r8   r=   r>     s     r  z<<describe>>r7    )r\  rw   r^  element_typesZdefault_valuedescriptionr   )rk  rY   rj  r   rH   rE  r   rw   lstripr   r^  get_descriptionsr"  r  r   r   rM   r   r   r  r(   rz   rY  r   )	rU   r]   parameter_loaderr  r^  r  Zetr  Zdetailsr8   r  r=   describe_parameterh  s8    



z Configuration.describe_parameterc                 C   s   t tdd | jD S )Nc                 s   s   | ]}| d V  qdS )r   N)r  r  r8   r8   r=   r>     s     z0Configuration.list_parameters.<locals>.<genexpr>)r   r   rk  rt   r8   r8   r=   list_parameters  s    zConfiguration.list_parametersc                 C   s@   || j krd| }| jj| }|j}t|ts2t||||S )Nr   )rk  rY   rj  r   rH   rE  r   r(   )rU   r]   rD   r_   r  r  r8   r8   r=   typify_parameter  s    
zConfiguration.typify_parameterc                 C   s
   t  d S rG   r   rt   r8   r8   r=   r    s    zConfiguration.get_descriptions)r8   NN)N)rM   rN   rO   rT   rq  rr  rs  rv  rw  r|  r  r  r   r  r  r  r  r  r  r  r  r8   r8   r8   r=   rn    s$   

%
%
rn  )r6   )r6   )tr   Z
__future__r   r   r   r   abcr   r   collectionsr   Zcollections.abcr	   r@  enumr
   r   	itertoolsr   Zloggingr   osr   r   r   os.pathr   r   r   r   r   r   compatr   r   r   Z	constantsr   rR   r   Z	serializer   rQ   r    r!   Zauxlib.collectionr"   r#   r$   r%   Zauxlib.exceptionsr&   Zauxlib.type_coercionr'   r(   r)   Z_vendor.frozendictr*   Z_vendor.boltons.setutilsr+   Z_vendor.toolzr,   r-   r.   r/   r0   r1   Zruamel_yaml.commentsr2   r3   Zruamel_yaml.readerr4   Zruamel_yaml.scannerr5   ImportErrorZruamel.yaml.commentsZruamel.yaml.readerZruamel.yaml.scannerrM   logr   rA   rF   rK   rL   rP   r\   ra   rd   rg   ri   rj   rn   ro   r   r   r   r   r   r   r   r   r  r4  r>  rD  r   rE  rO  rQ  rY  r[  rH  r   ri  rn  r8   r8   r8   r=   <module>   s    
	
		!'f5$ &AKLL47D^