
    d{6                       d dl mZ d dlZd dlZd dl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mZmZmZ d dlmZmZ d dlmZmZmZ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%m&Z&m'Z'm(Z( d dl)m*Z* erd dlm+Z+ d dlm,Z, d dl-m.Z.  G d de          Z/d Z0d Z1 ej2        edddd          Z3d Z4 G d de          Z5 G d de          Z6de6fed<   dS )    )annotationsN)Iterable)TYPE_CHECKINGAny)Version)BACKEND_ENTRYPOINTSBackendEntrypointWritableCFDataStore_normalize_pathfind_root_and_group)CachingFileManagerDummyFileManager)	HDF5_LOCKcombine_locksensure_lockget_write_lock)BaseNetCDF4Array_encode_nc4_variable_extract_nc4_variable_encoding_get_datatype_nc4_require_group)StoreBackendEntrypoint)indexing)
FrozenDictis_remote_uriread_magic_number_from_file'try_read_magic_number_from_file_or_path)Variable)BufferedIOBase)AbstractDataStore)Datasetc                  "    e Zd ZddZd Zd ZdS )H5NetCDFArrayWrapperTc                Z    | j                             |          }|j        | j                 S N)	datastore_acquire	variablesvariable_name)self
needs_lockdss      9lib/python3.11/site-packages/xarray/backends/h5netcdf_.py	get_arrayzH5NetCDFArrayWrapper.get_array-   s'    ^$$Z00|D.//    c                b    t          j        || j        t           j        j        | j                  S r%   )r   explicit_indexing_adaptershapeIndexingSupportOUTER_1VECTOR_getitem)r*   keys     r-   __getitem__z H5NetCDFArrayWrapper.__getitem__1   s*    1X5CT]
 
 	
r/   c                    | j         j        5  |                     d          }||         cd d d            S # 1 swxY w Y   d S )NF)r+   )r&   lockr.   )r*   r6   arrays      r-   r5   zH5NetCDFArrayWrapper._getitem6   s    ^  	 	NNeN44E:	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8<<NT)__name__
__module____qualname__r.   r7   r5    r/   r-   r#   r#   ,   sF        0 0 0 0
 
 

    r/   r#   c                Z    t          | t                    r|                     d          S | S )Nzutf-8)
isinstancebytesdecode)txts    r-   maybe_decode_bytesrE   <   s+    #u zz'"""
r/   c                x    i }| j                                         D ]\  }}|dvrt          |          }|||<   |S )N)
_FillValuemissing_value)attrsitemsrE   )h5netcdf_varrI   kvs       r-   _read_attributesrN   C   sT     E"((**  1333"1%%AaLr/   FTh5netcdf)lsd_okay	h5py_okaybackendunlimited_dimsc                ,    |                      |          S r%   create_group)datasetnames     r-   _h5netcdf_create_grouprY   X   s    %%%r/   c                      e Zd ZdZdZddedfdZe	 	 	 	 	 	 	 	 dd            Zdd	Z	e
d
             Zd Zd Zd Zd Zd ZddZd Zd Z	 ddZd Zd ZdS )H5NetCDFStorez/Store for reading and writing data via h5netcdf)	autocloseformat	is_remoter9   	_filename_group_manager_modeNFc                   dd l }t          ||j        |j        f          rK|t	          |          \  }}n't          |          |j        urt          d          |}t          |          }|| _        || _	        || _
        d | _        t	          | j                  d         j        | _        t          | j                  | _        t#          |          | _        || _        d S )Nr   z=must supply a h5netcdf.File if the group argument is provided)rO   rA   FileGroupr   type
ValueErrorr   ra   r`   rb   r]   r,   filenamer_   r   r^   r   r9   r\   )r*   managergroupmoder9   r\   rO   roots           r-   __init__zH5NetCDFStore.__init__j   s    gx~>?? 
	-}1'::ee==55$/   &t,,G
 -TW55a8A&t~66%%	"r/   rTc
                   dd l }
t          |t                    rt          d          t          |t          j                  r6t          |          }|                    d          st          | d          |dvrt          d          ||	d}|||d<   |1|d	k    rt          }n#t          t          t          |          g          }t          |
j        |||
          } | |||||          S )Nr   zGcan't open netCDF4/HDF5 as bytes try passing a path or file-like object   HDF

z- is not the signature of a valid netCDF4 file)NNETCDF4z#invalid format for h5netcdf backend)invalid_netcdfdecode_vlen_strings
phony_dimsrn   )rk   kwargs)rj   rk   r9   r\   )rO   rA   rB   rg   ioIOBaser   
startswithr   r   r   r   rd   )clsrh   rk   r]   rj   r9   r\   rr   rt   rs   rO   magic_numberru   ri   s                 r-   openzH5NetCDFStore.open   s4    	h&& 
	9   "),, 	6x@@L**+?@@  #RRR   ***BCCC -#6
 
 !#-F< <s{{ $i1I1I%JKK$X]H4PVWWWs7%dSSSSr/   c                    | j                             |          5 }t          || j        | j        t
                    }d d d            n# 1 swxY w Y   |S )NrU   )ra   acquire_contextr   r`   rb   rY   )r*   r+   rl   r,   s       r-   r'   zH5NetCDFStore._acquire   s    ]**:66 	$#dk4:<R  B	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   #A

