o
    Jh`                  	   @   sl  d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddl	Z	ddl
ZdZdZdZd	Zd
ZG dd dejZG dd dejZd,deje fddZd,defddZdd Zdeje defddZd,dedeje defddZdedefddZded edejeje eje f fd!d"Zd#eje defd$d%Z d&d' Z!d(d) Z"d edede#fd*d+Z$dS )-z)
Handle config file and argument parsing
    )deque)ConfigParser)PathNzyoyo.inieditorpost_create_commandz%inheritz%includec                   @   s   e Zd ZdZdS )CircularReferenceErrorzJ
    %include or %inherit directive has created a circular reference.
    N)__name__
__module____qualname____doc__ r   r   M/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/yoyo/config.pyr   #   s    r   c                       s<   e Zd ZU i Zejeef ed< dd Z fddZ	  Z
S )CustomInterpolationdefaultsc                 C   s   |pi | _ d S Nr   )selfr   r   r   r   __init__,      zCustomInterpolation.__init__c                    s,   | j  }|| tt| |||||S r   )r   copyupdatesuperr   
before_get)r   parsersectionoptionvaluer   merged_defaults	__class__r   r   r   /   s
   



zCustomInterpolation.before_get)r   r	   r
   r   tDictstr__annotations__r   r   __classcell__r   r   r   r   r   )   s   
 r   pathc                    s@   t    fddtj D }| rtjtj| |d< |S )Nc                    s$   i | ]\}}  ||d dqS )%z%%)optionxformreplace.0kvr   r   r   
<dictcomp>9   s    z.get_interpolation_defaults.<locals>.<dictcomp>here)configparserr   osenvironitemsr%   dirnameabspath)r%   r   r   r-   r   get_interpolation_defaults7   s   
r6   returnc                 C   s   t t| dS )N)interpolation)r   r   r   r   r   r   get_configparserA   r   r9   c                    s6   dd | j D  | jdi  fdd| D  dS )z
    Update an ArgumentParser's defaults.

    Unlike ArgumentParser.set_defaults this will only set defaults for
    arguments the parser has configured.
    c                 S   s   h | ]}|j qS r   )dest)r*   actionr   r   r   	<setcomp>L   s    z,update_argparser_defaults.<locals>.<setcomp>c                    s   i | ]\}}| v r||qS r   r   r)   
known_argsr   r   r.   M       z-update_argparser_defaults.<locals>.<dictcomp>Nr   )_actionsset_defaultsr3   )r   r   r   r=   r   update_argparser_defaultsE   s   &rB   srcc           
         s   | du r	t t S t| }t|}||i t|g}g ||fg}|rd| \}}}t||\}}t||D ]!}||v rDt	dj
|dt|}| |< |||g ||f q6|| || |s"t fdd|D }	|	dt |	dt |	S )z
    Read the configuration file at ``src`` and construct a ConfigParser instance.

    If ``src`` is None a new, empty ConfigParse object will be created.
    Nz%{path!r} contains circular references)r%   c                    s   g | ]} | qS r   r   )r*   pconfig_filesr   r   
<listcomp>o   s    zread_config.<locals>.<listcomp>DEFAULT)r9   r6   
_make_path_read_configr   popfind_includes	itertoolschainr   formatappend
extendleftextendmerge_configsremove_optionINCLUDEINHERIT)
rC   r%   configmerge_paths
to_process	ancestorsinheritsincludesrD   mergedr   rE   r   read_configP   s4   




r^   sbasepathc                 C   s8   |r|j |  }nt| }| }| st|| S )za
    Return a fully resolved Path. Raises FileNotFoundError if the path does not
    exist.

    )parentr   resolveexistsFileNotFoundError)r_   r`   rD   r   r   r   rI   v   s   	rI   c                 C   s$   t tt| }|t| g |S r   )r9   r6   r"   read)r%   rW   r   r   r   rJ      s   rJ   rW   c              
   C   s   t g tg i}tt fD ]E}z
|d |  }W n	 ty   Y q
w |D ],}d}|dr3d}|dd  }zt|| }W n tyF   |rD Y q"w || | q"q
|t |t  fS )NrH   T?F   )rU   rV   splitKeyError
startswithrI   rd   rP   )r`   rW   resultkeypathsrD   strictr%   r   r   r   rL      s,   
rL   configsc                 C   s"   dd }t || dd  | d S )Nc                 S   s   |  | | S r   )	read_dict)c1c2r   r   r   merge   s   
zmerge_configs.<locals>.mergerg   r   )	functoolsreduce)ro   rs   r   r   r   rS      s   rS   c                 C   s4   t d t|d}z
| |W |  S |  w )z3
    Write the configuration file to ``path``.
    ?   w)r1   umaskopenwriteclose)rW   r%   fr   r   r   save_config   s
   


r}   c                  C   sV   t  } | t j| kr)t j| t}t j|r|S t j| } | t j| ksdS )z=Find the closest config file in the cwd or a parent directoryN)r1   getcwdr%   r4   joinCONFIG_FILENAMEisfile)dr%   r   r   r   find_config   s   r   c                 C   s2   dt fdd}t| r|t||| kS dS )NrW   c                 S   s   dd |   D S )Nc                 S   s   i | ]\}}|t | qS r   )dictr3   )r*   r+   r   r   r   r   r.      r?   z3config_changed.<locals>.to_dict.<locals>.<dictcomp>)r3   )rW   r   r   r   to_dict   s   zconfig_changed.<locals>.to_dictT)r   r   rc   r^   )rW   r%   r   r   r   r   config_changed   s   r   r   )%r   collectionsr   r0   r   pathlibr   rt   rM   r1   typingr    r   CONFIG_EDITOR_KEY CONFIG_NEW_MIGRATION_COMMAND_KEYrV   rU   Errorr   BasicInterpolationr   Optionalr"   r6   r9   rB   r^   rI   rJ   TupleListrL   rS   r}   r   boolr   r   r   r   r   <module>   sB   
&
