a
    İa|                  	   @   s  d dl Z d dlZd dlZ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mZmZmZ ddlmZmZ dd	lmZ zd dlZd
ZW n8 ey   dZY n$ eefy   ed dZY n0 e ZG dd deZG dd deZG dd deZ e ed< dS )    N   )indexing)Frozen
FrozenDictclose_on_error)Variable   )BACKEND_ENTRYPOINTSAbstractDataStoreBackendArrayBackendEntrypoint_normalize_path)SerializableLockensure_lock)StoreBackendEntrypointTFzFailed to load cfgrib - most likely there is a problem accessing the ecCodes library. Try `import cfgrib` to get the full error messagec                   @   s$   e Zd Zdd Zdd Zdd ZdS )CfGribArrayWrapperc                 C   s    || _ |j| _|j| _|| _d S N)	datastoreshapeZdtypearray)selfr   r    r   6lib/python3.9/site-packages/xarray/backends/cfgrib_.py__init__(   s    zCfGribArrayWrapper.__init__c                 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CfGribArrayWrapper.__getitem__c                 C   s6   | j j | j| W  d    S 1 s(0    Y  d S r   )r   lockr   r   r   r   r   r   3   s    
zCfGribArrayWrapper._getitemN)__name__
__module____qualname__r   r   r   r   r   r   r   r   '   s   r   c                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )CfGribDataStorezP
    Implements the ``xr.AbstractDataStore`` read-only API for a GRIB file.
    Nc                 K   s.   |d u rt }t|| _tj|fi || _d S r   )ECCODES_LOCKr   r   cfgribZ	open_fileds)r   filenamer   Zbackend_kwargsr   r   r   r   =   s    
zCfGribDataStore.__init__c                 C   sV   t |jtjr|j}nt| |j}t|}| jj	 }|jj
|d< t|j||j|S )NZoriginal_shape)
isinstancedatanpZndarrayr   r   ZLazilyIndexedArrayr%   encodingcopyr   r   
dimensions
attributes)r   namevarr(   Zwrapped_arrayr*   r   r   r   open_store_variableD   s    
z#CfGribDataStore.open_store_variablec                    s   t  fdd jj D S )Nc                 3   s"   | ]\}}|  ||fV  qd S r   )r0   .0kvr   r   r   	<genexpr>Q   s   z0CfGribDataStore.get_variables.<locals>.<genexpr>)r   r%   Z	variablesitemsr5   r   r5   r   get_variablesP   s    
zCfGribDataStore.get_variablesc                 C   s   t | jjS r   )r   r%   r-   r5   r   r   r   	get_attrsU   s    zCfGribDataStore.get_attrsc                 C   s   t | jjS r   )r   r%   r,   r5   r   r   r   get_dimensionsX   s    zCfGribDataStore.get_dimensionsc                 C   s   |   }ddd | D iS )NZunlimited_dimsc                 S   s   h | ]\}}|d u r|qS r   r   r1   r   r   r   	<setcomp>]       z/CfGribDataStore.get_encoding.<locals>.<setcomp>)r:   r7   )r   Zdimsr   r   r   get_encoding[   s    zCfGribDataStore.get_encoding)N)
r   r    r!   __doc__r   r0   r8   r9   r:   r=   r   r   r   r   r"   8   s   
r"   c                   @   s@   e Zd ZeZdd Zdddddddddi g ddddd	d
ZdS )CfgribfBackendEntrypointc                 C   s2   zt j|\}}W n ty(   Y dS 0 |dv S )NF>   z.gribz.grbz.grb2z.grib2)ospathsplitext	TypeError)r   filename_or_obj_extr   r   r   guess_can_openc   s
    z'CfgribfBackendEntrypoint.guess_can_openTNz{path}.{short_hash}.idx)Z	parametertimeZ	geographyZvertical)rH   step)mask_and_scaledecode_timesconcat_charactersdecode_coordsdrop_variables
use_cftimedecode_timedeltar   	indexpathfilter_by_keys	read_keys	encode_cfsqueeze	time_dimsc                C   sl   t |}t||
||||||	d}t }t|* |j||||||||d}W d    n1 s^0    Y  |S )N)rQ   rR   rS   rT   rU   rV   r   )rJ   rK   rL   rM   rN   rO   rP   )r   r"   r   r   open_dataset)r   rD   rJ   rK   rL   rM   rN   rO   rP   r   rQ   rR   rS   rT   rU   rV   storeZstore_entrypointr%   r   r   r   rW   j   s0    

$
z%CfgribfBackendEntrypoint.open_dataset)r   r    r!   
has_cfgribZ	availablerG   rW   r   r   r   r   r?   `   s"   r?   r$   )!r@   warningsZnumpyr)   corer   Z
core.utilsr   r   r   Zcore.variabler   commonr	   r
   r   r   r   locksr   r   rX   r   r$   rY   ModuleNotFoundErrorImportErrorRuntimeErrorwarnr#   r   r"   r?   r   r   r   r   <module>   s.   
(8