U
    Cvf                     @  s   d dl mZ d dlZd dlmZ d dlmZmZm	Z	m
Z
mZ d dl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dd ZG dd deZG dd de
Zeed< dS )    )annotationsN)Version)BACKEND_ENTRYPOINTSAbstractDataStoreBackendArrayBackendEntrypointrobust_getitem)StoreBackendEntrypoint)indexing)integer_types)Frozen
FrozenDictclose_on_erroris_dict_likeis_remote_urimodule_available)Variablec                   @  sB   e Zd Zdd ZeddddZedd Zd	d
 Zdd ZdS )PydapArrayWrapperc                 C  s
   || _ d S N)array)selfr    r   :/tmp/pip-unpacked-wheel-h316xyqg/xarray/backends/pydap_.py__init__   s    zPydapArrayWrapper.__init__ztuple[int, ...])returnc                 C  s   | j jS r   )r   shaper   r   r   r   r      s    zPydapArrayWrapper.shapec                 C  s   | j jS r   )r   dtyper   r   r   r   r   #   s    zPydapArrayWrapper.dtypec                 C  s   t || jt jj| jS r   )r
   Zexplicit_indexing_adapterr   ZIndexingSupportZBASIC_getitem)r   keyr   r   r   __getitem__'   s       zPydapArrayWrapper.__getitem__c                 C  s\   t | jd| j}t||td}tdd t|D }|jt| |jkrX|rXt	||}|S )Nr   )Zcatchc                 s  s    | ]\}}t |tr|V  qd S r   )
isinstancer   ).0nkr   r   r   	<genexpr>2   s     
 z-PydapArrayWrapper._getitem.<locals>.<genexpr>)
getattrr   r   
ValueErrortuple	enumeratendimlennpZsqueeze)r   r   r   resultZaxisr   r   r   r   ,   s    zPydapArrayWrapper._getitemN)	__name__
__module____qualname__r   propertyr   r   r    r   r   r   r   r   r      s   
r   c                   st   t | } t| D ]^   dks.  dr@| |   qt|   r|  fdd|   D  q| S )NglobalZ_globalc                   s    i | ]\}}  d | |qS ).r   )r"   Zk_childZv_childr$   r   r   
<dictcomp>D   s    z#_fix_attributes.<locals>.<dictcomp>)dictlistlowerendswithupdatepopr   items)
attributesr   r4   r   _fix_attributes9   s    
r>   c                   @  sF   e Zd ZdZdd ZedddZdd Zd	d
 Zdd Z	dd Z
dS )PydapDataStorezStore for accessing OpenDAP datasets with pydap.

    This store provides an alternative way to access OpenDAP datasets that may
    be useful if the netCDF4 library is not available.
    c                 C  s
   || _ dS )zN
        Parameters
        ----------
        ds : pydap DatasetType
        N)ds)r   r@   r   r   r   r   S   s    zPydapDataStore.__init__Nc                 C  s   dd l }dd l}|d kr(ddlm}	 |	}||||p4d|d}
t|jjtdkr||d k	rf|
d|i |d k	r||
d|i |jjf |
}| |S )Nr   )DEFAULT_TIMEOUTT)urlapplicationsessionoutput_gridtimeoutz3.3.0verifyuser_charset)	Zpydap.clientZ	pydap.librA   r   lib__version__r:   clientZopen_url)clsrB   rC   rD   rE   rF   rG   rH   pydaprA   kwargsr@   r   r   r   open[   s$    zPydapDataStore.openc                 C  s"   t t|}t|j|t|jS r   )r
   ZLazilyIndexedArrayr   r   
dimensionsr>   r=   )r   vardatar   r   r   open_store_variable}   s    z"PydapDataStore.open_store_variablec                   s   t  fdd j D S )Nc                 3  s"   | ]}|   j| fV  qd S r   )rS   r@   )r"   r$   r   r   r   r%      s    z/PydapDataStore.get_variables.<locals>.<genexpr>)r   r@   keysr   r   r   r   get_variables   s    zPydapDataStore.get_variablesc                 C  s   t t| jjS r   )r   r>   r@   r=   r   r   r   r   	get_attrs   s    zPydapDataStore.get_attrsc                 C  s   t | jjS r   )r   r@   rP   r   r   r   r   get_dimensions   s    zPydapDataStore.get_dimensions)NNNNNN)r.   r/   r0   __doc__r   classmethodrO   rS   rU   rV   rW   r   r   r   r   r?   L   s         !r?   c                   @  s2   e Zd ZdZedZdZdZdd Zdd	d
Z	dS )PydapBackendEntrypointa^  
    Backend for steaming datasets over the internet using
    the Data Access Protocol, also known as DODS or OPeNDAP
    based on the pydap package.

    This backend is selected by default for urls.

    For more information about the underlying library, visit:
    https://www.pydap.org

    See Also
    --------
    backends.PydapDataStore
    rM   z6Open remote datasets via OPeNDAP using pydap in XarrayzWhttps://docs.xarray.dev/en/stable/generated/xarray.backends.PydapBackendEntrypoint.htmlc                 C  s   t |tot|S r   )r!   strr   )r   filename_or_objr   r   r   guess_can_open   s    z%PydapBackendEntrypoint.guess_can_openTNc                 C  s\   t j||	|
||||d}t }t|, |j||||||||d}|W  5 Q R  S Q R X d S )N)rB   rC   rD   rE   rF   rG   rH   )mask_and_scaledecode_timesconcat_charactersdecode_coordsdrop_variables
use_cftimedecode_timedelta)r?   rO   r	   r   open_dataset)r   r\   r^   r_   r`   ra   rb   rc   rd   rC   rD   rE   rF   rG   rH   storeZstore_entrypointr@   r   r   r   re      s,    


z#PydapBackendEntrypoint.open_dataset)TTTTNNNNNNNNN)
r.   r/   r0   rX   r   	availabledescriptionrB   r]   re   r   r   r   r   rZ      s&                rZ   rM   )
__future__r   Znumpyr,   Zpackaging.versionr   Zxarray.backends.commonr   r   r   r   r   Zxarray.backends.storer	   Zxarray.corer
   Zxarray.core.pycompatr   Zxarray.core.utilsr   r   r   r   r   r   Zxarray.core.variabler   r   r>   r?   rZ   r   r   r   r   <module>   s    AB