B
    lz]m                 @   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
 yddlmZ W n  ek
rh   ddl	mZ Y nX 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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#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZCmDZDmEZEmFZF y,ddlGmHZHmIZI ddlJmKZK ddlLmMZM W n> ek
r   ddlNmHZHmIZI ddlOmKZK ddlPmMZM Y nX eeQZRe> ZSdOddZTdPd d!ZUd"d# ZVG d$d% d%e1ZWG d&d' d'eWZXG d(d) d)eWZYG d*d+ d+eYZZG d,d- d-eYZ[G d.d/ d/e[Z\G d0d1 d1eYZ]G d2d3 d3e2eWZ^d4d5 Z_G d6d7 d7eZ`e)eG d8d9 d9eaZbG d:d; d;ebZcG d<d= d=ebZdG d>d? d?ebZed@dA Zfe)eG dBdC dCeaZgG dDdE dEegZhG dFdG dGegZiG dHdI dIegZjG dJdK dKekZle)elG dLdM dMeaZmdNS )Qa`  
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

Limitations:
  - at the moment only supports a "flat" config structure; no nested data structures

    )absolute_importdivisionprint_functionunicode_literals)ABCMetaabstractmethod)defaultdict)Mapping)glob)chain)	getLogger)environstat)basenamejoin
expandvars)S_IFDIRS_IFMTS_IFREG)EnumEnumMeta   )	binary_type
isiterable	iteritems
itervaluesodictprimitive_typesstring_types	text_typewith_metaclass)NULL)expand)	yaml_load   )
CondaErrorCondaMultiError)AttrDictfirstlastmake_immutable)ThisShouldNeverHappenError)TypeCoercionErrortypify_data_structure)
frozendict)
IndexedSet)concatconcatvexceptsmergeunique)CommentedSeqCommentedMap)ReaderError)ScannerError  c                sH   t | s| g} yd fdd| D S  tk
rB   t| g S X d S )N
c             3   s   | ]}d  |f V  qdS )z%s- %sN ).0item)paddingr;   9lib/python3.7/site-packages/conda/common/configuration.py	<genexpr>C   s    zpretty_list.<locals>.<genexpr>)r   r   	TypeErrorpretty_list)iterabler>   r;   )r>   r?   rB   ?   s    rB   c                s   d  fddt| D S )Nr:   c             3   s    | ]\}}d  ||f V  qdS )z%s%s: %sNr;   )r<   keyvalue)r>   r;   r?   r@   I   s    zpretty_map.<locals>.<genexpr>)r   r   )Z
dictionaryr>   r;   )r>   r?   
pretty_mapH   s    rF   c             C   s$   t | tst | trt| S | S d S )N)
isinstancer   r   r   )Z
unexpandedr;   r;   r?   expand_environment_variablesL   s    rH   c               @   s   e Zd ZdS )ConfigurationErrorN)__name__
__module____qualname__r;   r;   r;   r?   rI   R   s   rI   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)superrM   __init__)selfrO   Zmessage_additionkwargsmessage)	__class__r;   r?   rQ   W   s    zConfigurationLoadError.__init__)rN   )rJ   rK   rL   rQ   __classcell__r;   r;   )rU   r?   rM   V   s   rM   c                   s   e Zd Zd fdd	Z  ZS )ValidationErrorNc                s*   || _ || _|| _tt| j|f| d S )N)parameter_nameparameter_valuesourcerP   rW   rQ   )rR   rX   rY   rZ   msgrS   )rU   r;   r?   rQ   _   s    zValidationError.__init__)N)rJ   rK   rL   rQ   rV   r;   r;   )rU   r?   rW   ]   s   rW   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[   )rZ   keysrB   rP   r\   rQ   )rR   rZ   r]   Zpreferred_keyr[   )rU   r;   r?   rQ   h   s
    zMultipleKeysError.__init__)rJ   rK   rL   rQ   rV   r;   r;   )rU   r?   r\   f   s   r\   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:
