o
    yAf                     @  s   d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZ d dlmZ G dd	 d	eZG d
d deZG dd dZG dd dejZdS )    )annotationsN)ABCabstractmethod)ChainMap)contextmanager)AnyIterableIteratorMappingMutableMappingSequence)path_to_uric                   @  s(   e Zd ZedddZeddd	Zd
S )ContextFormatterreturnr   c                 C  s   dS )a#  
        This returns a mapping of supported field names to their respective formatting functions. Each function
        accepts 2 arguments:

        - the `value` that was passed to the format call, defaulting to `None`
        - the modifier `data`, defaulting to an empty string
        N selfr   r   </usr/lib/python3.10/site-packages/hatchling/utils/context.pyget_formatters   s    zContextFormatter.get_formatterspathstrmodifierc                 C  s   |st j|S |dd d d }|r,|d dkr,t j|}|  |r,|d dks|s0|S t|dkrDddt| }t	||d }|dkrPt
|S |d	krZt j|S d
| }t	|)N:parent   z1Expected a single path modifier and instead got: z, r   urirealzUnknown path modifier: )osr   normpathsplitdirnamepoplenjoinreversed
ValueErrorr   realpath)clsr   r   	modifiersmessager   r   r   format_path   s&   
zContextFormatter.format_pathNr   r   )r   r   r   r   r   r   )__name__
__module____qualname__r   r   classmethodr+   r   r   r   r   r      s
    	r   c                   @  sV   e Zd ZdZdddZdd	d
ZdddZdddZdddZdddZ	dddZ
dS )DefaultContextFormatterdefaultrootr   r   Nonec                 C  s
   || _ d S N)_DefaultContextFormatter__rootr   r3   r   r   r   __init__7   s   
z DefaultContextFormatter.__init__r   c                 C  s   | j | j| j| j| jdS )N)/;envhomer3   )4_DefaultContextFormatter__format_directory_separator/_DefaultContextFormatter__format_path_separator$_DefaultContextFormatter__format_env%_DefaultContextFormatter__format_home%_DefaultContextFormatter__format_rootr   r   r   r   r   :   s   z&DefaultContextFormatter.get_formattersvaluedatac                 C     t jS r5   )r   sepr   rB   rC   r   r   r   Z__format_directory_separatorC      z4DefaultContextFormatter.__format_directory_separatorc                 C  rD   r5   )r   pathseprF   r   r   r   Z__format_path_separatorF   rG   z/DefaultContextFormatter.__format_path_separatorc                 C  s   |  | j|S r5   )r+   r6   rF   r   r   r   Z__format_rootI   s   z%DefaultContextFormatter.__format_rootc                 C  s   |  tjd|S )N~)r+   r   r   
expanduserrF   r   r   r   Z__format_homeL   s   z%DefaultContextFormatter.__format_homec                 C  sN   |sd}t ||d\}}}|tjv rtj| S |s%d| }t ||S )Nz6The `env` context formatting field requires a modifierr   z5Nonexistent environment variable must set a default: )r&   	partitionr   environ)r   rB   rC   r*   env_var	separatorr2   r   r   r   Z__format_envO   s   


z$DefaultContextFormatter.__format_envNr3   r   r   r4   r,   )rB   r   rC   r   r   r   )r-   r.   r/   CONTEXT_NAMEr8   r   r=   r>   rA   r@   r?   r   r   r   r   r1   4   s    


	


r1   c                   @  sL   e Zd ZdddZdd
dZdddZedddZdddZdddZ	dS ) Contextr3   r   r   r4   c                 C  s:   t || _t | _t | _t| j| _| t	| j d S r5   )
r   Z_Context__rootr   _Context__formattersset_Context__configured_contextsContextStringFormatter_Context__formatteradd_contextr1   r7   r   r   r   r8   `   s
   
zContext.__init__argsr   kwargsc                 O  s   | j j|i |S r5   )rV   format)r   rX   rY   r   r   r   rZ   j   s   zContext.formatcontextr1   c                 C  s0   |j | jv rd S | |  | j|j  d S r5   )rP   rT   _Context__add_formattersr   addr   r[   r   r   r   rW   m   s   zContext.add_contextr	   c                 c  s0    |  |  z
d V  W |   d S |   w r5   )r\   r   _Context__remove_formattersr^   r   r   r   apply_contextt   s
   zContext.apply_context
formattersr   c                 C  s   | j jd|S )Nr   )rR   mapsinsertr   ra   r   r   r   Z__add_formatters|   s   zContext.__add_formattersc                 C  s&   t | jjdkr| jjd d S d S )Nr   r   )r#   rR   rb   r"   r   r   r   r   Z__remove_formatters   s   zContext.__remove_formattersNrO   )rX   r   rY   r   r   r   )r[   r1   r   r4   )r[   r1   r   r	   )ra   r   r   r4   )r   r4   )
r-   r.   r/   r8   rZ   rW   r   r`   r\   r_   r   r   r   r   rQ   _   s    




rQ   c                      sR   e Zd Zd fddZdddZd fddZd fddZd fddZ  ZS ) rU   ra   r   r   r4   c                   s   t    || _d S r5   )superr8   #_ContextStringFormatter__formattersrd   	__class__r   r   r8      s   

zContextStringFormatter.__init__format_stringr   rX   Sequence[Any]rY   Mapping[str, Any]c                 C  s.   t  }| ||||d\}}| ||| |S )N
   )rS   _vformatcheck_unused_args)r   ri   rX   rY   	used_argsresult_r   r   r   vformat   s   zContextStringFormatter.vformatkey	int | strr   c                   sP   || j v r|t|S z	t |||W S  ty'   d| d}t|d w )NzUnknown context field ``)rf   getr   re   	get_valueKeyErrorr&   )r   rs   rX   rY   r*   rg   r   r   rw      s   

z ContextStringFormatter.get_valuerB   format_specc                   s8   | d\}}}|| jv r| j| ||S t ||S Nr   )rK   rf   re   format_field)r   rB   ry   	formatterrq   rC   rg   r   r   r{      s   
z#ContextStringFormatter.format_fieldr   c                 #  sR    t  |D ]\}}}}|| jv r||| d| |fV  q||||fV  qd S rz   )re   parserf   )r   ri   literal_text
field_namery   
conversionrg   r   r   r}      s   
zContextStringFormatter.parse)ra   r   r   r4   )ri   r   rX   rj   rY   rk   r   r   )rs   rt   rX   rj   rY   rk   r   r   )rB   r   ry   r   r   r   )ri   r   r   r   )	r-   r.   r/   r8   rr   rw   r{   r}   __classcell__r   r   rg   r   rU      s    
	rU   )
__future__r   r   stringabcr   r   collectionsr   
contextlibr   typingr   r   r	   r
   r   r   Zhatchling.utils.fsr   r   r1   rQ   	FormatterrU   r   r   r   r   <module>   s     '+%