o
    yAf=                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 dZ
dZdedefdd	Zdedefd
dZG dd deZG dd dZdS )    N)Path)DictIterableListTupleUnion)EditableProject__version__z0.5namereturnc                 C   s   t d| t jd uS )Nz)^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$)rematch
IGNORECASEr
    r   7/usr/lib/python3.10/site-packages/editables/__init__.pyis_valid   s   r   c                 C   s   t dd|  S )Nz[-_.]+_)r   sublowerr   r   r   r   	normalize   s   r   c                   @   s   e Zd ZdS )EditableExceptionN)__name__
__module____qualname__r   r   r   r   r      s    r   c                   @   s
  e Zd Zdedeeejf ddfddZdeeejf defdd	Z	d
edeeejf ddfddZ
deeejf ddfddZdedeeejf ddfddZdeeeef  fddZdee fddZdefddZdededeeef fddZdefddZdS )r   project_nameproject_dirr   Nc                 C   sP   t |std| dt|| _d| j | _t|| _i | _g | _i | _	d S )NzProject name z is not validZ_editable_impl_)
r   
ValueErrorr   r   	bootstrapr   r   redirectionspath_entriessubpackages)selfr   r   r   r   r   __init__$   s   


zEditableProject.__init__pathc                 C   s   | j |  S N)r   resolve)r"   r$   r   r   r   make_absolute.   s   zEditableProject.make_absoluter
   targetc                 C   sZ   d|v rt d| d| |}| r|d }| r&t|| j|< d S t | d)N.zCannot map z! as it is not a top-level packagez__init__.pyz( is not a valid Python package or module)r   r'   is_diris_filestrr   )r"   r
   r(   
abs_targetr   r   r   map1   s   

zEditableProject.mapdirnamec                 C   s   | j | | d S r%   )r    appendr'   )r"   r/   r   r   r   add_to_path>   s   zEditableProject.add_to_pathpackagec                 C   s   |  || j|< d S r%   )r'   r!   )r"   r2   r/   r   r   r   add_to_subpackageA   s   z!EditableProject.add_to_subpackagec                 c   sd    | j  d|  fV  | jr | j D ]\}}| ||V  q| jr0| j d|  fV  d S d S )Nz.pthz.py)r   pth_filer!   itemspackage_redirectionr   r   bootstrap_file)r"   r2   locationr   r   r   filesD   s   zEditableProject.filesc                 C   s   g }| j r
|d |S )N	editables)r   r0   )r"   depsr   r   r   dependenciesL   s   
zEditableProject.dependenciesc                 C   s@   g }| j r|d| j  | jD ]	}|t| qd|S )Nzimport 
)r   r0   r   r    r,   join)r"   linesentryr   r   r   r4   R   s   

zEditableProject.pth_filer8   c                 C   s(   | ddd }dt|d}||fS )Nr)   /z/__init__.pyz__path__ = [])replacer,   )r"   r2   r8   Zinit_pycontentr   r   r   r6   Z   s   z#EditableProject.package_redirectionc                 C   s>   ddg}| j  D ]\}}|d|d|d q	d|S )Nz7from editables.redirector import RedirectingFinder as FzF.install()zF.map_module(z, )r=   )r   r5   r0   r>   )r"   r   r
   r$   r   r   r   r7   _   s   
zEditableProject.bootstrap_file)r   r   r   r,   r   osPathLiker#   r   r'   r.   r1   r3   r   r   r9   r   r<   r4   r6   r7   r   r   r   r   r   #   s     
  r   )rF   r   pathlibr   typingr   r   r   r   r   __all__r	   r,   boolr   r   	Exceptionr   r   r   r   r   r   <module>   s    