%s)r[   )
wrong_typevalid_typesrB   rP   r^   rQ   )rR   rX   rY   rZ   r_   r`   r[   )rU   r;   r?   rQ   r   s    zInvalidTypeError.__init__)N)rJ   rK   rL   rQ   rV   r;   r;   )rU   r?   r^   q   s   r^   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.)r[   )rG   intrB   rP   ra   rQ   )	rR   rX   rY   rZ   r_   r`   Zindex_or_keyZ	qualifierr[   )rU   r;   r?   rQ   }   s    z InvalidElementTypeError.__init__)rJ   rK   rL   rQ   rV   r;   r;   )rU   r?   ra   |   s   ra   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.
%s)r[   )rP   rc   rQ   )rR   rX   rY   rZ   Zcustom_messager[   )rU   r;   r?   rQ      s    zCustomValidationError.__init__)rJ   rK   rL   rQ   rV   r;   r;   )rU   r?   rc      s   rc   c                   s   e Zd Z fddZ  ZS )MultiValidationErrorc                s   t t| j|f|| d S )N)rP   rd   rQ   )rR   errorsargsrS   )rU   r;   r?   rQ      s    zMultiValidationError.__init__)rJ   rK   rL   rQ   rV   r;   r;   )rU   r?   rd      s   rd   c             C   s*   | sdS t | dkr| d nt| d S )NTr   r   )lenrd   )re   r;   r;   r?   raise_errors   s
    
rh   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)rE   )rR   r;   r;   r?   __str__   s    zParameterFlag.__str__c             C   s   | | S )Nr;   )clsnamer;   r;   r?   	from_name   s    zParameterFlag.from_namec             C   s   | |S )Nr;   )rn   rE   r;   r;   r?   
from_value   s    zParameterFlag.from_valuec          	   C   s2   y| d}| |S  ttfk
r,   d S X d S )Nz!#)striprq   
ValueErrorAttributeError)rn   stringr;   r;   r?   from_string   s
    

zParameterFlag.from_stringN)rJ   rK   rL   rj   rk   rl   rm   classmethodrp   rq   rv   r;   r;   r;   r?   ri      s   ri   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   || _ || _yt|d| _W n   || _Y nX d S )Nzutf-8)rZ   rD   Zunicodedecode
_raw_value)rR   rZ   rD   	raw_valuer;   r;   r?   rQ      s    zRawParameter.__init__c             C   s   t t| S )N)r   vars)rR   r;   r;   r?   __repr__   s    zRawParameter.__repr__c             C   s
   t  d S )N)NotImplementedError)rR   parameter_objr;   r;   r?   rE      s    zRawParameter.valuec             C   s
   t  d S )N)r~   )rR   r;   r;   r?   keyflag   s    zRawParameter.keyflagc             C   s
   t  d S )N)r~   )rR   r   r;   r;   r?   
valueflags   s    zRawParameter.valueflagsc                s"   rt  fddD S tS )Nc             3   s"   | ]}| || fV  qd S )Nr;   )r<   rD   )rn   from_maprZ   r;   r?   r@      s    z3RawParameter.make_raw_parameters.<locals>.<genexpr>)dict	EMPTY_MAP)rn   rZ   r   r;   )rn   r   rZ   r?   make_raw_parameters   s    z RawParameter.make_raw_parametersN)rJ   rK   rL   rQ   r}   r   rE   r   r   rw   r   r;   r;   r;   r?   rx      s   	rx   c                   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             C   sZ   t |drHt| jtstt|d}tdd dd | j|D D S | jd 	 S d S )Nstring_delimiterc             s   s   | ]}|r|V  qd S )Nr;   )r<   vr;   r;   r?   r@      s    z(EnvRawParameter.value.<locals>.<genexpr>c             s   s   | ]}|  V  qd S )N)rr   )r<   Zvvr;   r;   r?   r@      s    r   )
hasattrrG   rz   r   AssertionErrorgetattrtuplesplit'_EnvRawParameter__important_split_valuerr   )rR   r   r   r;   r;   r?   rE      s    

zEnvRawParameter.valuec             C   s   t | jdkrtjS d S )Nr$   )rg   r   ri   rj   )rR   r;   r;   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 )rN   Nr;   )r<   _r;   r;   r?   r@      s    z-EnvRawParameter.valueflags.<locals>.<genexpr>r   )r   r   r   rz   r   r   rr   )rR   r   r   r;   r;   r?   r      s    

