U
    vIÀd+  ã                   @  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ûû