U
    vId+                     @  s  d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZ ed
dG dd dZG dd deZddddZG dd dZe Ze	ddddZeeddddZ eeddddZ!dddddZ"G d d! d!Z#G d"d# d#Z$dd$dd%d&Z%ei d'd(d)d$d*d+d,d-d.Z&d/e'd/e'd/fe( d0d1d2d3d4Z)e	d)dd5d6Z*d/S )7    )annotations)MappingCallableIterable)	dataclass)singledispatchwraps)MappingProxyType)AnyUnion)
_read_attr)StorageTypeGroupStorageType)report_write_key_on_errorreport_read_key_on_errorT)frozenc                   @  s   e Zd ZU ded< ded< dS )IOSpecstrencoding_typeencoding_versionN)__name__
__module____qualname____annotations__ r   r   S/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/_io/specs/registry.pyr      s   
r   c                   @  s8   e Zd Zed dddZeddddd dd	d
ZdS )IORegistryErrorreturnc                 C  s*   d| d| }|r"|d| 7 }| |S )Nz!No method registered for writing z into z with r   )cls	dest_typetyp	modifiersmsgr   r   r   _from_write_parts   s    z!IORegistryError._from_write_partsr   r   r   r   )methodregistrysrc_typspecr   c                 C  s    d| d| d| d}| |S )NzNo z method registered for  from z6. You may need to update your installation of anndata.r   )r   r%   r&   r'   r(   r#   r   r   r   _from_read_parts    s    
z IORegistryError._from_read_partsN)r   r   r   classmethodr$   r*   r   r   r   r   r      s   r   r(   c                   s   dd fdd}|S )Nr   funcc                   s   t   fdd}|S )Nc                   s>    | |f||}| | j dj | | j dj |S )Nencoding-typeencoding-version)attrs
setdefaultr   r   )gkargskwargsresult)r.   r(   r   r   wrapper2   s    z.write_spec.<locals>.decorator.<locals>.wrapper)r   )r.   r8   r,   r-   r   	decorator1   s    zwrite_spec.<locals>.decoratorr   )r(   r9   r   r,   r   
write_spec0   s    
r:   c                   @  s   e Zd Zdd Ze fddddddd	Ze fddd
dddZddd
dddZe fddddddZe fddd
dddZ	e fddd
dddZ
e fddddddZe fddd
dddZdddddZd S )!
IORegistryc                 C  s   i | _ i | _i | _i | _d S N)readread_partialwritewrite_specs)selfr   r   r   __init__?   s
    zIORegistry.__init__typeztype | tuple[type, str]zIOSpec | Mapping[str, str]zIterable[str])r    src_typer(   r"   c                   sp   t tjkrNj krNj }td d| d n
j<  fdd}|S )NzHCannot overwrite IO specifications. Attempted to overwrite encoding for r)   z to c                   s   t | j f< | S r<   )r:   r?   r-   r    r"   rA   r(   rD   r   r   	_register\   s    z,IORegistry.register_write.<locals>._register)	proc_spec	frozensetr@   	TypeError)rA   r    rD   r(   r"   Zcurrent_specrF   r   rE   r   register_writeG   s    

zIORegistry.register_writefrozenset[str])r    rD   r"   c                 C  sJ   dd l }||jkr|j}|||f| jkr8| j|||f S t|||d S )Nr   )h5pyFileGroupr?   r   r$   )rA   r    rD   r"   rL   r   r   r   
get_writerb   s    
zIORegistry.get_writerc                 C  s   |||f| j kS r<   )r?   )rA   r    rD   r"   r   r   r   
has_writerr   s    zIORegistry.has_writer)rD   r(   r"   c                   s&   t t   fdd}|S )Nc                   s   | j  f< | S r<   r=   r-   r"   rA   r(   rD   r   r   rF      s    z+IORegistry.register_read.<locals>._registerrG   rH   rA   rD   r(   r"   rF   r   rR   r   register_readz   s    zIORegistry.register_readr   c                 C  s6   |||f| j kr | j |||f S tdtj ||d S )Nr=   )r=   r   r*   	_REGISTRYrA   rD   r(   r"   r   r   r   
get_reader   s       zIORegistry.get_readerc                 C  s   |||f| j kS r<   rQ   rW   r   r   r   
has_reader   s    zIORegistry.has_readerc                   s&   t t   fdd}|S )Nc                   s   | j  f< | S r<   )r>   r-   rR   r   r   rF      s    z3IORegistry.register_read_partial.<locals>._registerrS   rT   r   rR   r   register_read_partial   s    z IORegistry.register_read_partialc                 C  s6   |||f| j kr | j |||f S tdtj ||d S )Nr>   )r>   r   r*   rV   rW   r   r   r   get_partial_reader   s       zIORegistry.get_partial_readerr
   elemr   c                 C  s<   t |dr.t||jjf}|| jkr.| j| S | jt| S )Ndtype)hasattrrC   r^   kindr@   )rA   r]   r!   r   r   r   get_spec   s
    