zEnvRawParameter.valueflagsc             C   s   | j dS )Nz
!important)rz   r   )rR   r;   r;   r?   Z__important_split_value   s    z'EnvRawParameter.__important_split_valuec                s<   d |  t fddttD }tt| tj|S )Nz{0}_c             3   s2   | ]*\}}|  r| d d |fV  qdS )rN   r   N)
startswithreplacelower)r<   kr   )keystartr;   r?   r@      s   z6EnvRawParameter.make_raw_parameters.<locals>.<genexpr>)	formatupperr   r   r   rP   r   r   rZ   )rn   ZappnameZraw_env)rU   )r   r?   r      s    z#EnvRawParameter.make_raw_parameters)rJ   rK   rL   rZ   rE   r   r   propertyr   rw   r   rV   r;   r;   )rU   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   s
   t | jS )N)r*   rz   )rR   r   r;   r;   r?   rE     s    zArgParseRawParameter.valuec             C   s   d S )Nr;   )rR   r;   r;   r?   r     s    zArgParseRawParameter.keyflagc             C   s   t |trd S dS )Nr;   )rG   PrimitiveParameter)rR   r   r;   r;   r?   r     s    zArgParseRawParameter.valueflagsc                s   t t| tj|S )N)rP   r   r   rZ   )rn   Zargs_from_argparse)rU   r;   r?   r   
  s    z(ArgParseRawParameter.make_raw_parameters)