AAc                *    |                                  S r%   )r'   r*   s    r-   r,   zH5NetCDFStore.ds   s    }}r/   c                   dd l }|j        }t          j        t	          ||                     }t          |          }|j        |j        |j        d}|j	        dk    rd|d<   |j
        |d<   n|j	        |j	        |d<   |j
        |d<   | j        |d	<   |j        |d
<   |                    |j                  }|t          u rt          |d<   n|n
|j        |d<   t!          ||||          S )Nr   )
chunksizes
fletcher32shufflegzipTzlib	complevelcompressioncompression_optssourceoriginal_shapevlendtype)h5py
dimensionsr   LazilyIndexedArrayr#   rN   chunksr   r   r   r   r_   r2   check_dtyper   strr   )	r*   rX   varr   r   datarI   encoding
vlen_dtypes	            r-   open_store_variablez!H5NetCDFStore.open_store_variable   s   ^
*+?d+K+KLL %% *.{
 
 ?f$$#HV$'$8H[!!_(&)oH]#+.+?H'( "^%(Y!"%%39%55
 #HW# #	HW
D%:::r/   c                r     t           fd j        j                                        D                       S )Nc              3  N   K   | ]\  }}|                     ||          fV   d S r%   )r   ).0rL   rM   r*   s      r-   	<genexpr>z.H5NetCDFStore.get_variables.<locals>.<genexpr>   sM       
 
