Upload folder using huggingface_hub (part 5)
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +5 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/INSTALLER +1 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/METADATA +64 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/RECORD +106 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/REQUESTED +0 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/WHEEL +5 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/LICENSE +30 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/hdf5.txt +69 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/license.txt +34 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/pytables.txt +33 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/python.txt +44 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/stdint.txt +25 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/lzf/LICENSE.txt +33 -0
- .venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/top_level.txt +1 -0
- .venv/lib/python3.11/site-packages/h5py.libs/libaec-a27cf049.so.0.1.4 +0 -0
- .venv/lib/python3.11/site-packages/h5py.libs/libhdf5-9e18f0c6.so.320.0.0 +3 -0
- .venv/lib/python3.11/site-packages/h5py.libs/libhdf5_hl-69da89c9.so.320.0.0 +3 -0
- .venv/lib/python3.11/site-packages/h5py.libs/libsz-c6be10dd.so.2.0.1 +0 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_objects.py +92 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_ros3.py +112 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_selections.py +142 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_slicing.py +421 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_vds/__init__.py +4 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_vds/test_highlevel_vds.py +482 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_vds/test_lowlevel_vds.py +298 -0
- .venv/lib/python3.11/site-packages/h5py/tests/test_vds/test_virtual_source.py +166 -0
- .venv/lib/python3.11/site-packages/h5py/utils.cpython-311-x86_64-linux-gnu.so +3 -0
- .venv/lib/python3.11/site-packages/h5py/version.py +65 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/INSTALLER +1 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/METADATA +87 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/RECORD +9 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/REQUESTED +0 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/WHEEL +5 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/licenses/LICENSE +201 -0
- .venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/sboms/hf_xet.cyclonedx.json +0 -0
- .venv/lib/python3.11/site-packages/hf_xet/__init__.py +5 -0
- .venv/lib/python3.11/site-packages/hf_xet/__pycache__/__init__.cpython-311.pyc +0 -0
- .venv/lib/python3.11/site-packages/hf_xet/hf_xet.abi3.so +3 -0
- .venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER +1 -0
- .venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA +625 -0
- .venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD +38 -0
- .venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/REQUESTED +0 -0
- .venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL +4 -0
- .venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md +27 -0
- .venv/lib/python3.11/site-packages/httpcore/__init__.py +141 -0
- .venv/lib/python3.11/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc +0 -0
- .venv/lib/python3.11/site-packages/httpcore/__pycache__/_api.cpython-311.pyc +0 -0
- .venv/lib/python3.11/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc +0 -0
- .venv/lib/python3.11/site-packages/httpcore/__pycache__/_models.cpython-311.pyc +0 -0
- .venv/lib/python3.11/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc +0 -0
.gitattributes
CHANGED
|
@@ -73,3 +73,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 73 |
.venv/lib/python3.11/site-packages/h5py/h5s.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
| 74 |
.venv/lib/python3.11/site-packages/h5py/h5t.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
| 75 |
.venv/lib/python3.11/site-packages/h5py/h5z.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
.venv/lib/python3.11/site-packages/h5py/h5s.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
| 74 |
.venv/lib/python3.11/site-packages/h5py/h5t.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
| 75 |
.venv/lib/python3.11/site-packages/h5py/h5z.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
| 76 |
+
.venv/lib/python3.11/site-packages/h5py/utils.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
| 77 |
+
.venv/lib/python3.11/site-packages/h5py.libs/libhdf5-9e18f0c6.so.320.0.0 filter=lfs diff=lfs merge=lfs -text
|
| 78 |
+
.venv/lib/python3.11/site-packages/h5py.libs/libhdf5_hl-69da89c9.so.320.0.0 filter=lfs diff=lfs merge=lfs -text
|
| 79 |
+
.venv/lib/python3.11/site-packages/hf_xet/hf_xet.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 80 |
+
.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hf_api.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
uv
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/METADATA
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: h5py
|
| 3 |
+
Version: 3.16.0
|
| 4 |
+
Summary: Read and write HDF5 files from Python
|
| 5 |
+
Author-email: Andrew Collette <andrew.collette@gmail.com>
|
| 6 |
+
Maintainer-email: Thomas Kluyver <thomas@kluyver.me.uk>, Thomas A Caswell <tcaswell@bnl.gov>
|
| 7 |
+
License-Expression: BSD-3-Clause
|
| 8 |
+
Project-URL: Homepage, https://www.h5py.org/
|
| 9 |
+
Project-URL: Source, https://github.com/h5py/h5py
|
| 10 |
+
Project-URL: Documentation, https://docs.h5py.org/en/stable/
|
| 11 |
+
Project-URL: Release notes, https://docs.h5py.org/en/stable/whatsnew/index.html
|
| 12 |
+
Project-URL: Discussion forum, https://forum.hdfgroup.org/c/hdf5/h5py
|
| 13 |
+
Classifier: Development Status :: 5 - Production/Stable
|
| 14 |
+
Classifier: Intended Audience :: Developers
|
| 15 |
+
Classifier: Intended Audience :: Information Technology
|
| 16 |
+
Classifier: Intended Audience :: Science/Research
|
| 17 |
+
Classifier: Operating System :: Unix
|
| 18 |
+
Classifier: Operating System :: POSIX :: Linux
|
| 19 |
+
Classifier: Operating System :: MacOS :: MacOS X
|
| 20 |
+
Classifier: Operating System :: Microsoft :: Windows
|
| 21 |
+
Classifier: Programming Language :: Cython
|
| 22 |
+
Classifier: Programming Language :: Python
|
| 23 |
+
Classifier: Programming Language :: Python :: 3
|
| 24 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 25 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 26 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 27 |
+
Classifier: Programming Language :: Python :: 3.13
|
| 28 |
+
Classifier: Programming Language :: Python :: 3.14
|
| 29 |
+
Classifier: Programming Language :: Python :: Free Threading :: 1 - Unstable
|
| 30 |
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
| 31 |
+
Classifier: Topic :: Scientific/Engineering
|
| 32 |
+
Classifier: Topic :: Database
|
| 33 |
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
| 34 |
+
Requires-Python: >=3.10
|
| 35 |
+
Description-Content-Type: text/x-rst
|
| 36 |
+
License-File: LICENSE
|
| 37 |
+
License-File: lzf/LICENSE.txt
|
| 38 |
+
License-File: licenses/hdf5.txt
|
| 39 |
+
License-File: licenses/license.txt
|
| 40 |
+
License-File: licenses/pytables.txt
|
| 41 |
+
License-File: licenses/python.txt
|
| 42 |
+
License-File: licenses/stdint.txt
|
| 43 |
+
Requires-Dist: numpy>=1.21.2
|
| 44 |
+
Dynamic: license-file
|
| 45 |
+
Dynamic: requires-dist
|
| 46 |
+
|
| 47 |
+
The h5py package provides both a high- and low-level interface to the HDF5
|
| 48 |
+
library from Python. The low-level interface is intended to be a complete
|
| 49 |
+
wrapping of the HDF5 API, while the high-level component supports access to
|
| 50 |
+
HDF5 files, datasets and groups using established Python and NumPy concepts.
|
| 51 |
+
|
| 52 |
+
A strong emphasis on automatic conversion between Python (Numpy) datatypes and
|
| 53 |
+
data structures and their HDF5 equivalents vastly simplifies the process of
|
| 54 |
+
reading and writing data from Python.
|
| 55 |
+
|
| 56 |
+
Wheels are provided for several popular platforms, with an included copy of
|
| 57 |
+
the HDF5 library (usually the latest version when h5py is released).
|
| 58 |
+
|
| 59 |
+
You can also `build h5py from source
|
| 60 |
+
<https://docs.h5py.org/en/stable/build.html#source-installation>`_
|
| 61 |
+
with any HDF5 stable release from version 1.10.4 onwards, although naturally new
|
| 62 |
+
HDF5 versions released after this version of h5py may not work.
|
| 63 |
+
Odd-numbered minor versions of HDF5 (e.g. 1.13) are experimental, and may not
|
| 64 |
+
be supported.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/RECORD
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
h5py-3.16.0.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
|
| 2 |
+
h5py-3.16.0.dist-info/METADATA,sha256=5GH89-uf7mJCIF-SJcwXhFWgIS0cDLj5l_fuv4zZaV4,3007
|
| 3 |
+
h5py-3.16.0.dist-info/RECORD,,
|
| 4 |
+
h5py-3.16.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 5 |
+
h5py-3.16.0.dist-info/WHEEL,sha256=Op2QaqlU71fNSBP2nIljEWzUWxRUBAuK-SqS4BfzclU,113
|
| 6 |
+
h5py-3.16.0.dist-info/licenses/LICENSE,sha256=5XSylmVc-wylGA7G7uPJXRIrCQZzbTyn484Z4PKX8Mk,1520
|
| 7 |
+
h5py-3.16.0.dist-info/licenses/licenses/hdf5.txt,sha256=K4L--O2KAgumVs4tslBe2FiTnLfDtvffCEvYMDLXe8c,3766
|
| 8 |
+
h5py-3.16.0.dist-info/licenses/licenses/license.txt,sha256=-s9D4DGTz0z42LzdZ84E_GHvaUjdBmcqTl2leeZKOUg,1739
|
| 9 |
+
h5py-3.16.0.dist-info/licenses/licenses/pytables.txt,sha256=mi1dboFWOMajwRMPZr58z_CehMDoIeVz8q3WnURiJBQ,1640
|
| 10 |
+
h5py-3.16.0.dist-info/licenses/licenses/python.txt,sha256=hITnBcmcf12_FXcjtOPNHa_5z-QcdAtXJVWHjwWFiYQ,2503
|
| 11 |
+
h5py-3.16.0.dist-info/licenses/licenses/stdint.txt,sha256=HUwLpl1NqiPvjWwFcevpazCrrr2inCbWbOE1QNTxKyg,1394
|
| 12 |
+
h5py-3.16.0.dist-info/licenses/lzf/LICENSE.txt,sha256=qPjFSrwA0azRV0AVV7Psb1AKx2pe_Reg6qZE4tMua-s,1556
|
| 13 |
+
h5py-3.16.0.dist-info/top_level.txt,sha256=fO7Bsaa0F3Nx6djErCCbSw4-E7rBFMWrBVTGLEMxUMg,5
|
| 14 |
+
h5py.libs/libaec-a27cf049.so.0.1.4,sha256=mnI5kmsWLg2-QaH8AYHlXs0p1dv6Vv_eQr7IrUtPLbY,50545
|
| 15 |
+
h5py.libs/libhdf5-9e18f0c6.so.320.0.0,sha256=H2PzwC8C3NcC_OY6D23GeGQwvxuYmSbGhQ0gJrLItCQ,6132905
|
| 16 |
+
h5py.libs/libhdf5_hl-69da89c9.so.320.0.0,sha256=xC-1hG-mWDV1ZmGETFmmDd6EghL0s14EuuHZ-xd1Nvk,198665
|
| 17 |
+
h5py.libs/libsz-c6be10dd.so.2.0.1,sha256=pKlk1m-DS3eHyWl94BlWUzPs0ZCtGVeeoYBQVvm8fVY,54057
|
| 18 |
+
h5py/__init__.py,sha256=1KRoAwhyR872fuNKTZjXl74vVbH5IwvF-KH6NY-NG4c,3705
|
| 19 |
+
h5py/_conv.cpython-311-x86_64-linux-gnu.so,sha256=86f18GMgtaax4dfi8ZXOaDiEj657dJOB7JmaSzR1dMQ,459673
|
| 20 |
+
h5py/_errors.cpython-311-x86_64-linux-gnu.so,sha256=1cKD22D2spMDBWskavz2_RdK1nq0jEtBCHeAZNn_HWc,159673
|
| 21 |
+
h5py/_hl/__init__.py,sha256=R6siZWBApRmGrOkxi8kNKxZ0Hcp2MieM-0EBWwbp7vc,457
|
| 22 |
+
h5py/_hl/attrs.py,sha256=v9v8fJ9AaqGRXBDVDm89Pbms_7eqRQW4Ta45lUop1A4,10209
|
| 23 |
+
h5py/_hl/base.py,sha256=TGEn-w9w297bIQy-8--DfeMf5khezya6lO1bq7JhKDU,15701
|
| 24 |
+
h5py/_hl/compat.py,sha256=UXvt42U_OiXAcPcrr1FwVP_ScD4yL-ONPercjyUx6FA,1523
|
| 25 |
+
h5py/_hl/dataset.py,sha256=Vzq8QU7sLBDgM86qPzNjjyYbAZERHdrkk6yR-7dOZVc,45291
|
| 26 |
+
h5py/_hl/datatype.py,sha256=-kIh5Ha9K21VLqInUmZ6SZdXag1yvyo30MpgsM3H0P0,1548
|
| 27 |
+
h5py/_hl/dims.py,sha256=rbjYav9D7dFG-Tns_RDuP24B6bwR80LO_2d2NQYihh8,5109
|
| 28 |
+
h5py/_hl/files.py,sha256=kmhW1WMm27-M1qaYFpwF6Nb1STLUDcmYk1GzCOA1jTY,25154
|
| 29 |
+
h5py/_hl/filters.py,sha256=8e00taWWH4eV9y0Hq9CIRsCNZMqJyN9x2sUjKkYya-Y,14604
|
| 30 |
+
h5py/_hl/group.py,sha256=6q_QLDGOLHgXlw0Qmr56WlQ8Qk9tbyVyeADgFu7GX7c,34321
|
| 31 |
+
h5py/_hl/selections.py,sha256=MThKzB1B4N9x9T5CwfQvTqLCXP_GwGrLP1HatNV1yBg,14686
|
| 32 |
+
h5py/_hl/selections2.py,sha256=PcKxIbSCYjL_QrbeCHw8-MHWDBxOlEDG_UHvP4aBuKY,2723
|
| 33 |
+
h5py/_hl/vds.py,sha256=QpMLtumI_uaJ1CdqMXyxgGaW3rxAztcwSIB4rEjLC3U,9468
|
| 34 |
+
h5py/_npystrings.cpython-311-x86_64-linux-gnu.so,sha256=GqlAY4hUG7phhRzb0tC9Afdhrme-Py4ZSrfeZWW29OU,154849
|
| 35 |
+
h5py/_objects.cpython-311-x86_64-linux-gnu.so,sha256=Lv29s0RkqNPn-Dm8fdZRgmZwAn5CEyaVihp_Hs8hWQ8,360785
|
| 36 |
+
h5py/_proxy.cpython-311-x86_64-linux-gnu.so,sha256=vqzGOpz3Fne-WzIDkYDD87hYNL1Y1h1LX2VzDR0ZCS8,142321
|
| 37 |
+
h5py/_selector.cpython-311-x86_64-linux-gnu.so,sha256=PtYkVj6sWMEuStPNF-PbPhfaPMHWeUzQbPNVjlnEZ8A,364945
|
| 38 |
+
h5py/defs.cpython-311-x86_64-linux-gnu.so,sha256=jReZI6HVK9hXR8TxiqYqwUoofism1bdCfPRbyIYcHIM,512497
|
| 39 |
+
h5py/h5.cpython-311-x86_64-linux-gnu.so,sha256=g_uzy5YKyzdPSL2EZLrV-f3obiWiceqaxL9Zc2I2Hvw,257665
|
| 40 |
+
h5py/h5a.cpython-311-x86_64-linux-gnu.so,sha256=CXAB8DvXN9t88oCRBchXVU7a43Dp9WJWQ3U6lNTvt1U,319121
|
| 41 |
+
h5py/h5ac.cpython-311-x86_64-linux-gnu.so,sha256=xecNlWm9uIx_2WGhg0EwnYbDoSiR_La3Ig2-4xDpcvg,216257
|
| 42 |
+
h5py/h5d.cpython-311-x86_64-linux-gnu.so,sha256=hHGhKMb8L0ZRLW51RhukB1rkQLIkEkeD8-W5KvqrZSw,577985
|
| 43 |
+
h5py/h5ds.cpython-311-x86_64-linux-gnu.so,sha256=ctcMYks7lOFzV8wKAcHWkgpk-cEbdcTKWQbpdJV5r48,224825
|
| 44 |
+
h5py/h5f.cpython-311-x86_64-linux-gnu.so,sha256=bKdZMDaC82rt-e0EqgcA9hjLaax18jZDClvIkrQU_bI,352025
|
| 45 |
+
h5py/h5fd.cpython-311-x86_64-linux-gnu.so,sha256=zwo74dnNsIv0M_3uCZ-ngdny1GhRgFhsCe9qmKMOFn8,364857
|
| 46 |
+
h5py/h5g.cpython-311-x86_64-linux-gnu.so,sha256=7bphFJdzlfqSjAhGycM43DuT9FPOiBwxLTV1n8dKpGc,381033
|
| 47 |
+
h5py/h5i.cpython-311-x86_64-linux-gnu.so,sha256=NCe1NW1amlKjOZFlKu09hlF_TBGoswlrIDnhUb3coHs,175457
|
| 48 |
+
h5py/h5l.cpython-311-x86_64-linux-gnu.so,sha256=3BKvrhWKEKl_pTGhb3-1cXpqRVINy_ZAozFDZZc1xp0,274001
|
| 49 |
+
h5py/h5o.cpython-311-x86_64-linux-gnu.so,sha256=5bE5Q7z2grHZyrI9_LemJVl95F1cezW1xZZjrcEmgS0,343609
|
| 50 |
+
h5py/h5p.cpython-311-x86_64-linux-gnu.so,sha256=c-yPWSc4TzT8O3wXIW4vsYznvu8rBt5YDr2tShB529E,885185
|
| 51 |
+
h5py/h5pl.cpython-311-x86_64-linux-gnu.so,sha256=LBFTKE-RL0YZSW89pGXbkOzkVxuishZ1lfCcA9kQG64,162889
|
| 52 |
+
h5py/h5py_warnings.py,sha256=bNPu7wWPt1xLVZVB-lpycIoMux1kcNfaKf4NE78dK90,523
|
| 53 |
+
h5py/h5r.cpython-311-x86_64-linux-gnu.so,sha256=EluXGlvs36y_OeT5-uji1rlebS-lj0hEc2ibZ8rRoCE,200169
|
| 54 |
+
h5py/h5s.cpython-311-x86_64-linux-gnu.so,sha256=3aUO9A77EAQjVmV5icOTeXO6_vKJFZlgDHailgjyHXs,319049
|
| 55 |
+
h5py/h5t.cpython-311-x86_64-linux-gnu.so,sha256=REVuP3pTUBWGp2ihJklbPo5LKAsgzuVLQ_ZBdLn4jcY,919425
|
| 56 |
+
h5py/h5z.cpython-311-x86_64-linux-gnu.so,sha256=pQh4ME-qhAKMhW1CECUnk6fLlr9SLJQAHyeUdZv4wFk,171313
|
| 57 |
+
h5py/ipy_completer.py,sha256=dGKYNK3CE32jwRVrBeUssdXRocu45VnrA3cvLRp-2E0,3733
|
| 58 |
+
h5py/tests/__init__.py,sha256=oPTnFGaf5_48QHzq0mpTwlxbagBvnvU3W9s2AWRcWFU,613
|
| 59 |
+
h5py/tests/common.py,sha256=YuWJ5cblajJUGbejKVDl7C_FVzFgjWeKr1p3EIBO0sc,9278
|
| 60 |
+
h5py/tests/conftest.py,sha256=-aF7Ig1w4yd00YxOS9ScB4hFunPLXPXUGF8rDL43WSg,545
|
| 61 |
+
h5py/tests/data_files/__init__.py,sha256=WgwvU8ZVG00ZN2EOOnZ7TYJX_NzF_JCSd7nSEDJrbrE,193
|
| 62 |
+
h5py/tests/data_files/compound-dtype-complex.h5,sha256=682WWAlgZPFuRqLXS5UyyeamrVtnqCfy-09jefawU4A,13792
|
| 63 |
+
h5py/tests/data_files/vlen_string_dset.h5,sha256=kA-LrxnT2MTRGTrBrGAZ7nd0AF6FwDCvROZ1ezjSl5M,6304
|
| 64 |
+
h5py/tests/data_files/vlen_string_dset_utc.h5,sha256=hbcoOCuDPB2mFie5ozTiKCLVwcs1n-O6byUmKvRTL2M,169904
|
| 65 |
+
h5py/tests/data_files/vlen_string_s390x.h5,sha256=6pkMaOA3G6-rSWb3UvoTVbO59kNgBm9tna_48bfnTKU,9008
|
| 66 |
+
h5py/tests/test_attribute_create.py,sha256=YWXGzX53dryJT2eW-tSXOEPq80Vrq-s4B9aJpV_Wjsg,3181
|
| 67 |
+
h5py/tests/test_attrs.py,sha256=jt2w-bbIgNV-U1LJ71LmoN9ltqePrlmAzYZOOM7YLdo,9652
|
| 68 |
+
h5py/tests/test_attrs_data.py,sha256=hLttIRENNppMAY7zGVHiuly1QOg54gndk9OA3fFuxI8,10154
|
| 69 |
+
h5py/tests/test_base.py,sha256=8zkoukhM7XqR08lvFHFxmP-3B5RLYCaXwEJvDvXuDpQ,3971
|
| 70 |
+
h5py/tests/test_big_endian_file.py,sha256=-IYw7zyybjYIGKgZu1ys5D74ur4WMHeJRCHXiohlWvQ,1469
|
| 71 |
+
h5py/tests/test_completions.py,sha256=5IoOj-sdctWpf_shX4sCweZEEgrzZRMv4KDalWPsJtM,1894
|
| 72 |
+
h5py/tests/test_dataset.py,sha256=ikpvsbNnSPe91fUG3Uqne6bewfxVAHvayBPWpn2NDLw,88749
|
| 73 |
+
h5py/tests/test_dataset_getitem.py,sha256=9IlFGNFs-ioNe7YsXBVrkZMYi0YxagUD_nls7ftIV1U,21005
|
| 74 |
+
h5py/tests/test_dataset_swmr.py,sha256=cwkcX4GwGuLXD3IRlrgPnstbeWCUOhJXBEWthJWSakw,4060
|
| 75 |
+
h5py/tests/test_datatype.py,sha256=Gr-0IgmeC7ldt5rQMX3r4zlPwhUTsh7Fru6sMCRj0vU,1091
|
| 76 |
+
h5py/tests/test_dimension_scales.py,sha256=qA_dlkb5WYbqz8eXKpy6g_VcOsKKamT71t010kJH6b0,8424
|
| 77 |
+
h5py/tests/test_dims_dimensionproxy.py,sha256=OzhpDSYjKegKusgqaCcxcjIlLtELzKndzlpbqqpCu54,591
|
| 78 |
+
h5py/tests/test_dtype.py,sha256=ScTD9_PI3wsdBnfmlbfHcioCB_o0okjccwoANQK-hCQ,20109
|
| 79 |
+
h5py/tests/test_errors.py,sha256=jRWnUxN9bwlhdcSrcsgElto1amVHOg564_StvA9WcVA,2369
|
| 80 |
+
h5py/tests/test_file.py,sha256=FimQtXH8zbjVeqtEUaBA-HsTgA3Jztrq_X7StmSZFA8,35243
|
| 81 |
+
h5py/tests/test_file2.py,sha256=R3eoUPK-DwIl_bU3Xr2IJ5iLdEbuUNoc8138nWJ0WRg,11160
|
| 82 |
+
h5py/tests/test_file_alignment.py,sha256=Ov8hhi6ZfcIf-sntv9OGBQ0kk8aAag9yXjsN-yA64kI,4488
|
| 83 |
+
h5py/tests/test_file_image.py,sha256=w7COnNE--O_zfmJKdADzNjTsJp8zUC5Z5XzX0p9OGeY,2009
|
| 84 |
+
h5py/tests/test_filters.py,sha256=GeU-WR6C3fblqRrfUG7hxK90E3LeDNn-ADwS9GQ8qzg,3218
|
| 85 |
+
h5py/tests/test_group.py,sha256=bx0pd8pI7JiKQuIE-ARZ-cXGeNfShGn92OAQVlcAx6k,48757
|
| 86 |
+
h5py/tests/test_h5.py,sha256=FlYZcVxxP1kIYCZdSEC3sR7o72dPWYiUbhyFO0rvN-8,1216
|
| 87 |
+
h5py/tests/test_h5d_direct_chunk.py,sha256=xDEEP-djvITkMNMk3T7TPFnZ5g4kpvshXdIvgVJ1Nmo,7811
|
| 88 |
+
h5py/tests/test_h5f.py,sha256=eNZAcfQ2Au1W5nwewZ6FDbA0JURlY5R4hhjZPijdGnI,3929
|
| 89 |
+
h5py/tests/test_h5o.py,sha256=5bob6Brn-lW-xSNgSS5rLiuwKWQ0SzP4aTYoccgYfDQ,522
|
| 90 |
+
h5py/tests/test_h5p.py,sha256=qWO3u5JOQ4XkgLm2t0kSZgj0RgAylFWlSHia_M2r9AI,8094
|
| 91 |
+
h5py/tests/test_h5pl.py,sha256=2LZY4glHa9lMQLXfuPFFs_mcdGHMgUxpixKQ6RyEIx8,1847
|
| 92 |
+
h5py/tests/test_h5s.py,sha256=TGgvWcqPmBKuyNnEDmQxwOCXqvW9Uj0KTt9bVZ2IGOw,2149
|
| 93 |
+
h5py/tests/test_h5t.py,sha256=EjYXQl70rJaUfE9NOYnWjTltP0g02IYGWpmq1uMQsx8,6595
|
| 94 |
+
h5py/tests/test_h5z.py,sha256=WuQljb3J9K_dv29sysjnwc9lnPeUUAEHrjFx90BypOg,1972
|
| 95 |
+
h5py/tests/test_native_complex.py,sha256=Sog3Dm0TSHFEY-r8td-9k_apFFw1TsRzt_BAVYJQurY,5684
|
| 96 |
+
h5py/tests/test_npystrings.py,sha256=IwssUPMLTBq7kpTZuU4Xj7k0QTAkYZ_gpuC7o3U4O5g,5846
|
| 97 |
+
h5py/tests/test_objects.py,sha256=ia_kwGyWdD0e8fXunF2MP4apuJ3vc1I49jfKu1aPIS8,3043
|
| 98 |
+
h5py/tests/test_ros3.py,sha256=19xBp3LF0QnFwKbcuZDAa2YEt90hl44_bB2Qdo2F0JM,3378
|
| 99 |
+
h5py/tests/test_selections.py,sha256=gXYA8OStDr_LwUGbBEwRC14yRRBmRRxz-HBp6fOwuFk,4891
|
| 100 |
+
h5py/tests/test_slicing.py,sha256=ql5vshPyFoyqvZetERA2NPqu0tkSTXqU0nTveaI7ngY,14158
|
| 101 |
+
h5py/tests/test_vds/__init__.py,sha256=2mnHIhOAdjMVjHQjBp9VFDLfltPEOR02aoZ1yTJU5hY,103
|
| 102 |
+
h5py/tests/test_vds/test_highlevel_vds.py,sha256=p38uAjBJ252qXnwnMMeP4DA7WX9j_XVpu6cSbBRrgpw,17852
|
| 103 |
+
h5py/tests/test_vds/test_lowlevel_vds.py,sha256=Gp2dX53EaGmJ4Vd7N7K_e0efGkkqPkdnQtZBmjSVLOc,11934
|
| 104 |
+
h5py/tests/test_vds/test_virtual_source.py,sha256=eJglh9M8-JZsKFbOq__dLgnhafs91UcujxdD1Ng6ryA,6055
|
| 105 |
+
h5py/utils.cpython-311-x86_64-linux-gnu.so,sha256=e24uxED3CLW1YrrR-M3Cwvc-rSv9muBWuxgXfq_fCKk,175529
|
| 106 |
+
h5py/version.py,sha256=uR4EyeOssFzeBCJ0F_16laX3Plet5Dx7iXTSTMNJ6fw,1911
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/REQUESTED
ADDED
|
File without changes
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: setuptools (82.0.0)
|
| 3 |
+
Root-Is-Purelib: false
|
| 4 |
+
Tag: cp311-cp311-manylinux_2_28_x86_64
|
| 5 |
+
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/LICENSE
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright (c) 2008 Andrew Collette and contributors
|
| 2 |
+
All rights reserved.
|
| 3 |
+
|
| 4 |
+
Redistribution and use in source and binary forms, with or without
|
| 5 |
+
modification, are permitted provided that the following conditions are
|
| 6 |
+
met:
|
| 7 |
+
|
| 8 |
+
1. Redistributions of source code must retain the above copyright
|
| 9 |
+
notice, this list of conditions and the following disclaimer.
|
| 10 |
+
|
| 11 |
+
2. Redistributions in binary form must reproduce the above copyright
|
| 12 |
+
notice, this list of conditions and the following disclaimer in the
|
| 13 |
+
documentation and/or other materials provided with the
|
| 14 |
+
distribution.
|
| 15 |
+
|
| 16 |
+
3. Neither the name of the copyright holder nor the names of its
|
| 17 |
+
contributors may be used to endorse or promote products derived from
|
| 18 |
+
this software without specific prior written permission.
|
| 19 |
+
|
| 20 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| 21 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| 22 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| 23 |
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| 24 |
+
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 25 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| 26 |
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| 27 |
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| 28 |
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| 29 |
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 30 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/hdf5.txt
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
HDF5 (Hierarchical Data Format 5) Software Library and Utilities
|
| 2 |
+
Copyright 2006-2007 by The HDF Group (THG).
|
| 3 |
+
|
| 4 |
+
NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities
|
| 5 |
+
Copyright 1998-2006 by the Board of Trustees of the University of Illinois.
|
| 6 |
+
|
| 7 |
+
All rights reserved.
|
| 8 |
+
|
| 9 |
+
Contributors: National Center for Supercomputing Applications (NCSA)
|
| 10 |
+
at the University of Illinois, Fortner Software, Unidata Program
|
| 11 |
+
Center (netCDF), The Independent JPEG Group (JPEG), Jean-loup Gailly
|
| 12 |
+
and Mark Adler (gzip), and Digital Equipment Corporation (DEC).
|
| 13 |
+
|
| 14 |
+
Redistribution and use in source and binary forms, with or without
|
| 15 |
+
modification, are permitted for any purpose (including commercial
|
| 16 |
+
purposes) provided that the following conditions are met:
|
| 17 |
+
|
| 18 |
+
1. Redistributions of source code must retain the above copyright
|
| 19 |
+
notice, this list of conditions, and the following disclaimer.
|
| 20 |
+
2. Redistributions in binary form must reproduce the above
|
| 21 |
+
copyright notice, this list of conditions, and the following
|
| 22 |
+
disclaimer in the documentation and/or materials provided with the
|
| 23 |
+
distribution.
|
| 24 |
+
3. In addition, redistributions of modified forms of the source or
|
| 25 |
+
binary code must carry prominent notices stating that the original
|
| 26 |
+
code was changed and the date of the change.
|
| 27 |
+
4. All publications or advertising materials mentioning features or
|
| 28 |
+
use of this software are asked, but not required, to acknowledge that
|
| 29 |
+
it was developed by The HDF Group and by the National Center for
|
| 30 |
+
Supercomputing Applications at the University of Illinois at
|
| 31 |
+
Urbana-Champaign and credit the contributors.
|
| 32 |
+
5. Neither the name of The HDF Group, the name of the University,
|
| 33 |
+
nor the name of any Contributor may be used to endorse or promote
|
| 34 |
+
products derived from this software without specific prior written
|
| 35 |
+
permission from THG, the University, or the Contributor, respectively.
|
| 36 |
+
|
| 37 |
+
DISCLAIMER: THIS SOFTWARE IS PROVIDED BY THE HDF GROUP (THG) AND THE
|
| 38 |
+
CONTRIBUTORS "AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR
|
| 39 |
+
IMPLIED. In no event shall THG or the Contributors be liable for any
|
| 40 |
+
damages suffered by the users arising out of the use of this software,
|
| 41 |
+
even if advised of the possibility of such damage.
|
| 42 |
+
|
| 43 |
+
Portions of HDF5 were developed with support from the University of
|
| 44 |
+
California, Lawrence Livermore National Laboratory (UC LLNL). The
|
| 45 |
+
following statement applies to those portions of the product and must
|
| 46 |
+
be retained in any redistribution of source code, binaries,
|
| 47 |
+
documentation, and/or accompanying materials:
|
| 48 |
+
|
| 49 |
+
This work was partially produced at the University of California,
|
| 50 |
+
Lawrence Livermore National Laboratory (UC LLNL) under contract
|
| 51 |
+
no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy
|
| 52 |
+
(DOE) and The Regents of the University of California (University) for
|
| 53 |
+
the operation of UC LLNL.
|
| 54 |
+
|
| 55 |
+
DISCLAIMER: This work was prepared as an account of work sponsored by
|
| 56 |
+
an agency of the United States Government. Neither the United States
|
| 57 |
+
Government nor the University of California nor any of their
|
| 58 |
+
employees, makes any warranty, express or implied, or assumes any
|
| 59 |
+
liability or responsibility for the accuracy, completeness, or
|
| 60 |
+
usefulness of any information, apparatus, product, or process
|
| 61 |
+
disclosed, or represents that its use would not infringe privately-
|
| 62 |
+
owned rights. Reference herein to any specific commercial products,
|
| 63 |
+
process, or service by trade name, trademark, manufacturer, or
|
| 64 |
+
otherwise, does not necessarily constitute or imply its endorsement,
|
| 65 |
+
recommendation, or favoring by the United States Government or the
|
| 66 |
+
University of California. The views and opinions of authors expressed
|
| 67 |
+
herein do not necessarily state or reflect those of the United States
|
| 68 |
+
Government or the University of California, and shall not be used for
|
| 69 |
+
advertising or product endorsement purposes.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/license.txt
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright Notice and Statement for the h5py Project
|
| 2 |
+
===================================================
|
| 3 |
+
|
| 4 |
+
Copyright (c) 2008-2013 Andrew Collette and contributors
|
| 5 |
+
http://www.h5py.org
|
| 6 |
+
All rights reserved.
|
| 7 |
+
|
| 8 |
+
Redistribution and use in source and binary forms, with or without
|
| 9 |
+
modification, are permitted provided that the following conditions are
|
| 10 |
+
met:
|
| 11 |
+
|
| 12 |
+
a. Redistributions of source code must retain the above copyright
|
| 13 |
+
notice, this list of conditions and the following disclaimer.
|
| 14 |
+
|
| 15 |
+
b. Redistributions in binary form must reproduce the above copyright
|
| 16 |
+
notice, this list of conditions and the following disclaimer in the
|
| 17 |
+
documentation and/or other materials provided with the
|
| 18 |
+
distribution.
|
| 19 |
+
|
| 20 |
+
c. Neither the name of the author nor the names of contributors may
|
| 21 |
+
be used to endorse or promote products derived from this software
|
| 22 |
+
without specific prior written permission.
|
| 23 |
+
|
| 24 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| 25 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| 26 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| 27 |
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| 28 |
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 29 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| 30 |
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| 31 |
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| 32 |
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| 33 |
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 34 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/pytables.txt
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright Notice and Statement for PyTables Software Library and Utilities:
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2002, 2003, 2004 Francesc Altet
|
| 4 |
+
Copyright (c) 2005, 2006, 2007 Carabos Coop. V.
|
| 5 |
+
All rights reserved.
|
| 6 |
+
|
| 7 |
+
Redistribution and use in source and binary forms, with or without
|
| 8 |
+
modification, are permitted provided that the following conditions are
|
| 9 |
+
met:
|
| 10 |
+
|
| 11 |
+
a. Redistributions of source code must retain the above copyright
|
| 12 |
+
notice, this list of conditions and the following disclaimer.
|
| 13 |
+
|
| 14 |
+
b. Redistributions in binary form must reproduce the above copyright
|
| 15 |
+
notice, this list of conditions and the following disclaimer in the
|
| 16 |
+
documentation and/or other materials provided with the
|
| 17 |
+
distribution.
|
| 18 |
+
|
| 19 |
+
c. Neither the name of the Carabos Coop. V. nor the names of its
|
| 20 |
+
contributors may be used to endorse or promote products derived
|
| 21 |
+
from this software without specific prior written permission.
|
| 22 |
+
|
| 23 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| 24 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| 25 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| 26 |
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| 27 |
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 28 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| 29 |
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| 30 |
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| 31 |
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| 32 |
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 33 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/python.txt
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Python license
|
| 2 |
+
==============
|
| 3 |
+
|
| 4 |
+
#. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and
|
| 5 |
+
the Individual or Organization ("Licensee") accessing and otherwise using Python
|
| 6 |
+
Python 2.7.5 software in source or binary form and its associated documentation.
|
| 7 |
+
|
| 8 |
+
#. Subject to the terms and conditions of this License Agreement, PSF hereby
|
| 9 |
+
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
|
| 10 |
+
analyze, test, perform and/or display publicly, prepare derivative works,
|
| 11 |
+
distribute, and otherwise use Python Python 2.7.5 alone or in any derivative
|
| 12 |
+
version, provided, however, that PSF's License Agreement and PSF's notice of
|
| 13 |
+
copyright, i.e., "Copyright 2001-2013 Python Software Foundation; All Rights
|
| 14 |
+
Reserved" are retained in Python Python 2.7.5 alone or in any derivative version
|
| 15 |
+
prepared by Licensee.
|
| 16 |
+
|
| 17 |
+
#. In the event Licensee prepares a derivative work that is based on or
|
| 18 |
+
incorporates Python Python 2.7.5 or any part thereof, and wants to make the
|
| 19 |
+
derivative work available to others as provided herein, then Licensee hereby
|
| 20 |
+
agrees to include in any such work a brief summary of the changes made to Python
|
| 21 |
+
Python 2.7.5.
|
| 22 |
+
|
| 23 |
+
#. PSF is making Python Python 2.7.5 available to Licensee on an "AS IS" basis.
|
| 24 |
+
PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF
|
| 25 |
+
EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
|
| 26 |
+
WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
|
| 27 |
+
USE OF PYTHON Python 2.7.5 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
| 28 |
+
|
| 29 |
+
#. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON Python 2.7.5
|
| 30 |
+
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
|
| 31 |
+
MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON Python 2.7.5, OR ANY DERIVATIVE
|
| 32 |
+
THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
| 33 |
+
|
| 34 |
+
#. This License Agreement will automatically terminate upon a material breach of
|
| 35 |
+
its terms and conditions.
|
| 36 |
+
|
| 37 |
+
#. Nothing in this License Agreement shall be deemed to create any relationship
|
| 38 |
+
of agency, partnership, or joint venture between PSF and Licensee. This License
|
| 39 |
+
Agreement does not grant permission to use PSF trademarks or trade name in a
|
| 40 |
+
trademark sense to endorse or promote products or services of Licensee, or any
|
| 41 |
+
third party.
|
| 42 |
+
|
| 43 |
+
#. By copying, installing or otherwise using Python Python 2.7.5, Licensee agrees
|
| 44 |
+
to be bound by the terms and conditions of this License Agreement.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/licenses/stdint.txt
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright (c) 2006-2008 Alexander Chemeris
|
| 2 |
+
|
| 3 |
+
Redistribution and use in source and binary forms, with or without
|
| 4 |
+
modification, are permitted provided that the following conditions are met:
|
| 5 |
+
|
| 6 |
+
1. Redistributions of source code must retain the above copyright notice,
|
| 7 |
+
this list of conditions and the following disclaimer.
|
| 8 |
+
|
| 9 |
+
2. Redistributions in binary form must reproduce the above copyright
|
| 10 |
+
notice, this list of conditions and the following disclaimer in the
|
| 11 |
+
documentation and/or other materials provided with the distribution.
|
| 12 |
+
|
| 13 |
+
3. The name of the author may be used to endorse or promote products
|
| 14 |
+
derived from this software without specific prior written permission.
|
| 15 |
+
|
| 16 |
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| 17 |
+
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| 18 |
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| 19 |
+
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 20 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| 21 |
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| 22 |
+
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| 23 |
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| 24 |
+
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| 25 |
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/licenses/lzf/LICENSE.txt
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright Notice and Statement for LZF filter
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2008-2009 Andrew Collette
|
| 4 |
+
http://h5py.org
|
| 5 |
+
All rights reserved.
|
| 6 |
+
|
| 7 |
+
Redistribution and use in source and binary forms, with or without
|
| 8 |
+
modification, are permitted provided that the following conditions are
|
| 9 |
+
met:
|
| 10 |
+
|
| 11 |
+
a. Redistributions of source code must retain the above copyright
|
| 12 |
+
notice, this list of conditions and the following disclaimer.
|
| 13 |
+
|
| 14 |
+
b. Redistributions in binary form must reproduce the above copyright
|
| 15 |
+
notice, this list of conditions and the following disclaimer in the
|
| 16 |
+
documentation and/or other materials provided with the
|
| 17 |
+
distribution.
|
| 18 |
+
|
| 19 |
+
c. Neither the name of the author nor the names of contributors may
|
| 20 |
+
be used to endorse or promote products derived from this software
|
| 21 |
+
without specific prior written permission.
|
| 22 |
+
|
| 23 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| 24 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| 25 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| 26 |
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| 27 |
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 28 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| 29 |
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| 30 |
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| 31 |
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| 32 |
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 33 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.venv/lib/python3.11/site-packages/h5py-3.16.0.dist-info/top_level.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
h5py
|
.venv/lib/python3.11/site-packages/h5py.libs/libaec-a27cf049.so.0.1.4
ADDED
|
Binary file (50.5 kB). View file
|
|
|
.venv/lib/python3.11/site-packages/h5py.libs/libhdf5-9e18f0c6.so.320.0.0
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1f63f3c02f02dcd702fce63a0f6dc6786430bf1b989926c6850d2026b2c8b424
|
| 3 |
+
size 6132905
|
.venv/lib/python3.11/site-packages/h5py.libs/libhdf5_hl-69da89c9.so.320.0.0
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c42fb5846fa65835756661844c59a60dde848212f4b35e04bae1d9fb177536f9
|
| 3 |
+
size 198665
|
.venv/lib/python3.11/site-packages/h5py.libs/libsz-c6be10dd.so.2.0.1
ADDED
|
Binary file (54.1 kB). View file
|
|
|
.venv/lib/python3.11/site-packages/h5py/tests/test_objects.py
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is part of h5py, a Python interface to the HDF5 library.
|
| 2 |
+
#
|
| 3 |
+
# http://www.h5py.org
|
| 4 |
+
#
|
| 5 |
+
# Copyright 2008-2013 Andrew Collette and contributors
|
| 6 |
+
#
|
| 7 |
+
# License: Standard 3-clause BSD; see "license.txt" for full license terms
|
| 8 |
+
# and contributor agreement.
|
| 9 |
+
import os
|
| 10 |
+
import threading
|
| 11 |
+
import time
|
| 12 |
+
|
| 13 |
+
import pytest
|
| 14 |
+
|
| 15 |
+
from h5py import _objects as o
|
| 16 |
+
from .common import TestCase
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
class TestObjects(TestCase):
|
| 20 |
+
|
| 21 |
+
def test_invalid(self):
|
| 22 |
+
# Check for segfault on close
|
| 23 |
+
oid = o.ObjectID(0)
|
| 24 |
+
del oid
|
| 25 |
+
oid = o.ObjectID(1)
|
| 26 |
+
del oid
|
| 27 |
+
|
| 28 |
+
def test_equality(self):
|
| 29 |
+
# Identifier-based equality
|
| 30 |
+
oid1 = o.ObjectID(42)
|
| 31 |
+
oid2 = o.ObjectID(42)
|
| 32 |
+
oid3 = o.ObjectID(43)
|
| 33 |
+
|
| 34 |
+
self.assertEqual(oid1, oid2)
|
| 35 |
+
self.assertNotEqual(oid1, oid3)
|
| 36 |
+
|
| 37 |
+
def test_hash(self):
|
| 38 |
+
# Default objects are not hashable
|
| 39 |
+
oid = o.ObjectID(42)
|
| 40 |
+
with self.assertRaises(TypeError):
|
| 41 |
+
hash(oid)
|
| 42 |
+
|
| 43 |
+
@pytest.mark.thread_unsafe(reason="fork() from a thread may deadlock")
|
| 44 |
+
@pytest.mark.filterwarnings(
|
| 45 |
+
# https://github.com/python/cpython/pull/100229
|
| 46 |
+
r"ignore:.*use of fork\(\) may lead to deadlocks:DeprecationWarning"
|
| 47 |
+
)
|
| 48 |
+
@pytest.mark.skipif(not hasattr(os, "fork"), reason="fork() not available")
|
| 49 |
+
def test_phil_fork_with_threads(self):
|
| 50 |
+
"""Test that handling of the phil Lock after fork is correct.
|
| 51 |
+
|
| 52 |
+
h5py uses os.register_at_fork() to cause os.fork() to acquire the phil lock
|
| 53 |
+
before forking and release it afterwards, so that the global state of libhdf5
|
| 54 |
+
cannot be cloned in a corrupted state.
|
| 55 |
+
"""
|
| 56 |
+
thread_acquired_phil_event = threading.Event()
|
| 57 |
+
|
| 58 |
+
def f():
|
| 59 |
+
# Simulate another thread holding the phil lock while it updates
|
| 60 |
+
# the libhdf5 global state
|
| 61 |
+
with o.phil:
|
| 62 |
+
thread_acquired_phil_event.set()
|
| 63 |
+
time.sleep(1)
|
| 64 |
+
|
| 65 |
+
thread = threading.Thread(target=f)
|
| 66 |
+
thread.start()
|
| 67 |
+
thread_acquired_phil_event.wait()
|
| 68 |
+
|
| 69 |
+
try:
|
| 70 |
+
# Now fork the current (main) thread while the other thread holds the lock.
|
| 71 |
+
# os.fork() acquires the phil lock, so this will block until the other
|
| 72 |
+
# thread releases it.
|
| 73 |
+
pid = os.fork()
|
| 74 |
+
if pid == 0:
|
| 75 |
+
# Child process
|
| 76 |
+
# If we handle the phil lock correctly, this should not deadlock, and we
|
| 77 |
+
# should be able to acquire the lock here.
|
| 78 |
+
if o.phil.acquire(blocking=False):
|
| 79 |
+
o.phil.release()
|
| 80 |
+
os._exit(0)
|
| 81 |
+
else:
|
| 82 |
+
os._exit(1)
|
| 83 |
+
else:
|
| 84 |
+
# Parent process
|
| 85 |
+
assert o.phil.acquire(blocking=False)
|
| 86 |
+
o.phil.release()
|
| 87 |
+
# Wait for the child process to finish
|
| 88 |
+
_, status = os.waitpid(pid, 0)
|
| 89 |
+
assert os.WIFEXITED(status)
|
| 90 |
+
assert os.WEXITSTATUS(status) == 0
|
| 91 |
+
finally:
|
| 92 |
+
thread.join()
|
.venv/lib/python3.11/site-packages/h5py/tests/test_ros3.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is part of h5py, a Python interface to the HDF5 library.
|
| 2 |
+
#
|
| 3 |
+
# http://www.h5py.org
|
| 4 |
+
#
|
| 5 |
+
# Copyright 2008-2013 Andrew Collette and contributors
|
| 6 |
+
#
|
| 7 |
+
# License: Standard 3-clause BSD; see "license.txt" for full license terms
|
| 8 |
+
# and contributor agreement.
|
| 9 |
+
|
| 10 |
+
"""
|
| 11 |
+
Read-only S3 virtual file driver (VFD) test module.
|
| 12 |
+
"""
|
| 13 |
+
|
| 14 |
+
import h5py
|
| 15 |
+
from h5py._hl.files import make_fapl
|
| 16 |
+
import pytest
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
pytestmark = [
|
| 20 |
+
pytest.mark.skipif(
|
| 21 |
+
not h5py.h5.get_config().ros3,
|
| 22 |
+
reason="ros3 driver not available")
|
| 23 |
+
]
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
@pytest.mark.network
|
| 27 |
+
@pytest.mark.parametrize(
|
| 28 |
+
"kwargs",
|
| 29 |
+
[
|
| 30 |
+
pytest.param(
|
| 31 |
+
{},
|
| 32 |
+
id="HDF5-v1",
|
| 33 |
+
marks=pytest.mark.skipif(
|
| 34 |
+
h5py.version.hdf5_version_tuple >= (2, 0, 0),
|
| 35 |
+
reason="Requires HDF5 < 2.0",
|
| 36 |
+
),
|
| 37 |
+
),
|
| 38 |
+
pytest.param(
|
| 39 |
+
{"aws_region": b"us-east-2"},
|
| 40 |
+
id="HDF5-v2",
|
| 41 |
+
marks=pytest.mark.skipif(
|
| 42 |
+
h5py.version.hdf5_version_tuple < (2, 0, 0),
|
| 43 |
+
reason="Requires HDF5 >= 2.0",
|
| 44 |
+
),
|
| 45 |
+
),
|
| 46 |
+
],
|
| 47 |
+
)
|
| 48 |
+
def test_ros3(kwargs):
|
| 49 |
+
""" ROS3 driver and options """
|
| 50 |
+
|
| 51 |
+
with h5py.File("https://dandiarchive.s3.amazonaws.com/ros3test.hdf5", 'r',
|
| 52 |
+
driver='ros3', **kwargs) as f:
|
| 53 |
+
assert f
|
| 54 |
+
assert 'mydataset' in f.keys()
|
| 55 |
+
assert f["mydataset"].shape == (100,)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
@pytest.mark.parametrize(
|
| 59 |
+
"exc,match_exc",
|
| 60 |
+
[
|
| 61 |
+
pytest.param(
|
| 62 |
+
ValueError,
|
| 63 |
+
[
|
| 64 |
+
"AWS region required for s3:// location",
|
| 65 |
+
r"^foo://wrong/scheme: S3 location must begin with",
|
| 66 |
+
],
|
| 67 |
+
id="HDF5-v1",
|
| 68 |
+
marks=pytest.mark.skipif(
|
| 69 |
+
h5py.version.hdf5_version_tuple >= (2, 0, 0),
|
| 70 |
+
reason="Requires HDF5 < 2.0",
|
| 71 |
+
),
|
| 72 |
+
),
|
| 73 |
+
pytest.param(
|
| 74 |
+
OSError,
|
| 75 |
+
[None, "can't parse object key from path"],
|
| 76 |
+
id="HDF5-v2",
|
| 77 |
+
marks=pytest.mark.skipif(
|
| 78 |
+
h5py.version.hdf5_version_tuple < (2, 0, 0),
|
| 79 |
+
reason="Requires HDF5 >= 2.0",
|
| 80 |
+
),
|
| 81 |
+
),
|
| 82 |
+
],
|
| 83 |
+
)
|
| 84 |
+
def test_ros3_s3_fails(exc, match_exc):
|
| 85 |
+
"""ROS3 exceptions for s3:// location"""
|
| 86 |
+
with pytest.raises(exc, match=match_exc[0]):
|
| 87 |
+
h5py.File('s3://fakebucket/fakekey', 'r', driver='ros3')
|
| 88 |
+
|
| 89 |
+
with pytest.raises(exc, match=match_exc[1]):
|
| 90 |
+
h5py.File('foo://wrong/scheme', 'r', driver='ros3')
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
@pytest.mark.network
|
| 94 |
+
def test_ros3_s3uri():
|
| 95 |
+
"""Use S3 URI with ROS3 driver"""
|
| 96 |
+
with h5py.File('s3://dandiarchive/ros3test.hdf5', 'r', driver='ros3',
|
| 97 |
+
aws_region=b'us-east-2') as f:
|
| 98 |
+
assert f
|
| 99 |
+
assert 'mydataset' in f.keys()
|
| 100 |
+
assert f["mydataset"].shape == (100,)
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
@pytest.mark.skipif(h5py.version.hdf5_version_tuple < (1, 14, 2),
|
| 104 |
+
reason='AWS S3 access token support in HDF5 >= 1.14.2')
|
| 105 |
+
def test_ros3_temp_token():
|
| 106 |
+
"""Set and get S3 access token"""
|
| 107 |
+
token = b'#0123FakeToken4567/8/9'
|
| 108 |
+
fapl = make_fapl('ros3', libver=None, rdcc_nslots=None, rdcc_nbytes=None,
|
| 109 |
+
rdcc_w0=None, locking=None, page_buf_size=None, min_meta_keep=None,
|
| 110 |
+
min_raw_keep=None, alignment_threshold=1, alignment_interval=1,
|
| 111 |
+
meta_block_size=None, session_token=token)
|
| 112 |
+
assert token, fapl.get_fapl_ros3_token()
|
.venv/lib/python3.11/site-packages/h5py/tests/test_selections.py
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is part of h5py, a Python interface to the HDF5 library.
|
| 2 |
+
#
|
| 3 |
+
# http://www.h5py.org
|
| 4 |
+
#
|
| 5 |
+
# Copyright 2008-2013 Andrew Collette and contributors
|
| 6 |
+
#
|
| 7 |
+
# License: Standard 3-clause BSD; see "license.txt" for full license terms
|
| 8 |
+
# and contributor agreement.
|
| 9 |
+
|
| 10 |
+
"""
|
| 11 |
+
Tests for the (internal) selections module
|
| 12 |
+
"""
|
| 13 |
+
|
| 14 |
+
import numpy as np
|
| 15 |
+
import h5py
|
| 16 |
+
import h5py._hl.selections as sel
|
| 17 |
+
import h5py._hl.selections2 as sel2
|
| 18 |
+
|
| 19 |
+
from .common import TestCase, make_name
|
| 20 |
+
|
| 21 |
+
class BaseSelection(TestCase):
|
| 22 |
+
def setUp(self):
|
| 23 |
+
self.f = h5py.File(self.mktemp(), 'w')
|
| 24 |
+
self.dsid = self.f.create_dataset('x', (), "f4").id
|
| 25 |
+
|
| 26 |
+
def tearDown(self):
|
| 27 |
+
if self.f:
|
| 28 |
+
self.f.close()
|
| 29 |
+
|
| 30 |
+
class TestTypeGeneration(BaseSelection):
|
| 31 |
+
|
| 32 |
+
"""
|
| 33 |
+
Internal feature: Determine output types from dataset dtype and fields.
|
| 34 |
+
"""
|
| 35 |
+
|
| 36 |
+
def test_simple(self):
|
| 37 |
+
""" Non-compound types are handled appropriately """
|
| 38 |
+
dt = np.dtype('i')
|
| 39 |
+
out, format = sel2.read_dtypes(dt, ())
|
| 40 |
+
self.assertEqual(out, format)
|
| 41 |
+
self.assertEqual(out, np.dtype('i'))
|
| 42 |
+
|
| 43 |
+
def test_simple_fieldexc(self):
|
| 44 |
+
""" Field names for non-field types raises ValueError """
|
| 45 |
+
dt = np.dtype('i')
|
| 46 |
+
with self.assertRaises(ValueError):
|
| 47 |
+
out, format = sel2.read_dtypes(dt, ('a',))
|
| 48 |
+
|
| 49 |
+
def test_compound_simple(self):
|
| 50 |
+
""" Compound types with elemental subtypes """
|
| 51 |
+
dt = np.dtype( [('a','i'), ('b','f'), ('c','|S10')] )
|
| 52 |
+
|
| 53 |
+
# Implicit selection of all fields -> all fields
|
| 54 |
+
out, format = sel2.read_dtypes(dt, ())
|
| 55 |
+
self.assertEqual(out, format)
|
| 56 |
+
self.assertEqual(out, dt)
|
| 57 |
+
|
| 58 |
+
# Explicit selection of fields -> requested fields
|
| 59 |
+
out, format = sel2.read_dtypes(dt, ('a','b'))
|
| 60 |
+
self.assertEqual(out, format)
|
| 61 |
+
self.assertEqual(out, np.dtype( [('a','i'), ('b','f')] ))
|
| 62 |
+
|
| 63 |
+
# Explicit selection of exactly one field -> no fields
|
| 64 |
+
out, format = sel2.read_dtypes(dt, ('a',))
|
| 65 |
+
self.assertEqual(out, np.dtype('i'))
|
| 66 |
+
self.assertEqual(format, np.dtype( [('a','i')] ))
|
| 67 |
+
|
| 68 |
+
# Field does not appear in named typed
|
| 69 |
+
with self.assertRaises(ValueError):
|
| 70 |
+
out, format = sel2.read_dtypes(dt, ('j', 'k'))
|
| 71 |
+
|
| 72 |
+
class TestScalarSliceRules(BaseSelection):
|
| 73 |
+
|
| 74 |
+
"""
|
| 75 |
+
Internal feature: selections rules for scalar datasets
|
| 76 |
+
"""
|
| 77 |
+
|
| 78 |
+
def test_args(self):
|
| 79 |
+
""" Permissible arguments for scalar slicing """
|
| 80 |
+
shape, selection = sel2.read_selections_scalar(self.dsid, ())
|
| 81 |
+
self.assertEqual(shape, None)
|
| 82 |
+
self.assertEqual(selection.get_select_npoints(), 1)
|
| 83 |
+
|
| 84 |
+
shape, selection = sel2.read_selections_scalar(self.dsid, (Ellipsis,))
|
| 85 |
+
self.assertEqual(shape, ())
|
| 86 |
+
self.assertEqual(selection.get_select_npoints(), 1)
|
| 87 |
+
|
| 88 |
+
with self.assertRaises(ValueError):
|
| 89 |
+
shape, selection = sel2.read_selections_scalar(self.dsid, (1,))
|
| 90 |
+
|
| 91 |
+
dsid = self.f.create_dataset(make_name(), (1,), "f4").id
|
| 92 |
+
with self.assertRaises(RuntimeError):
|
| 93 |
+
shape, selection = sel2.read_selections_scalar(dsid, (1,))
|
| 94 |
+
|
| 95 |
+
class TestSelection(BaseSelection):
|
| 96 |
+
|
| 97 |
+
""" High-level routes to generate a selection
|
| 98 |
+
"""
|
| 99 |
+
|
| 100 |
+
def test_selection(self):
|
| 101 |
+
dset = self.f.create_dataset(make_name(), (100,100), "f4")
|
| 102 |
+
regref = dset.regionref[0:100, 0:100]
|
| 103 |
+
|
| 104 |
+
# args is list, return a FancySelection
|
| 105 |
+
st = sel.select((10,), list([1,2,3]), dset)
|
| 106 |
+
self.assertIsInstance(st, sel.FancySelection)
|
| 107 |
+
|
| 108 |
+
# args[0] is tuple, return a FancySelection
|
| 109 |
+
st = sel.select((10,), ((1, 2, 3),), dset)
|
| 110 |
+
self.assertIsInstance(st, sel.FancySelection)
|
| 111 |
+
|
| 112 |
+
# args is a Boolean mask, return a PointSelection
|
| 113 |
+
st1 = sel.select((5,), np.array([True,False,False,False,True]), dset)
|
| 114 |
+
self.assertIsInstance(st1, sel.PointSelection)
|
| 115 |
+
|
| 116 |
+
# args is int, return a SimpleSelection
|
| 117 |
+
st2 = sel.select((10,), 1, dset)
|
| 118 |
+
self.assertIsInstance(st2, sel.SimpleSelection)
|
| 119 |
+
|
| 120 |
+
# args is str, should be rejected
|
| 121 |
+
with self.assertRaises(TypeError):
|
| 122 |
+
sel.select((100,), "foo", dset)
|
| 123 |
+
|
| 124 |
+
# args is RegionReference, return a Selection instance
|
| 125 |
+
st3 = sel.select((100,100), regref, dset)
|
| 126 |
+
self.assertIsInstance(st3, sel.Selection)
|
| 127 |
+
|
| 128 |
+
# args is RegionReference, but dataset is None
|
| 129 |
+
with self.assertRaises(TypeError):
|
| 130 |
+
sel.select((100,), regref, None)
|
| 131 |
+
|
| 132 |
+
# args is RegionReference, but its shape doesn't match dataset shape
|
| 133 |
+
with self.assertRaises(TypeError):
|
| 134 |
+
sel.select((100,), regref, dset)
|
| 135 |
+
|
| 136 |
+
# args is a single Selection instance, return the arg
|
| 137 |
+
st4 = sel.select((100,100), st3, dset)
|
| 138 |
+
self.assertEqual(st4,st3)
|
| 139 |
+
|
| 140 |
+
# args is a single Selection instance, but args shape doesn't match Shape
|
| 141 |
+
with self.assertRaises(TypeError):
|
| 142 |
+
sel.select((100,), st3, dset)
|
.venv/lib/python3.11/site-packages/h5py/tests/test_slicing.py
ADDED
|
@@ -0,0 +1,421 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is part of h5py, a Python interface to the HDF5 library.
|
| 2 |
+
#
|
| 3 |
+
# http://www.h5py.org
|
| 4 |
+
#
|
| 5 |
+
# Copyright 2008-2013 Andrew Collette and contributors
|
| 6 |
+
#
|
| 7 |
+
# License: Standard 3-clause BSD; see "license.txt" for full license terms
|
| 8 |
+
# and contributor agreement.
|
| 9 |
+
|
| 10 |
+
"""
|
| 11 |
+
Dataset slicing test module.
|
| 12 |
+
|
| 13 |
+
Tests all supported slicing operations, including read/write and
|
| 14 |
+
broadcasting operations. Does not test type conversion except for
|
| 15 |
+
corner cases overlapping with slicing; for example, when selecting
|
| 16 |
+
specific fields of a compound type.
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
import numpy as np
|
| 20 |
+
|
| 21 |
+
from .common import TestCase, make_name
|
| 22 |
+
|
| 23 |
+
import h5py
|
| 24 |
+
from h5py import File, MultiBlockSlice
|
| 25 |
+
|
| 26 |
+
class BaseSlicing(TestCase):
|
| 27 |
+
|
| 28 |
+
def setUp(self):
|
| 29 |
+
self.f = File(self.mktemp(), 'w')
|
| 30 |
+
|
| 31 |
+
def tearDown(self):
|
| 32 |
+
if self.f:
|
| 33 |
+
self.f.close()
|
| 34 |
+
|
| 35 |
+
class TestSingleElement(BaseSlicing):
|
| 36 |
+
|
| 37 |
+
"""
|
| 38 |
+
Feature: Retrieving a single element works with NumPy semantics
|
| 39 |
+
"""
|
| 40 |
+
|
| 41 |
+
def test_single_index(self):
|
| 42 |
+
""" Single-element selection with [index] yields array scalar """
|
| 43 |
+
dset = self.f.create_dataset(make_name(), (1,), dtype='i1')
|
| 44 |
+
out = dset[0]
|
| 45 |
+
self.assertIsInstance(out, np.int8)
|
| 46 |
+
|
| 47 |
+
def test_single_null(self):
|
| 48 |
+
""" Single-element selection with [()] yields ndarray """
|
| 49 |
+
dset = self.f.create_dataset(make_name(), (1,), dtype='i1')
|
| 50 |
+
out = dset[()]
|
| 51 |
+
self.assertIsInstance(out, np.ndarray)
|
| 52 |
+
self.assertEqual(out.shape, (1,))
|
| 53 |
+
|
| 54 |
+
def test_scalar_index(self):
|
| 55 |
+
""" Slicing with [...] yields scalar ndarray """
|
| 56 |
+
dset = self.f.create_dataset(make_name(), shape=(), dtype='f')
|
| 57 |
+
out = dset[...]
|
| 58 |
+
self.assertIsInstance(out, np.ndarray)
|
| 59 |
+
self.assertEqual(out.shape, ())
|
| 60 |
+
|
| 61 |
+
def test_scalar_null(self):
|
| 62 |
+
""" Slicing with [()] yields array scalar """
|
| 63 |
+
dset = self.f.create_dataset(make_name(), shape=(), dtype='i1')
|
| 64 |
+
out = dset[()]
|
| 65 |
+
self.assertIsInstance(out, np.int8)
|
| 66 |
+
|
| 67 |
+
def test_compound(self):
|
| 68 |
+
""" Compound scalar is numpy.void, not tuple (issue 135) """
|
| 69 |
+
dt = np.dtype([('a','i4'),('b','f8')])
|
| 70 |
+
v = np.ones((4,), dtype=dt)
|
| 71 |
+
dset = self.f.create_dataset(make_name(), (4,), data=v)
|
| 72 |
+
self.assertEqual(dset[0], v[0])
|
| 73 |
+
self.assertIsInstance(dset[0], np.void)
|
| 74 |
+
|
| 75 |
+
class TestObjectIndex(BaseSlicing):
|
| 76 |
+
|
| 77 |
+
"""
|
| 78 |
+
Feature: numpy.object_ subtypes map to real Python objects
|
| 79 |
+
"""
|
| 80 |
+
|
| 81 |
+
def test_reference(self):
|
| 82 |
+
""" Indexing a reference dataset returns a h5py.Reference instance """
|
| 83 |
+
dset = self.f.create_dataset(make_name(), (1,), dtype=h5py.ref_dtype)
|
| 84 |
+
dset[0] = self.f.ref
|
| 85 |
+
self.assertEqual(type(dset[0]), h5py.Reference)
|
| 86 |
+
|
| 87 |
+
def test_regref(self):
|
| 88 |
+
""" Indexing a region reference dataset returns a h5py.RegionReference
|
| 89 |
+
"""
|
| 90 |
+
dset1 = self.f.create_dataset(make_name("x"), (10,10), "f4")
|
| 91 |
+
regref = dset1.regionref[...]
|
| 92 |
+
dset2 = self.f.create_dataset(make_name("y"), (1,), dtype=h5py.regionref_dtype)
|
| 93 |
+
dset2[0] = regref
|
| 94 |
+
self.assertEqual(type(dset2[0]), h5py.RegionReference)
|
| 95 |
+
|
| 96 |
+
def test_reference_field(self):
|
| 97 |
+
""" Compound types of which a reference is an element work right """
|
| 98 |
+
dt = np.dtype([('a', 'i'),('b', h5py.ref_dtype)])
|
| 99 |
+
|
| 100 |
+
dset = self.f.create_dataset(make_name(), (1,), dtype=dt)
|
| 101 |
+
dset[0] = (42, self.f['/'].ref)
|
| 102 |
+
|
| 103 |
+
out = dset[0]
|
| 104 |
+
self.assertEqual(type(out[1]), h5py.Reference) # isinstance does NOT work
|
| 105 |
+
|
| 106 |
+
def test_scalar(self):
|
| 107 |
+
""" Indexing returns a real Python object on scalar datasets """
|
| 108 |
+
dset = self.f.create_dataset(make_name(), (), dtype=h5py.ref_dtype)
|
| 109 |
+
dset[()] = self.f.ref
|
| 110 |
+
self.assertEqual(type(dset[()]), h5py.Reference)
|
| 111 |
+
|
| 112 |
+
def test_bytestr(self):
|
| 113 |
+
""" Indexing a byte string dataset returns a real python byte string
|
| 114 |
+
"""
|
| 115 |
+
dset = self.f.create_dataset(make_name(), (1,), dtype=h5py.string_dtype(encoding='ascii'))
|
| 116 |
+
dset[0] = b"Hello there!"
|
| 117 |
+
self.assertEqual(type(dset[0]), bytes)
|
| 118 |
+
|
| 119 |
+
class TestSimpleSlicing(TestCase):
|
| 120 |
+
|
| 121 |
+
"""
|
| 122 |
+
Feature: Simple NumPy-style slices (start:stop:step) are supported.
|
| 123 |
+
"""
|
| 124 |
+
|
| 125 |
+
def setUp(self):
|
| 126 |
+
self.f = File(self.mktemp(), 'w')
|
| 127 |
+
self.arr = np.arange(10)
|
| 128 |
+
self.dset = self.f.create_dataset('x', data=self.arr)
|
| 129 |
+
|
| 130 |
+
def tearDown(self):
|
| 131 |
+
if self.f:
|
| 132 |
+
self.f.close()
|
| 133 |
+
|
| 134 |
+
def test_negative_stop(self):
|
| 135 |
+
""" Negative stop indexes work as they do in NumPy """
|
| 136 |
+
self.assertArrayEqual(self.dset[2:-2], self.arr[2:-2])
|
| 137 |
+
|
| 138 |
+
def test_write(self):
|
| 139 |
+
"""Assigning to a 1D slice of a 2D dataset
|
| 140 |
+
"""
|
| 141 |
+
dset = self.f.create_dataset(make_name(), (10, 2), "f4")
|
| 142 |
+
|
| 143 |
+
x = np.zeros((10, 1))
|
| 144 |
+
dset[:, 0] = x[:, 0]
|
| 145 |
+
with self.assertRaises(TypeError):
|
| 146 |
+
dset[:, 1] = x
|
| 147 |
+
|
| 148 |
+
class TestArraySlicing(BaseSlicing):
|
| 149 |
+
|
| 150 |
+
"""
|
| 151 |
+
Feature: Array types are handled appropriately
|
| 152 |
+
"""
|
| 153 |
+
|
| 154 |
+
def test_read(self):
|
| 155 |
+
""" Read arrays tack array dimensions onto end of shape tuple """
|
| 156 |
+
dt = np.dtype('(3,)f8')
|
| 157 |
+
dset = self.f.create_dataset(make_name(), (10,), dtype=dt)
|
| 158 |
+
self.assertEqual(dset.shape, (10,))
|
| 159 |
+
self.assertEqual(dset.dtype, dt)
|
| 160 |
+
|
| 161 |
+
# Full read
|
| 162 |
+
out = dset[...]
|
| 163 |
+
self.assertEqual(out.dtype, np.dtype('f8'))
|
| 164 |
+
self.assertEqual(out.shape, (10,3))
|
| 165 |
+
|
| 166 |
+
# Single element
|
| 167 |
+
out = dset[0]
|
| 168 |
+
self.assertEqual(out.dtype, np.dtype('f8'))
|
| 169 |
+
self.assertEqual(out.shape, (3,))
|
| 170 |
+
|
| 171 |
+
# Range
|
| 172 |
+
out = dset[2:8:2]
|
| 173 |
+
self.assertEqual(out.dtype, np.dtype('f8'))
|
| 174 |
+
self.assertEqual(out.shape, (3,3))
|
| 175 |
+
|
| 176 |
+
def test_write_broadcast(self):
|
| 177 |
+
""" Array fill from constant is not supported (issue 211).
|
| 178 |
+
"""
|
| 179 |
+
dt = np.dtype('(3,)i')
|
| 180 |
+
|
| 181 |
+
dset = self.f.create_dataset(make_name(), (10,), dtype=dt)
|
| 182 |
+
|
| 183 |
+
with self.assertRaises(TypeError):
|
| 184 |
+
dset[...] = 42
|
| 185 |
+
|
| 186 |
+
def test_write_element(self):
|
| 187 |
+
""" Write a single element to the array
|
| 188 |
+
|
| 189 |
+
Issue 211.
|
| 190 |
+
"""
|
| 191 |
+
dt = np.dtype('(3,)f8')
|
| 192 |
+
dset = self.f.create_dataset(make_name(), (10,), dtype=dt)
|
| 193 |
+
|
| 194 |
+
data = np.array([1,2,3.0])
|
| 195 |
+
dset[4] = data
|
| 196 |
+
|
| 197 |
+
out = dset[4]
|
| 198 |
+
self.assertTrue(np.all(out == data))
|
| 199 |
+
|
| 200 |
+
def test_write_slices(self):
|
| 201 |
+
""" Write slices to array type """
|
| 202 |
+
dt = np.dtype('(3,)i')
|
| 203 |
+
|
| 204 |
+
data1 = np.ones((2,), dtype=dt)
|
| 205 |
+
data2 = np.ones((4,5), dtype=dt)
|
| 206 |
+
|
| 207 |
+
dset = self.f.create_dataset(make_name(), (10,9,11), dtype=dt)
|
| 208 |
+
|
| 209 |
+
dset[0,0,2:4] = data1
|
| 210 |
+
self.assertArrayEqual(dset[0,0,2:4], data1)
|
| 211 |
+
|
| 212 |
+
dset[3, 1:5, 6:11] = data2
|
| 213 |
+
self.assertArrayEqual(dset[3, 1:5, 6:11], data2)
|
| 214 |
+
|
| 215 |
+
|
| 216 |
+
def test_roundtrip(self):
|
| 217 |
+
""" Read the contents of an array and write them back
|
| 218 |
+
|
| 219 |
+
Issue 211.
|
| 220 |
+
"""
|
| 221 |
+
dt = np.dtype('(3,)f8')
|
| 222 |
+
dset = self.f.create_dataset(make_name(), (10,), dtype=dt)
|
| 223 |
+
|
| 224 |
+
out = dset[...]
|
| 225 |
+
dset[...] = out
|
| 226 |
+
|
| 227 |
+
self.assertTrue(np.all(dset[...] == out))
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
class TestZeroLengthSlicing(BaseSlicing):
|
| 231 |
+
|
| 232 |
+
"""
|
| 233 |
+
Slices resulting in empty arrays
|
| 234 |
+
"""
|
| 235 |
+
|
| 236 |
+
def test_slice_zero_length_dimension(self):
|
| 237 |
+
""" Slice a dataset with a zero in its shape vector
|
| 238 |
+
along the zero-length dimension """
|
| 239 |
+
for i, shape in enumerate([(0,), (0, 3), (0, 2, 1)]):
|
| 240 |
+
dset = self.f.create_dataset(make_name(f"x{i}"), shape, dtype=int, maxshape=(None,)*len(shape))
|
| 241 |
+
self.assertEqual(dset.shape, shape)
|
| 242 |
+
out = dset[...]
|
| 243 |
+
self.assertIsInstance(out, np.ndarray)
|
| 244 |
+
self.assertEqual(out.shape, shape)
|
| 245 |
+
out = dset[:]
|
| 246 |
+
self.assertIsInstance(out, np.ndarray)
|
| 247 |
+
self.assertEqual(out.shape, shape)
|
| 248 |
+
if len(shape) > 1:
|
| 249 |
+
out = dset[:, :1]
|
| 250 |
+
self.assertIsInstance(out, np.ndarray)
|
| 251 |
+
self.assertEqual(out.shape[:2], (0, 1))
|
| 252 |
+
|
| 253 |
+
def test_slice_other_dimension(self):
|
| 254 |
+
""" Slice a dataset with a zero in its shape vector
|
| 255 |
+
along a non-zero-length dimension """
|
| 256 |
+
for i, shape in enumerate([(3, 0), (1, 2, 0), (2, 0, 1)]):
|
| 257 |
+
dset = self.f.create_dataset(make_name(f"x{i}"), shape, dtype=int, maxshape=(None,)*len(shape))
|
| 258 |
+
self.assertEqual(dset.shape, shape)
|
| 259 |
+
out = dset[:1]
|
| 260 |
+
self.assertIsInstance(out, np.ndarray)
|
| 261 |
+
self.assertEqual(out.shape, (1,)+shape[1:])
|
| 262 |
+
|
| 263 |
+
def test_slice_of_length_zero(self):
|
| 264 |
+
""" Get a slice of length zero from a non-empty dataset """
|
| 265 |
+
for i, shape in enumerate([(3,), (2, 2,), (2, 1, 5)]):
|
| 266 |
+
dset = self.f.create_dataset(make_name(f"x{i}"), data=np.zeros(shape, int), maxshape=(None,)*len(shape))
|
| 267 |
+
self.assertEqual(dset.shape, shape)
|
| 268 |
+
out = dset[1:1]
|
| 269 |
+
self.assertIsInstance(out, np.ndarray)
|
| 270 |
+
self.assertEqual(out.shape, (0,)+shape[1:])
|
| 271 |
+
|
| 272 |
+
class TestFieldNames(BaseSlicing):
|
| 273 |
+
|
| 274 |
+
"""
|
| 275 |
+
Field names for read & write
|
| 276 |
+
"""
|
| 277 |
+
|
| 278 |
+
dt = np.dtype([('a', 'f'), ('b', 'i'), ('c', 'f4')])
|
| 279 |
+
data = np.ones((100,), dtype=dt)
|
| 280 |
+
|
| 281 |
+
def setUp(self):
|
| 282 |
+
BaseSlicing.setUp(self)
|
| 283 |
+
self.dset = self.f.create_dataset('x', (100,), dtype=self.dt)
|
| 284 |
+
self.dset[...] = self.data
|
| 285 |
+
|
| 286 |
+
def test_read(self):
|
| 287 |
+
""" Test read with field selections """
|
| 288 |
+
self.assertArrayEqual(self.dset['a'], self.data['a'])
|
| 289 |
+
|
| 290 |
+
def test_unicode_names(self):
|
| 291 |
+
""" Unicode field names for for read and write """
|
| 292 |
+
self.assertArrayEqual(self.dset['a'], self.data['a'])
|
| 293 |
+
|
| 294 |
+
data = self.data.copy()
|
| 295 |
+
dset = self.f.create_dataset(make_name(), data=data)
|
| 296 |
+
dset['a'] = 42
|
| 297 |
+
data['a'] = 42
|
| 298 |
+
self.assertArrayEqual(dset['a'], data['a'])
|
| 299 |
+
|
| 300 |
+
def test_write(self):
|
| 301 |
+
""" Test write with field selections """
|
| 302 |
+
data = self.data.copy()
|
| 303 |
+
dset = self.f.create_dataset(make_name(), data=data)
|
| 304 |
+
|
| 305 |
+
data['a'] *= 2
|
| 306 |
+
dset['a'] = data
|
| 307 |
+
self.assertTrue(np.all(dset[...] == data))
|
| 308 |
+
data['b'] *= 4
|
| 309 |
+
dset['b'] = data
|
| 310 |
+
self.assertTrue(np.all(dset[...] == data))
|
| 311 |
+
data['a'] *= 3
|
| 312 |
+
data['c'] *= 3
|
| 313 |
+
dset['a','c'] = data
|
| 314 |
+
self.assertTrue(np.all(dset[...] == data))
|
| 315 |
+
|
| 316 |
+
def test_write_noncompound(self):
|
| 317 |
+
""" Test write with non-compound source (single-field) """
|
| 318 |
+
data = self.data.copy()
|
| 319 |
+
dset = self.f.create_dataset(make_name(), data=data)
|
| 320 |
+
|
| 321 |
+
data['b'] = 1.0
|
| 322 |
+
dset['b'] = 1.0
|
| 323 |
+
self.assertTrue(np.all(dset[...] == data))
|
| 324 |
+
|
| 325 |
+
|
| 326 |
+
class TestMultiBlockSlice(BaseSlicing):
|
| 327 |
+
|
| 328 |
+
def setUp(self):
|
| 329 |
+
super().setUp()
|
| 330 |
+
self.arr = np.arange(10)
|
| 331 |
+
self.dset = self.f.create_dataset('x', data=self.arr)
|
| 332 |
+
|
| 333 |
+
def test_default(self):
|
| 334 |
+
# Default selects entire dataset as one block
|
| 335 |
+
mbslice = MultiBlockSlice()
|
| 336 |
+
|
| 337 |
+
self.assertEqual(mbslice.indices(10), (0, 1, 10, 1))
|
| 338 |
+
np.testing.assert_array_equal(self.dset[mbslice], self.arr)
|
| 339 |
+
|
| 340 |
+
def test_default_explicit(self):
|
| 341 |
+
mbslice = MultiBlockSlice(start=0, count=10, stride=1, block=1)
|
| 342 |
+
|
| 343 |
+
self.assertEqual(mbslice.indices(10), (0, 1, 10, 1))
|
| 344 |
+
np.testing.assert_array_equal(self.dset[mbslice], self.arr)
|
| 345 |
+
|
| 346 |
+
def test_start(self):
|
| 347 |
+
mbslice = MultiBlockSlice(start=4)
|
| 348 |
+
|
| 349 |
+
self.assertEqual(mbslice.indices(10), (4, 1, 6, 1))
|
| 350 |
+
np.testing.assert_array_equal(self.dset[mbslice], np.array([4, 5, 6, 7, 8, 9]))
|
| 351 |
+
|
| 352 |
+
def test_count(self):
|
| 353 |
+
mbslice = MultiBlockSlice(count=7)
|
| 354 |
+
|
| 355 |
+
self.assertEqual(mbslice.indices(10), (0, 1, 7, 1))
|
| 356 |
+
np.testing.assert_array_equal(
|
| 357 |
+
self.dset[mbslice], np.array([0, 1, 2, 3, 4, 5, 6])
|
| 358 |
+
)
|
| 359 |
+
|
| 360 |
+
def test_count_more_than_length_error(self):
|
| 361 |
+
mbslice = MultiBlockSlice(count=11)
|
| 362 |
+
with self.assertRaises(ValueError):
|
| 363 |
+
mbslice.indices(10)
|
| 364 |
+
|
| 365 |
+
def test_stride(self):
|
| 366 |
+
mbslice = MultiBlockSlice(stride=2)
|
| 367 |
+
|
| 368 |
+
self.assertEqual(mbslice.indices(10), (0, 2, 5, 1))
|
| 369 |
+
np.testing.assert_array_equal(self.dset[mbslice], np.array([0, 2, 4, 6, 8]))
|
| 370 |
+
|
| 371 |
+
def test_stride_zero_error(self):
|
| 372 |
+
with self.assertRaises(ValueError):
|
| 373 |
+
# This would cause a ZeroDivisionError if not caught
|
| 374 |
+
MultiBlockSlice(stride=0, block=0).indices(10)
|
| 375 |
+
|
| 376 |
+
def test_stride_block_equal(self):
|
| 377 |
+
mbslice = MultiBlockSlice(stride=2, block=2)
|
| 378 |
+
|
| 379 |
+
self.assertEqual(mbslice.indices(10), (0, 2, 5, 2))
|
| 380 |
+
np.testing.assert_array_equal(self.dset[mbslice], self.arr)
|
| 381 |
+
|
| 382 |
+
def test_block_more_than_stride_error(self):
|
| 383 |
+
with self.assertRaises(ValueError):
|
| 384 |
+
MultiBlockSlice(block=3)
|
| 385 |
+
|
| 386 |
+
with self.assertRaises(ValueError):
|
| 387 |
+
MultiBlockSlice(stride=2, block=3)
|
| 388 |
+
|
| 389 |
+
def test_stride_more_than_block(self):
|
| 390 |
+
mbslice = MultiBlockSlice(stride=3, block=2)
|
| 391 |
+
|
| 392 |
+
self.assertEqual(mbslice.indices(10), (0, 3, 3, 2))
|
| 393 |
+
np.testing.assert_array_equal(self.dset[mbslice], np.array([0, 1, 3, 4, 6, 7]))
|
| 394 |
+
|
| 395 |
+
def test_block_overruns_extent_error(self):
|
| 396 |
+
# If fully described then must fit within extent
|
| 397 |
+
mbslice = MultiBlockSlice(start=2, count=2, stride=5, block=4)
|
| 398 |
+
with self.assertRaises(ValueError):
|
| 399 |
+
mbslice.indices(10)
|
| 400 |
+
|
| 401 |
+
def test_fully_described(self):
|
| 402 |
+
mbslice = MultiBlockSlice(start=1, count=2, stride=5, block=4)
|
| 403 |
+
|
| 404 |
+
self.assertEqual(mbslice.indices(10), (1, 5, 2, 4))
|
| 405 |
+
np.testing.assert_array_equal(
|
| 406 |
+
self.dset[mbslice], np.array([1, 2, 3, 4, 6, 7, 8, 9])
|
| 407 |
+
)
|
| 408 |
+
|
| 409 |
+
def test_count_calculated(self):
|
| 410 |
+
# If not given, count should be calculated to select as many full blocks as possible
|
| 411 |
+
mbslice = MultiBlockSlice(start=1, stride=3, block=2)
|
| 412 |
+
|
| 413 |
+
self.assertEqual(mbslice.indices(10), (1, 3, 3, 2))
|
| 414 |
+
np.testing.assert_array_equal(self.dset[mbslice], np.array([1, 2, 4, 5, 7, 8]))
|
| 415 |
+
|
| 416 |
+
def test_zero_count_calculated_error(self):
|
| 417 |
+
# In this case, there is no possible count to select even one block, so error
|
| 418 |
+
mbslice = MultiBlockSlice(start=8, stride=4, block=3)
|
| 419 |
+
|
| 420 |
+
with self.assertRaises(ValueError):
|
| 421 |
+
mbslice.indices(10)
|
.venv/lib/python3.11/site-packages/h5py/tests/test_vds/__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
from .test_virtual_source import *
|
| 3 |
+
from .test_highlevel_vds import *
|
| 4 |
+
from .test_lowlevel_vds import *
|
.venv/lib/python3.11/site-packages/h5py/tests/test_vds/test_highlevel_vds.py
ADDED
|
@@ -0,0 +1,482 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'''
|
| 2 |
+
Unit test for the high level vds interface for eiger
|
| 3 |
+
https://support.hdfgroup.org/HDF5/docNewFeatures/VDS/HDF5-VDS-requirements-use-cases-2014-12-10.pdf
|
| 4 |
+
'''
|
| 5 |
+
import os
|
| 6 |
+
import os.path as osp
|
| 7 |
+
import shutil
|
| 8 |
+
import tempfile
|
| 9 |
+
|
| 10 |
+
import numpy as np
|
| 11 |
+
from numpy.testing import assert_array_equal
|
| 12 |
+
import pytest
|
| 13 |
+
|
| 14 |
+
import h5py as h5
|
| 15 |
+
from ..common import ut, make_name
|
| 16 |
+
from ..._hl.vds import vds_support
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
@ut.skipUnless(vds_support,
|
| 20 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 21 |
+
class TestEigerHighLevel(ut.TestCase):
|
| 22 |
+
def setUp(self):
|
| 23 |
+
self.working_dir = tempfile.mkdtemp()
|
| 24 |
+
self.fname = ['raw_file_1.h5', 'raw_file_2.h5', 'raw_file_3.h5']
|
| 25 |
+
for k, outfile in enumerate(self.fname):
|
| 26 |
+
filename = osp.join(self.working_dir, outfile)
|
| 27 |
+
f = h5.File(filename, 'w')
|
| 28 |
+
f['data'] = np.ones((20, 200, 200)) * k
|
| 29 |
+
f.close()
|
| 30 |
+
|
| 31 |
+
f = h5.File(osp.join(self.working_dir, 'raw_file_4.h5'), 'w')
|
| 32 |
+
f['data'] = np.ones((18, 200, 200)) * 3
|
| 33 |
+
self.fname.append('raw_file_4.h5')
|
| 34 |
+
self.fname = [osp.join(self.working_dir, ix) for ix in self.fname]
|
| 35 |
+
f.close()
|
| 36 |
+
|
| 37 |
+
def test_eiger_high_level(self):
|
| 38 |
+
outfile = osp.join(self.working_dir, make_name('eiger{}.h5'))
|
| 39 |
+
layout = h5.VirtualLayout(shape=(78, 200, 200), dtype=float)
|
| 40 |
+
|
| 41 |
+
M_minus_1 = 0
|
| 42 |
+
# Create the virtual dataset file
|
| 43 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 44 |
+
for foo in self.fname:
|
| 45 |
+
in_data = h5.File(foo, 'r')['data']
|
| 46 |
+
src_shape = in_data.shape
|
| 47 |
+
in_data.file.close()
|
| 48 |
+
M = M_minus_1 + src_shape[0]
|
| 49 |
+
vsource = h5.VirtualSource(foo, 'data', shape=src_shape)
|
| 50 |
+
layout[M_minus_1:M, :, :] = vsource
|
| 51 |
+
M_minus_1 = M
|
| 52 |
+
f.create_virtual_dataset('data', layout, fillvalue=45)
|
| 53 |
+
|
| 54 |
+
f = h5.File(outfile, 'r')['data']
|
| 55 |
+
self.assertEqual(f[10, 100, 10], 0.0)
|
| 56 |
+
self.assertEqual(f[30, 100, 100], 1.0)
|
| 57 |
+
self.assertEqual(f[50, 100, 100], 2.0)
|
| 58 |
+
self.assertEqual(f[70, 100, 100], 3.0)
|
| 59 |
+
f.file.close()
|
| 60 |
+
|
| 61 |
+
def tearDown(self):
|
| 62 |
+
shutil.rmtree(self.working_dir)
|
| 63 |
+
|
| 64 |
+
'''
|
| 65 |
+
Unit test for the high level vds interface for excalibur
|
| 66 |
+
https://support.hdfgroup.org/HDF5/docNewFeatures/VDS/HDF5-VDS-requirements-use-cases-2014-12-10.pdf
|
| 67 |
+
'''
|
| 68 |
+
|
| 69 |
+
class ExcaliburData:
|
| 70 |
+
FEM_PIXELS_PER_CHIP_X = 256
|
| 71 |
+
FEM_PIXELS_PER_CHIP_Y = 256
|
| 72 |
+
FEM_CHIPS_PER_STRIPE_X = 8
|
| 73 |
+
FEM_CHIPS_PER_STRIPE_Y = 1
|
| 74 |
+
FEM_STRIPES_PER_MODULE = 2
|
| 75 |
+
|
| 76 |
+
@property
|
| 77 |
+
def sensor_module_dimensions(self):
|
| 78 |
+
x_pixels = self.FEM_PIXELS_PER_CHIP_X * self.FEM_CHIPS_PER_STRIPE_X
|
| 79 |
+
y_pixels = self.FEM_PIXELS_PER_CHIP_Y * self.FEM_CHIPS_PER_STRIPE_Y * self.FEM_STRIPES_PER_MODULE
|
| 80 |
+
return y_pixels, x_pixels,
|
| 81 |
+
|
| 82 |
+
@property
|
| 83 |
+
def fem_stripe_dimensions(self):
|
| 84 |
+
x_pixels = self.FEM_PIXELS_PER_CHIP_X * self.FEM_CHIPS_PER_STRIPE_X
|
| 85 |
+
y_pixels = self.FEM_PIXELS_PER_CHIP_Y * self.FEM_CHIPS_PER_STRIPE_Y
|
| 86 |
+
return y_pixels, x_pixels,
|
| 87 |
+
|
| 88 |
+
def generate_sensor_module_image(self, value, dtype='uint16'):
|
| 89 |
+
dset = np.empty(shape=self.sensor_module_dimensions, dtype=dtype)
|
| 90 |
+
dset.fill(value)
|
| 91 |
+
return dset
|
| 92 |
+
|
| 93 |
+
def generate_fem_stripe_image(self, value, dtype='uint16'):
|
| 94 |
+
dset = np.empty(shape=self.fem_stripe_dimensions, dtype=dtype)
|
| 95 |
+
dset.fill(value)
|
| 96 |
+
return dset
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
@ut.skipUnless(vds_support,
|
| 100 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 101 |
+
class TestExcaliburHighLevel(ut.TestCase):
|
| 102 |
+
def create_excalibur_fem_stripe_datafile(self, fname, nframes, excalibur_data,scale):
|
| 103 |
+
shape = (nframes,) + excalibur_data.fem_stripe_dimensions
|
| 104 |
+
max_shape = shape#(None,) + excalibur_data.fem_stripe_dimensions
|
| 105 |
+
chunk = (1,) + excalibur_data.fem_stripe_dimensions
|
| 106 |
+
with h5.File(fname, 'w', libver='latest') as f:
|
| 107 |
+
dset = f.create_dataset('data', shape=shape, maxshape=max_shape, chunks=chunk, dtype='uint16')
|
| 108 |
+
for data_value_index in np.arange(nframes):
|
| 109 |
+
dset[data_value_index] = excalibur_data.generate_fem_stripe_image(data_value_index*scale)
|
| 110 |
+
|
| 111 |
+
def setUp(self):
|
| 112 |
+
self.working_dir = tempfile.mkdtemp()
|
| 113 |
+
self.fname = ["stripe_%d.h5" % stripe for stripe in range(1,7)]
|
| 114 |
+
self.fname = [osp.join(self.working_dir, f) for f in self.fname]
|
| 115 |
+
nframes = 5
|
| 116 |
+
self.edata = ExcaliburData()
|
| 117 |
+
for k, raw_file in enumerate(self.fname):
|
| 118 |
+
self.create_excalibur_fem_stripe_datafile(raw_file, nframes, self.edata,k)
|
| 119 |
+
|
| 120 |
+
def test_excalibur_high_level(self):
|
| 121 |
+
outfile = osp.join(self.working_dir, make_name('excalibur{}.h5'))
|
| 122 |
+
f = h5.File(outfile,'w',libver='latest') # create an output file.
|
| 123 |
+
in_key = 'data' # where is the data at the input?
|
| 124 |
+
in_sh = h5.File(self.fname[0],'r')[in_key].shape # get the input shape
|
| 125 |
+
dtype = h5.File(self.fname[0],'r')[in_key].dtype # get the datatype
|
| 126 |
+
|
| 127 |
+
# now generate the output shape
|
| 128 |
+
vertical_gap = 10 # pixels spacing in the vertical
|
| 129 |
+
nfiles = len(self.fname)
|
| 130 |
+
nframes = in_sh[0]
|
| 131 |
+
width = in_sh[2]
|
| 132 |
+
height = (in_sh[1]*nfiles) + (vertical_gap*(nfiles-1))
|
| 133 |
+
out_sh = (nframes, height, width)
|
| 134 |
+
|
| 135 |
+
# Virtual layout is a representation of the output dataset
|
| 136 |
+
layout = h5.VirtualLayout(shape=out_sh, dtype=dtype)
|
| 137 |
+
offset = 0 # initial offset
|
| 138 |
+
for i, filename in enumerate(self.fname):
|
| 139 |
+
# A representation of the input dataset
|
| 140 |
+
vsource = h5.VirtualSource(filename, in_key, shape=in_sh)
|
| 141 |
+
layout[:, offset:(offset + in_sh[1]), :] = vsource # map them with indexing
|
| 142 |
+
offset += in_sh[1] + vertical_gap # increment the offset
|
| 143 |
+
|
| 144 |
+
# pass the fill value and list of maps
|
| 145 |
+
f.create_virtual_dataset('data', layout, fillvalue=0x1)
|
| 146 |
+
f.close()
|
| 147 |
+
|
| 148 |
+
f = h5.File(outfile,'r')['data']
|
| 149 |
+
self.assertEqual(f[3,100,0], 0.0)
|
| 150 |
+
self.assertEqual(f[3,260,0], 1.0)
|
| 151 |
+
self.assertEqual(f[3,350,0], 3.0)
|
| 152 |
+
self.assertEqual(f[3,650,0], 6.0)
|
| 153 |
+
self.assertEqual(f[3,900,0], 9.0)
|
| 154 |
+
self.assertEqual(f[3,1150,0], 12.0)
|
| 155 |
+
self.assertEqual(f[3,1450,0], 15.0)
|
| 156 |
+
f.file.close()
|
| 157 |
+
|
| 158 |
+
def tearDown(self):
|
| 159 |
+
shutil.rmtree(self.working_dir)
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
'''
|
| 163 |
+
Unit test for the high level vds interface for percival
|
| 164 |
+
https://support.hdfgroup.org/HDF5/docNewFeatures/VDS/HDF5-VDS-requirements-use-cases-2014-12-10.pdf
|
| 165 |
+
'''
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
@ut.skipUnless(vds_support,
|
| 169 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 170 |
+
class TestPercivalHighLevel(ut.TestCase):
|
| 171 |
+
|
| 172 |
+
def setUp(self):
|
| 173 |
+
self.working_dir = tempfile.mkdtemp()
|
| 174 |
+
self.fname = ['raw_file_1.h5','raw_file_2.h5','raw_file_3.h5']
|
| 175 |
+
k = 0
|
| 176 |
+
for outfile in self.fname:
|
| 177 |
+
filename = osp.join(self.working_dir, outfile)
|
| 178 |
+
f = h5.File(filename,'w')
|
| 179 |
+
f['data'] = np.ones((20,200,200))*k
|
| 180 |
+
k +=1
|
| 181 |
+
f.close()
|
| 182 |
+
|
| 183 |
+
f = h5.File(osp.join(self.working_dir, 'raw_file_4.h5'), 'w')
|
| 184 |
+
f['data'] = np.ones((19,200,200))*3
|
| 185 |
+
self.fname.append('raw_file_4.h5')
|
| 186 |
+
self.fname = [osp.join(self.working_dir, ix) for ix in self.fname]
|
| 187 |
+
f.close()
|
| 188 |
+
|
| 189 |
+
def test_percival_high_level(self):
|
| 190 |
+
outfile = osp.join(self.working_dir, make_name('percival{}.h5'))
|
| 191 |
+
|
| 192 |
+
# Virtual layout is a representation of the output dataset
|
| 193 |
+
layout = h5.VirtualLayout(shape=(79, 200, 200), dtype=np.float64)
|
| 194 |
+
for k, filename in enumerate(self.fname):
|
| 195 |
+
dim1 = 19 if k == 3 else 20
|
| 196 |
+
vsource = h5.VirtualSource(filename, 'data',shape=(dim1, 200, 200))
|
| 197 |
+
layout[k:79:4, :, :] = vsource[:, :, :]
|
| 198 |
+
|
| 199 |
+
# Create the virtual dataset file
|
| 200 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 201 |
+
f.create_virtual_dataset('data', layout, fillvalue=-5)
|
| 202 |
+
|
| 203 |
+
foo = np.array(2 * list(range(4)))
|
| 204 |
+
with h5.File(outfile,'r') as f:
|
| 205 |
+
ds = f['data']
|
| 206 |
+
line = ds[:8,100,100]
|
| 207 |
+
self.assertEqual(ds.shape, (79,200,200),)
|
| 208 |
+
assert_array_equal(line, foo)
|
| 209 |
+
|
| 210 |
+
def test_percival_source_from_dataset(self):
|
| 211 |
+
outfile = osp.join(self.working_dir, make_name('percival{}.h5'))
|
| 212 |
+
|
| 213 |
+
# Virtual layout is a representation of the output dataset
|
| 214 |
+
layout = h5.VirtualLayout(shape=(79, 200, 200), dtype=np.float64)
|
| 215 |
+
for k, filename in enumerate(self.fname):
|
| 216 |
+
with h5.File(filename, 'r') as f:
|
| 217 |
+
vsource = h5.VirtualSource(f['data'])
|
| 218 |
+
layout[k:79:4, :, :] = vsource
|
| 219 |
+
|
| 220 |
+
# Create the virtual dataset file
|
| 221 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 222 |
+
f.create_virtual_dataset('data', layout, fillvalue=-5)
|
| 223 |
+
|
| 224 |
+
foo = np.array(2 * list(range(4)))
|
| 225 |
+
with h5.File(outfile,'r') as f:
|
| 226 |
+
ds = f['data']
|
| 227 |
+
line = ds[:8,100,100]
|
| 228 |
+
self.assertEqual(ds.shape, (79,200,200),)
|
| 229 |
+
assert_array_equal(line, foo)
|
| 230 |
+
|
| 231 |
+
def tearDown(self):
|
| 232 |
+
shutil.rmtree(self.working_dir)
|
| 233 |
+
|
| 234 |
+
@ut.skipUnless(vds_support,
|
| 235 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 236 |
+
class SlicingTestCase(ut.TestCase):
|
| 237 |
+
|
| 238 |
+
def setUp(self):
|
| 239 |
+
self.tmpdir = tempfile.mkdtemp()
|
| 240 |
+
# Create source files (1.h5 to 4.h5)
|
| 241 |
+
for n in range(1, 5):
|
| 242 |
+
with h5.File(osp.join(self.tmpdir, '{}.h5'.format(n)), 'w') as f:
|
| 243 |
+
d = f.create_dataset('data', (100,), 'i4')
|
| 244 |
+
d[:] = np.arange(100) + n
|
| 245 |
+
|
| 246 |
+
def make_virtual_ds(self):
|
| 247 |
+
# Assemble virtual dataset
|
| 248 |
+
layout = h5.VirtualLayout((4, 100), 'i4', maxshape=(4, None))
|
| 249 |
+
|
| 250 |
+
for n in range(1, 5):
|
| 251 |
+
filename = osp.join(self.tmpdir, "{}.h5".format(n))
|
| 252 |
+
vsource = h5.VirtualSource(filename, 'data', shape=(100,))
|
| 253 |
+
# Fill the first half with positions 0, 2, 4... from the source
|
| 254 |
+
layout[n - 1, :50] = vsource[0:100:2]
|
| 255 |
+
# Fill the second half with places 1, 3, 5... from the source
|
| 256 |
+
layout[n - 1, 50:] = vsource[1:100:2]
|
| 257 |
+
|
| 258 |
+
outfile = osp.join(self.tmpdir, make_name('VDS{}.h5'))
|
| 259 |
+
|
| 260 |
+
# Add virtual dataset to output file
|
| 261 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 262 |
+
f.create_virtual_dataset('/group/data', layout, fillvalue=-5)
|
| 263 |
+
|
| 264 |
+
return outfile
|
| 265 |
+
|
| 266 |
+
def test_slice_source(self):
|
| 267 |
+
outfile = self.make_virtual_ds()
|
| 268 |
+
|
| 269 |
+
with h5.File(outfile, 'r') as f:
|
| 270 |
+
assert_array_equal(f['/group/data'][0][:3], [1, 3, 5])
|
| 271 |
+
assert_array_equal(f['/group/data'][0][50:53], [2, 4, 6])
|
| 272 |
+
assert_array_equal(f['/group/data'][3][:3], [4, 6, 8])
|
| 273 |
+
assert_array_equal(f['/group/data'][3][50:53], [5, 7, 9])
|
| 274 |
+
|
| 275 |
+
def test_inspection(self):
|
| 276 |
+
with h5.File(osp.join(self.tmpdir, '1.h5'), 'r') as f:
|
| 277 |
+
assert not f['data'].is_virtual
|
| 278 |
+
|
| 279 |
+
outfile = self.make_virtual_ds()
|
| 280 |
+
|
| 281 |
+
with h5.File(outfile, 'r') as f:
|
| 282 |
+
ds = f['/group/data']
|
| 283 |
+
assert ds.is_virtual
|
| 284 |
+
|
| 285 |
+
src_files = {osp.join(self.tmpdir, '{}.h5'.format(n))
|
| 286 |
+
for n in range(1, 5)}
|
| 287 |
+
assert {s.file_name for s in ds.virtual_sources()} == src_files
|
| 288 |
+
|
| 289 |
+
def test_mismatched_selections(self):
|
| 290 |
+
layout = h5.VirtualLayout((4, 100), 'i4', maxshape=(4, None))
|
| 291 |
+
|
| 292 |
+
filename = osp.join(self.tmpdir, "1.h5")
|
| 293 |
+
vsource = h5.VirtualSource(filename, 'data', shape=(100,))
|
| 294 |
+
with self.assertRaisesRegex(ValueError, r'different number'):
|
| 295 |
+
layout[0, :49] = vsource[0:100:2]
|
| 296 |
+
|
| 297 |
+
def tearDown(self):
|
| 298 |
+
shutil.rmtree(self.tmpdir)
|
| 299 |
+
|
| 300 |
+
@ut.skipUnless(vds_support,
|
| 301 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 302 |
+
class IndexingTestCase(ut.TestCase):
|
| 303 |
+
|
| 304 |
+
def setUp(self):
|
| 305 |
+
self.tmpdir = tempfile.mkdtemp()
|
| 306 |
+
# Create source file (1.h5)
|
| 307 |
+
with h5.File(osp.join(self.tmpdir, '1.h5'), 'w') as f:
|
| 308 |
+
d = f.create_dataset('data', (10,), 'i4')
|
| 309 |
+
d[:] = np.arange(10)*10
|
| 310 |
+
|
| 311 |
+
def test_index_layout(self):
|
| 312 |
+
# Assemble virtual dataset (indexing target)
|
| 313 |
+
layout = h5.VirtualLayout((100,), 'i4')
|
| 314 |
+
|
| 315 |
+
inds = [3,6,20,25,33,47,70,75,96,98]
|
| 316 |
+
|
| 317 |
+
filename = osp.join(self.tmpdir, "1.h5")
|
| 318 |
+
vsource = h5.VirtualSource(filename, 'data', shape=(10,))
|
| 319 |
+
layout[inds] = vsource
|
| 320 |
+
|
| 321 |
+
outfile = osp.join(self.tmpdir, make_name('VDS{}.h5'))
|
| 322 |
+
|
| 323 |
+
# Assembly virtual dataset (indexing source)
|
| 324 |
+
layout2 = h5.VirtualLayout((6,), 'i4')
|
| 325 |
+
|
| 326 |
+
inds2 = [0,1,4,5,8]
|
| 327 |
+
layout2[1:] = vsource[inds2]
|
| 328 |
+
|
| 329 |
+
# Add virtual datasets to output file and close
|
| 330 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 331 |
+
f.create_virtual_dataset('/data', layout, fillvalue=-5)
|
| 332 |
+
f.create_virtual_dataset(b'/data2', layout2, fillvalue=-3)
|
| 333 |
+
|
| 334 |
+
# Read data from virtual datasets
|
| 335 |
+
with h5.File(outfile, 'r') as f:
|
| 336 |
+
data = f['/data'][()]
|
| 337 |
+
data2 = f['/data2'][()]
|
| 338 |
+
|
| 339 |
+
# Verify
|
| 340 |
+
assert_array_equal(data[inds], np.arange(10)*10)
|
| 341 |
+
assert_array_equal(data2[1:], [0,10,40,50,80])
|
| 342 |
+
|
| 343 |
+
mask = np.zeros(100)
|
| 344 |
+
mask[inds] = 1
|
| 345 |
+
self.assertEqual(data[mask == 0].min(), -5)
|
| 346 |
+
self.assertEqual(data[mask == 0].max(), -5)
|
| 347 |
+
self.assertEqual(data2[0], -3)
|
| 348 |
+
|
| 349 |
+
def tearDown(self):
|
| 350 |
+
shutil.rmtree(self.tmpdir)
|
| 351 |
+
|
| 352 |
+
@ut.skipUnless(vds_support,
|
| 353 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 354 |
+
class RelativeLinkTestCase(ut.TestCase):
|
| 355 |
+
|
| 356 |
+
def setUp(self):
|
| 357 |
+
self.tmpdir = tempfile.mkdtemp()
|
| 358 |
+
self.f1 = osp.join(self.tmpdir, 'testfile1.h5')
|
| 359 |
+
self.f2 = osp.join(self.tmpdir, 'testfile2.h5')
|
| 360 |
+
|
| 361 |
+
self.data1 = np.arange(10)
|
| 362 |
+
self.data2 = np.arange(10) * -1
|
| 363 |
+
|
| 364 |
+
with h5.File(self.f1, 'w') as f:
|
| 365 |
+
# dataset
|
| 366 |
+
ds = f.create_dataset('data', (10,), 'f4')
|
| 367 |
+
ds[:] = self.data1
|
| 368 |
+
|
| 369 |
+
with h5.File(self.f2, 'w') as f:
|
| 370 |
+
# dataset
|
| 371 |
+
ds = f.create_dataset('data', (10,), 'f4')
|
| 372 |
+
ds[:] = self.data2
|
| 373 |
+
self.make_vds(f)
|
| 374 |
+
|
| 375 |
+
def make_vds(self, f):
|
| 376 |
+
# virtual dataset
|
| 377 |
+
layout = h5.VirtualLayout((2, 10), 'f4')
|
| 378 |
+
vsource1 = h5.VirtualSource(self.f1, 'data', shape=(10,))
|
| 379 |
+
vsource2 = h5.VirtualSource(self.f2, 'data', shape=(10,))
|
| 380 |
+
layout[0] = vsource1
|
| 381 |
+
layout[1] = vsource2
|
| 382 |
+
f.create_virtual_dataset('virtual', layout)
|
| 383 |
+
|
| 384 |
+
@pytest.mark.thread_unsafe(reason="Renames shared files")
|
| 385 |
+
def test_relative_vds(self):
|
| 386 |
+
with h5.File(self.f2) as f:
|
| 387 |
+
data = f['virtual'][:]
|
| 388 |
+
np.testing.assert_array_equal(data[0], self.data1)
|
| 389 |
+
np.testing.assert_array_equal(data[1], self.data2)
|
| 390 |
+
|
| 391 |
+
# move f2 -> f3
|
| 392 |
+
f3 = osp.join(self.tmpdir, 'testfile3.h5')
|
| 393 |
+
os.rename(self.f2, f3)
|
| 394 |
+
|
| 395 |
+
with h5.File(f3) as f:
|
| 396 |
+
data = f['virtual'][:]
|
| 397 |
+
assert data.dtype == 'f4'
|
| 398 |
+
np.testing.assert_array_equal(data[0], self.data1)
|
| 399 |
+
np.testing.assert_array_equal(data[1], self.data2)
|
| 400 |
+
|
| 401 |
+
# moving other file
|
| 402 |
+
f4 = osp.join(self.tmpdir, 'testfile4.h5')
|
| 403 |
+
os.rename(self.f1, f4)
|
| 404 |
+
|
| 405 |
+
with h5.File(f3) as f:
|
| 406 |
+
data = f['virtual'][:]
|
| 407 |
+
assert data.dtype == 'f4'
|
| 408 |
+
# unavailable data is silently converted to default value
|
| 409 |
+
np.testing.assert_array_equal(data[0], 0)
|
| 410 |
+
np.testing.assert_array_equal(data[1], self.data2)
|
| 411 |
+
|
| 412 |
+
def tearDown(self):
|
| 413 |
+
shutil.rmtree(self.tmpdir)
|
| 414 |
+
|
| 415 |
+
class RelativeLinkBuildVDSTestCase(RelativeLinkTestCase):
|
| 416 |
+
# Test a link to the same file with the virtual dataset created by
|
| 417 |
+
# File.build_virtual_dataset()
|
| 418 |
+
def make_vds(self, f):
|
| 419 |
+
with f.build_virtual_dataset('virtual', (2, 10), dtype='f4') as layout:
|
| 420 |
+
layout[0] = h5.VirtualSource(self.f1, 'data', shape=(10,))
|
| 421 |
+
layout[1] = h5.VirtualSource(self.f2, 'data', shape=(10,))
|
| 422 |
+
|
| 423 |
+
@ut.skipUnless(vds_support,
|
| 424 |
+
'VDS requires HDF5 >= 1.9.233')
|
| 425 |
+
class VDSUnlimitedTestCase(ut.TestCase):
|
| 426 |
+
|
| 427 |
+
def setUp(self):
|
| 428 |
+
self.tmpdir = tempfile.mkdtemp()
|
| 429 |
+
self.path = osp.join(self.tmpdir, "resize.h5")
|
| 430 |
+
with h5.File(self.path, "w") as f:
|
| 431 |
+
source_dset = f.create_dataset(
|
| 432 |
+
"source",
|
| 433 |
+
data=np.arange(20),
|
| 434 |
+
shape=(10, 2),
|
| 435 |
+
maxshape=(None, 2),
|
| 436 |
+
chunks=(10, 1),
|
| 437 |
+
fillvalue=-1
|
| 438 |
+
)
|
| 439 |
+
self.layout = h5.VirtualLayout((10, 1), int, maxshape=(None, 1))
|
| 440 |
+
layout_source = h5.VirtualSource(source_dset)
|
| 441 |
+
self.layout[:h5.UNLIMITED, 0] = layout_source[:h5.UNLIMITED, 1]
|
| 442 |
+
|
| 443 |
+
f.create_virtual_dataset("virtual", self.layout)
|
| 444 |
+
|
| 445 |
+
def test_unlimited_axis(self):
|
| 446 |
+
comp1 = np.arange(1, 20, 2).reshape(10, 1)
|
| 447 |
+
comp2 = np.vstack((
|
| 448 |
+
comp1,
|
| 449 |
+
np.full(shape=(10, 1), fill_value=-1)
|
| 450 |
+
))
|
| 451 |
+
comp3 = np.vstack((
|
| 452 |
+
comp1,
|
| 453 |
+
np.full(shape=(10, 1), fill_value=0)
|
| 454 |
+
))
|
| 455 |
+
fname = osp.join(self.tmpdir, make_name("resize2{}.h5"))
|
| 456 |
+
shutil.copyfile(self.path, fname)
|
| 457 |
+
with h5.File(fname, "a") as f:
|
| 458 |
+
source_dset = f['source']
|
| 459 |
+
virtual_dset = f['virtual']
|
| 460 |
+
np.testing.assert_array_equal(comp1, virtual_dset)
|
| 461 |
+
source_dset.resize(20, axis=0)
|
| 462 |
+
np.testing.assert_array_equal(comp2, virtual_dset)
|
| 463 |
+
source_dset[10:, 1] = np.zeros((10,), dtype=int)
|
| 464 |
+
np.testing.assert_array_equal(comp3, virtual_dset)
|
| 465 |
+
|
| 466 |
+
def tearDown(self):
|
| 467 |
+
shutil.rmtree(self.tmpdir)
|
| 468 |
+
|
| 469 |
+
|
| 470 |
+
def test_no_mappings(writable_file):
|
| 471 |
+
name = make_name()
|
| 472 |
+
with writable_file.build_virtual_dataset(name, (10, 20), np.int32):
|
| 473 |
+
pass
|
| 474 |
+
|
| 475 |
+
dset = writable_file[name]
|
| 476 |
+
assert dset.is_virtual
|
| 477 |
+
assert dset.virtual_sources() == []
|
| 478 |
+
np.testing.assert_array_equal(dset[()], np.zeros((10, 20), np.int32))
|
| 479 |
+
|
| 480 |
+
|
| 481 |
+
if __name__ == "__main__":
|
| 482 |
+
ut.main()
|
.venv/lib/python3.11/site-packages/h5py/tests/test_vds/test_lowlevel_vds.py
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'''
|
| 2 |
+
Unit test for the low level vds interface for eiger
|
| 3 |
+
https://support.hdfgroup.org/HDF5/docNewFeatures/VDS/HDF5-VDS-requirements-use-cases-2014-12-10.pdf
|
| 4 |
+
'''
|
| 5 |
+
|
| 6 |
+
import os.path as osp
|
| 7 |
+
import tempfile
|
| 8 |
+
|
| 9 |
+
import numpy as np
|
| 10 |
+
|
| 11 |
+
import h5py as h5
|
| 12 |
+
from ..common import ut, make_name
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
class TestEigerLowLevel(ut.TestCase):
|
| 16 |
+
def setUp(self):
|
| 17 |
+
self.working_dir = tempfile.TemporaryDirectory()
|
| 18 |
+
self.fname = ['raw_file_1.h5', 'raw_file_2.h5', 'raw_file_3.h5']
|
| 19 |
+
k = 0
|
| 20 |
+
for outfile in self.fname:
|
| 21 |
+
filename = osp.join(self.working_dir.name, outfile)
|
| 22 |
+
with h5.File(filename, 'w') as f:
|
| 23 |
+
f['data'] = np.ones((20, 200, 200))*k
|
| 24 |
+
k += 1
|
| 25 |
+
|
| 26 |
+
with h5.File(osp.join(self.working_dir.name, 'raw_file_4.h5'), 'w') as f:
|
| 27 |
+
f['data'] = np.ones((18, 200, 200))*3
|
| 28 |
+
self.fname.append('raw_file_4.h5')
|
| 29 |
+
self.fname = [osp.join(self.working_dir.name, ix) for ix in self.fname]
|
| 30 |
+
|
| 31 |
+
def test_eiger_low_level(self):
|
| 32 |
+
outfile = osp.join(self.working_dir.name, make_name('eiger{}.h5'))
|
| 33 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 34 |
+
vdset_shape = (78, 200, 200)
|
| 35 |
+
vdset_max_shape = vdset_shape
|
| 36 |
+
virt_dspace = h5.h5s.create_simple(vdset_shape, vdset_max_shape)
|
| 37 |
+
dcpl = h5.h5p.create(h5.h5p.DATASET_CREATE)
|
| 38 |
+
dcpl.set_fill_value(np.array([-1]))
|
| 39 |
+
# Create the source dataset dataspace
|
| 40 |
+
k = 0
|
| 41 |
+
for foo in self.fname:
|
| 42 |
+
with h5.File(foo, 'r') as in_f:
|
| 43 |
+
src_shape = in_f['data'].shape
|
| 44 |
+
src_dspace = h5.h5s.create_simple(src_shape, src_shape)
|
| 45 |
+
# Select the source dataset hyperslab
|
| 46 |
+
src_dspace.select_hyperslab(start=(0, 0, 0),
|
| 47 |
+
stride=(1, 1, 1),
|
| 48 |
+
count=(1, 1, 1),
|
| 49 |
+
block=src_shape)
|
| 50 |
+
|
| 51 |
+
virt_dspace.select_hyperslab(start=(k, 0, 0),
|
| 52 |
+
stride=(1, 1, 1),
|
| 53 |
+
count=(1, 1, 1),
|
| 54 |
+
block=src_shape)
|
| 55 |
+
|
| 56 |
+
dcpl.set_virtual(virt_dspace, foo.encode('utf-8'),
|
| 57 |
+
b'data', src_dspace)
|
| 58 |
+
k += src_shape[0]
|
| 59 |
+
|
| 60 |
+
# Create the virtual dataset
|
| 61 |
+
h5.h5d.create(f.id, name=b"data", tid=h5.h5t.NATIVE_INT16,
|
| 62 |
+
space=virt_dspace, dcpl=dcpl)
|
| 63 |
+
|
| 64 |
+
with h5.File(outfile, 'r') as f:
|
| 65 |
+
d = f['data']
|
| 66 |
+
self.assertEqual(d[10, 100, 10], 0.0)
|
| 67 |
+
self.assertEqual(d[30, 100, 100], 1.0)
|
| 68 |
+
self.assertEqual(d[50, 100, 100], 2.0)
|
| 69 |
+
self.assertEqual(d[70, 100, 100], 3.0)
|
| 70 |
+
|
| 71 |
+
def tearDown(self):
|
| 72 |
+
self.working_dir.cleanup()
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
if __name__ == "__main__":
|
| 76 |
+
ut.main()
|
| 77 |
+
'''
|
| 78 |
+
Unit test for the low level vds interface for excalibur
|
| 79 |
+
https://support.hdfgroup.org/HDF5/docNewFeatures/VDS/HDF5-VDS-requirements-use-cases-2014-12-10.pdf
|
| 80 |
+
'''
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
class ExcaliburData:
|
| 84 |
+
FEM_PIXELS_PER_CHIP_X = 256
|
| 85 |
+
FEM_PIXELS_PER_CHIP_Y = 256
|
| 86 |
+
FEM_CHIPS_PER_STRIPE_X = 8
|
| 87 |
+
FEM_CHIPS_PER_STRIPE_Y = 1
|
| 88 |
+
FEM_STRIPES_PER_MODULE = 2
|
| 89 |
+
|
| 90 |
+
@property
|
| 91 |
+
def sensor_module_dimensions(self):
|
| 92 |
+
x_pixels = self.FEM_PIXELS_PER_CHIP_X * self.FEM_CHIPS_PER_STRIPE_X
|
| 93 |
+
y_pixels = self.FEM_PIXELS_PER_CHIP_Y * self.FEM_CHIPS_PER_STRIPE_Y * self.FEM_STRIPES_PER_MODULE
|
| 94 |
+
return y_pixels, x_pixels,
|
| 95 |
+
|
| 96 |
+
@property
|
| 97 |
+
def fem_stripe_dimensions(self):
|
| 98 |
+
x_pixels = self.FEM_PIXELS_PER_CHIP_X * self.FEM_CHIPS_PER_STRIPE_X
|
| 99 |
+
y_pixels = self.FEM_PIXELS_PER_CHIP_Y * self.FEM_CHIPS_PER_STRIPE_Y
|
| 100 |
+
return y_pixels, x_pixels,
|
| 101 |
+
|
| 102 |
+
def generate_sensor_module_image(self, value, dtype='uint16'):
|
| 103 |
+
dset = np.empty(shape=self.sensor_module_dimensions, dtype=dtype)
|
| 104 |
+
dset.fill(value)
|
| 105 |
+
return dset
|
| 106 |
+
|
| 107 |
+
def generate_fem_stripe_image(self, value, dtype='uint16'):
|
| 108 |
+
dset = np.empty(shape=self.fem_stripe_dimensions, dtype=dtype)
|
| 109 |
+
dset.fill(value)
|
| 110 |
+
return dset
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
class TestExcaliburLowLevel(ut.TestCase):
|
| 114 |
+
def create_excalibur_fem_stripe_datafile(self, fname, nframes, excalibur_data,scale):
|
| 115 |
+
shape = (nframes,) + excalibur_data.fem_stripe_dimensions
|
| 116 |
+
max_shape = (nframes,) + excalibur_data.fem_stripe_dimensions
|
| 117 |
+
chunk = (1,) + excalibur_data.fem_stripe_dimensions
|
| 118 |
+
with h5.File(fname, 'w', libver='latest') as f:
|
| 119 |
+
dset = f.create_dataset('data', shape=shape, maxshape=max_shape, chunks=chunk, dtype='uint16')
|
| 120 |
+
for data_value_index in np.arange(nframes):
|
| 121 |
+
dset[data_value_index] = excalibur_data.generate_fem_stripe_image(data_value_index*scale)
|
| 122 |
+
|
| 123 |
+
def setUp(self):
|
| 124 |
+
self.working_dir = tempfile.TemporaryDirectory()
|
| 125 |
+
self.fname = ["stripe_%d.h5" % stripe for stripe in range(1,7)]
|
| 126 |
+
self.fname = [osp.join(self.working_dir.name, ix) for ix in self.fname]
|
| 127 |
+
nframes = 5
|
| 128 |
+
self.edata = ExcaliburData()
|
| 129 |
+
k=0
|
| 130 |
+
for raw_file in self.fname:
|
| 131 |
+
self.create_excalibur_fem_stripe_datafile(raw_file, nframes, self.edata,k)
|
| 132 |
+
k+=1
|
| 133 |
+
|
| 134 |
+
def test_excalibur_low_level(self):
|
| 135 |
+
|
| 136 |
+
excalibur_data = self.edata
|
| 137 |
+
outfile = osp.join(self.working_dir.name, make_name('excalibur{}.h5'))
|
| 138 |
+
vdset_stripe_shape = (1,) + excalibur_data.fem_stripe_dimensions
|
| 139 |
+
vdset_stripe_max_shape = (5, ) + excalibur_data.fem_stripe_dimensions
|
| 140 |
+
vdset_shape = (5,
|
| 141 |
+
excalibur_data.fem_stripe_dimensions[0] * len(self.fname) + (10 * (len(self.fname)-1)),
|
| 142 |
+
excalibur_data.fem_stripe_dimensions[1])
|
| 143 |
+
vdset_max_shape = (5,
|
| 144 |
+
excalibur_data.fem_stripe_dimensions[0] * len(self.fname) + (10 * (len(self.fname)-1)),
|
| 145 |
+
excalibur_data.fem_stripe_dimensions[1])
|
| 146 |
+
vdset_y_offset = 0
|
| 147 |
+
|
| 148 |
+
# Create the virtual dataset file
|
| 149 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 150 |
+
|
| 151 |
+
# Create the source dataset dataspace
|
| 152 |
+
src_dspace = h5.h5s.create_simple(vdset_stripe_shape, vdset_stripe_max_shape)
|
| 153 |
+
# Create the virtual dataset dataspace
|
| 154 |
+
virt_dspace = h5.h5s.create_simple(vdset_shape, vdset_max_shape)
|
| 155 |
+
|
| 156 |
+
# Create the virtual dataset property list
|
| 157 |
+
dcpl = h5.h5p.create(h5.h5p.DATASET_CREATE)
|
| 158 |
+
dcpl.set_fill_value(np.array([0x01]))
|
| 159 |
+
|
| 160 |
+
# Select the source dataset hyperslab
|
| 161 |
+
src_dspace.select_hyperslab(start=(0, 0, 0), count=(1, 1, 1), block=vdset_stripe_max_shape)
|
| 162 |
+
|
| 163 |
+
for raw_file in self.fname:
|
| 164 |
+
# Select the virtual dataset hyperslab (for the source dataset)
|
| 165 |
+
virt_dspace.select_hyperslab(start=(0, vdset_y_offset, 0),
|
| 166 |
+
count=(1, 1, 1),
|
| 167 |
+
block=vdset_stripe_max_shape)
|
| 168 |
+
# Set the virtual dataset hyperslab to point to the real first dataset
|
| 169 |
+
dcpl.set_virtual(virt_dspace, raw_file.encode('utf-8'),
|
| 170 |
+
b"/data", src_dspace)
|
| 171 |
+
vdset_y_offset += vdset_stripe_shape[1] + 10
|
| 172 |
+
|
| 173 |
+
# Create the virtual dataset
|
| 174 |
+
h5.h5d.create(
|
| 175 |
+
f.id,
|
| 176 |
+
name=b"data",
|
| 177 |
+
tid=h5.h5t.NATIVE_INT16,
|
| 178 |
+
space=virt_dspace,
|
| 179 |
+
dcpl=dcpl,
|
| 180 |
+
)
|
| 181 |
+
assert(f['data'].fillvalue == 0x01)
|
| 182 |
+
|
| 183 |
+
with h5.File(outfile,'r') as f:
|
| 184 |
+
d = f['data']
|
| 185 |
+
self.assertEqual(d[3,100,0], 0.0)
|
| 186 |
+
self.assertEqual(d[3,260,0], 1.0)
|
| 187 |
+
self.assertEqual(d[3,350,0], 3.0)
|
| 188 |
+
self.assertEqual(d[3,650,0], 6.0)
|
| 189 |
+
self.assertEqual(d[3,900,0], 9.0)
|
| 190 |
+
self.assertEqual(d[3,1150,0], 12.0)
|
| 191 |
+
self.assertEqual(d[3,1450,0], 15.0)
|
| 192 |
+
|
| 193 |
+
def tearDown(self):
|
| 194 |
+
self.working_dir.cleanup()
|
| 195 |
+
|
| 196 |
+
'''
|
| 197 |
+
Unit test for the low level vds interface for percival
|
| 198 |
+
https://support.hdfgroup.org/HDF5/docNewFeatures/VDS/HDF5-VDS-requirements-use-cases-2014-12-10.pdf
|
| 199 |
+
'''
|
| 200 |
+
|
| 201 |
+
|
| 202 |
+
class TestPercivalLowLevel(ut.TestCase):
|
| 203 |
+
|
| 204 |
+
def setUp(self):
|
| 205 |
+
self.working_dir = tempfile.TemporaryDirectory()
|
| 206 |
+
self.fname = ['raw_file_1.h5','raw_file_2.h5','raw_file_3.h5']
|
| 207 |
+
k = 0
|
| 208 |
+
for outfile in self.fname:
|
| 209 |
+
filename = osp.join(self.working_dir.name, outfile)
|
| 210 |
+
with h5.File(filename,'w') as f:
|
| 211 |
+
f['data'] = np.ones((20,200,200))*k
|
| 212 |
+
k +=1
|
| 213 |
+
|
| 214 |
+
with h5.File(osp.join(self.working_dir.name, 'raw_file_4.h5'),'w') as f:
|
| 215 |
+
f['data'] = np.ones((19,200,200))*3
|
| 216 |
+
self.fname.append('raw_file_4.h5')
|
| 217 |
+
self.fname = [osp.join(self.working_dir.name, ix) for ix in self.fname]
|
| 218 |
+
|
| 219 |
+
def test_percival_low_level(self):
|
| 220 |
+
outfile = osp.join(self.working_dir.name, make_name('percival{}.h5'))
|
| 221 |
+
|
| 222 |
+
with h5.File(outfile, 'w', libver='latest') as f:
|
| 223 |
+
vdset_shape = (1,200,200)
|
| 224 |
+
num = h5.h5s.UNLIMITED
|
| 225 |
+
vdset_max_shape = (num,)+vdset_shape[1:]
|
| 226 |
+
virt_dspace = h5.h5s.create_simple(vdset_shape, vdset_max_shape)
|
| 227 |
+
dcpl = h5.h5p.create(h5.h5p.DATASET_CREATE)
|
| 228 |
+
dcpl.set_fill_value(np.array([-1]))
|
| 229 |
+
# Create the source dataset dataspace
|
| 230 |
+
k = 0
|
| 231 |
+
for foo in self.fname:
|
| 232 |
+
with h5.File(foo, 'r') as in_f:
|
| 233 |
+
src_shape = in_f['data'].shape
|
| 234 |
+
max_src_shape = (num,)+src_shape[1:]
|
| 235 |
+
src_dspace = h5.h5s.create_simple(src_shape, max_src_shape)
|
| 236 |
+
# Select the source dataset hyperslab
|
| 237 |
+
src_dspace.select_hyperslab(start=(0, 0, 0),
|
| 238 |
+
stride=(1,1,1),
|
| 239 |
+
count=(num, 1, 1),
|
| 240 |
+
block=(1,)+src_shape[1:])
|
| 241 |
+
|
| 242 |
+
virt_dspace.select_hyperslab(start=(k, 0, 0),
|
| 243 |
+
stride=(4,1,1),
|
| 244 |
+
count=(num, 1, 1),
|
| 245 |
+
block=(1,)+src_shape[1:])
|
| 246 |
+
|
| 247 |
+
dcpl.set_virtual(virt_dspace, foo.encode('utf-8'), b'data', src_dspace)
|
| 248 |
+
k+=1
|
| 249 |
+
|
| 250 |
+
# Create the virtual dataset
|
| 251 |
+
h5.h5d.create(
|
| 252 |
+
f.id,
|
| 253 |
+
name=b"data",
|
| 254 |
+
tid=h5.h5t.NATIVE_INT16,
|
| 255 |
+
space=virt_dspace,
|
| 256 |
+
dcpl=dcpl,
|
| 257 |
+
)
|
| 258 |
+
|
| 259 |
+
with h5.File(outfile, 'r') as f:
|
| 260 |
+
sh = f['data'].shape
|
| 261 |
+
line = f['data'][:8,100,100]
|
| 262 |
+
foo = np.array(2*list(range(4)))
|
| 263 |
+
self.assertEqual(sh,(79,200,200),)
|
| 264 |
+
np.testing.assert_array_equal(line,foo)
|
| 265 |
+
|
| 266 |
+
def tearDown(self):
|
| 267 |
+
self.working_dir.cleanup()
|
| 268 |
+
|
| 269 |
+
|
| 270 |
+
def test_virtual_prefix(tmp_path):
|
| 271 |
+
a = tmp_path / make_name('a')
|
| 272 |
+
b = tmp_path / make_name('b')
|
| 273 |
+
a.mkdir()
|
| 274 |
+
b.mkdir()
|
| 275 |
+
src_file = h5.File(a / 'src.h5', 'w')
|
| 276 |
+
src_file['data'] = np.arange(10)
|
| 277 |
+
|
| 278 |
+
vds_file = h5.File(b / 'vds.h5', 'w')
|
| 279 |
+
layout = h5.VirtualLayout(shape=(10,), dtype=np.int64)
|
| 280 |
+
layout[:] = h5.VirtualSource('src.h5', 'data', shape=(10,))
|
| 281 |
+
vds_file.create_virtual_dataset('data', layout, fillvalue=-1)
|
| 282 |
+
|
| 283 |
+
# Path doesn't resolve
|
| 284 |
+
np.testing.assert_array_equal(vds_file['data'], np.full(10, fill_value=-1))
|
| 285 |
+
|
| 286 |
+
a_bytes = bytes(a)
|
| 287 |
+
dapl = h5.h5p.create(h5.h5p.DATASET_ACCESS)
|
| 288 |
+
dapl.set_virtual_prefix(a_bytes)
|
| 289 |
+
vds_id = h5.h5d.open(vds_file.id, b'data', dapl=dapl)
|
| 290 |
+
vds = h5.Dataset(vds_id)
|
| 291 |
+
|
| 292 |
+
# Now it should find the source file and read the data correctly
|
| 293 |
+
np.testing.assert_array_equal(vds[:], np.arange(10))
|
| 294 |
+
# Check that get_virtual_prefix gives back what we put in
|
| 295 |
+
assert vds.id.get_access_plist().get_virtual_prefix() == a_bytes
|
| 296 |
+
|
| 297 |
+
src_file.close()
|
| 298 |
+
vds_file.close()
|
.venv/lib/python3.11/site-packages/h5py/tests/test_vds/test_virtual_source.py
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ..common import ut, make_name
|
| 2 |
+
import h5py as h5
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
class TestVirtualSource(ut.TestCase):
|
| 7 |
+
def test_full_slice(self):
|
| 8 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 9 |
+
sliced = dataset[:,:,:]
|
| 10 |
+
self.assertEqual(dataset.shape,sliced.shape)
|
| 11 |
+
|
| 12 |
+
# def test_full_slice_inverted(self):
|
| 13 |
+
# dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 14 |
+
# sliced = dataset[:,:,::-1]
|
| 15 |
+
# self.assertEqual(dataset.shape,sliced.shape)
|
| 16 |
+
#
|
| 17 |
+
# def test_subsampled_slice_inverted(self):
|
| 18 |
+
# dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 19 |
+
# sliced = dataset[:,:,::-2]
|
| 20 |
+
# self.assertEqual((20,30,15),sliced.shape)
|
| 21 |
+
|
| 22 |
+
def test_integer_indexed(self):
|
| 23 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 24 |
+
sliced = dataset[5,:,:]
|
| 25 |
+
self.assertEqual((30,30),sliced.shape)
|
| 26 |
+
|
| 27 |
+
def test_integer_single_indexed(self):
|
| 28 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 29 |
+
sliced = dataset[5]
|
| 30 |
+
self.assertEqual((30,30),sliced.shape)
|
| 31 |
+
|
| 32 |
+
def test_two_integer_indexed(self):
|
| 33 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 34 |
+
sliced = dataset[5,:,10]
|
| 35 |
+
self.assertEqual((30,),sliced.shape)
|
| 36 |
+
|
| 37 |
+
def test_single_range(self):
|
| 38 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 39 |
+
sliced = dataset[5:10,:,:]
|
| 40 |
+
self.assertEqual((5,)+dataset.shape[1:],sliced.shape)
|
| 41 |
+
|
| 42 |
+
def test_shape_calculation_positive_step(self):
|
| 43 |
+
dataset = h5.VirtualSource('test','test',(20,))
|
| 44 |
+
cmp = []
|
| 45 |
+
for i in range(5):
|
| 46 |
+
d = dataset[2:12+i:3].shape[0]
|
| 47 |
+
ref = np.arange(20)[2:12+i:3].size
|
| 48 |
+
cmp.append(ref==d)
|
| 49 |
+
self.assertEqual(5, sum(cmp))
|
| 50 |
+
|
| 51 |
+
# def test_shape_calculation_positive_step_switched_start_stop(self):
|
| 52 |
+
# dataset = h5.VirtualSource('test','test',(20,))
|
| 53 |
+
# cmp = []
|
| 54 |
+
# for i in range(5):
|
| 55 |
+
# d = dataset[12+i:2:3].shape[0]
|
| 56 |
+
# ref = np.arange(20)[12+i:2:3].size
|
| 57 |
+
# cmp.append(ref==d)
|
| 58 |
+
# self.assertEqual(5, sum(cmp))
|
| 59 |
+
#
|
| 60 |
+
#
|
| 61 |
+
# def test_shape_calculation_negative_step(self):
|
| 62 |
+
# dataset = h5.VirtualSource('test','test',(20,))
|
| 63 |
+
# cmp = []
|
| 64 |
+
# for i in range(5):
|
| 65 |
+
# d = dataset[12+i:2:-3].shape[0]
|
| 66 |
+
# ref = np.arange(20)[12+i:2:-3].size
|
| 67 |
+
# cmp.append(ref==d)
|
| 68 |
+
# self.assertEqual(5, sum(cmp))
|
| 69 |
+
#
|
| 70 |
+
# def test_shape_calculation_negative_step_switched_start_stop(self):
|
| 71 |
+
# dataset = h5.VirtualSource('test','test',(20,))
|
| 72 |
+
# cmp = []
|
| 73 |
+
# for i in range(5):
|
| 74 |
+
# d = dataset[2:12+i:-3].shape[0]
|
| 75 |
+
# ref = np.arange(20)[2:12+i:-3].size
|
| 76 |
+
# cmp.append(ref==d)
|
| 77 |
+
# self.assertEqual(5, sum(cmp))
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
def test_double_range(self):
|
| 81 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 82 |
+
sliced = dataset[5:10,:,20:25]
|
| 83 |
+
self.assertEqual((5,30,5),sliced.shape)
|
| 84 |
+
|
| 85 |
+
def test_double_strided_range(self):
|
| 86 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 87 |
+
sliced = dataset[6:12:2,:,20:26:3]
|
| 88 |
+
self.assertEqual((3,30,2,),sliced.shape)
|
| 89 |
+
|
| 90 |
+
# def test_double_strided_range_inverted(self):
|
| 91 |
+
# dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 92 |
+
# sliced = dataset[12:6:-2,:,26:20:-3]
|
| 93 |
+
# self.assertEqual((3,30,2),sliced.shape)
|
| 94 |
+
|
| 95 |
+
def test_negative_start_index(self):
|
| 96 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 97 |
+
sliced = dataset[-10:16]
|
| 98 |
+
self.assertEqual((6,30,30),sliced.shape)
|
| 99 |
+
|
| 100 |
+
def test_negative_stop_index(self):
|
| 101 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 102 |
+
sliced = dataset[10:-4]
|
| 103 |
+
self.assertEqual((6,30,30),sliced.shape)
|
| 104 |
+
|
| 105 |
+
def test_negative_start_and_stop_index(self):
|
| 106 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 107 |
+
sliced = dataset[-10:-4]
|
| 108 |
+
self.assertEqual((6,30,30),sliced.shape)
|
| 109 |
+
|
| 110 |
+
# def test_negative_start_and_stop_and_stride_index(self):
|
| 111 |
+
# dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 112 |
+
# sliced = dataset[-4:-10:-2]
|
| 113 |
+
# self.assertEqual((3,30,30),sliced.shape)
|
| 114 |
+
#
|
| 115 |
+
def test_ellipsis(self):
|
| 116 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 117 |
+
sliced = dataset[...]
|
| 118 |
+
self.assertEqual(dataset.shape,sliced.shape)
|
| 119 |
+
|
| 120 |
+
def test_ellipsis_end(self):
|
| 121 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 122 |
+
sliced = dataset[0:1,...]
|
| 123 |
+
self.assertEqual((1,)+dataset.shape[1:],sliced.shape)
|
| 124 |
+
|
| 125 |
+
def test_ellipsis_start(self):
|
| 126 |
+
dataset = h5.VirtualSource('test','test',(20,30,30))
|
| 127 |
+
sliced = dataset[...,0:1]
|
| 128 |
+
self.assertEqual(dataset.shape[:-1]+(1,),sliced.shape)
|
| 129 |
+
|
| 130 |
+
def test_ellipsis_sandwich(self):
|
| 131 |
+
dataset = h5.VirtualSource('test','test',(20,30,30,40))
|
| 132 |
+
sliced = dataset[0:1,...,5:6]
|
| 133 |
+
self.assertEqual((1,)+dataset.shape[1:-1]+(1,),sliced.shape)
|
| 134 |
+
|
| 135 |
+
def test_integer_shape(self):
|
| 136 |
+
dataset = h5.VirtualSource('test','test', 20)
|
| 137 |
+
self.assertEqual(dataset.shape, (20,))
|
| 138 |
+
|
| 139 |
+
def test_integer_maxshape(self):
|
| 140 |
+
dataset = h5.VirtualSource('test','test', 20, maxshape=30)
|
| 141 |
+
self.assertEqual(dataset.maxshape, (30,))
|
| 142 |
+
|
| 143 |
+
def test_extra_args(self):
|
| 144 |
+
with h5.File(make_name("f1{}.h5"), driver='core',
|
| 145 |
+
backing_store=False, mode='w') as ftest:
|
| 146 |
+
ftest['a'] = [1, 2, 3]
|
| 147 |
+
a = ftest['a']
|
| 148 |
+
|
| 149 |
+
with self.assertRaises(TypeError):
|
| 150 |
+
h5.VirtualSource(a, 'b')
|
| 151 |
+
with self.assertRaises(TypeError):
|
| 152 |
+
h5.VirtualSource(a, shape=(1, ))
|
| 153 |
+
with self.assertRaises(TypeError):
|
| 154 |
+
h5.VirtualSource(a, maxshape=(None,))
|
| 155 |
+
with self.assertRaises(TypeError):
|
| 156 |
+
h5.VirtualSource(a, dtype=int)
|
| 157 |
+
|
| 158 |
+
def test_repeated_slice(self):
|
| 159 |
+
dataset = h5.VirtualSource('test', 'test', (20, 30, 30))
|
| 160 |
+
sliced = dataset[5:10, :, :]
|
| 161 |
+
with self.assertRaises(RuntimeError):
|
| 162 |
+
sliced[:, :4]
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
if __name__ == "__main__":
|
| 166 |
+
ut.main()
|
.venv/lib/python3.11/site-packages/h5py/utils.cpython-311-x86_64-linux-gnu.so
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7b6e2ec440f708b5b562bad1f8cdc2c2f73ead2bfd9ae056bb18177eafdf08a9
|
| 3 |
+
size 175529
|
.venv/lib/python3.11/site-packages/h5py/version.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is part of h5py, a Python interface to the HDF5 library.
|
| 2 |
+
#
|
| 3 |
+
# http://www.h5py.org
|
| 4 |
+
#
|
| 5 |
+
# Copyright 2008-2013 Andrew Collette and contributors
|
| 6 |
+
#
|
| 7 |
+
# License: Standard 3-clause BSD; see "license.txt" for full license terms
|
| 8 |
+
# and contributor agreement.
|
| 9 |
+
|
| 10 |
+
"""
|
| 11 |
+
Versioning module for h5py.
|
| 12 |
+
"""
|
| 13 |
+
|
| 14 |
+
from collections import namedtuple
|
| 15 |
+
from . import h5 as _h5
|
| 16 |
+
import sys
|
| 17 |
+
import numpy
|
| 18 |
+
|
| 19 |
+
# All should be integers, except pre, as validating versions is more than is
|
| 20 |
+
# needed for our use case
|
| 21 |
+
_H5PY_VERSION_CLS = namedtuple("_H5PY_VERSION_CLS",
|
| 22 |
+
"major minor bugfix pre post dev")
|
| 23 |
+
|
| 24 |
+
hdf5_built_version_tuple = _h5.HDF5_VERSION_COMPILED_AGAINST
|
| 25 |
+
|
| 26 |
+
version_tuple = _H5PY_VERSION_CLS(3, 16, 0, None, None, None)
|
| 27 |
+
|
| 28 |
+
version = "{0.major:d}.{0.minor:d}.{0.bugfix:d}".format(version_tuple)
|
| 29 |
+
if version_tuple.pre is not None:
|
| 30 |
+
version += version_tuple.pre
|
| 31 |
+
if version_tuple.post is not None:
|
| 32 |
+
version += ".post{0.post:d}".format(version_tuple)
|
| 33 |
+
if version_tuple.dev is not None:
|
| 34 |
+
version += ".dev{0.dev:d}".format(version_tuple)
|
| 35 |
+
|
| 36 |
+
hdf5_version_tuple = _h5.get_libversion()
|
| 37 |
+
hdf5_version = "%d.%d.%d" % hdf5_version_tuple
|
| 38 |
+
|
| 39 |
+
api_version_tuple = (1,8)
|
| 40 |
+
api_version = "%d.%d" % api_version_tuple
|
| 41 |
+
|
| 42 |
+
info = """\
|
| 43 |
+
Summary of the h5py configuration
|
| 44 |
+
---------------------------------
|
| 45 |
+
|
| 46 |
+
h5py %(h5py)s
|
| 47 |
+
HDF5 %(hdf5)s
|
| 48 |
+
Python %(python)s
|
| 49 |
+
sys.platform %(platform)s
|
| 50 |
+
sys.maxsize %(maxsize)s
|
| 51 |
+
numpy %(numpy)s
|
| 52 |
+
cython (built with) %(cython_version)s
|
| 53 |
+
numpy (built against) %(numpy_build_version)s
|
| 54 |
+
HDF5 (built against) %(hdf5_build_version)s
|
| 55 |
+
""" % {
|
| 56 |
+
'h5py': version,
|
| 57 |
+
'hdf5': hdf5_version,
|
| 58 |
+
'python': sys.version,
|
| 59 |
+
'platform': sys.platform,
|
| 60 |
+
'maxsize': sys.maxsize,
|
| 61 |
+
'numpy': numpy.__version__,
|
| 62 |
+
'cython_version': _h5.CYTHON_VERSION_COMPILED_WITH,
|
| 63 |
+
'numpy_build_version': _h5.NUMPY_VERSION_COMPILED_AGAINST,
|
| 64 |
+
'hdf5_build_version': "%d.%d.%d" % hdf5_built_version_tuple,
|
| 65 |
+
}
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
uv
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/METADATA
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: hf-xet
|
| 3 |
+
Version: 1.5.1
|
| 4 |
+
Classifier: Development Status :: 5 - Production/Stable
|
| 5 |
+
Classifier: License :: OSI Approved :: Apache Software License
|
| 6 |
+
Classifier: Programming Language :: Rust
|
| 7 |
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
| 8 |
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
| 9 |
+
Classifier: Programming Language :: Python :: 3
|
| 10 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 11 |
+
Classifier: Programming Language :: Python :: 3.8
|
| 12 |
+
Classifier: Programming Language :: Python :: 3.9
|
| 13 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 14 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 15 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 16 |
+
Classifier: Programming Language :: Python :: 3.13
|
| 17 |
+
Classifier: Programming Language :: Python :: 3.14
|
| 18 |
+
Classifier: Programming Language :: Python :: Free Threading
|
| 19 |
+
Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
|
| 20 |
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
| 21 |
+
Requires-Dist: pytest ; extra == 'tests'
|
| 22 |
+
Provides-Extra: tests
|
| 23 |
+
License-File: LICENSE
|
| 24 |
+
Summary: Fast transfer of large files with the Hugging Face Hub.
|
| 25 |
+
Maintainer-email: Rajat Arya <rajat@rajatarya.com>, Jared Sulzdorf <j.sulzdorf@gmail.com>, Di Xiao <di@huggingface.co>, Assaf Vayner <assaf@huggingface.co>, Hoyt Koepke <hoytak@gmail.com>
|
| 26 |
+
License-Expression: Apache-2.0
|
| 27 |
+
Requires-Python: >=3.8
|
| 28 |
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
| 29 |
+
Project-URL: Documentation, https://huggingface.co/docs/hub/xet/index
|
| 30 |
+
Project-URL: Homepage, https://github.com/huggingface/xet-core
|
| 31 |
+
Project-URL: Issues, https://github.com/huggingface/xet-core/issues
|
| 32 |
+
Project-URL: Repository, https://github.com/huggingface/xet-core.git
|
| 33 |
+
|
| 34 |
+
<!---
|
| 35 |
+
Copyright 2024 The HuggingFace Team. All rights reserved.
|
| 36 |
+
|
| 37 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 38 |
+
you may not use this file except in compliance with the License.
|
| 39 |
+
You may obtain a copy of the License at
|
| 40 |
+
|
| 41 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 42 |
+
|
| 43 |
+
Unless required by applicable law or agreed to in writing, software
|
| 44 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 45 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 46 |
+
See the License for the specific language governing permissions and
|
| 47 |
+
limitations under the License.
|
| 48 |
+
-->
|
| 49 |
+
<p align="center">
|
| 50 |
+
<a href="https://github.com/huggingface/xet-core/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/huggingface/xet-core.svg?color=blue"></a>
|
| 51 |
+
<a href="https://github.com/huggingface/xet-core/releases"><img alt="GitHub release" src="https://img.shields.io/github/release/huggingface/xet-core.svg"></a>
|
| 52 |
+
<a href="https://github.com/huggingface/xet-core/blob/main/CODE_OF_CONDUCT.md"><img alt="Contributor Covenant" src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg"></a>
|
| 53 |
+
</p>
|
| 54 |
+
|
| 55 |
+
<h3 align="center">
|
| 56 |
+
<p>🤗 hf-xet - xet client tech, used in <a target="_blank" href="https://github.com/huggingface/huggingface_hub/">huggingface_hub</a></p>
|
| 57 |
+
</h3>
|
| 58 |
+
|
| 59 |
+
## Welcome
|
| 60 |
+
|
| 61 |
+
`hf-xet` enables `huggingface_hub` to utilize xet storage for uploading and downloading to HF Hub. Xet storage provides chunk-based deduplication, efficient storage/retrieval with local disk caching, and backwards compatibility with Git LFS. This library is not meant to be used directly, and is instead intended to be used from [huggingface_hub](https://pypi.org/project/huggingface-hub).
|
| 62 |
+
|
| 63 |
+
## Key features
|
| 64 |
+
|
| 65 |
+
♻ **chunk-based deduplication implementation**: avoid transferring and storing chunks that are shared across binary files (models, datasets, etc).
|
| 66 |
+
|
| 67 |
+
🤗 **Python bindings**: bindings for [huggingface_hub](https://github.com/huggingface/huggingface_hub/) package.
|
| 68 |
+
|
| 69 |
+
↔ **network communications**: concurrent communication to HF Hub Xet backend services (CAS).
|
| 70 |
+
|
| 71 |
+
🔖 **local disk caching**: chunk-based cache that sits alongside the existing [huggingface_hub disk cache](https://huggingface.co/docs/huggingface_hub/guides/manage-cache).
|
| 72 |
+
|
| 73 |
+
## Installation
|
| 74 |
+
|
| 75 |
+
Install the `hf_xet` package with [pip](https://pypi.org/project/hf-xet/):
|
| 76 |
+
|
| 77 |
+
```bash
|
| 78 |
+
pip install hf_xet
|
| 79 |
+
```
|
| 80 |
+
|
| 81 |
+
## Quick Start
|
| 82 |
+
|
| 83 |
+
`hf_xet` is not intended to be run independently as it is expected to be used from `huggingface_hub`, so to get started with `huggingface_hub` check out the documentation [here]("https://hf.co/docs/huggingface_hub").
|
| 84 |
+
|
| 85 |
+
## Contributions (feature requests, bugs, etc.) are encouraged & appreciated 💙💚💛💜🧡❤️
|
| 86 |
+
|
| 87 |
+
Please join us in making hf-xet better. We value everyone's contributions. Code is not the only way to help. Answering questions, helping each other, improving documentation, filing issues all help immensely. If you are interested in contributing (please do!), check out the [contribution guide](https://github.com/huggingface/xet-core/blob/main/CONTRIBUTING.md) for this repository.
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/RECORD
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
hf_xet-1.5.1.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
|
| 2 |
+
hf_xet-1.5.1.dist-info/METADATA,sha256=Ng3NIurLVmsxfHrQzB0hVplUWdfDjyPgOB1vV43zU9s,4882
|
| 3 |
+
hf_xet-1.5.1.dist-info/RECORD,,
|
| 4 |
+
hf_xet-1.5.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 5 |
+
hf_xet-1.5.1.dist-info/WHEEL,sha256=OkX4wPsZin6E8CKOzxYqaTQ7om8YEJGkDJxzf2dJ9DM,143
|
| 6 |
+
hf_xet-1.5.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
| 7 |
+
hf_xet-1.5.1.dist-info/sboms/hf_xet.cyclonedx.json,sha256=qwtR4a6GgW2Y-ybzx9ThgMyHXF11N79IyEWcWf1CeBw,304991
|
| 8 |
+
hf_xet/__init__.py,sha256=E8UDdyQ8glZ_nve9hHEf22bPang8-RKx4VuApXYeQUo,107
|
| 9 |
+
hf_xet/hf_xet.abi3.so,sha256=67AVYfNTLATTgxnYRWZSV5vBoS_6j1FFDErdBM-hhTY,11601472
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/REQUESTED
ADDED
|
File without changes
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: maturin (1.13.3)
|
| 3 |
+
Root-Is-Purelib: false
|
| 4 |
+
Tag: cp37-abi3-manylinux_2_17_x86_64
|
| 5 |
+
Tag: cp37-abi3-manylinux2014_x86_64
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/licenses/LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Apache License
|
| 2 |
+
Version 2.0, January 2004
|
| 3 |
+
http://www.apache.org/licenses/
|
| 4 |
+
|
| 5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 6 |
+
|
| 7 |
+
1. Definitions.
|
| 8 |
+
|
| 9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 11 |
+
|
| 12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 13 |
+
the copyright owner that is granting the License.
|
| 14 |
+
|
| 15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 16 |
+
other entities that control, are controlled by, or are under common
|
| 17 |
+
control with that entity. For the purposes of this definition,
|
| 18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 19 |
+
direction or management of such entity, whether by contract or
|
| 20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 22 |
+
|
| 23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 24 |
+
exercising permissions granted by this License.
|
| 25 |
+
|
| 26 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 27 |
+
including but not limited to software source code, documentation
|
| 28 |
+
source, and configuration files.
|
| 29 |
+
|
| 30 |
+
"Object" form shall mean any form resulting from mechanical
|
| 31 |
+
transformation or translation of a Source form, including but
|
| 32 |
+
not limited to compiled object code, generated documentation,
|
| 33 |
+
and conversions to other media types.
|
| 34 |
+
|
| 35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 36 |
+
Object form, made available under the License, as indicated by a
|
| 37 |
+
copyright notice that is included in or attached to the work
|
| 38 |
+
(an example is provided in the Appendix below).
|
| 39 |
+
|
| 40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 41 |
+
form, that is based on (or derived from) the Work and for which the
|
| 42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 44 |
+
of this License, Derivative Works shall not include works that remain
|
| 45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 46 |
+
the Work and Derivative Works thereof.
|
| 47 |
+
|
| 48 |
+
"Contribution" shall mean any work of authorship, including
|
| 49 |
+
the original version of the Work and any modifications or additions
|
| 50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 54 |
+
means any form of electronic, verbal, or written communication sent
|
| 55 |
+
to the Licensor or its representatives, including but not limited to
|
| 56 |
+
communication on electronic mailing lists, source code control systems,
|
| 57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 59 |
+
excluding communication that is conspicuously marked or otherwise
|
| 60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 61 |
+
|
| 62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 64 |
+
subsequently incorporated within the Work.
|
| 65 |
+
|
| 66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 71 |
+
Work and such Derivative Works in Source or Object form.
|
| 72 |
+
|
| 73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 76 |
+
(except as stated in this section) patent license to make, have made,
|
| 77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 78 |
+
where such license applies only to those patent claims licensable
|
| 79 |
+
by such Contributor that are necessarily infringed by their
|
| 80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 82 |
+
institute patent litigation against any entity (including a
|
| 83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 84 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 85 |
+
or contributory patent infringement, then any patent licenses
|
| 86 |
+
granted to You under this License for that Work shall terminate
|
| 87 |
+
as of the date such litigation is filed.
|
| 88 |
+
|
| 89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 90 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 91 |
+
modifications, and in Source or Object form, provided that You
|
| 92 |
+
meet the following conditions:
|
| 93 |
+
|
| 94 |
+
(a) You must give any other recipients of the Work or
|
| 95 |
+
Derivative Works a copy of this License; and
|
| 96 |
+
|
| 97 |
+
(b) You must cause any modified files to carry prominent notices
|
| 98 |
+
stating that You changed the files; and
|
| 99 |
+
|
| 100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 101 |
+
that You distribute, all copyright, patent, trademark, and
|
| 102 |
+
attribution notices from the Source form of the Work,
|
| 103 |
+
excluding those notices that do not pertain to any part of
|
| 104 |
+
the Derivative Works; and
|
| 105 |
+
|
| 106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 107 |
+
distribution, then any Derivative Works that You distribute must
|
| 108 |
+
include a readable copy of the attribution notices contained
|
| 109 |
+
within such NOTICE file, excluding those notices that do not
|
| 110 |
+
pertain to any part of the Derivative Works, in at least one
|
| 111 |
+
of the following places: within a NOTICE text file distributed
|
| 112 |
+
as part of the Derivative Works; within the Source form or
|
| 113 |
+
documentation, if provided along with the Derivative Works; or,
|
| 114 |
+
within a display generated by the Derivative Works, if and
|
| 115 |
+
wherever such third-party notices normally appear. The contents
|
| 116 |
+
of the NOTICE file are for informational purposes only and
|
| 117 |
+
do not modify the License. You may add Your own attribution
|
| 118 |
+
notices within Derivative Works that You distribute, alongside
|
| 119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 120 |
+
that such additional attribution notices cannot be construed
|
| 121 |
+
as modifying the License.
|
| 122 |
+
|
| 123 |
+
You may add Your own copyright statement to Your modifications and
|
| 124 |
+
may provide additional or different license terms and conditions
|
| 125 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 126 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 127 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 128 |
+
the conditions stated in this License.
|
| 129 |
+
|
| 130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 132 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 133 |
+
this License, without any additional terms or conditions.
|
| 134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 135 |
+
the terms of any separate license agreement you may have executed
|
| 136 |
+
with Licensor regarding such Contributions.
|
| 137 |
+
|
| 138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 140 |
+
except as required for reasonable and customary use in describing the
|
| 141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 142 |
+
|
| 143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 144 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 147 |
+
implied, including, without limitation, any warranties or conditions
|
| 148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 150 |
+
appropriateness of using or redistributing the Work and assume any
|
| 151 |
+
risks associated with Your exercise of permissions under this License.
|
| 152 |
+
|
| 153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 154 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 155 |
+
unless required by applicable law (such as deliberate and grossly
|
| 156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 157 |
+
liable to You for damages, including any direct, indirect, special,
|
| 158 |
+
incidental, or consequential damages of any character arising as a
|
| 159 |
+
result of this License or out of the use or inability to use the
|
| 160 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 161 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 162 |
+
other commercial damages or losses), even if such Contributor
|
| 163 |
+
has been advised of the possibility of such damages.
|
| 164 |
+
|
| 165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 168 |
+
or other liability obligations and/or rights consistent with this
|
| 169 |
+
License. However, in accepting such obligations, You may act only
|
| 170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 171 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 172 |
+
defend, and hold each Contributor harmless for any liability
|
| 173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 174 |
+
of your accepting any such warranty or additional liability.
|
| 175 |
+
|
| 176 |
+
END OF TERMS AND CONDITIONS
|
| 177 |
+
|
| 178 |
+
APPENDIX: How to apply the Apache License to your work.
|
| 179 |
+
|
| 180 |
+
To apply the Apache License to your work, attach the following
|
| 181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
| 182 |
+
replaced with your own identifying information. (Don't include
|
| 183 |
+
the brackets!) The text should be enclosed in the appropriate
|
| 184 |
+
comment syntax for the file format. We also recommend that a
|
| 185 |
+
file or class name and description of purpose be included on the
|
| 186 |
+
same "printed page" as the copyright notice for easier
|
| 187 |
+
identification within third-party archives.
|
| 188 |
+
|
| 189 |
+
Copyright [yyyy] [name of copyright owner]
|
| 190 |
+
|
| 191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 192 |
+
you may not use this file except in compliance with the License.
|
| 193 |
+
You may obtain a copy of the License at
|
| 194 |
+
|
| 195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 196 |
+
|
| 197 |
+
Unless required by applicable law or agreed to in writing, software
|
| 198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 200 |
+
See the License for the specific language governing permissions and
|
| 201 |
+
limitations under the License.
|
.venv/lib/python3.11/site-packages/hf_xet-1.5.1.dist-info/sboms/hf_xet.cyclonedx.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
.venv/lib/python3.11/site-packages/hf_xet/__init__.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .hf_xet import *
|
| 2 |
+
|
| 3 |
+
__doc__ = hf_xet.__doc__
|
| 4 |
+
if hasattr(hf_xet, "__all__"):
|
| 5 |
+
__all__ = hf_xet.__all__
|
.venv/lib/python3.11/site-packages/hf_xet/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (371 Bytes). View file
|
|
|
.venv/lib/python3.11/site-packages/hf_xet/hf_xet.abi3.so
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ebb01561f3532c04d38319d8456652579bc1a12ffa8f51450c4add04cfa18536
|
| 3 |
+
size 11601472
|
.venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
uv
|
.venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA
ADDED
|
@@ -0,0 +1,625 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: httpcore
|
| 3 |
+
Version: 1.0.9
|
| 4 |
+
Summary: A minimal low-level HTTP client.
|
| 5 |
+
Project-URL: Documentation, https://www.encode.io/httpcore
|
| 6 |
+
Project-URL: Homepage, https://www.encode.io/httpcore/
|
| 7 |
+
Project-URL: Source, https://github.com/encode/httpcore
|
| 8 |
+
Author-email: Tom Christie <tom@tomchristie.com>
|
| 9 |
+
License-Expression: BSD-3-Clause
|
| 10 |
+
License-File: LICENSE.md
|
| 11 |
+
Classifier: Development Status :: 3 - Alpha
|
| 12 |
+
Classifier: Environment :: Web Environment
|
| 13 |
+
Classifier: Framework :: AsyncIO
|
| 14 |
+
Classifier: Framework :: Trio
|
| 15 |
+
Classifier: Intended Audience :: Developers
|
| 16 |
+
Classifier: License :: OSI Approved :: BSD License
|
| 17 |
+
Classifier: Operating System :: OS Independent
|
| 18 |
+
Classifier: Programming Language :: Python :: 3
|
| 19 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 20 |
+
Classifier: Programming Language :: Python :: 3.8
|
| 21 |
+
Classifier: Programming Language :: Python :: 3.9
|
| 22 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 23 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 24 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 25 |
+
Classifier: Topic :: Internet :: WWW/HTTP
|
| 26 |
+
Requires-Python: >=3.8
|
| 27 |
+
Requires-Dist: certifi
|
| 28 |
+
Requires-Dist: h11>=0.16
|
| 29 |
+
Provides-Extra: asyncio
|
| 30 |
+
Requires-Dist: anyio<5.0,>=4.0; extra == 'asyncio'
|
| 31 |
+
Provides-Extra: http2
|
| 32 |
+
Requires-Dist: h2<5,>=3; extra == 'http2'
|
| 33 |
+
Provides-Extra: socks
|
| 34 |
+
Requires-Dist: socksio==1.*; extra == 'socks'
|
| 35 |
+
Provides-Extra: trio
|
| 36 |
+
Requires-Dist: trio<1.0,>=0.22.0; extra == 'trio'
|
| 37 |
+
Description-Content-Type: text/markdown
|
| 38 |
+
|
| 39 |
+
# HTTP Core
|
| 40 |
+
|
| 41 |
+
[](https://github.com/encode/httpcore/actions)
|
| 42 |
+
[](https://pypi.org/project/httpcore/)
|
| 43 |
+
|
| 44 |
+
> *Do one thing, and do it well.*
|
| 45 |
+
|
| 46 |
+
The HTTP Core package provides a minimal low-level HTTP client, which does
|
| 47 |
+
one thing only. Sending HTTP requests.
|
| 48 |
+
|
| 49 |
+
It does not provide any high level model abstractions over the API,
|
| 50 |
+
does not handle redirects, multipart uploads, building authentication headers,
|
| 51 |
+
transparent HTTP caching, URL parsing, session cookie handling,
|
| 52 |
+
content or charset decoding, handling JSON, environment based configuration
|
| 53 |
+
defaults, or any of that Jazz.
|
| 54 |
+
|
| 55 |
+
Some things HTTP Core does do:
|
| 56 |
+
|
| 57 |
+
* Sending HTTP requests.
|
| 58 |
+
* Thread-safe / task-safe connection pooling.
|
| 59 |
+
* HTTP(S) proxy & SOCKS proxy support.
|
| 60 |
+
* Supports HTTP/1.1 and HTTP/2.
|
| 61 |
+
* Provides both sync and async interfaces.
|
| 62 |
+
* Async backend support for `asyncio` and `trio`.
|
| 63 |
+
|
| 64 |
+
## Requirements
|
| 65 |
+
|
| 66 |
+
Python 3.8+
|
| 67 |
+
|
| 68 |
+
## Installation
|
| 69 |
+
|
| 70 |
+
For HTTP/1.1 only support, install with:
|
| 71 |
+
|
| 72 |
+
```shell
|
| 73 |
+
$ pip install httpcore
|
| 74 |
+
```
|
| 75 |
+
|
| 76 |
+
There are also a number of optional extras available...
|
| 77 |
+
|
| 78 |
+
```shell
|
| 79 |
+
$ pip install httpcore['asyncio,trio,http2,socks']
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
## Sending requests
|
| 83 |
+
|
| 84 |
+
Send an HTTP request:
|
| 85 |
+
|
| 86 |
+
```python
|
| 87 |
+
import httpcore
|
| 88 |
+
|
| 89 |
+
response = httpcore.request("GET", "https://www.example.com/")
|
| 90 |
+
|
| 91 |
+
print(response)
|
| 92 |
+
# <Response [200]>
|
| 93 |
+
print(response.status)
|
| 94 |
+
# 200
|
| 95 |
+
print(response.headers)
|
| 96 |
+
# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...]
|
| 97 |
+
print(response.content)
|
| 98 |
+
# b'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>\n\n<meta charset="utf-8"/>\n ...'
|
| 99 |
+
```
|
| 100 |
+
|
| 101 |
+
The top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides.
|
| 102 |
+
|
| 103 |
+
```python
|
| 104 |
+
import httpcore
|
| 105 |
+
|
| 106 |
+
http = httpcore.ConnectionPool()
|
| 107 |
+
response = http.request("GET", "https://www.example.com/")
|
| 108 |
+
```
|
| 109 |
+
|
| 110 |
+
Once you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/).
|
| 111 |
+
|
| 112 |
+
## Motivation
|
| 113 |
+
|
| 114 |
+
You *probably* don't want to be using HTTP Core directly. It might make sense if
|
| 115 |
+
you're writing something like a proxy service in Python, and you just want
|
| 116 |
+
something at the lowest possible level, but more typically you'll want to use
|
| 117 |
+
a higher level client library, such as `httpx`.
|
| 118 |
+
|
| 119 |
+
The motivation for `httpcore` is:
|
| 120 |
+
|
| 121 |
+
* To provide a reusable low-level client library, that other packages can then build on top of.
|
| 122 |
+
* To provide a *really clear interface split* between the networking code and client logic,
|
| 123 |
+
so that each is easier to understand and reason about in isolation.
|
| 124 |
+
|
| 125 |
+
## Dependencies
|
| 126 |
+
|
| 127 |
+
The `httpcore` package has the following dependencies...
|
| 128 |
+
|
| 129 |
+
* `h11`
|
| 130 |
+
* `certifi`
|
| 131 |
+
|
| 132 |
+
And the following optional extras...
|
| 133 |
+
|
| 134 |
+
* `anyio` - Required by `pip install httpcore['asyncio']`.
|
| 135 |
+
* `trio` - Required by `pip install httpcore['trio']`.
|
| 136 |
+
* `h2` - Required by `pip install httpcore['http2']`.
|
| 137 |
+
* `socksio` - Required by `pip install httpcore['socks']`.
|
| 138 |
+
|
| 139 |
+
## Versioning
|
| 140 |
+
|
| 141 |
+
We use [SEMVER for our versioning policy](https://semver.org/).
|
| 142 |
+
|
| 143 |
+
For changes between package versions please see our [project changelog](CHANGELOG.md).
|
| 144 |
+
|
| 145 |
+
We recommend pinning your requirements either the most current major version, or a more specific version range:
|
| 146 |
+
|
| 147 |
+
```python
|
| 148 |
+
pip install 'httpcore==1.*'
|
| 149 |
+
```
|
| 150 |
+
# Changelog
|
| 151 |
+
|
| 152 |
+
All notable changes to this project will be documented in this file.
|
| 153 |
+
|
| 154 |
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
| 155 |
+
|
| 156 |
+
## Version 1.0.9 (April 24th, 2025)
|
| 157 |
+
|
| 158 |
+
- Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008)
|
| 159 |
+
|
| 160 |
+
## Version 1.0.8 (April 11th, 2025)
|
| 161 |
+
|
| 162 |
+
- Fix `AttributeError` when importing on Python 3.14. (#1005)
|
| 163 |
+
|
| 164 |
+
## Version 1.0.7 (November 15th, 2024)
|
| 165 |
+
|
| 166 |
+
- Support `proxy=…` configuration on `ConnectionPool()`. (#974)
|
| 167 |
+
|
| 168 |
+
## Version 1.0.6 (October 1st, 2024)
|
| 169 |
+
|
| 170 |
+
- Relax `trio` dependency pinning. (#956)
|
| 171 |
+
- Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955)
|
| 172 |
+
- Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918)
|
| 173 |
+
|
| 174 |
+
## 1.0.5 (March 27th, 2024)
|
| 175 |
+
|
| 176 |
+
- Handle `EndOfStream` exception for anyio backend. (#899)
|
| 177 |
+
- Allow trio `0.25.*` series in package dependancies. (#903)
|
| 178 |
+
|
| 179 |
+
## 1.0.4 (February 21st, 2024)
|
| 180 |
+
|
| 181 |
+
- Add `target` request extension. (#888)
|
| 182 |
+
- Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882)
|
| 183 |
+
|
| 184 |
+
## 1.0.3 (February 13th, 2024)
|
| 185 |
+
|
| 186 |
+
- Fix support for async cancellations. (#880)
|
| 187 |
+
- Fix trace extension when used with socks proxy. (#849)
|
| 188 |
+
- Fix SSL context for connections using the "wss" scheme (#869)
|
| 189 |
+
|
| 190 |
+
## 1.0.2 (November 10th, 2023)
|
| 191 |
+
|
| 192 |
+
- Fix `float("inf")` timeouts in `Event.wait` function. (#846)
|
| 193 |
+
|
| 194 |
+
## 1.0.1 (November 3rd, 2023)
|
| 195 |
+
|
| 196 |
+
- Fix pool timeout to account for the total time spent retrying. (#823)
|
| 197 |
+
- Raise a neater RuntimeError when the correct async deps are not installed. (#826)
|
| 198 |
+
- Add support for synchronous TLS-in-TLS streams. (#840)
|
| 199 |
+
|
| 200 |
+
## 1.0.0 (October 6th, 2023)
|
| 201 |
+
|
| 202 |
+
From version 1.0 our async support is now optional, as the package has minimal dependencies by default.
|
| 203 |
+
|
| 204 |
+
For async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`.
|
| 205 |
+
|
| 206 |
+
The project versioning policy is now explicitly governed by SEMVER. See https://semver.org/.
|
| 207 |
+
|
| 208 |
+
- Async support becomes fully optional. (#809)
|
| 209 |
+
- Add support for Python 3.12. (#807)
|
| 210 |
+
|
| 211 |
+
## 0.18.0 (September 8th, 2023)
|
| 212 |
+
|
| 213 |
+
- Add support for HTTPS proxies. (#745, #786)
|
| 214 |
+
- Drop Python 3.7 support. (#727)
|
| 215 |
+
- Handle `sni_hostname` extension with SOCKS proxy. (#774)
|
| 216 |
+
- Handle HTTP/1.1 half-closed connections gracefully. (#641)
|
| 217 |
+
- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762)
|
| 218 |
+
|
| 219 |
+
## 0.17.3 (July 5th, 2023)
|
| 220 |
+
|
| 221 |
+
- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726)
|
| 222 |
+
- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699)
|
| 223 |
+
- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730)
|
| 224 |
+
- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717)
|
| 225 |
+
- Drop Python 3.7 support. (#727)
|
| 226 |
+
|
| 227 |
+
## 0.17.2 (May 23th, 2023)
|
| 228 |
+
|
| 229 |
+
- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668)
|
| 230 |
+
- Improve logging with per-module logger names. (#690)
|
| 231 |
+
- Add `sni_hostname` request extension. (#696)
|
| 232 |
+
- Resolve race condition during import of `anyio` package. (#692)
|
| 233 |
+
- Enable TCP_NODELAY for all synchronous sockets. (#651)
|
| 234 |
+
|
| 235 |
+
## 0.17.1 (May 17th, 2023)
|
| 236 |
+
|
| 237 |
+
- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669)
|
| 238 |
+
- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678)
|
| 239 |
+
- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679)
|
| 240 |
+
- Fix edge-case exception when removing requests from the connection pool. (#680)
|
| 241 |
+
- Fix pool timeout edge-case. (#688)
|
| 242 |
+
|
| 243 |
+
## 0.17.0 (March 16th, 2023)
|
| 244 |
+
|
| 245 |
+
- Add DEBUG level logging. (#648)
|
| 246 |
+
- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652)
|
| 247 |
+
- Increase the allowable HTTP header size to 100kB. (#647)
|
| 248 |
+
- Add `retries` option to SOCKS proxy classes. (#643)
|
| 249 |
+
|
| 250 |
+
## 0.16.3 (December 20th, 2022)
|
| 251 |
+
|
| 252 |
+
- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625)
|
| 253 |
+
- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637)
|
| 254 |
+
- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631)
|
| 255 |
+
- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639)
|
| 256 |
+
|
| 257 |
+
## 0.16.2 (November 25th, 2022)
|
| 258 |
+
|
| 259 |
+
- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627)
|
| 260 |
+
- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619)
|
| 261 |
+
|
| 262 |
+
## 0.16.1 (November 17th, 2022)
|
| 263 |
+
|
| 264 |
+
- Fix HTTP/1.1 interim informational responses, such as "100 Continue". (#605)
|
| 265 |
+
|
| 266 |
+
## 0.16.0 (October 11th, 2022)
|
| 267 |
+
|
| 268 |
+
- Support HTTP/1.1 informational responses. (#581)
|
| 269 |
+
- Fix async cancellation behaviour. (#580)
|
| 270 |
+
- Support `h11` 0.14. (#579)
|
| 271 |
+
|
| 272 |
+
## 0.15.0 (May 17th, 2022)
|
| 273 |
+
|
| 274 |
+
- Drop Python 3.6 support (#535)
|
| 275 |
+
- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506)
|
| 276 |
+
- Switch to explicit `typing.Optional` for type hints. (#513)
|
| 277 |
+
- For `trio` map OSError exceptions to `ConnectError`. (#543)
|
| 278 |
+
|
| 279 |
+
## 0.14.7 (February 4th, 2022)
|
| 280 |
+
|
| 281 |
+
- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502)
|
| 282 |
+
- Fix AttributeError that happened when Socks5Connection were terminated. (#501)
|
| 283 |
+
|
| 284 |
+
## 0.14.6 (February 1st, 2022)
|
| 285 |
+
|
| 286 |
+
- Fix SOCKS support for `http://` URLs. (#492)
|
| 287 |
+
- Resolve race condition around exceptions during streaming a response. (#491)
|
| 288 |
+
|
| 289 |
+
## 0.14.5 (January 18th, 2022)
|
| 290 |
+
|
| 291 |
+
- SOCKS proxy support. (#478)
|
| 292 |
+
- Add proxy_auth argument to HTTPProxy. (#481)
|
| 293 |
+
- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479)
|
| 294 |
+
|
| 295 |
+
## 0.14.4 (January 5th, 2022)
|
| 296 |
+
|
| 297 |
+
- Support HTTP/2 on HTTPS tunnelling proxies. (#468)
|
| 298 |
+
- Fix proxy headers missing on HTTP forwarding. (#456)
|
| 299 |
+
- Only instantiate SSL context if required. (#457)
|
| 300 |
+
- More robust HTTP/2 handling. (#253, #439, #440, #441)
|
| 301 |
+
|
| 302 |
+
## 0.14.3 (November 17th, 2021)
|
| 303 |
+
|
| 304 |
+
- Fix race condition when removing closed connections from the pool. (#437)
|
| 305 |
+
|
| 306 |
+
## 0.14.2 (November 16th, 2021)
|
| 307 |
+
|
| 308 |
+
- Failed connections no longer remain in the pool. (Pull #433)
|
| 309 |
+
|
| 310 |
+
## 0.14.1 (November 12th, 2021)
|
| 311 |
+
|
| 312 |
+
- `max_connections` becomes optional. (Pull #429)
|
| 313 |
+
- `certifi` is now included in the install dependancies. (Pull #428)
|
| 314 |
+
- `h2` is now strictly optional. (Pull #428)
|
| 315 |
+
|
| 316 |
+
## 0.14.0 (November 11th, 2021)
|
| 317 |
+
|
| 318 |
+
The 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly.
|
| 319 |
+
|
| 320 |
+
Some of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage.
|
| 321 |
+
|
| 322 |
+
See [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background.
|
| 323 |
+
|
| 324 |
+
There's some other neat bits in there too, such as the "trace" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to...
|
| 325 |
+
|
| 326 |
+
* Log the point at which the connection is established, and the IP/port on which it is made.
|
| 327 |
+
* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.)
|
| 328 |
+
* Log SSL version info / certificate info.
|
| 329 |
+
|
| 330 |
+
Note that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not.
|
| 331 |
+
|
| 332 |
+
## 0.13.7 (September 13th, 2021)
|
| 333 |
+
|
| 334 |
+
- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403)
|
| 335 |
+
|
| 336 |
+
## 0.13.6 (June 15th, 2021)
|
| 337 |
+
|
| 338 |
+
### Fixed
|
| 339 |
+
|
| 340 |
+
- Close sockets when read or write timeouts occur. (Pull #365)
|
| 341 |
+
|
| 342 |
+
## 0.13.5 (June 14th, 2021)
|
| 343 |
+
|
| 344 |
+
### Fixed
|
| 345 |
+
|
| 346 |
+
- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362)
|
| 347 |
+
|
| 348 |
+
## 0.13.4 (June 9th, 2021)
|
| 349 |
+
|
| 350 |
+
### Added
|
| 351 |
+
|
| 352 |
+
- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354)
|
| 353 |
+
|
| 354 |
+
### Fixed
|
| 355 |
+
|
| 356 |
+
- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511).
|
| 357 |
+
|
| 358 |
+
## 0.13.3 (May 6th, 2021)
|
| 359 |
+
|
| 360 |
+
### Added
|
| 361 |
+
|
| 362 |
+
- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333)
|
| 363 |
+
|
| 364 |
+
### Fixed
|
| 365 |
+
|
| 366 |
+
- Handle cases where environment does not provide `select.poll` support. (Pull #331)
|
| 367 |
+
|
| 368 |
+
## 0.13.2 (April 29th, 2021)
|
| 369 |
+
|
| 370 |
+
### Added
|
| 371 |
+
|
| 372 |
+
- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313)
|
| 373 |
+
|
| 374 |
+
## 0.13.1 (April 28th, 2021)
|
| 375 |
+
|
| 376 |
+
### Fixed
|
| 377 |
+
|
| 378 |
+
- More resiliant testing for closed connections. (Pull #311)
|
| 379 |
+
- Don't raise exceptions on ungraceful connection closes. (Pull #310)
|
| 380 |
+
|
| 381 |
+
## 0.13.0 (April 21st, 2021)
|
| 382 |
+
|
| 383 |
+
The 0.13 release updates the core API in order to match the HTTPX Transport API,
|
| 384 |
+
introduced in HTTPX 0.18 onwards.
|
| 385 |
+
|
| 386 |
+
An example of making requests with the new interface is:
|
| 387 |
+
|
| 388 |
+
```python
|
| 389 |
+
with httpcore.SyncConnectionPool() as http:
|
| 390 |
+
status_code, headers, stream, extensions = http.handle_request(
|
| 391 |
+
method=b'GET',
|
| 392 |
+
url=(b'https', b'example.org', 443, b'/'),
|
| 393 |
+
headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')]
|
| 394 |
+
stream=httpcore.ByteStream(b''),
|
| 395 |
+
extensions={}
|
| 396 |
+
)
|
| 397 |
+
body = stream.read()
|
| 398 |
+
print(status_code, body)
|
| 399 |
+
```
|
| 400 |
+
|
| 401 |
+
### Changed
|
| 402 |
+
|
| 403 |
+
- The `.request()` method is now `handle_request()`. (Pull #296)
|
| 404 |
+
- The `.arequest()` method is now `.handle_async_request()`. (Pull #296)
|
| 405 |
+
- The `headers` argument is no longer optional. (Pull #296)
|
| 406 |
+
- The `stream` argument is no longer optional. (Pull #296)
|
| 407 |
+
- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296)
|
| 408 |
+
- The `"reason"` extension keyword is now named `"reason_phrase"`. (Pull #296)
|
| 409 |
+
- The `"reason_phrase"` and `"http_version"` extensions now use byte strings for their values. (Pull #296)
|
| 410 |
+
- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296)
|
| 411 |
+
|
| 412 |
+
### Added
|
| 413 |
+
|
| 414 |
+
- Streams now support a `.read()` interface. (Pull #296)
|
| 415 |
+
|
| 416 |
+
### Fixed
|
| 417 |
+
|
| 418 |
+
- Task cancellation no longer leaks connections from the connection pool. (Pull #305)
|
| 419 |
+
|
| 420 |
+
## 0.12.3 (December 7th, 2020)
|
| 421 |
+
|
| 422 |
+
### Fixed
|
| 423 |
+
|
| 424 |
+
- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167)
|
| 425 |
+
- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236)
|
| 426 |
+
- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243)
|
| 427 |
+
- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244)
|
| 428 |
+
- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249)
|
| 429 |
+
|
| 430 |
+
## 0.12.2 (November 20th, 2020)
|
| 431 |
+
|
| 432 |
+
### Fixed
|
| 433 |
+
|
| 434 |
+
- Properly wrap connect errors on the asyncio backend. (Pull #235)
|
| 435 |
+
- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237)
|
| 436 |
+
|
| 437 |
+
## 0.12.1 (November 7th, 2020)
|
| 438 |
+
|
| 439 |
+
### Added
|
| 440 |
+
|
| 441 |
+
- Add connect retries. (Pull #221)
|
| 442 |
+
|
| 443 |
+
### Fixed
|
| 444 |
+
|
| 445 |
+
- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185)
|
| 446 |
+
- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223)
|
| 447 |
+
- Properly wrap OS errors when using `trio`. (Pull #225)
|
| 448 |
+
|
| 449 |
+
## 0.12.0 (October 6th, 2020)
|
| 450 |
+
|
| 451 |
+
### Changed
|
| 452 |
+
|
| 453 |
+
- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104)
|
| 454 |
+
|
| 455 |
+
### Added
|
| 456 |
+
|
| 457 |
+
- Add Python 3.9 to officially supported versions.
|
| 458 |
+
|
| 459 |
+
### Fixed
|
| 460 |
+
|
| 461 |
+
- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201)
|
| 462 |
+
|
| 463 |
+
## 0.11.1 (September 28nd, 2020)
|
| 464 |
+
|
| 465 |
+
### Fixed
|
| 466 |
+
|
| 467 |
+
- Add await to async semaphore release() coroutine (#197)
|
| 468 |
+
- Drop incorrect curio classifier (#192)
|
| 469 |
+
|
| 470 |
+
## 0.11.0 (September 22nd, 2020)
|
| 471 |
+
|
| 472 |
+
The Transport API with 0.11.0 has a couple of significant changes.
|
| 473 |
+
|
| 474 |
+
Firstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features
|
| 475 |
+
such as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections.
|
| 476 |
+
|
| 477 |
+
The interface changes from:
|
| 478 |
+
|
| 479 |
+
```python
|
| 480 |
+
def request(method, url, headers, stream, timeout):
|
| 481 |
+
return (http_version, status_code, reason, headers, stream)
|
| 482 |
+
```
|
| 483 |
+
|
| 484 |
+
To instead including an optional dictionary of extensions on the request and response:
|
| 485 |
+
|
| 486 |
+
```python
|
| 487 |
+
def request(method, url, headers, stream, ext):
|
| 488 |
+
return (status_code, headers, stream, ext)
|
| 489 |
+
```
|
| 490 |
+
|
| 491 |
+
Having an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes.
|
| 492 |
+
|
| 493 |
+
In particular:
|
| 494 |
+
|
| 495 |
+
* Trailing headers support.
|
| 496 |
+
* HTTP/2 Server Push
|
| 497 |
+
* sendfile.
|
| 498 |
+
* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming.
|
| 499 |
+
* Exposing debug information out of the API, including template name, template context.
|
| 500 |
+
|
| 501 |
+
Currently extensions are limited to:
|
| 502 |
+
|
| 503 |
+
* request: `timeout` - Optional. Timeout dictionary.
|
| 504 |
+
* response: `http_version` - Optional. Include the HTTP version used on the response.
|
| 505 |
+
* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*.
|
| 506 |
+
|
| 507 |
+
See https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this.
|
| 508 |
+
|
| 509 |
+
Secondly, the async version of `request` is now namespaced as `arequest`.
|
| 510 |
+
|
| 511 |
+
This allows concrete transports to support both sync and async implementations on the same class.
|
| 512 |
+
|
| 513 |
+
### Added
|
| 514 |
+
|
| 515 |
+
- Add curio support. (Pull #168)
|
| 516 |
+
- Add anyio support, with `backend="anyio"`. (Pull #169)
|
| 517 |
+
|
| 518 |
+
### Changed
|
| 519 |
+
|
| 520 |
+
- Update the Transport API to use 'ext' for optional extensions. (Pull #190)
|
| 521 |
+
- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189)
|
| 522 |
+
|
| 523 |
+
## 0.10.2 (August 20th, 2020)
|
| 524 |
+
|
| 525 |
+
### Added
|
| 526 |
+
|
| 527 |
+
- Added Unix Domain Socket support. (Pull #139)
|
| 528 |
+
|
| 529 |
+
### Fixed
|
| 530 |
+
|
| 531 |
+
- Always include the port on proxy CONNECT requests. (Pull #154)
|
| 532 |
+
- Fix `max_keepalive_connections` configuration. (Pull #153)
|
| 533 |
+
- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164)
|
| 534 |
+
|
| 535 |
+
## 0.10.1 (August 7th, 2020)
|
| 536 |
+
|
| 537 |
+
- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes.
|
| 538 |
+
|
| 539 |
+
## 0.10.0 (August 7th, 2020)
|
| 540 |
+
|
| 541 |
+
The most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional.
|
| 542 |
+
|
| 543 |
+
Use either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support.
|
| 544 |
+
|
| 545 |
+
### Added
|
| 546 |
+
|
| 547 |
+
- HTTP/2 support becomes optional. (Pull #121, #130)
|
| 548 |
+
- Add `local_address=...` support. (Pull #100, #134)
|
| 549 |
+
- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133)
|
| 550 |
+
- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129)
|
| 551 |
+
- Add `UnsupportedProtocol` exception. (Pull #128)
|
| 552 |
+
- Add `.get_connection_info()` method. (Pull #102, #137)
|
| 553 |
+
- Add better TRACE logs. (Pull #101)
|
| 554 |
+
|
| 555 |
+
### Changed
|
| 556 |
+
|
| 557 |
+
- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140)
|
| 558 |
+
|
| 559 |
+
### Fixed
|
| 560 |
+
|
| 561 |
+
- Improve handling of server disconnects. (Pull #112)
|
| 562 |
+
|
| 563 |
+
## 0.9.1 (May 27th, 2020)
|
| 564 |
+
|
| 565 |
+
### Fixed
|
| 566 |
+
|
| 567 |
+
- Proper host resolution for sync case, including IPv6 support. (Pull #97)
|
| 568 |
+
- Close outstanding connections when connection pool is closed. (Pull #98)
|
| 569 |
+
|
| 570 |
+
## 0.9.0 (May 21th, 2020)
|
| 571 |
+
|
| 572 |
+
### Changed
|
| 573 |
+
|
| 574 |
+
- URL port becomes an `Optional[int]` instead of `int`. (Pull #92)
|
| 575 |
+
|
| 576 |
+
### Fixed
|
| 577 |
+
|
| 578 |
+
- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90)
|
| 579 |
+
- Remove incorrect debug log. (Pull #83)
|
| 580 |
+
|
| 581 |
+
## 0.8.4 (May 11th, 2020)
|
| 582 |
+
|
| 583 |
+
### Added
|
| 584 |
+
|
| 585 |
+
- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables
|
| 586 |
+
and TRACE level logging. (Pull #79)
|
| 587 |
+
|
| 588 |
+
### Fixed
|
| 589 |
+
|
| 590 |
+
- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81)
|
| 591 |
+
|
| 592 |
+
## 0.8.3 (May 6rd, 2020)
|
| 593 |
+
|
| 594 |
+
### Fixed
|
| 595 |
+
|
| 596 |
+
- Include `Host` and `Accept` headers on proxy "CONNECT" requests.
|
| 597 |
+
- De-duplicate any headers also contained in proxy_headers.
|
| 598 |
+
- HTTP/2 flag not being passed down to proxy connections.
|
| 599 |
+
|
| 600 |
+
## 0.8.2 (May 3rd, 2020)
|
| 601 |
+
|
| 602 |
+
### Fixed
|
| 603 |
+
|
| 604 |
+
- Fix connections using proxy forwarding requests not being added to the
|
| 605 |
+
connection pool properly. (Pull #70)
|
| 606 |
+
|
| 607 |
+
## 0.8.1 (April 30th, 2020)
|
| 608 |
+
|
| 609 |
+
### Changed
|
| 610 |
+
|
| 611 |
+
- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts.
|
| 612 |
+
|
| 613 |
+
## 0.8.0 (April 30th, 2020)
|
| 614 |
+
|
| 615 |
+
### Fixed
|
| 616 |
+
|
| 617 |
+
- Fixed tunnel proxy support.
|
| 618 |
+
|
| 619 |
+
### Added
|
| 620 |
+
|
| 621 |
+
- New `TimeoutException` base class.
|
| 622 |
+
|
| 623 |
+
## 0.7.0 (March 5th, 2020)
|
| 624 |
+
|
| 625 |
+
- First integration with HTTPX.
|
.venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
httpcore-1.0.9.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
|
| 2 |
+
httpcore-1.0.9.dist-info/METADATA,sha256=_i1P2mGZEol4d54M8n88BFxTGGP83Zh-rMdPOhjUHCE,21529
|
| 3 |
+
httpcore-1.0.9.dist-info/RECORD,,
|
| 4 |
+
httpcore-1.0.9.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 5 |
+
httpcore-1.0.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
| 6 |
+
httpcore-1.0.9.dist-info/licenses/LICENSE.md,sha256=_ctZFUx0y6uhahEkL3dAvqnyPW_rVUeRfYxflKgDkqU,1518
|
| 7 |
+
httpcore/__init__.py,sha256=9kT_kqChCCJUTHww24ZmR_ezcdbpRYWksD-gYNzkZP8,3445
|
| 8 |
+
httpcore/_api.py,sha256=unZmeDschBWCGCPCwkS3Wot9euK6bg_kKxLtGTxw214,3146
|
| 9 |
+
httpcore/_async/__init__.py,sha256=EWdl2v4thnAHzJpqjU4h2a8DUiGAvNiWrkii9pfhTf0,1221
|
| 10 |
+
httpcore/_async/connection.py,sha256=6OcPXqMEfc0BU38_-iHUNDd1vKSTc2UVT09XqNb_BOk,8449
|
| 11 |
+
httpcore/_async/connection_pool.py,sha256=DOIQ2s2ZCf9qfwxhzMprTPLqCL8OxGXiKF6qRHxvVyY,17307
|
| 12 |
+
httpcore/_async/http11.py,sha256=-qM9bV7PjSQF5vxs37-eUXOIFwbIjPcZbNliuX9TtBw,13880
|
| 13 |
+
httpcore/_async/http2.py,sha256=azX1fcmtXaIwjputFlZ4vd92J8xwjGOa9ax9QIv4394,23936
|
| 14 |
+
httpcore/_async/http_proxy.py,sha256=2zVkrlv-Ds-rWGaqaXlrhEJiAQFPo23BT3Gq_sWoBXU,14701
|
| 15 |
+
httpcore/_async/interfaces.py,sha256=jTiaWL83pgpGC9ziv90ZfwaKNMmHwmOalzaKiuTxATo,4455
|
| 16 |
+
httpcore/_async/socks_proxy.py,sha256=lLKgLlggPfhFlqi0ODeBkOWvt9CghBBUyqsnsU1tx6Q,13841
|
| 17 |
+
httpcore/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 18 |
+
httpcore/_backends/anyio.py,sha256=x8PgEhXRC8bVqsdzk_YJx8Y6d9Tub06CuUSwnbmtqoY,5252
|
| 19 |
+
httpcore/_backends/auto.py,sha256=zO136PKZmsaTDK-HRk84eA-MUg8_2wJf4NvmK432Aio,1662
|
| 20 |
+
httpcore/_backends/base.py,sha256=aShgRdZnMmRhFWHetjumlM73f8Kz1YOAyCUP_4kHslA,3042
|
| 21 |
+
httpcore/_backends/mock.py,sha256=er9T436uSe7NLrfiLa4x6Nuqg5ivQ693CxWYCWsgbH4,4077
|
| 22 |
+
httpcore/_backends/sync.py,sha256=bhE4d9iK9Umxdsdsgm2EfKnXaBms2WggGYU-7jmUujU,7977
|
| 23 |
+
httpcore/_backends/trio.py,sha256=LHu4_Mr5MswQmmT3yE4oLgf9b_JJfeVS4BjDxeJc7Ro,5996
|
| 24 |
+
httpcore/_exceptions.py,sha256=looCKga3_YVYu3s-d3L9RMPRJyhsY7fiuuGxvkOD0c0,1184
|
| 25 |
+
httpcore/_models.py,sha256=IO2CcXcdpovRcLTdGFGB6RyBZdEm2h_TOmoCc4rEKho,17623
|
| 26 |
+
httpcore/_ssl.py,sha256=srqmSNU4iOUvWF-SrJvb8G_YEbHFELOXQOwdDIBTS9c,187
|
| 27 |
+
httpcore/_sync/__init__.py,sha256=JBDIgXt5la1LCJ1sLQeKhjKFpLnpNr8Svs6z2ni3fgg,1141
|
| 28 |
+
httpcore/_sync/connection.py,sha256=9exGOb3PB-Mp2T1-sckSeL2t-tJ_9-NXomV8ihmWCgU,8238
|
| 29 |
+
httpcore/_sync/connection_pool.py,sha256=a-T8LTsUxc7r0Ww1atfHSDoWPjQ0fA8Ul7S3-F0Mj70,16955
|
| 30 |
+
httpcore/_sync/http11.py,sha256=IFobD1Md5JFlJGKWnh1_Q3epikUryI8qo09v8MiJIEA,13476
|
| 31 |
+
httpcore/_sync/http2.py,sha256=AxU4yhcq68Bn5vqdJYtiXKYUj7nvhYbxz3v4rT4xnvA,23400
|
| 32 |
+
httpcore/_sync/http_proxy.py,sha256=_al_6crKuEZu2wyvu493RZImJdBJnj5oGKNjLOJL2Zo,14463
|
| 33 |
+
httpcore/_sync/interfaces.py,sha256=snXON42vUDHO5JBJvo8D4VWk2Wat44z2OXXHDrjbl94,4344
|
| 34 |
+
httpcore/_sync/socks_proxy.py,sha256=zegZW9Snqj2_992DFJa8_CppOVBkVL4AgwduRkStakQ,13614
|
| 35 |
+
httpcore/_synchronization.py,sha256=zSi13mAColBnknjZBknUC6hKNDQT4C6ijnezZ-r0T2s,9434
|
| 36 |
+
httpcore/_trace.py,sha256=ck6ZoIzYTkdNAIfq5MGeKqBXDtqjOX-qfYwmZFbrGco,3952
|
| 37 |
+
httpcore/_utils.py,sha256=_RLgXYOAYC350ikALV59GZ68IJrdocRZxPs9PjmzdFY,1537
|
| 38 |
+
httpcore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
.venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/REQUESTED
ADDED
|
File without changes
|
.venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: hatchling 1.27.0
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-any
|
.venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright © 2020, [Encode OSS Ltd](https://www.encode.io/).
|
| 2 |
+
All rights reserved.
|
| 3 |
+
|
| 4 |
+
Redistribution and use in source and binary forms, with or without
|
| 5 |
+
modification, are permitted provided that the following conditions are met:
|
| 6 |
+
|
| 7 |
+
* Redistributions of source code must retain the above copyright notice, this
|
| 8 |
+
list of conditions and the following disclaimer.
|
| 9 |
+
|
| 10 |
+
* Redistributions in binary form must reproduce the above copyright notice,
|
| 11 |
+
this list of conditions and the following disclaimer in the documentation
|
| 12 |
+
and/or other materials provided with the distribution.
|
| 13 |
+
|
| 14 |
+
* Neither the name of the copyright holder nor the names of its
|
| 15 |
+
contributors may be used to endorse or promote products derived from
|
| 16 |
+
this software without specific prior written permission.
|
| 17 |
+
|
| 18 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
| 19 |
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| 20 |
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
| 21 |
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
| 22 |
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
| 23 |
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
| 24 |
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
| 25 |
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
| 26 |
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 27 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.venv/lib/python3.11/site-packages/httpcore/__init__.py
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ._api import request, stream
|
| 2 |
+
from ._async import (
|
| 3 |
+
AsyncConnectionInterface,
|
| 4 |
+
AsyncConnectionPool,
|
| 5 |
+
AsyncHTTP2Connection,
|
| 6 |
+
AsyncHTTP11Connection,
|
| 7 |
+
AsyncHTTPConnection,
|
| 8 |
+
AsyncHTTPProxy,
|
| 9 |
+
AsyncSOCKSProxy,
|
| 10 |
+
)
|
| 11 |
+
from ._backends.base import (
|
| 12 |
+
SOCKET_OPTION,
|
| 13 |
+
AsyncNetworkBackend,
|
| 14 |
+
AsyncNetworkStream,
|
| 15 |
+
NetworkBackend,
|
| 16 |
+
NetworkStream,
|
| 17 |
+
)
|
| 18 |
+
from ._backends.mock import AsyncMockBackend, AsyncMockStream, MockBackend, MockStream
|
| 19 |
+
from ._backends.sync import SyncBackend
|
| 20 |
+
from ._exceptions import (
|
| 21 |
+
ConnectError,
|
| 22 |
+
ConnectionNotAvailable,
|
| 23 |
+
ConnectTimeout,
|
| 24 |
+
LocalProtocolError,
|
| 25 |
+
NetworkError,
|
| 26 |
+
PoolTimeout,
|
| 27 |
+
ProtocolError,
|
| 28 |
+
ProxyError,
|
| 29 |
+
ReadError,
|
| 30 |
+
ReadTimeout,
|
| 31 |
+
RemoteProtocolError,
|
| 32 |
+
TimeoutException,
|
| 33 |
+
UnsupportedProtocol,
|
| 34 |
+
WriteError,
|
| 35 |
+
WriteTimeout,
|
| 36 |
+
)
|
| 37 |
+
from ._models import URL, Origin, Proxy, Request, Response
|
| 38 |
+
from ._ssl import default_ssl_context
|
| 39 |
+
from ._sync import (
|
| 40 |
+
ConnectionInterface,
|
| 41 |
+
ConnectionPool,
|
| 42 |
+
HTTP2Connection,
|
| 43 |
+
HTTP11Connection,
|
| 44 |
+
HTTPConnection,
|
| 45 |
+
HTTPProxy,
|
| 46 |
+
SOCKSProxy,
|
| 47 |
+
)
|
| 48 |
+
|
| 49 |
+
# The 'httpcore.AnyIOBackend' class is conditional on 'anyio' being installed.
|
| 50 |
+
try:
|
| 51 |
+
from ._backends.anyio import AnyIOBackend
|
| 52 |
+
except ImportError: # pragma: nocover
|
| 53 |
+
|
| 54 |
+
class AnyIOBackend: # type: ignore
|
| 55 |
+
def __init__(self, *args, **kwargs): # type: ignore
|
| 56 |
+
msg = (
|
| 57 |
+
"Attempted to use 'httpcore.AnyIOBackend' but 'anyio' is not installed."
|
| 58 |
+
)
|
| 59 |
+
raise RuntimeError(msg)
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
# The 'httpcore.TrioBackend' class is conditional on 'trio' being installed.
|
| 63 |
+
try:
|
| 64 |
+
from ._backends.trio import TrioBackend
|
| 65 |
+
except ImportError: # pragma: nocover
|
| 66 |
+
|
| 67 |
+
class TrioBackend: # type: ignore
|
| 68 |
+
def __init__(self, *args, **kwargs): # type: ignore
|
| 69 |
+
msg = "Attempted to use 'httpcore.TrioBackend' but 'trio' is not installed."
|
| 70 |
+
raise RuntimeError(msg)
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
__all__ = [
|
| 74 |
+
# top-level requests
|
| 75 |
+
"request",
|
| 76 |
+
"stream",
|
| 77 |
+
# models
|
| 78 |
+
"Origin",
|
| 79 |
+
"URL",
|
| 80 |
+
"Request",
|
| 81 |
+
"Response",
|
| 82 |
+
"Proxy",
|
| 83 |
+
# async
|
| 84 |
+
"AsyncHTTPConnection",
|
| 85 |
+
"AsyncConnectionPool",
|
| 86 |
+
"AsyncHTTPProxy",
|
| 87 |
+
"AsyncHTTP11Connection",
|
| 88 |
+
"AsyncHTTP2Connection",
|
| 89 |
+
"AsyncConnectionInterface",
|
| 90 |
+
"AsyncSOCKSProxy",
|
| 91 |
+
# sync
|
| 92 |
+
"HTTPConnection",
|
| 93 |
+
"ConnectionPool",
|
| 94 |
+
"HTTPProxy",
|
| 95 |
+
"HTTP11Connection",
|
| 96 |
+
"HTTP2Connection",
|
| 97 |
+
"ConnectionInterface",
|
| 98 |
+
"SOCKSProxy",
|
| 99 |
+
# network backends, implementations
|
| 100 |
+
"SyncBackend",
|
| 101 |
+
"AnyIOBackend",
|
| 102 |
+
"TrioBackend",
|
| 103 |
+
# network backends, mock implementations
|
| 104 |
+
"AsyncMockBackend",
|
| 105 |
+
"AsyncMockStream",
|
| 106 |
+
"MockBackend",
|
| 107 |
+
"MockStream",
|
| 108 |
+
# network backends, interface
|
| 109 |
+
"AsyncNetworkStream",
|
| 110 |
+
"AsyncNetworkBackend",
|
| 111 |
+
"NetworkStream",
|
| 112 |
+
"NetworkBackend",
|
| 113 |
+
# util
|
| 114 |
+
"default_ssl_context",
|
| 115 |
+
"SOCKET_OPTION",
|
| 116 |
+
# exceptions
|
| 117 |
+
"ConnectionNotAvailable",
|
| 118 |
+
"ProxyError",
|
| 119 |
+
"ProtocolError",
|
| 120 |
+
"LocalProtocolError",
|
| 121 |
+
"RemoteProtocolError",
|
| 122 |
+
"UnsupportedProtocol",
|
| 123 |
+
"TimeoutException",
|
| 124 |
+
"PoolTimeout",
|
| 125 |
+
"ConnectTimeout",
|
| 126 |
+
"ReadTimeout",
|
| 127 |
+
"WriteTimeout",
|
| 128 |
+
"NetworkError",
|
| 129 |
+
"ConnectError",
|
| 130 |
+
"ReadError",
|
| 131 |
+
"WriteError",
|
| 132 |
+
]
|
| 133 |
+
|
| 134 |
+
__version__ = "1.0.9"
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
__locals = locals()
|
| 138 |
+
for __name in __all__:
|
| 139 |
+
# Exclude SOCKET_OPTION, it causes AttributeError on Python 3.14
|
| 140 |
+
if not __name.startswith(("__", "SOCKET_OPTION")):
|
| 141 |
+
setattr(__locals[__name], "__module__", "httpcore") # noqa
|
.venv/lib/python3.11/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (3.95 kB). View file
|
|
|
.venv/lib/python3.11/site-packages/httpcore/__pycache__/_api.cpython-311.pyc
ADDED
|
Binary file (4.11 kB). View file
|
|
|
.venv/lib/python3.11/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc
ADDED
|
Binary file (3.83 kB). View file
|
|
|
.venv/lib/python3.11/site-packages/httpcore/__pycache__/_models.cpython-311.pyc
ADDED
|
Binary file (24.6 kB). View file
|
|
|
.venv/lib/python3.11/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc
ADDED
|
Binary file (658 Bytes). View file
|
|
|