rJ   rK   rL   rZ   rE   r   r   rw   r   rV   r;   r;   )rU   r?   r      s
   r   c                   sx   e Zd Z fddZ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  ZS )YamlRawParameterc                s   || _ tt| ||| d S )N)_keycommentrP   r   rQ   )rR   rZ   rD   r{   Z
keycomment)rU   r;   r?   rQ     s    zYamlRawParameter.__init__c             C   s   |  | | jS )N)_YamlRawParameter__process_value)rR   r   r;   r;   r?   rE     s    
zYamlRawParameter.valuec             C   s   t | jS )N)ri   rv   r   )rR   r;   r;   r?   r     s    zYamlRawParameter.keyflagc             C   s   |  | | jS )N)r   _valueflags)rR   r   r;   r;   r?   r     s    
zYamlRawParameter.valueflagsc             C   s   t | drd S t| jtrH| | j}tdd |D | _t| j| _n`t| jtr| 	| j}t
dd t|D | _t| j| _n"t| jtrd | _| j| _nt d S )Nr   c             s   s   | ]}t |V  qd S )N)ri   rv   )r<   sr;   r;   r?   r@   '  s    z-YamlRawParameter.__process.<locals>.<genexpr>c             s   s(   | ] \}}|d k	r|t |fV  qd S )N)ri   rv   )r<   r   r   r;   r;   r?   r@   +  s   )r   rG   rz   r5   _get_yaml_list_commentsr   r   r   r6   _get_yaml_map_commentsr   r   r.   r   r+   )rR   r   Zvaluecommentsr;   r;   r?   Z	__process"  s    

zYamlRawParameter.__processc          	   C   s4   y| j j| d j S  ttfk
r.   d S X d S )Nr$   )caitemsrE   rr   rt   KeyError)Zcommented_dictrD   r;   r;   r?   _get_yaml_key_comment4  s    z&YamlRawParameter._get_yaml_key_commentc                s*   | j j t fddtt| D }|S )Nc             3   s0   | ](}t tttf fd ddd |V  qdS )c                s     | d j pd S )Nr   )getrE   rr   )q)r   r;   r?   <lambda>?      zDYamlRawParameter._get_yaml_list_comments.<locals>.<genexpr>.<lambda>c             S   s   d S )Nr;   )r   r;   r;   r?   r   @  r   N)r2   rt   r   rA   )r<   r   )r   r;   r?   r@   >  s   z;YamlRawParameter._get_yaml_list_comments.<locals>.<genexpr>)r   r   r   rangerg   )rE   Zraw_comment_linesr;   )r   r?   r   ;  s    z(YamlRawParameter._get_yaml_list_commentsc                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 )Nr$   )r   r   rE   rr   )r   )rawvaluer;   r?   r   H  r   zCYamlRawParameter._get_yaml_map_comments.<locals>.<genexpr>.<lambda>c             S   s   d S )Nr;   )r   r;   r;   r?   r   I  r   N)r2   rt   r   )r<   rD   )r   r;   r?   r@   G  s   z:YamlRawParameter._get_yaml_map_comments.<locals>.<genexpr>)r   )r   r;   )r   r?   r   E  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 )N)r   )r<   rD   )rn   r   rZ   r;   r?   r@   P  s   z7YamlRawParameter.make_raw_parameters.<locals>.<genexpr>)r   r   )rn   rZ   r   r;   )rn   r   rZ   r?   r   M  s    
z$YamlRawParameter.make_raw_parametersc             C   s   t |d}yt|}W nl tk
rT } z|j}t|d|j|jdW d d }~X Y n2 tk
r } zt|d|jdW d d }~X Y nX | 	||pt
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#   r8   Zproblem_markrM   r   r   r7   r   r   r   )rn   filepathZfhZruamel_yamlerrZmarkr;   r;   r?   make_raw_parameters_from_fileU  s    z.YamlRawParameter.make_raw_parameters_from_file)rJ   rK   rL   rQ   rE   r   r   r   staticmethodr   r   r   rw   r   r   rV   r;   r;   )rU   r?   r     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)z.ymlz.yamlZcondarc)endswithr   r   r   r   )fullpathr;   r;   r?   _file_yaml_loaderl  s    z,load_file_configs.<locals>._file_yaml_loaderc             s   s@   x:t ttt| dtt| dD ]}|t|fV  q$W d S )Nz*.ymlz*.yaml)sortedr1   r
   r   r   r   )r   r   r;   r;   r?   _dir_yaml_loaderp  s    z+load_file_configs.<locals>._dir_yaml_loaderc             S   s(   yt t| jS  tk
r"   d S X d S )N)r   r   st_modeOSError)rO   r;   r;   r?   _get_st_mode{  s    z'load_file_configs.<locals>._get_st_modec             s   s   | ]}t |V  qd S )N)r"   )r<   rO   r;   r;   r?   r@     s    z$load_file_configs.<locals>.<genexpr>c             3   s   | ]} |V  qd S )Nr;   )r<   rO   )r   r;   r?   r@     s    c             3   s&   | ]\}}|d k	r | |V  qd S )Nr;   )r<   rO   r   )_loaderr;   r?   r@     s   c             s   s   | ]
}|V  qd S )Nr;   )r<   Zkvr;   r;   r?   r@     s    )r   r   r   zipr   r   from_iterable)search_pathr   r   Zexpanded_pathsZ
stat_pathsZ
load_pathsraw_datar;   )r   r   r?   load_file_configsi  s    
r   c               @   s   e Zd 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d Zdd Zd&ddZdd Zdd Zedd Zedd  Zed!d" Zd'd#d$ZdS )(	ParameterNr;   Fc             C   s(   d | _ d | _|| _|| _|| _|| _d S )N)_name_namesdefaultaliases_validation_expandvars)rR   r   r   
validationr   r;   r;   r?   rQ     s    zParameter.__init__c             C   s,   || _ tdd t| j|fD }|| _|S )Nc             s   s   | ]
}|V  qd S )Nr;   )r<   xr;   r;   r?   r@     s    z&Parameter._set_name.<locals>.<genexpr>)r   	frozensetr   r   r   )rR   ro   r   r;   r;   r?   	_set_name  s    zParameter._set_namec             C   s   | j d krt | j S )N)r   r+   )rR   r;   r;   r?   ro     s    
zParameter.namec             C   s   | j d krt | j S )N)r   r+   )rR   r;   r;   r?   names  s    
zParameter.namesc                s   | j t  @ } fdd|D }t|}|dkr8dS |dkrPtt|d fS | j|kr|| j t tt| j	|| jfS d t tt| j	|| jfS d S )Nc                s   i | ]} | |qS r;   r;   )r<   rD   )raw_parametersr;   r?   
<dictcomp>  s    z@Parameter._raw_parameters_from_single_source.<locals>.<dictcomp>r   )NNr   )
r   r   r]   rg   nextr   ro   r\   iterrZ   )rR   r   r]   matchesZnumkeysr;   )r   r?   "_raw_parameters_from_single_source  s    
z,Parameter._raw_parameters_from_single_sourcec             C   sV   g }g }xDt |jD ]6\}}| |\}}|d k	r<|| |r|| qW ||fS )N)r   r   r   append)rR   instancer   Zmultikey_exceptionsr   r   matcherrorr;   r;   r?   _get_all_matches  s    
zParameter._get_all_matchesc             C   s
   t  d S )N)r~   )rR   r   r;   r;   r?   _merge  s    zParameter._mergec             C   sZ   | j rRt|tr*t|dd t|D S t|rHt|dd |D S t|S n|S d S )Nc             s   s   | ]\}}|t |fV  qd S )N)rH   )r<   r   r   r;   r;   r?   r@     s    z$Parameter._expand.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)rH   )r<   r   r;   r;   r?   r@     s    )r   rG   r	   typer   r   rH   )rR   datar;   r;   r?   _expand  s    

zParameter._expandc       	   
   C   s   | j |jkr|j| j  S | |\}}|r4| |n| j}| |}y| |d}W n, tk
r } z|| W d d }~X Y nX |	| 
|| t| ||j| j < |S )Nz
<<merged>>)ro   _cache_r   r   r   r   typifyrc   r   extendcollect_errorsrh   )	rR   r   Zinstance_typer   re   ZmergedZexpandedresulter;   r;   r?   __get__  s    
zParameter.__get__
<<merged>>c             C   s   g }t || js0|t| j||t|| j nR| jdk	r| |}|dkrb|t| j|| n t |tr|t	| j||| |S )zValidate a Parameter value.

        Args:
            instance (Configuration): The instance object to which the Parameter descriptor is
                attached.
            value: The value to be validated.

        NF)
rG   _typer   r^   ro   r   r   rW   r   rc   )rR   r   rE   rZ   re   r   r;   r;   r?   r     s    	


zParameter.collect_errorsc             C   s   |  tjkS )N)r   ri   rj   )rR   raw_parameterr;   r;   r?   _match_key_is_important  s    z!Parameter._match_key_is_importantc                s:   t t| fdddd d}|d kr*|S |d |d  S )Nc                s     | d S )Nr   )r   )r   )rR   r;   r?   r     r   z4Parameter._first_important_matches.<locals>.<lambda>c             S   s   | d S )Nr   r;   )r   r;   r;   r?   r     r   )Zapplyr   )r(   	enumerate)rR   r   idxr;   )rR   r?   _first_important_matches
  s    z"Parameter._first_important_matchesc             C   s   | d k	rd|  S dS )Nz  #!%srN   r;   )flagr;   r;   r?   _str_format_flag  s    zParameter._str_format_flagc             C   s   | d krdS | S )NNoner;   )rE   r;   r;   r?   _str_format_value  s    zParameter._str_format_valuec             C   s
   t  d S )N)r~   )rn   r   r;   r;   r?   repr_raw  s    zParameter.repr_rawc          
   C   s   | j }y
t||S  tk
r } z\|d kr0| j}t|}t|trjdtdj	|j
 }|d	||7 }t||j||W d d }~X Y nX d S )Nz, z'{}'z
Valid choices for {}: {})_element_typer-   r,   ro   r   
issubclassr   r   mapr   __members__valuesrc   rE   )rR   rE   rZ   ro   element_typer   r[   choicesr;   r;   r?   r     s    

zParameter.typify)r;   NF)r   )N)rJ   rK   rL   r   r   rQ   r   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   r   r;   r;   r;   r?   r     s$   

r   c                   s2   e Zd ZdZd fdd	Zdd Zd	d
 Z  ZS )r   zParameter 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.
    r;   NFc                s8   |dkrt |n|| _| j| _tt| |||| dS )a  
        Args:
            default (Any):  The parameter's default value.
            aliases (Iterable[str]): Alternate names for the parameter.
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value. Returning
                `None` also indicates a valid value.
            element_type (type or Tuple[type]): Type-validation of parameter's value. If None,
                type(default) is used.

        N)r   r   r   rP   r   rQ   )rR   r   r   r   r   r   )rU   r;   r?   rQ   2  s    zPrimitiveParameter.__init__c             C   sP   t || jd d}|d k	r"|| S t|dd d d}|d k	rF|| S t d S )N)r   c             S   s   | d k	S )Nr;   )r   r;   r;   r?   r   G  r   z+PrimitiveParameter._merge.<locals>.<lambda>)r(   r   rE   r)   r+   )rR   r   Zimportant_matchZ
last_matchr;   r;   r?   r   B  s    

zPrimitiveParameter._mergec             C   s&   d|j | || | | f S )Nz%s: %s%s)rD   r   rE   r   r   )rR   r   r;   r;   r?   r   L  s    zPrimitiveParameter.repr_raw)r;   NNF)rJ   rK   rL   __doc__rQ   r   r   rV   r;   r;   )rU   r?   r   +  s   
r   c                   sP   e Zd ZdZeZd fdd	Zd fd	d
	Zdd Zdd Z	 fddZ
  ZS )SequenceParameterzoParameter type for a Configuration class that holds a sequence (i.e. list) of python
    primitive values.
    r;   N,Fc                s&   || _ || _tt| |||| dS )a  
        Args:
            element_type (type or Iterable[type]): The generic type of each element in
                the sequence.
            default (Iterable[str]):  The parameter's default value.
            aliases (Iterable[str]): Alternate names for the parameter.
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.

        N)r   r   rP   r   rQ   )rR   r   r   r   r   r   r   )rU   r;   r?   rQ   X  s    zSequenceParameter.__init__
<<merged>>c          
      sZ   t t| ||}| j}x<t|D ]0\}}t||s"|t| j||t	||| q"W |S )N)
rP   r   r   r   r   rG   r   ra   ro   r   )rR   r   rE   rZ   re   r   r   element)rU   r;   r?   r   h  s    
z SequenceParameter.collect_errorsc       
         s   t fdd|D }x6|D ].\}}t|t s"tj||j|jjjjq"W 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 |	S )Nc             3   s   | ]}||  fV  qd S )N)rE   )r<   r   )rR   r;   r?   r@   t  s    z+SequenceParameter._merge.<locals>.<genexpr>c                s0   | r,t  fddt| || |D S dS )Nc             3   s   | ]\}}| kr|V  qd S )Nr;   )r<   r   r   )markerr;   r?   r@   ~  s   zESequenceParameter._merge.<locals>.get_marked_lines.<locals>.<genexpr>r;   )r   r   rE   r   )r   r   r   r;   )r   r?   get_marked_lines}  s    z2SequenceParameter._merge.<locals>.get_marked_linesc             3   s    | ]\}} |t jV  qd S )N)ri   rk   )r<   mr   )r   rR   r;   r?   r@     s    c             3   s    | ]\}} |t jV  qd S )N)ri   rl   )r<   r   r   )r   rR   r;   r?   r@     s    c             s   s   | ]\}}|V  qd S )Nr;   )r<   r   r   r;   r;   r?   r@     s    )r   r   rG   r^   ro   rZ   rU   rJ   r   r0   reversedr4   r1   )
rR   r   relevant_matches_and_valuesr   rE   Z	top_linesZbottom_linesZ	all_linesZtop_dedupedZbottom_dedupedr;   )r   rR   r?   r   q  s    

zSequenceParameter._mergec             C   sv   t  }|d|j| | f  xFt|| D ]4\}}|| | }|d| || |f  q4W d	|S )Nz%s:%sz  - %s%sr:   )
listr   rD   r   r   r   rE   r   r   r   )rR   r   linesr   rE   	valueflagr;   r;   r?   r     s    
zSequenceParameter.repr_rawc                s.   t t| |\}}tdd |D }||fS )Nc             s   s   | ]}|j d k	r|V  qd S )N)rz   )r<   r   r;   r;   r?   r@     s    z5SequenceParameter._get_all_matches.<locals>.<genexpr>)rP   r   r   r   )rR   r   r   
exceptions)rU   r;   r?   r     s    z"SequenceParameter._get_all_matches)r;   r;   Nr   F)r   )rJ   rK   rL   r   r   r   rQ   r   r   r   r   rV   r;   r;   )rU   r?   r   R  s    	(
r   c                   sP   e Zd ZdZeZd fdd	Zd fdd		Zd
d Zdd Z	 fddZ
  ZS )MapParameterzjParameter type for a Configuration class that holds a map (i.e. dict) of python
    primitive values.
    Nr;   Fc                s2   || _ |rt|pt }tt| |||| dS )a  
        Args:
            element_type (type or Iterable[type]): The generic type of each element.
            default (Mapping):  The parameter's default value. If None, will be an empty dict.
            aliases (Iterable[str]): Alternate names for the parameter.
            validation (callable): Given a parameter value as input, return a boolean indicating
                validity, or alternately return a string describing an invalid value.

        N)r   r.   rP   r  rQ   )rR   r   r   r   r   r   )rU   r;   r?   rQ     s    
zMapParameter.__init__
<<merged>>c                sF   t t||}t|trBj | fddt|D  |S )Nc             3   s4   | ],\}}t | stj|t| |V  qd S )N)rG   ra   ro   r   )r<   rD   val)r   rR   rZ   r;   r?   r@     s   z.MapParameter.collect_errors.<locals>.<genexpr>)rP   r  r   rG   r	   r   r   r   )rR   r   rE   rZ   re   )rU   )r   rR   rZ   r?   r     s    
zMapParameter.collect_errorsc                s   t fdd|D }x6|D ].\}}t|ts"tj||j|jjj	jq"W fdd t  fdd|D }t
ttdd |D t|S )Nc             3   s   | ]}||  fV  qd S )N)rE   )r<   r   )rR   r;   r?   r@     s    z&MapParameter._merge.<locals>.<genexpr>c                s   |   |tjkS )N)r   r   ri   rj   )r   rD   )rR   r;   r?   key_is_important  s    z-MapParameter._merge.<locals>.key_is_importantc             3   s.   | ]&\ }t  fd dt|D V  qdS )c             3   s$   | ]\}} |r||fV  qd S )Nr;   )r<   r   r   )r	  r   r;   r?   r@     s   z0MapParameter._merge.<locals>.<genexpr>.<genexpr>N)r   r   )r<   Zmatch_value)r	  )r   r?   r@     s   c             s   s   | ]\}}|V  qd S )Nr;   )r<   r   r   r;   r;   r?   r@     s    )r   r   rG   r	   r^   ro   rZ   rU   rJ   r   r.   r3   r1   r   )rR   r   r  r   rE   Zimportant_mapsr;   )r	  rR   r?   r     s    

zMapParameter._mergec          	   C   sz   t  }|d|j| | f  xJt|| D ]8\}}|| |}|d|| 	|| |f  q4W d
|S )Nz%s:%sz
  %s: %s%sr:   )r  r   rD   r   r   r   rE   r   r   r   r   )rR   r   r  ZvaluekeyrE   r  r;   r;   r?   r     s    
zMapParameter.repr_rawc                s.   t t| |\}}tdd |D }||fS )Nc             s   s   | ]}|j d k	r|V  qd S )N)rz   )r<   r   r;   r;   r?   r@     s    z0MapParameter._get_all_matches.<locals>.<genexpr>)rP   r  r   r   )rR   r   r   r  )rU   r;   r?   r     s    zMapParameter._get_all_matches)Nr;   NF)r  )rJ   rK   rL   r   r.   r   rQ   r   r   r   r   rV   r;   r;   )rU   r?   r    s   

r  c                   s    e Zd ZdZ fddZ  ZS )ConfigurationTypezmetaclass for Configurationc                s2   t t| ||| tdd t| jD | _d S )Nc             s   s&   | ]\}}t |tr||V  qd S )N)rG   r   r   )r<   ro   pr;   r;   r?   r@     s    z-ConfigurationType.__init__.<locals>.<genexpr>)rP   r
  rQ   r   r   __dict__parameter_names)rn   ro   basesattr)rU   r;   r?   rQ     s    zConfigurationType.__init__)rJ   rK   rL   r   rQ   rV   r;   r;   )rU   r?   r
    s   r
  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 )'Configurationr;   Nc             C   sD   t  | _t | _t | _tt| _| 	| | 
| | | d S )N)r   r   r   r   r/   _reset_callbacksr   r  Z_validation_errors_set_search_path_set_env_vars_set_argparse_args)rR   r   app_nameargparse_argsr;   r;   r?   rQ     s    


zConfiguration.__init__c             C   s$   t || _| t| |   | S )N)r/   Z_search_path_set_raw_datar   _reset_cache)rR   r   r;   r;   r?   r    s    
zConfiguration._set_search_pathc             C   s,   || _ |s| S t|| jtj< |   | S )N)Z	_app_namer   r   r   rZ   r  )rR   r  r;   r;   r?   r    s    zConfiguration._set_env_varsc             C   sr   t |dr(tdd tt|D | _n&|s6t | _ntdd t|D | _tj}t| j| j|< | 	  | S )Nr  c             s   s"   | ]\}}|t k	r||fV  qd S )N)r!   )r<   r   r   r;   r;   r?   r@     s    z3Configuration._set_argparse_args.<locals>.<genexpr>c             s   s"   | ]\}}|t k	r||fV  qd S )N)r!   )r<   r   r   r;   r;   r?   r@   '  s    )
r   r'   r   r|   Z_argparse_argsr   rZ   r   r   r  )rR   r  rZ   r;   r;   r?   r    s    

z Configuration._set_argparse_argsc             C   s   | j | |   | S )N)r   updater  )rR   r   r;   r;   r?   r  /  s    zConfiguration._set_raw_datac             C   s"   t  | _x| jD ]
}|  qW | S )N)r   r   r  )rR   callbackr;   r;   r?   r  4  s    
zConfiguration._reset_cachec             C   s   | j | d S )N)r  add)rR   r  r;   r;   r?   register_reset_callaback:  s    z&Configuration.register_reset_callabackc             C   s   i }g }| j | }x| jD ]}| jj| }||\}}|rF|| |d k	r||}	|	d kr~t|trpd}	nt|t	r~i }	y|j
|	|j|jd}
W n, tk
r } z|| W d d }~X Y qX || |
|j}|r|| q|
||j< qqW ||fS )Nr;   )ro   )r   r  rU   r  r   r   rE   rG   r   r  r   rZ   rD   rc   r   r   )rR   rZ   typed_valuesvalidation_errorsr   rD   	parameterr   Zmultikey_errorZuntyped_valueZtyped_valuer   Zcollected_errorsr;   r;   r?   check_source=  s2    




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   )r<   rZ   )rR   r;   r?   r@   a  s   z-Configuration.validate_all.<locals>.<genexpr>)r  r   r   r   rh   validate_configuration)rR   r  r;   )rR   r?   validate_all`  s    zConfiguration.validate_allc          
   O   sH   y| || W n4 t k