48AqQ((A../
 
 
 
 
 
r/   )r   r,   r(   rJ   r   s   `r-   get_variableszH5NetCDFStore.get_variables   sL     
 
 
 
<@G<M<S<S<U<U
 
 
 
 
 	
r/   c                D    t          t          | j                            S r%   )r   rN   r,   r   s    r-   	get_attrszH5NetCDFStore.get_attrs   s    *4733444r/   c                    dd l }t          |j                  t          d          k    r5t          d | j        j                                        D                       S | j        j        S )Nr   0.14.0.dev0c              3  >   K   | ]\  }}|t          |          fV  d S r%   )lenr   rL   rM   s      r-   r   z/H5NetCDFStore.get_dimensions.<locals>.<genexpr>   s0      QQdaq#a&&kQQQQQQr/   )rO   r   __version__r   r,   r   rJ   r*   rO   s     r-   get_dimensionszH5NetCDFStore.get_dimensions   sb    8'((GM,B,BBBQQdg6H6N6N6P6PQQQQQQ7%%r/   c                    dd l }t          |j                  t          d          k    r*dd | j        j                                        D             iS dd | j        j                                        D             iS )Nr   r   rS   c                @    h | ]\  }}|                                 |S r?   )isunlimitedr   s      r-   	<setcomp>z-H5NetCDFStore.get_encoding.<locals>.<setcomp>   s9     # # #!Q## # #r/   c                    h | ]	\  }}||
S r%   r?   r   s      r-   r   z-H5NetCDFStore.get_encoding.<locals>.<setcomp>   s$     # # #!Q	A			r/   )rO   r   r   r,   r   rJ   r   s     r-   get_encodingzH5NetCDFStore.get_encoding   s    8'((GM,B,BBB  # #"&'"4":":"<"<# # #  ! # #"&'"4":":"<"<# # # r/   c                    |r,d | j         j        |<   | j                             ||           d S || j         j        |<   d S r%   )r,   r   resize_dimension)r*   rX   lengthis_unlimiteds       r-   set_dimensionzH5NetCDFStore.set_dimension  sL     	.'+DGt$G$$T622222'-DGt$$$r/   c                $    || j         j        |<   d S r%   )r,   rI   )r*   r6   values      r-   set_attributezH5NetCDFStore.set_attribute	  s    "cr/   c                     t          |          S r%   )r   )r*   variables     r-   encode_variablezH5NetCDFStore.encode_variable  s    #H---r/   c                   dd l }|j                                        }t          ||          }|                    dd           }|t
          u r|t          d|d          |t
          u r|                    t
                    }t          ||          }	i }
|	                    dd	          r>|r&|		                    d
          dvrt          d          |	                    d
d           |r)d|	v r%d|	v r!|	d         |	d         k    rt          d          |	                    dd          }|dk    r|	                    d|           |	                    dd           |	d<   |j        rdD ]}||	v r|	|         |
|<   || j        vr | j        j        |f||j        |d|
}n| j        |         }|                                D ]\  }}||j        |<   t#          ||           }||j        fS )Nr   )raise_on_invalid_encodingrG   zh5netcdf does not yet support setting a fill value for variable-length strings (https://github.com/h5netcdf/h5netcdf/issues/37). Either remove '_FillValue' from encoding on variable zH or set {'dtype': 'S1'} in encoding to use the fixed width NC_CHAR type.r   )raise_on_invalidr   Fr   )Nr   z+'zlib' and 'compression' encodings mismatchr   r   r   z5'complevel' and 'compression_opts' encodings mismatchr   r   )r   r   r   r   r   )r   r   	fillvalue)r   rI   copyr   popr   NotImplementedErrorspecial_dtype_extract_h5nc_encodinggetrg   
setdefaultr2   r,   create_variabledimsrJ   r#   r   )r*   rX   r   check_encodingrS   r   rI   r   r   r   ru   r   r6   nc4_varrL   rM   targets                    r-   prepare_variablezH5NetCDFStore.prepare_variable  su    	##%%h.QQQIIlD11	C<<I1%  IM        C<<&&C&00E)(^TTT
 <<&& 	7 P(,,}"="=^"S"S !NOOOv666 	Vx''"h..%2D)EEETUUULLa00	>> 2I>>>%\\,== > 		0 0 0 (??"*3-F3Ktw-dg-#=#	 
  GG gdmGKKMM 	! 	!DAq GM!%dD11x}$$r/   c                8    | j                                          d S r%   )r,   syncr   s    r-   r   zH5NetCDFStore.syncZ  s    r/   c                *     | j         j        di | d S )Nr?   )ra   close)r*   ru   s     r-   r   zH5NetCDFStore.close]  s#    %%f%%%%%r/   )rn   NNNFNNTr;   )F)FN)r<   r=   r>   __doc__	__slots__r   rm   classmethodr{   r'   propertyr,   r   r   r   r   r   r   r   r   r   r   r   r?   r/   r-   r[   r[   \   sk       99	I '+IQV # # # #4   +T +T +T [+TZ      X#; #; #;J
 
 

5 5 5& & &   . . . .# # #. . . DHI% I% I% I%V  & & & & &r/   r[   c                  H    e Zd ZdZdZdZddZd	d	d	d	d
d
d
d
d
d
d
d
d	dddZd
S )H5netcdfBackendEntrypointa  
    Backend for netCDF files based on the h5netcdf package.

    It can open ".nc", ".nc4", ".cdf" files but will only be
    selected as the default if the "netcdf4" engine is not available.

    Additionally it can open valid HDF5 files, see
    https://h5netcdf.org/#invalid-netcdf-files for more info.
    It will not be detected as valid backend for such files, so make
    sure to specify ``engine="h5netcdf"`` in ``open_dataset``.

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

    See Also
    --------
    backends.H5NetCDFStore
    backends.NetCDF4BackendEntrypoint
    backends.ScipyBackendEntrypoint
    zMOpen netCDF (.nc, .nc4 and .cdf) and most HDF5 files using h5netcdf in XarrayzZhttps://docs.xarray.dev/en/stable/generated/xarray.backends.H5netcdfBackendEntrypoint.htmlfilename_or_obj;str | os.PathLike[Any] | BufferedIOBase | AbstractDataStorereturnboolc                    t          |          }||                    d          S t          |t          t          j        f          r&t          j                            |          \  }}|dv S dS )Nrp   >   .nc.cdf.nc4F)r   rx   rA   r   osPathLikepathsplitext)r*   r   rz   _exts        r-   guess_can_openz(H5netcdfBackendEntrypoint.guess_can_open|  so     ?OO#**+?@@@oR['9:: 	2W%%o66FAs111ur/   TN)mask_and_scaledecode_timesconcat_charactersdecode_coordsdrop_variables
use_cftimedecode_timedeltar]   rj   r9   rr   rt   rs   r   str | Iterable[str] | Noner!   c          
         t          |          }t                              ||	|
||||          }t                      }|                    ||||||||          }|S )N)r]   rj   r9   rr   rt   rs   )r   r   r   r   r   r   r   )r   r[   r{   r   open_dataset)r*   r   r   r   r   r   r   r   r   r]   rj   r9   rr   rt   rs   storestore_entrypointr,   s                     r-   r   z&H5netcdfBackendEntrypoint.open_dataset  s    $ */::"")! 3 # 
 
 233**)%/')!- + 	
 	
 	r/   )r   r   r   r   )r   r   r   r   r   r!   )r<   r=   r>   r   descriptionurlr   r   r?   r/   r-   r   r   a  s         , 	X  gC   $ 59 !) ) ) ) ) ) ) )r/   r   )7
__future__r   	functoolsrv   r   collections.abcr   typingr   r   packaging.versionr   xarray.backends.commonr   r	   r
   r   r   xarray.backends.file_managerr   r   xarray.backends.locksr   r   r   r   xarray.backends.netCDF4_r   r   r   r   r   xarray.backends.storer   xarray.corer   xarray.core.utilsr   r   r   r   xarray.core.variabler   r   r    xarray.core.datasetr!   r#   rE   rN   partialr   rY   r[   r   r?   r/   r-   <module>r      s   " " " " " "     				 				 $ $ $ $ $ $ % % % % % % % % % % % % % %              N M M M M M M M W W W W W W W W W W W W              9 8 8 8 8 8                        * ) ) ) ) ) ,!!!!!!888888++++++    +      	 	 	 +*"   & & &B& B& B& B& B&' B& B& B&JR R R R R 1 R R Rj $./H"I J   r/   