U
    vIdd                     @  s  d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlZdd	lmZ d d
lmZmZ eejjdkZddddddZdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd  d eZ d!d" Z!d#d$ Z"d%d& Z#d'd(d)d*d*d+d,d-d.Z$dS )/    )annotations)Enum)wrapssingledispatch)Callable)warn)versionN   )SparseDataset)H5Group	ZarrGroup   tupleint)shapeaxis
chunk_sizec                 c  sp   | | }d}dd t t| D }|| |k rTt||| ||< t|V  ||7 }q"t|d||< t|V  dS )a.      Gives indexer tuples chunked along an axis.

    Params
    ------
    shape
        Shape of array to be chunked
    axis
        Axis to chunk along
    chunk_size
        Size of chunk along axis

    Returns
    -------
    An iterator of tuples for indexing into an array of passed shape.
    r   c                 S  s   g | ]}t d qS )N)slice).0i r   J/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/_io/utils.py
<listcomp>+   s     z)idx_chunks_along_axis.<locals>.<listcomp>N)rangelenr   r   )r   r   r   totalcurZmutable_idxr   r   r   idx_chunks_along_axis   s    

r   c                 C  s*   zt |  W dS  tk
r$   Y dS X dS )z    Check whether string is float.

    See also
    --------
    http://stackoverflow.com/questions/736043/checking-if-a-string-can-be-converted-to-float-in-python
    TFN)float
ValueErrorstringr   r   r   is_float4   s
    r"   c                 C  s*   zt |  W dS  tk
r$   Y dS X dS )z Check whether string is integer.TFN)r   r   r    r   r   r   is_intC   s
    r#   c                 C  s    | dkrdS | dkrdS dS dS )z Check whether string is boolean.True)TTFalse)TF)FFNr   r    r   r   r   convert_boolL   s
    r&   c                 C  sL   t | rt| S t| r t| S t| d r8t| d S | dkrDdS | S dS )z%Convert string to int, float or bool.r      NoneN)r#   r   r"   r   r&   r    r   r   r   convert_stringV   s    r)   c                 C  s2   t | }t|trt| S t|  d| ddS )zChecks that passed value is a valid h5py key.

    Should convert it if there is an obvious conversion path, error otherwise.
    	 of type z" is an invalid key. Should be str.N)type
issubclassstr	TypeError)keytypr   r   r   	check_keyd   s    
r1   c                  O  s    ddl m} tdt || |S )Nr'   )	read_elemzHThis internal function has been deprecated, please use read_elem instead)specsr2   r   DeprecationWarning)argskwargsr2   r   r   r   read_attributey   s    r7   c                  O  s    ddl m} tdt || |S )Nr'   )
write_elemzIThis internal function has been deprecated, please use write_elem instead)r3   r8   r   r4   )r5   r6   r8   r   r   r   write_attribute   s    r9   c                   @  s   e Zd ZdZdS )AnnDataReadErrorz-Error caused while trying to read in AnnData.N)__name__
__module____qualname____doc__r   r   r   r   r:      s   r:   c                 C  sf   zdd l }W n tk
r$   d }Y nX |rDt| |j|jfrD| j}nt| trZ| jjj	}n| jj	}|S )Nr   )
zarrImportError
isinstanceGroupZArraystorer
   groupfilename)elemr?   parentr   r   r   _get_parent   s    

rI   c                   s"   dd t   fdd}|S )a[      A decorator for zarr element reading which makes keys involved in errors get reported.

    Example
    -------
    >>> import zarr
    >>> @report_read_key_on_error
    ... def read_arr(group):
    ...     raise NotImplementedError()
    >>> z = zarr.open("tmp.zarr")
    >>> z["X"] = [1, 2, 3]
    >>> read_arr(z["X"])  # doctest: +SKIP
    c                 S  s@   t | tr| n,t|}td|jdt| d| d| d S )Nz%Above error raised while reading key r*   z from .)rA   r:   rI   rF   r+   )erG   rH   r   r   r   re_raise_error   s    
z0report_read_key_on_error.<locals>.re_raise_errorc               
     sb   ddl m} | D ]}t||s q$qz | |W S  tk
r\ } z|| W 5 d }~X Y nX d S )Nr   )Reader)anndata._io.specsrM   rA   	Exception)r5   r6   rM   rG   rK   funcrL   r   r   func_wrapper   s    
z.report_read_key_on_error.<locals>.func_wrapperr   rQ   rR   r   rP   r   report_read_key_on_error   s    
rU   c                   s"   dd t   fdd}|S )af      A decorator for zarr element reading which makes keys involved in errors get reported.

    Example
    -------
    >>> import zarr
    >>> @report_write_key_on_error
    ... def write_arr(group, key, val):
    ...     raise NotImplementedError()
    >>> z = zarr.open("tmp.zarr")
    >>> X = [1, 2, 3]
    >>> write_arr(z, "X", X)  # doctest: +SKIP
    c                 S  sD   dt | kr n0t|}t| |  d|dt| d| | d S )Nz$Above error raised while writing keyz'

Above error raised while writing key z of z to )formatrI   r+   )rK   rG   r/   rH   r   r   r   rL      s    z1report_write_key_on_error.<locals>.re_raise_errorc               
     s   ddl m} tt| D ]&}| | }| |d  }t||s q@qz | |W S  tk
rz } z||| W 5 d }~X Y nX d S )Nr   )Writerr'   )rN   rW   r   r   rA   rO   )r5   r6   rW   r   rG   r/   rK   rP   r   r   rR      s    
z/report_write_key_on_error.<locals>.func_wrapperrS   rT   r   rP   r   report_write_key_on_error   s    rX   )Xvarvarm)attrszZarrGroup | H5Groupr   dict)fread_df	read_attrreturnc                C  s   |rBt dd | D r>t| dr,d| j nd}t| d|S i }d|krfd| krf|| d |d< d	|krd
| kr|| d
 |d	< d|krd| kr|| d |d< |S )z|    Backwards compat for reading legacy raw.
    Makes sure that no modern raw group coexists with legacy raw.* groups.
    c                 s  s   | ]}| d V  qdS )zraw.N)
startswith)r   kr   r   r   	<genexpr>  s     z#_read_legacy_raw.<locals>.<genexpr>filenamezFile Storez) has both legacy and current raw formats.rY   zraw.XrZ   zraw.varr[   zraw.varm)anyhasattrre   r   )r^   Z
modern_rawr_   r`   r\   whatrawr   r   r   _read_legacy_raw  s    rk   )%
__future__r   enumr   	functoolsr   r   typingr   warningsr   	packagingr   Zh5pyZ_core.sparse_datasetr
   Zanndata.compatr   r   parse__version__majorZH5PY_V3r   r"   r#   r&   r)   r1   r7   r9   OSErrorr:   rI   rU   rX   rk   r   r   r   r   <module>   s.   	

)7