rB } zt|dr0|jn|fS d }~X Y nX dS )Nre   r;   )rI   r   re   )funcrf   rS   r   r;   r;   r?   _collect_validation_errorf  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 )N)r  r$  r   )r<   ro   )rR   r;   r?   r@   o  s   z7Configuration.validate_configuration.<locals>.<genexpr>)r   r   r  post_build_validationrh   r   )rR   re   Zpost_errorsr;   )rR   r?   r!  n  s    z$Configuration.validate_configurationc             C   s   dS )Nr;   r;   )rR   r;   r;   r?   r%  t  s    z#Configuration.post_build_validationc             C   s^   t  }t  }x$| jD ]}| |\||< ||< qW tttt| t dd t|D S )Nc             s   s   | ]\}}|r||fV  qd S )Nr;   )r<   r   r   r;   r;   r?   r@   }  s    z,Configuration.collect_all.<locals>.<genexpr>)	r   r   r   rh   r   r   r   r   r   )rR   r  r  rZ   r;   r;   r?   collect_allw  s    zConfiguration.collect_allc          	      s   || j krd| }| jj| }t|ts,t|jd t fdd|j	D }| 
  d}|j}t|tkrx|g}t|s|g}tdd |D }|jj dd |||j|dd d	}t|tr|j|d