zIORegistry.get_specN)r   r   r   rB   rH   rJ   rO   rP   rU   rX   rY   rZ   r[   ra   r   r   r   r   r;   >   s"   	
r;   r   c                 C  s   t dt|  dd S )Nz proc_spec not defined for type: .)NotImplementedErrorrC   r,   r   r   r   rG      s    rG   c                 C  s   | S r<   r   r,   r   r   r   proc_spec_spec   s    rd   c                 C  s   t f dd |  D S )Nc                 S  s   i | ]\}}| d d|qS )-_)replace).0r4   vr   r   r   
<dictcomp>   s     
 z%proc_spec_mapping.<locals>.<dictcomp>)r   itemsr,   r   r   r   proc_spec_mapping   s    rl   r   r\   c                   s   t  fdddD S )Nc                   s   i | ]}|t  j|d qS ) )r   r1   )rh   r4   r]   r   r   rj      s    zget_spec.<locals>.<dictcomp>)r/   r0   )rG   rn   r   rn   r   ra      s
    
ra   c                   @  s<   e Zd ZdddddddZee fdd	d
dddZdS )ReaderNr;   zUnion[Callable, None]None)r&   callbackr   c                 C  s   || _ || _d S r<   r&   rq   rA   r&   rq   r   r   r   rB      s    zReader.__init__r   zfrozenset(str)r
   )r]   r"   r   c                 C  sb   ddl m} | jt|t|t|}||| d}| jdk	rV| j||j|t|dS ||S dS )zERead an element from a store. See exported function for more details.r   partial)_readerN)iospec)		functoolsru   r&   rX   rC   ra   rH   rq   name)rA   r]   r"   ru   Z	read_funcr   r   r   	read_elem   s      
zReader.read_elem)N)r   r   r   rB   r   rH   rz   r   r   r   r   ro      s
    ro   c                   @  s@   e Zd ZddddddZeei e ddd	d
ddZdS )WriterNr;   zGUnion[Callable[[GroupStorageType, str, StorageType, dict], None], None]rr   c                 C  s   || _ || _d S r<   rr   rs   r   r   r   rB      s    zWriter.__init__)dataset_kwargsr"   r   r   )storer4   c             	   C  s  ddl m} ddlm} t|}t|}	|d kr8dd S || sVt||j| }|dkrh|  n||krv||= t	|dr||	|j
jf|f| jjkr|| j||	|j
jf|| d}
n|| j||	|| d}
| jd k	r| j|
||||| j|d	S |
||||d
S d S )Nr   rt   )PurePosixPathc                  _  s   d S r<   r   )rf   __r   r   r   <lambda>      z#Writer.write_elem.<locals>.<lambda>/r^   )Z_writer)r|   rw   r|   )rx   ru   pathlibr~   rC   is_absoluter   ry   clearr_   r^   r`   r&   r?   rO   rq   ra   )rA   r}   r4   r]   r|   r"   ru   r~   r    tZ
write_funcr   r   r   
write_elem  sD    



	zWriter.write_elem)N)r   r   r   rB   r   r	   rH   r   r   r   r   r   r{      s    r{   r
   c                 C  s   t t| S )a  
    Read an element from a store.

    Assumes that the element is encoded using the anndata encoding. This function will
    determine the encoded type using the encoding metadata stored in elem's attributes.

    Params
    ------
    elem
        The stored element.
    )ro   rV   rz   rn   r   r   r   rz   :  s    rz   r   r   r   r   rp   )r}   r4   r]   r|   r   c                C  s   t tj| |||d dS )a  
    Write an element to a storage group using anndata encoding.

    Params
    ------
    store
        The group to write to.
    k
        The key to write to in the group. Note that absolute paths will be written
        from the root.
    elem
        The element to write. Typically an in-memory object, e.g. an AnnData, pandas
        dataframe, scipy sparse matrix, etc.
    dataset_kwargs
        Keyword arguments to pass to the stores dataset creation function.
        E.g. for zarr this would be `chunks`, `compressor`.
    r   N)r{   rV   r   )r}   r4   r]   r|   r   r   r   r   I  s    r   N)rk   indicesr"   rK   )r"   c                C  s$   t t| t| t|| ||dS )z.Read part of an element from an on disk store.)rk   r   )rV   r[   rC   ra   rH   )r]   rk   r   r"   r   r   r   read_elem_partiale  s        r   c                 C  s   | j S r<   )ry   rn   r   r   r   elem_keyr  s    r   )+
__future__r   collections.abcr   r   r   dataclassesr   rx   r   r   typesr	   typingr
   r   Zanndata.compatr   Zanndata._typesr   r   Zanndata._io.utilsr   r   r   	Exceptionr   r:   r;   rV   rG   registerrd   rl   ra   ro   r{   rz   r   slicerH   r   r   r   r   r   r   <module>   s@   {J