U
    CvfP                     @  s   d dl mZ d dlZd dlmZmZmZmZm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZmZmZmZ d d	lmZ eeegZG d
d deZG dd deZG dd deZeed< dS )    )annotationsN)BACKEND_ENTRYPOINTSAbstractDataStoreBackendArrayBackendEntrypoint_normalize_path)CachingFileManager)	HDF5_LOCKNETCDFC_LOCKcombine_locksensure_lock)StoreBackendEntrypoint)indexing)Frozen
FrozenDictclose_on_errormodule_available)Variablec                   @  s.   e Zd Zdd ZdddZdd Zdd	 Zd
S )PncArrayWrapperc                 C  s.   || _ || _|  }|j| _t|j| _d S N)	datastorevariable_name	get_arrayshapenpZdtype)selfr   r   array r   A/tmp/pip-unpacked-wheel-h316xyqg/xarray/backends/pseudonetcdf_.py__init__   s
    zPncArrayWrapper.__init__Tc                 C  s   | j j|}|j| j S r   )r   _manageracquire	variablesr   )r   
needs_lockdsr   r   r   r      s    zPncArrayWrapper.get_arrayc                 C  s   t || jt jj| jS r   )r   Zexplicit_indexing_adapterr   ZIndexingSupportZOUTER_1VECTOR_getitem)r   keyr   r   r   __getitem__#   s       zPncArrayWrapper.__getitem__c              
   C  s4   | j j" | jdd}|| W  5 Q R  S Q R X d S )NF)r#   )r   lockr   )r   r&   r   r   r   r   r%   (   s    
zPncArrayWrapper._getitemN)T)__name__
__module____qualname__r   r   r'   r%   r   r   r   r   r      s   
r   c                   @  sd   e Zd ZdZedddZdddZedd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd ZdS )PseudoNetCDFDataStorez-Store for accessing datasets via PseudoNetCDFNc                 K  sP   ddl m} d|i}|d k	r$||d< |d kr0t}t||fd|i|}| ||S )Nr   )pncopenkwargsmoder(   )PseudoNetCDFr-   PNETCDF_LOCKr   )clsfilenamer(   r/   format_kwargsr-   keywordsmanagerr   r   r   open1   s    zPseudoNetCDFDataStore.openc                 C  s   || _ t|| _d S r   )r    r   r(   )r   r6   r(   r   r   r   r   @   s    zPseudoNetCDFDataStore.__init__c                 C  s
   | j  S r   )r    r!   r   r   r   r   r$   D   s    zPseudoNetCDFDataStore.dsc                   s4   t t|| } fdd  D }t j||S )Nc                   s   i | ]}|t  |qS r   )getattr.0kvarr   r   
<dictcomp>J   s      z=PseudoNetCDFDataStore.open_store_variable.<locals>.<dictcomp>)r   ZLazilyIndexedArrayr   ncattrsr   
dimensions)r   namer>   dataattrsr   r=   r   open_store_variableH   s    z)PseudoNetCDFDataStore.open_store_variablec                   s   t  fdd jj D S )Nc                 3  s"   | ]\}}|  ||fV  qd S r   )rE   )r;   r<   vr8   r   r   	<genexpr>N   s    z6PseudoNetCDFDataStore.get_variables.<locals>.<genexpr>)r   r$   r"   itemsr8   r   r8   r   get_variablesM   s    
z#PseudoNetCDFDataStore.get_variablesc                   s   t  fdd j D S )Nc                   s   i | ]}|t  j|qS r   )r9   r$   r:   r8   r   r   r?   S   s      z3PseudoNetCDFDataStore.get_attrs.<locals>.<dictcomp>)r   r$   r@   r8   r   r8   r   	get_attrsR   s    zPseudoNetCDFDataStore.get_attrsc                 C  s   t | jjS r   )r   r$   rA   r8   r   r   r   get_dimensionsU   s    z$PseudoNetCDFDataStore.get_dimensionsc                   s   d fdd j jD iS )NZunlimited_dimsc                   s    h | ]} j j|  r|qS r   )r$   rA   Zisunlimitedr:   r8   r   r   	<setcomp>Z   s     z5PseudoNetCDFDataStore.get_encoding.<locals>.<setcomp>)r$   rA   r8   r   r8   r   get_encodingX   s
     
z"PseudoNetCDFDataStore.get_encodingc                 C  s   | j   d S r   )r    closer8   r   r   r   rN   _   s    zPseudoNetCDFDataStore.close)NN)N)r)   r*   r+   __doc__classmethodr7   r   propertyr$   rE   rI   rJ   rK   rM   rN   r   r   r   r   r,   .   s   

r,   c                	   @  s.   e Zd ZdZedZdZdZdZdd	d
Z	dS )PseudoNetCDFBackendEntrypointaj  
    Backend for netCDF-like data formats in the air quality field
    based on the PseudoNetCDF package.

    It can open:
    - CAMx
    - RACM2 box-model outputs
    - Kinetic Pre-Processor outputs
    - ICARTT Data files (ffi1001)
    - CMAQ Files
    - GEOS-Chem Binary Punch/NetCDF files
    - and many more

    This backend is not selected by default for any files, so make
    sure to specify ``engine="pseudonetcdf"`` in ``open_dataset``.

    For more information about the underlying library, visit:
    https://pseudonetcdf.readthedocs.io

    See Also
    --------
    backends.PseudoNetCDFDataStore
    r0   zGOpen many atmospheric science data formats using PseudoNetCDF in Xarrayz^https://docs.xarray.dev/en/stable/generated/xarray.backends.PseudoNetCDFBackendEntrypoint.html)
filename_or_objmask_and_scaledecode_timesconcat_charactersdecode_coordsdrop_variables
use_cftimedecode_timedeltar/   r(   FTNc                 K  sX   t |}tj|f|
|	d|}t }t|  |j||||||||d}W 5 Q R X |S )N)r(   r/   )rT   rU   rV   rW   rX   rY   rZ   )r   r,   r7   r   r   open_dataset)r   rS   rT   rU   rV   rW   rX   rY   rZ   r/   r(   r4   storeZstore_entrypointr$   r   r   r   r[      s,     

z*PseudoNetCDFBackendEntrypoint.open_dataset)	FTTTNNNNN)
r)   r*   r+   rO   r   	availabledescriptionurlZopen_dataset_parametersr[   r   r   r   r   rR   c   s             rR   Zpseudonetcdf) 
__future__r   Znumpyr   Zxarray.backends.commonr   r   r   r   r   Zxarray.backends.file_managerr   Zxarray.backends.locksr	   r
   r   r   Zxarray.backends.storer   Zxarray.corer   Zxarray.core.utilsr   r   r   r   Zxarray.core.variabler   r1   r   r,   rR   r   r   r   r   <module>   s   5Q