< |S )Nr   c             3   s   | ]}| kr|V  qd S )Nr;   )r<   alias)ro   r;   r?   r@     s    z3Configuration.describe_parameter.<locals>.<genexpr>rN   c             s   s   | ]}|j V  qd S )N)rJ   )r<   Z_etr;   r;   r?   r@     s    r  r:    )Zparameter_typero   r   element_typesZdefault_valuedescriptionr   )r  rU   r  rG   r   r   ro   lstripr   r   get_descriptionsr   r   r   r   r   rJ   r   r   r   rr   r   r   )rR   rX   r  r   r*  Zetr)  Zdetailsr;   )ro   r?   describe_parameter  s,    


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<   ro   r;   r;   r?   r@     s    z0Configuration.list_parameters.<locals>.<genexpr>)r   r   r  )rR   r;   r;   r?   list_parameters  s    zConfiguration.list_parametersc             C   s8   || j krd| }| jj| }t|ts,t|||S )Nr   )r  rU   r  rG   r   r   r   )rR   rX   rE   rZ   r  r;   r;   r?   typify_parameter  s
    
zConfiguration.typify_parameterc             C   s
   t  d S )N)r~   )rR   r;   r;   r?   r,    s    zConfiguration.get_descriptions)r;   NN)N)rJ   rK   rL   rQ   r  r  r  r  r  r  r   r"  r   r$  r!  r%  r&  r-  r.  r/  r,  r;   r;   r;   r?   r    s"   

#	r  N)r9   )r9   )nr   Z
__future__r   r   r   r   abcr   r   collectionsr   Zcollections.abcr	   ImportErrorr
   	itertoolsr   Zloggingr   osr   r   os.pathr   r   r   r   r   r   enumr   r   compatr   r   r   r   r   r   r   r   r    Z	constantsr!   rO   r"   Z	serializer#   rN   r%   r&   Z_vendor.auxlib.collectionr'   r(   r)   r*   Z_vendor.auxlib.exceptionsr+   Z_vendor.auxlib.type_coercionr,   r-   Z_vendor.frozendictr.   Z_vendor.boltons.setutilsr/   Z_vendor.toolzr0   r1   r2   r3   r4   Zruamel_yaml.commentsr5   r6   Zruamel_yaml.readerr7   Zruamel_yaml.scannerr8   Zruamel.yaml.commentsZruamel.yaml.readerZruamel.yaml.scannerrJ   logr   rB   rF   rH   rI   rM   rW   r\   r^   ra   rc   rd   rh   ri   objectrx   r   r   r   r   r   r   r   r  r   r
  r  r;   r;   r;   r?   <module>   s~   ,
	
		!%Y"  'ZE