From 284a240ecaafd04b41396b1b2df60f2662aec31a Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 14 Nov 2024 11:41:17 -0500 Subject: [PATCH 01/10] update default_language_version --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d89bc25..6aa44d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ ci: autofix_prs: false # Comment "pre-commit.ci autofix" on a PR to trigger default_language_version: - python: python3 + python: python3.9 repos: - repo: https://github.com/pre-commit/pre-commit-hooks From 55b8cef438ca2c61462069241ae425ada59ef56e Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 14 Nov 2024 11:56:31 -0500 Subject: [PATCH 02/10] remove unused args and update hook exclusions --- .pre-commit-config.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6aa44d4..1288790 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,6 @@ repos: args: [ '--allow-multiple-documents' ] - id: check-toml - id: check-json - args: ['--autofix', '--no-ensure-ascii', '--no-sort-keys'] # Check for common mistakes - id: check-added-large-files - id: check-case-conflict @@ -29,12 +28,12 @@ repos: - id: destroyed-symlinks - id: detect-private-key - id: end-of-file-fixer - exclude: ".ipynb" + exclude_types: ["jupyter", "text"] - id: mixed-line-ending - id: no-commit-to-branch # protects `main` by default - id: debug-statements - id: trailing-whitespace - exclude: ".txt" + exclude_types: ["jupyter", "text"] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.7.3 From 3931a1639e6627c405ec98db691cfcf76c9b7298 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:58:10 +0000 Subject: [PATCH 03/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/example/ncompare-example-usage.ipynb | 1060 ++++++++++----------- ncompare/console.py | 16 +- ncompare/core.py | 75 +- ncompare/printing.py | 29 +- ncompare/sequence_operations.py | 5 +- ncompare/utils.py | 1 + tests/conftest.py | 86 +- tests/data/create_a-b_test_netcdfs.ipynb | 283 +++--- tests/test_cli.py | 4 +- tests/test_complete_file_output.py | 10 +- tests/test_core.py | 21 +- tests/test_printing.py | 2 +- tests/test_sequence_operations.py | 18 +- tests/test_utils.py | 2 +- 14 files changed, 843 insertions(+), 769 deletions(-) diff --git a/docs/example/ncompare-example-usage.ipynb b/docs/example/ncompare-example-usage.ipynb index 14afb08..1fa7d2d 100644 --- a/docs/example/ncompare-example-usage.ipynb +++ b/docs/example/ncompare-example-usage.ipynb @@ -1,538 +1,538 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "214b2e0a-4a8a-48bb-b1f5-b457b69ece57", - "metadata": {}, - "source": [ - "# Brief demonstration of `ncompare`: to compare the structure, groups, variables, and attributes of two netCDF files\"" - ] - }, - { - "cell_type": "markdown", - "id": "351983d5-1c2f-45ee-8a24-cd2a3b621405", - "metadata": {}, - "source": [ - "Installation instructions for `ncompare` can be found in either of these locations:\n", - "\n", - "- [GitHub repository](https://github.com/nasa/ncompare)\n", - "- [Pip entry](https://pypi.org/project/ncompare/)" - ] - }, - { - "cell_type": "markdown", - "id": "569c088b-0929-43c3-8d0f-6da3b6c89cce", - "metadata": {}, - "source": [ - "## `ncompare`'s command line arguments, provided by the `--help` description" - ] - }, - { - "cell_type": "markdown", - "id": "6a145933-e57b-4e33-bed1-95b13800878d", - "metadata": {}, - "source": [ - "***✍️ Syntax Note:*** Commands preceeded by an exclamation point \"!\" \n", - "(which is needed to [run shell commands in a Jupyter notebook](https://stackoverflow.com/a/48529220)) can be run from a terminal. \n", - "In a shell/terminal, the exclamation point should not be used." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "07e397b3-4964-4a90-b7f5-ae35185f86e5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "usage: ncompare [-h] [-v COMPARISON_VAR_NAME] [-g COMPARISON_VAR_GROUP]\n", - " [--only-diffs] [--file-text FILE_TEXT] [--file-csv FILE_CSV]\n", - " [--file-xlsx FILE_XLSX] [--no-color] [--show-attributes]\n", - " [--show-chunks]\n", - " [--column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS]\n", - " [--version]\n", - " nc_a nc_b\n", - "\n", - "Compare the variables contained within two different NetCDF datasets\n", - "\n", - "positional arguments:\n", - " nc_a First NetCDF file\n", - " nc_b First NetCDF file\n", - "\n", - "options:\n", - " -h, --help show this help message and exit\n", - " -v COMPARISON_VAR_NAME, --comparison_var_name COMPARISON_VAR_NAME\n", - " Comparison variable name\n", - " -g COMPARISON_VAR_GROUP, --comparison_var_group COMPARISON_VAR_GROUP\n", - " Comparison variable group\n", - " --only-diffs Only display variables and attributes that are\n", - " different\n", - " --file-text FILE_TEXT\n", - " A text file to which the output will be written.\n", - " --file-csv FILE_CSV A csv (comma separated values) file to which the\n", - " output will be written.\n", - " --file-xlsx FILE_XLSX\n", - " An Excel file to which the output will be written.\n", - " --no-color Turn off all colorized output\n", - " --show-attributes Include variable attributes in comparison\n", - " --show-chunks Include chunk sizes in the table that compares\n", - " variables\n", - " --column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS\n", - " Width, in number of characters, of the three columns\n", - " in the comparison report\n", - " --version Show the current version.\n" - ] - } - ], - "source": [ - "! ncompare --help" - ] - }, - { - "cell_type": "markdown", - "id": "4028d153-a1d2-4f8b-aad5-ca736b6c8292", - "metadata": {}, - "source": [ - "## Example 1: Two netCDF files with the same groups, variables, and attributes\n", - "----" - ] - }, - { - "cell_type": "markdown", - "id": "6992fa0f-7460-42c8-b0d4-d0634ddcc798", - "metadata": {}, - "source": [ - "Data files are first defined. The examples here rely on three files: two from NOAA National Centers of Environmental Information's (NCEI) (a) _[Global Precipitation Climatology Project (GPCP) Climate Data Record (CDR), Monthly V2.3](https://doi.org/10.7289/V56971M6)_ and one from the (b) _[Climate Data Record (CDR) of Precipitation Estimation from Remotely Sensed Information using Artificial Neural Networks (PERSIANN-CDR), Version 1 Revision 1)](https://doi.org/10.7289/V51V5BWQ)_ (a daily quasi-global precipitation product), accessible via [this GPCP catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html) and [this PERSIANN catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/persiann/catalog.html):\n", - "\n", - "1. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\n", - "2. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\n", - "3. https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "136bbeb8-6d74-4373-8ef7-1c20c1fe6afc", - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "\n", - "file_urls = [\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\",\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\",\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc\",\n", - "]\n", - "\n", - "file_names = [Path(url).name for url in file_urls]" - ] - }, - { - "cell_type": "markdown", - "id": "2b635084-8b99-4824-9f36-27b1c31bd2a5", - "metadata": {}, - "source": [ - "To download these files (e.g., for the first time running this notebook), run the following:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "10a025b9-4483-4925-873e-6653b64441e3", - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "\n", - "for url, filename in zip(file_urls, file_names):\n", - " r = requests.get(url, allow_redirects=True)\n", - " open(filename, 'wb').write(r.content)" - ] - }, - { - "cell_type": "markdown", - "id": "56b0eeba-20ed-46ed-a14b-593b59c2d9cd", - "metadata": {}, - "source": [ - "Next, we pass the two filepaths to `ncompare`, and any differences would be printed in red. In this case, there are no differences; therefore, all of the variables are printed in black." - ] - }, - { - "cell_type": "markdown", - "id": "a2ea8513-19ce-4089-8494-e0fba9aea789", - "metadata": {}, - "source": [ - "***✍️ Syntax Note:*** the curly brackets, \"{\" and \"}\", that follow are simply a way to [substitute python variables into a shell command](https://stackoverflow.com/a/35497161). \n", - "In a shell/terminal, one can just write out the full arguments, separated by spaces.\n", - "For example, the following command would be run at the terminal as `ncompare notebook_example_data/MOP03JM-202205-L3V95.6.3.he5 notebook_example_data/MOP03JM-202205-L3V95.9.3.he5`\n", - "\n", - "***✍️ `ncompare` Options Note:*** the `--column-widths 33 26 26` arguments are optional, and they are being used here to shrink the columns width-wise from their defaults to a size that fits better in the GitHub notebook renderer." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "43cace42-aa55-469e-84d9-13a45115267e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: gpcp_v02r03_monthly_d202302_c20230505.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True.\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36m[('latitude', 72), ('longitude', 144), ('nv', 2), ('time', 1)]\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -------------------------/ -------------------------/\u001b[0m\n", - "\u001b[0m num variables in group: 8 8\u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (72,) (72,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (144,) (144,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 8 8\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 0 0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --column-widths 33 26 26 {file_names[0]} {file_names[1]}" - ] - }, - { - "cell_type": "markdown", - "id": "220888cd-92d1-4bb4-9b5d-8187f89bda87", - "metadata": {}, - "source": [ - "## Example 2: Two netCDF files with different groups, variables, and attributes\n", - "----" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c48728a0-1379-4a05-b7e6-ad50694510df", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", - " new_vars[k] = decode_cf_variable(\n", - "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", - "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", - "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", - "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --column-widths 33 30 30 {file_names[0]} {file_names[2]}" - ] - }, + "cells": [ + { + "cell_type": "markdown", + "id": "214b2e0a-4a8a-48bb-b1f5-b457b69ece57", + "metadata": {}, + "source": [ + "# Brief demonstration of `ncompare`: to compare the structure, groups, variables, and attributes of two netCDF files\"" + ] + }, + { + "cell_type": "markdown", + "id": "351983d5-1c2f-45ee-8a24-cd2a3b621405", + "metadata": {}, + "source": [ + "Installation instructions for `ncompare` can be found in either of these locations:\n", + "\n", + "- [GitHub repository](https://github.com/nasa/ncompare)\n", + "- [Pip entry](https://pypi.org/project/ncompare/)" + ] + }, + { + "cell_type": "markdown", + "id": "569c088b-0929-43c3-8d0f-6da3b6c89cce", + "metadata": {}, + "source": [ + "## `ncompare`'s command line arguments, provided by the `--help` description" + ] + }, + { + "cell_type": "markdown", + "id": "6a145933-e57b-4e33-bed1-95b13800878d", + "metadata": {}, + "source": [ + "***✍️ Syntax Note:*** Commands preceeded by an exclamation point \"!\" \n", + "(which is needed to [run shell commands in a Jupyter notebook](https://stackoverflow.com/a/48529220)) can be run from a terminal. \n", + "In a shell/terminal, the exclamation point should not be used." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "07e397b3-4964-4a90-b7f5-ae35185f86e5", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "id": "11a23041-6f24-491b-a9e3-124ace151736", - "metadata": {}, - "source": [ - "#### More file details can be examined by using the `--show-attributes` and `--show-chunks` options" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "usage: ncompare [-h] [-v COMPARISON_VAR_NAME] [-g COMPARISON_VAR_GROUP]\n", + " [--only-diffs] [--file-text FILE_TEXT] [--file-csv FILE_CSV]\n", + " [--file-xlsx FILE_XLSX] [--no-color] [--show-attributes]\n", + " [--show-chunks]\n", + " [--column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS]\n", + " [--version]\n", + " nc_a nc_b\n", + "\n", + "Compare the variables contained within two different NetCDF datasets\n", + "\n", + "positional arguments:\n", + " nc_a First NetCDF file\n", + " nc_b First NetCDF file\n", + "\n", + "options:\n", + " -h, --help show this help message and exit\n", + " -v COMPARISON_VAR_NAME, --comparison_var_name COMPARISON_VAR_NAME\n", + " Comparison variable name\n", + " -g COMPARISON_VAR_GROUP, --comparison_var_group COMPARISON_VAR_GROUP\n", + " Comparison variable group\n", + " --only-diffs Only display variables and attributes that are\n", + " different\n", + " --file-text FILE_TEXT\n", + " A text file to which the output will be written.\n", + " --file-csv FILE_CSV A csv (comma separated values) file to which the\n", + " output will be written.\n", + " --file-xlsx FILE_XLSX\n", + " An Excel file to which the output will be written.\n", + " --no-color Turn off all colorized output\n", + " --show-attributes Include variable attributes in comparison\n", + " --show-chunks Include chunk sizes in the table that compares\n", + " variables\n", + " --column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS\n", + " Width, in number of characters, of the three columns\n", + " in the comparison report\n", + " --version Show the current version.\n" + ] + } + ], + "source": [ + "! ncompare --help" + ] + }, + { + "cell_type": "markdown", + "id": "4028d153-a1d2-4f8b-aad5-ca736b6c8292", + "metadata": {}, + "source": [ + "## Example 1: Two netCDF files with the same groups, variables, and attributes\n", + "----" + ] + }, + { + "cell_type": "markdown", + "id": "6992fa0f-7460-42c8-b0d4-d0634ddcc798", + "metadata": {}, + "source": [ + "Data files are first defined. The examples here rely on three files: two from NOAA National Centers of Environmental Information's (NCEI) (a) _[Global Precipitation Climatology Project (GPCP) Climate Data Record (CDR), Monthly V2.3](https://doi.org/10.7289/V56971M6)_ and one from the (b) _[Climate Data Record (CDR) of Precipitation Estimation from Remotely Sensed Information using Artificial Neural Networks (PERSIANN-CDR), Version 1 Revision 1)](https://doi.org/10.7289/V51V5BWQ)_ (a daily quasi-global precipitation product), accessible via [this GPCP catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html) and [this PERSIANN catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/persiann/catalog.html):\n", + "\n", + "1. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\n", + "2. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\n", + "3. https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "136bbeb8-6d74-4373-8ef7-1c20c1fe6afc", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "file_urls = [\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\",\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\",\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc\",\n", + "]\n", + "\n", + "file_names = [Path(url).name for url in file_urls]" + ] + }, + { + "cell_type": "markdown", + "id": "2b635084-8b99-4824-9f36-27b1c31bd2a5", + "metadata": {}, + "source": [ + "To download these files (e.g., for the first time running this notebook), run the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "10a025b9-4483-4925-873e-6653b64441e3", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "for url, filename in zip(file_urls, file_names):\n", + " r = requests.get(url, allow_redirects=True)\n", + " open(filename, \"wb\").write(r.content)" + ] + }, + { + "cell_type": "markdown", + "id": "56b0eeba-20ed-46ed-a14b-593b59c2d9cd", + "metadata": {}, + "source": [ + "Next, we pass the two filepaths to `ncompare`, and any differences would be printed in red. In this case, there are no differences; therefore, all of the variables are printed in black." + ] + }, + { + "cell_type": "markdown", + "id": "a2ea8513-19ce-4089-8494-e0fba9aea789", + "metadata": {}, + "source": [ + "***✍️ Syntax Note:*** the curly brackets, \"{\" and \"}\", that follow are simply a way to [substitute python variables into a shell command](https://stackoverflow.com/a/35497161). \n", + "In a shell/terminal, one can just write out the full arguments, separated by spaces.\n", + "For example, the following command would be run at the terminal as `ncompare notebook_example_data/MOP03JM-202205-L3V95.6.3.he5 notebook_example_data/MOP03JM-202205-L3V95.9.3.he5`\n", + "\n", + "***✍️ `ncompare` Options Note:*** the `--column-widths 33 26 26` arguments are optional, and they are being used here to shrink the columns width-wise from their defaults to a size that fits better in the GitHub notebook renderer." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "43cace42-aa55-469e-84d9-13a45115267e", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 6, - "id": "1dd4c51a-394c-4569-b8b1-053743e63cb9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", - " new_vars[k] = decode_cf_variable(\n", - "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", - "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", - "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", - "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: latitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 60.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: longitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 360.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record (CDR) of GPCP Monthly Satellite-Gauge Combined Precipitation \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation amount \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA CDR of GPCP Satellite-Gauge Combined Precipitation Error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_method: sum\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record of PERSIANN-CDR daily precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation_amount\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 999999.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcalendar: Gregorian \u001b[0m\n", - "\u001b[0m long_name: time time\u001b[0m\n", - "\u001b[0m standard_name: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --show-attributes --show-chunks --column-widths 33 30 30 {file_names[0]} {file_names[2]}" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: gpcp_v02r03_monthly_d202302_c20230505.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True.\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36m[('latitude', 72), ('longitude', 144), ('nv', 2), ('time', 1)]\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -------------------------/ -------------------------/\u001b[0m\n", + "\u001b[0m num variables in group: 8 8\u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (72,) (72,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (144,) (144,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 8 8\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 0 0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m" + ] + } + ], + "source": [ + "! ncompare --column-widths 33 26 26 {file_names[0]} {file_names[1]}" + ] + }, + { + "cell_type": "markdown", + "id": "220888cd-92d1-4bb4-9b5d-8187f89bda87", + "metadata": {}, + "source": [ + "## Example 2: Two netCDF files with different groups, variables, and attributes\n", + "----" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c48728a0-1379-4a05-b7e6-ad50694510df", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "id": "dccb326d-3b47-4d0f-b96d-93577d3e7c54", - "metadata": {}, - "source": [ - "END of Notebook." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", + " new_vars[k] = decode_cf_variable(\n", + "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", + "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", + "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", + "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m\u001b[0m" + ] } - ], - "metadata": { - "kernelspec": { - "display_name": "ncompare-jupyter-example", - "language": "python", - "name": "ncompare-jupyter-example" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.0" + ], + "source": [ + "! ncompare --column-widths 33 30 30 {file_names[0]} {file_names[2]}" + ] + }, + { + "cell_type": "markdown", + "id": "11a23041-6f24-491b-a9e3-124ace151736", + "metadata": {}, + "source": [ + "#### More file details can be examined by using the `--show-attributes` and `--show-chunks` options" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1dd4c51a-394c-4569-b8b1-053743e63cb9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", + " new_vars[k] = decode_cf_variable(\n", + "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", + "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", + "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", + "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: latitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 60.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: longitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 360.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record (CDR) of GPCP Monthly Satellite-Gauge Combined Precipitation \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation amount \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA CDR of GPCP Satellite-Gauge Combined Precipitation Error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_method: sum\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record of PERSIANN-CDR daily precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation_amount\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 999999.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcalendar: Gregorian \u001b[0m\n", + "\u001b[0m long_name: time time\u001b[0m\n", + "\u001b[0m standard_name: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m\u001b[0m" + ] } + ], + "source": [ + "! ncompare --show-attributes --show-chunks --column-widths 33 30 30 {file_names[0]} {file_names[2]}" + ] + }, + { + "cell_type": "markdown", + "id": "dccb326d-3b47-4d0f-b96d-93577d3e7c54", + "metadata": {}, + "source": [ + "END of Notebook." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ncompare-jupyter-example", + "language": "python", + "name": "ncompare-jupyter-example" }, - "nbformat": 4, - "nbformat_minor": 5 + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/ncompare/console.py b/ncompare/console.py index 91f85a2..e530043 100755 --- a/ncompare/console.py +++ b/ncompare/console.py @@ -25,6 +25,7 @@ # See the License for the specific language governing permissions and limitations under the License. """Command line interface for `ncompare` -- to compare the structure of two NetCDF files.""" + import argparse import importlib.metadata import sys @@ -34,7 +35,7 @@ from ncompare.core import compare -__version__ = importlib.metadata.version('ncompare') +__version__ = importlib.metadata.version("ncompare") def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: @@ -65,7 +66,10 @@ def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: ) parser.add_argument("--file-xlsx", help="An Excel file to which the output will be written.") parser.add_argument( - "--no-color", action="store_true", default=False, help="Turn off all colorized output" + "--no-color", + action="store_true", + default=False, + help="Turn off all colorized output", ) parser.add_argument( "--show-attributes", @@ -90,8 +94,8 @@ def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: parser.add_argument( "--version", - action='version', - version=f'%(prog)s {__version__}', + action="version", + version=f"%(prog)s {__version__}", default=False, help="Show the current version.", ) @@ -103,7 +107,7 @@ def main() -> None: # pragma: no cover """Run from the command line.""" args = _cli(None) - delattr(args, 'version') + delattr(args, "version") try: compare(**vars(args)) @@ -113,5 +117,5 @@ def main() -> None: # pragma: no cover sys.exit(0) # a clean, no-issue, exit -if __name__ == '__main__': # pragma: no cover +if __name__ == "__main__": # pragma: no cover main() diff --git a/ncompare/core.py b/ncompare/core.py index 8b8d040..f3b553d 100644 --- a/ncompare/core.py +++ b/ncompare/core.py @@ -28,6 +28,7 @@ # pylint: disable=fixme """Compare the structure of two NetCDF files.""" + import random import traceback from collections import namedtuple @@ -195,7 +196,11 @@ def run_through_comparisons( + f"\nChecking multiple random values within specified variable <{comparison_var_name}>:" ) compare_multiple_random_values( - out, nc_a, nc_b, groupname=comparison_var_group, varname=comparison_var_name + out, + nc_a, + nc_b, + groupname=comparison_var_group, + varname=comparison_var_name, ) except KeyError: @@ -280,12 +285,14 @@ def walk_common_groups_tree( # type:ignore[misc] top_b[group_b_name] if (group_b_name and (group_b_name in top_b.groups)) else None, ) for (_, group_a_name, group_b_name) in common_elements( - top_a.groups if top_a is not None else "", top_b.groups if top_b is not None else "" + top_a.groups if top_a is not None else "", + top_b.groups if top_b is not None else "", ) ) for _, subgroup_a_name, subgroup_b_name in common_elements( - top_a.groups if top_a is not None else "", top_b.groups if top_b is not None else "" + top_a.groups if top_a is not None else "", + top_b.groups if top_b is not None else "", ): yield from walk_common_groups_tree( top_a_name + "/" + subgroup_a_name if subgroup_a_name else "", @@ -311,18 +318,26 @@ def compare_two_nc_files( show_attributes: bool = False, ) -> tuple[int, int, int]: """Go through all groups and all variables, and show them side by side - whether they align and where they don't.""" - out.side_by_side(' ', 'File A', 'File B', force_display_even_if_same=True) + out.side_by_side(" ", "File A", "File B", force_display_even_if_same=True) num_var_diffs = {"left": 0, "right": 0, "both": 0} with netCDF4.Dataset(nc_one) as nc_a, netCDF4.Dataset(nc_two) as nc_b: out.side_by_side( - 'All Variables', ' ', ' ', dash_line=False, force_display_even_if_same=True + "All Variables", " ", " ", dash_line=False, force_display_even_if_same=True ) - out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) + out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) group_counter = 0 _print_group_details_side_by_side( - out, nc_a, "/", nc_b, "/", group_counter, num_var_diffs, show_attributes, show_chunks + out, + nc_a, + "/", + nc_b, + "/", + group_counter, + num_var_diffs, + show_attributes, + show_chunks, ) group_counter += 1 @@ -341,20 +356,20 @@ def compare_two_nc_files( ) group_counter += 1 - out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) + out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) out.side_by_side( - 'Total number of shared items:', - str(num_var_diffs['both']), - str(num_var_diffs['both']), + "Total number of shared items:", + str(num_var_diffs["both"]), + str(num_var_diffs["both"]), force_display_even_if_same=True, ) out.side_by_side( - 'Total number of non-shared items:', - str(num_var_diffs['left']), - str(num_var_diffs['right']), + "Total number of non-shared items:", + str(num_var_diffs["left"]), + str(num_var_diffs["right"]), force_display_even_if_same=True, ) - return num_var_diffs['left'], num_var_diffs['right'], num_var_diffs['both'] + return num_var_diffs["left"], num_var_diffs["right"], num_var_diffs["both"] def _print_group_details_side_by_side( @@ -369,7 +384,12 @@ def _print_group_details_side_by_side( show_chunks: bool, ) -> None: out.side_by_side( - " ", " ", " ", dash_line=False, highlight_diff=False, force_display_even_if_same=True + " ", + " ", + " ", + dash_line=False, + highlight_diff=False, + force_display_even_if_same=True, ) out.side_by_side( f"GROUP #{group_counter:02}", @@ -388,19 +408,19 @@ def _print_group_details_side_by_side( if group_b: vars_b_sorted = sorted(group_b.variables) out.side_by_side( - 'num variables in group:', + "num variables in group:", len(vars_a_sorted), len(vars_b_sorted), highlight_diff=True, force_display_even_if_same=True, ) - out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) + out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) # Count differences between the lists of variables in this group. left, right, both = count_diffs(vars_a_sorted, vars_b_sorted) - num_var_diffs['left'] += left - num_var_diffs['right'] += right - num_var_diffs['both'] += both + num_var_diffs["left"] += left + num_var_diffs["right"] += right + num_var_diffs["both"] += both # Go through each variable in the current group. for variable_pair in common_elements(vars_a_sorted, vars_b_sorted): @@ -473,7 +493,10 @@ def _print_var_properties_side_by_side( for attr_a_key, attr_a, attr_b_key, attr_b in get_and_check_variable_attributes(v_a, v_b): # Check whether attr_a_key is empty, because it might be if the variable doesn't exist in File A. out.side_by_side( - f"{attr_a_key if attr_a_key else attr_b_key}:", attr_a, attr_b, highlight_diff=True + f"{attr_a_key if attr_a_key else attr_b_key}:", + attr_a, + attr_b, + highlight_diff=True, ) # Scale Factor @@ -483,14 +506,14 @@ def _print_var_properties_side_by_side( def get_and_check_variable_scale_factor(v_a, v_b) -> Union[None, tuple[str, str]]: - if getattr(v_a.variable, 'scale_factor', None): + if getattr(v_a.variable, "scale_factor", None): sf_a = v_a.variable.scale_factor else: - sf_a = ' ' - if getattr(v_b.variable, 'scale_factor', None): + sf_a = " " + if getattr(v_b.variable, "scale_factor", None): sf_b = v_b.variable.scale_factor else: - sf_b = ' ' + sf_b = " " if (sf_a != " ") or (sf_b != " "): return str(sf_a), str(sf_b) else: diff --git a/ncompare/printing.py b/ncompare/printing.py index 13d9ae3..a270461 100644 --- a/ncompare/printing.py +++ b/ncompare/printing.py @@ -25,6 +25,7 @@ # pylint: disable=too-many-arguments """Utility functions for printing to the console or a text file.""" + import csv import re import warnings @@ -43,7 +44,7 @@ # Set up regex remover of ANSI color escape sequences # From ansi_escape = re.compile( - r''' + r""" \x1B # ESC (?: # 7-bit C1 Fe (except CSI) [@-Z\\-_] @@ -53,7 +54,7 @@ [ -/]* # Intermediate bytes [@-~] # Final byte ) -''', +""", re.VERBOSE, ) @@ -131,7 +132,11 @@ def __exit__(self, exc_type, exc_value, exc_traceback): # noqa: D105 self._text_file_obj.close() def print( - self, string: str = "", colors: bool = False, add_to_history: bool = False, **print_args + self, + string: str = "", + colors: bool = False, + add_to_history: bool = False, + **print_args, ) -> None: """Print text using custom options. @@ -156,7 +161,7 @@ def print( # Optional - write text to file if self._text_file_obj: # Remove ANSI escape sequences. - result = ansi_escape.sub('', text_to_print) + result = ansi_escape.sub("", text_to_print) self._text_file_obj.write(result + "\n") # Optional - save text to a history list @@ -168,7 +173,7 @@ def _add_to_history(self, *args): def _parse_single_str(s): # pylint: disable=invalid-name # Remove ANSI escape sequences before adding to a parsed string list. - result = ansi_escape.sub('', s) + result = ansi_escape.sub("", s) # Remove any leading or trailing newlines. return result.strip("\n") @@ -321,16 +326,16 @@ def lists_diff( # print(Fore.RED + "Which items are different? ---> %s." % # str(set(list_a).symmetric_difference(list_b))) - self.side_by_side(' ', 'File A', 'File B') + self.side_by_side(" ", "File A", "File B") self.side_by_side_list_diff(list_a, list_b) - self.side_by_side('Number of non-shared items:', str(left), str(right)) + self.side_by_side("Number of non-shared items:", str(left), str(right)) return left, right, both def write_history_to_csv(self, filename: Union[str, Path] = "test.csv"): """Save the line history that's been stored to a CSV file.""" - headers = ['Info', 'File A', 'File B', 'Other marks'] - with open(filename, 'w', encoding="utf-8") as target: + headers = ["Info", "File A", "File B", "Other marks"] + with open(filename, "w", encoding="utf-8") as target: writer = csv.writer(target) writer.writerow(headers) writer.writerows(self._line_history) @@ -341,7 +346,7 @@ def write_history_to_excel(self, filename: Union[str, Path] = "test.xlsx"): sheet = workbook.active # Add a header row - sheet.append(['Info', 'File A', 'File B']) + sheet.append(["Info", "File A", "File B"]) # Add rows and apply styles for row in self._line_history: @@ -350,7 +355,7 @@ def write_history_to_excel(self, filename: Union[str, Path] = "test.xlsx"): # First, remove difference marker that is redundant with styles applied to the row (unlike in the CSV) del row[3] sheet.append(_excel_red_cells(row, sheet)) - elif (len(row) == 1) or ((len(row) == 3) and ((row[1] == '') and (row[2] == ''))): + elif (len(row) == 1) or ((len(row) == 3) and ((row[1] == "") and (row[2] == ""))): # The case where there is a subheader and no information in the second and third columns. sheet.append(_excel_bold_underline_cells(row, sheet)) else: @@ -379,5 +384,5 @@ def _excel_bold_underline_cells(data, sheet): """Stylize cells in Excel with a bold and underlined font.""" for cell in data: cell = Cell(sheet, column="A", row=1, value=cell) - cell.font = Font(bold=True, underline='single') + cell.font = Font(bold=True, underline="single") yield cell diff --git a/ncompare/sequence_operations.py b/ncompare/sequence_operations.py index 10dc8f3..5baef68 100644 --- a/ncompare/sequence_operations.py +++ b/ncompare/sequence_operations.py @@ -24,6 +24,7 @@ # See the License for the specific language governing permissions and limitations under the License. """Helper functions for operating on iterables, such as lists or sets.""" + from collections.abc import Generator, Iterable from typing import Union @@ -62,9 +63,9 @@ def common_elements( ) if item not in a_sorted: - item_a = '' + item_a = "" elif item not in b_sorted: - item_b = '' + item_b = "" yield i, item_a, item_b diff --git a/ncompare/utils.py b/ncompare/utils.py index 0c03149..6c2d720 100644 --- a/ncompare/utils.py +++ b/ncompare/utils.py @@ -24,6 +24,7 @@ # See the License for the specific language governing permissions and limitations under the License. """Helper utilities.""" + from pathlib import Path from typing import Union diff --git a/tests/conftest.py b/tests/conftest.py index 1e33e03..6a11927 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,7 +35,7 @@ @pytest.fixture(scope="session") def temp_data_dir(tmpdir_factory) -> Path: - return Path(tmpdir_factory.mktemp('data')) + return Path(tmpdir_factory.mktemp("data")) @pytest.fixture(scope="function") @@ -130,25 +130,25 @@ def ds_3dims_3vars_4coords_1group(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_1group.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup('Group1') + grp1 = f.createGroup("Group1") # A root variable - f.createVariable('var0', "i2", ()) + f.createVariable("var0", "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension('x', 2) - grp1.createDimension('step', 3) - grp1.createDimension('track', 7) + grp1.createDimension("x", 2) + grp1.createDimension("step", 3) + grp1.createDimension("track", 7) # Variables in grp1 - grp1.createVariable('var1', 'f8', ()) + grp1.createVariable("var1", "f8", ()) # - grp1.createVariable('var2', 'f4', ()) + grp1.createVariable("var2", "f4", ()) # - grp1.createVariable('step', 'f4', ('step',), fill_value=False) - grp1['step'][:] = [-0.9, -1.8, -2.7] + grp1.createVariable("step", "f4", ("step",), fill_value=False) + grp1["step"][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) + grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) # Wrap up f.close() @@ -161,35 +161,35 @@ def ds_3dims_3vars_4coords_2groups(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_2groups.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup('Group1') - grp2 = f.createGroup('Group2') + grp1 = f.createGroup("Group1") + grp2 = f.createGroup("Group2") # A root variable - f.createVariable('var0', "i2", ()) + f.createVariable("var0", "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension('x', 2) - grp1.createDimension('step', 3) - grp1.createDimension('track', 7) + grp1.createDimension("x", 2) + grp1.createDimension("step", 3) + grp1.createDimension("track", 7) # Variables in grp1 - grp1.createVariable('var1', 'f8', ()) + grp1.createVariable("var1", "f8", ()) # - grp1.createVariable('var2', 'f4', ()) + grp1.createVariable("var2", "f4", ()) # - grp1.createVariable('step', 'f4', ('step',), fill_value=False) - grp1['step'][:] = [-0.9, -1.8, -2.7] + grp1.createVariable("step", "f4", ("step",), fill_value=False) + grp1["step"][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) + grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) # New/modified coordinates in grp2 - grp2.createDimension('x', 2) - grp2.createDimension('step', 3) - grp2.createDimension('track', 7) - grp2.createDimension('level', 4) + grp2.createDimension("x", 2) + grp2.createDimension("step", 3) + grp2.createDimension("track", 7) + grp2.createDimension("level", 4) # Variables in grp2 - grp2.createVariable('var3', 'f8', ('level',), fill_value=False) + grp2.createVariable("var3", "f8", ("level",), fill_value=False) # Wrap up f.close() @@ -202,38 +202,38 @@ def ds_3dims_3vars_4coords_1subgroup(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_1subgroup.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup('Group1') - grp2 = f.createGroup('Group2') - grp2_subgroup = grp2.createGroup('Group2_subgroup') + grp1 = f.createGroup("Group1") + grp2 = f.createGroup("Group2") + grp2_subgroup = grp2.createGroup("Group2_subgroup") # A root variable - f.createVariable('var0', "i2", ()) + f.createVariable("var0", "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension('x', 2) - grp1.createDimension('step', 3) - grp1.createDimension('track', 7) + grp1.createDimension("x", 2) + grp1.createDimension("step", 3) + grp1.createDimension("track", 7) # Variables in grp1 - grp1.createVariable('var1', 'f8', ()) + grp1.createVariable("var1", "f8", ()) # - grp1.createVariable('var2', 'f4', ()) + grp1.createVariable("var2", "f4", ()) # - grp1.createVariable('step', 'f4', ('step',), fill_value=False) - grp1['step'][:] = [-0.9, -1.8, -2.7] + grp1.createVariable("step", "f4", ("step",), fill_value=False) + grp1["step"][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) + grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) # New/modified coordinates in grp2 - grp2.createDimension('step', 3) - grp2.createDimension('level', 4) + grp2.createDimension("step", 3) + grp2.createDimension("level", 4) # Variables in grp2 - grp2.createVariable('var3', 'f8', ('step', 'level'), fill_value=False) + grp2.createVariable("var3", "f8", ("step", "level"), fill_value=False) # New/modified coordinates in grp2 # Variables in grp2 - grp2_subgroup.createVariable('var4', 'f8', ('level',), fill_value=False) + grp2_subgroup.createVariable("var4", "f8", ("level",), fill_value=False) # Wrap up f.close() diff --git a/tests/data/create_a-b_test_netcdfs.ipynb b/tests/data/create_a-b_test_netcdfs.ipynb index afb7ab6..49a396c 100644 --- a/tests/data/create_a-b_test_netcdfs.ipynb +++ b/tests/data/create_a-b_test_netcdfs.ipynb @@ -8,8 +8,9 @@ "outputs": [], "source": [ "import time\n", - "import numpy as np\n", - "import netCDF4 as nc" + "\n", + "import netCDF4 as nc\n", + "import numpy as np" ] }, { @@ -38,72 +39,70 @@ } ], "source": [ - "some_4d_data = np.array([\n", + "some_4d_data = np.array(\n", " [\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287], \n", - " ]\n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", " ]\n", - "])\n", + ")\n", "some_4d_data.shape" ] }, @@ -128,81 +127,95 @@ "\n", "with nc.Dataset(\"test_a.nc\", \"w\", format=\"NETCDF4\") as rootgrp:\n", " print(f\"Creating {rootgrp.data_model}...\")\n", - " \n", + "\n", " # --- Create Groups ---\n", " groups[\"Position\"] = rootgrp.createGroup(\"Position\")\n", " groups[\"Statistics\"] = rootgrp.createGroup(\"Statistics\")\n", - " \n", + "\n", " groups[\"Data\"] = rootgrp.createGroup(\"Data\")\n", " groups[\"Data_Products_Subgroup\"] = rootgrp.createGroup(\"/Data/Products\")\n", " groups[\"Data_Quality_Subgroup\"] = rootgrp.createGroup(\"/Data/Quality\")\n", - " \n", - " \n", + "\n", " # --- Create Dimensions ---\n", " dims[\"time\"] = rootgrp.createDimension(\"time\", None)\n", " dims[\"latitude\"] = rootgrp.createDimension(\"lat\", 3)\n", " dims[\"longitude\"] = rootgrp.createDimension(\"lon\", 4)\n", " dims[\"conditions\"] = rootgrp.createDimension(\"conditions\", 2)\n", - " \n", + "\n", " dims[\"level\"] = groups[\"Data\"].createDimension(\"level\", None)\n", - " \n", - " \n", + "\n", " # --- Create Variables ---\n", " conditions = rootgrp.createVariable(\"conditions\", \"i4\", (\"conditions\",))\n", " times = rootgrp.createVariable(\"time\", \"f8\", (\"time\",))\n", - " \n", + "\n", " latitudes = rootgrp.createVariable(\"/Position/lat\", \"f4\", (\"lat\",))\n", " longitudes = rootgrp.createVariable(\"/Position/lon\", \"f4\", (\"lon\",))\n", - " \n", + "\n", " mean_values = rootgrp.createVariable(\"/Statistics/mean_value\", \"f4\", (\"time\",))\n", - " \n", + "\n", " levels = rootgrp.createVariable(\"/Data/level\", \"i4\", (\"level\",))\n", - " product_temp = rootgrp.createVariable(\"/Data/Products/temp\", \"f4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " quality_flag = rootgrp.createVariable(\"/Data/Quality/quality_flag\", \"i4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " \n", - " \n", + " product_temp = rootgrp.createVariable(\n", + " \"/Data/Products/temp\",\n", + " \"f4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + " quality_flag = rootgrp.createVariable(\n", + " \"/Data/Quality/quality_flag\",\n", + " \"i4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + "\n", " # --- Assign Attributes ---\n", " rootgrp.description = \"Example netCDF file\"\n", " rootgrp.history = \"Created \" + time.ctime(time.time())\n", " rootgrp.source = \"test data creation script\"\n", - " \n", + "\n", " groups[\"Position\"].description = \"This group contain position data.\"\n", " groups[\"Statistics\"].description = \"This group contains statistical information.\"\n", - " \n", + "\n", " times.units = \"hours since 0001-01-01 00:00:00.0\"\n", " times.long_name = \"Time of observation\"\n", " times.calendar = \"gregorian\"\n", " times.coordinates = \"time\"\n", - " \n", + "\n", " levels.units = \"hPa\"\n", - " \n", + "\n", " latitudes.units = \"degrees north\"\n", - " \n", + "\n", " longitudes.units = \"degrees east\"\n", - " \n", + "\n", " mean_values.long_name = \"average value for each time\"\n", " mean_values.coordinates = \"time\"\n", - " \n", + "\n", " product_temp.long_name = \"temperature\"\n", " product_temp.units = \"K\"\n", - " \n", + "\n", " quality_flag.units = \"unitless\"\n", - " \n", - " \n", + "\n", " # --- Assign Data Values ---\n", - " lats = np.arange(-90, 91, 90)\n", - " lons = np.arange(-180, 180, 90)\n", + " lats = np.arange(-90, 91, 90)\n", + " lons = np.arange(-180, 180, 90)\n", " latitudes[:] = lats\n", " longitudes[:] = lons\n", - " \n", + "\n", " nlats = len(rootgrp.dimensions[\"lat\"])\n", " nlons = len(rootgrp.dimensions[\"lon\"])\n", - " \n", + "\n", " product_temp[0:5, 0:2, :, :] = some_4d_data\n", - " \n", + "\n", " times[0:5] = [1, 1.5, 2, 2.5, 3]\n", " levels[0:2] = [10, 20]\n", - " \n", + "\n", "print(\"Done.\")" ] }, @@ -227,97 +240,111 @@ "\n", "with nc.Dataset(\"test_b.nc\", \"w\", format=\"NETCDF4\") as rootgrp:\n", " print(f\"Creating {rootgrp.data_model}...\")\n", - " \n", + "\n", " # --- Create Groups ---\n", " groups[\"Position\"] = rootgrp.createGroup(\"Position\")\n", " groups[\"Statistics\"] = rootgrp.createGroup(\"Statistics\")\n", - " \n", + "\n", " groups[\"Data\"] = rootgrp.createGroup(\"Data\")\n", " groups[\"Data_Products_Subgroup\"] = rootgrp.createGroup(\"/Data/Products\")\n", " groups[\"Data_Quality_Subgroup\"] = rootgrp.createGroup(\"/Data/Quality\")\n", - " \n", + "\n", " groups[\"Data_Supplemental_Subgroup\"] = rootgrp.createGroup(\"/Data/Supplemental\")\n", " groups[\"Data_Supplemental_Details_Subgroup\"] = rootgrp.createGroup(\"/Data/Supplemental/Details\")\n", - " \n", + "\n", " # --- Create Dimensions ---\n", " dims[\"time\"] = rootgrp.createDimension(\"time\", None)\n", " dims[\"latitude\"] = rootgrp.createDimension(\"lat\", 2)\n", " dims[\"longitude\"] = rootgrp.createDimension(\"lon\", 2)\n", " dims[\"conditions\"] = rootgrp.createDimension(\"conditions\", 2)\n", - " \n", + "\n", " dims[\"level\"] = groups[\"Data\"].createDimension(\"level\", None)\n", - " \n", - " \n", + "\n", " # --- Create Variables ---\n", " conditions = rootgrp.createVariable(\"conditions\", \"i4\", (\"conditions\",))\n", " times = rootgrp.createVariable(\"time\", \"f8\", (\"time\",))\n", - " \n", + "\n", " latitudes = rootgrp.createVariable(\"/Position/lat\", \"f4\", (\"lat\",))\n", " longitudes = rootgrp.createVariable(\"/Position/lon\", \"f4\", (\"lon\",))\n", - " \n", + "\n", " std_values = rootgrp.createVariable(\"/Statistics/std_value\", \"f4\", (\"time\",))\n", - " \n", + "\n", " levels = rootgrp.createVariable(\"/Data/level\", \"i4\", (\"level\",))\n", - " product_temp = rootgrp.createVariable(\"/Data/Products/temp\", \"f4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " quality_flag = rootgrp.createVariable(\"/Data/Quality/quality_flag\", \"i4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " \n", - " supplemental_flag = rootgrp.createVariable(\"/Data/Supplemental/supplemental_flag\", \"i4\", (\"time\", \"conditions\"))\n", - " condition_details = rootgrp.createVariable(\"/Data/Supplemental/Details/condition_details\", \"f8\", (\"conditions\"))\n", - " \n", - " \n", + " product_temp = rootgrp.createVariable(\n", + " \"/Data/Products/temp\",\n", + " \"f4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + " quality_flag = rootgrp.createVariable(\n", + " \"/Data/Quality/quality_flag\",\n", + " \"i4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + "\n", + " supplemental_flag = rootgrp.createVariable(\n", + " \"/Data/Supplemental/supplemental_flag\", \"i4\", (\"time\", \"conditions\")\n", + " )\n", + " condition_details = rootgrp.createVariable(\n", + " \"/Data/Supplemental/Details/condition_details\", \"f8\", (\"conditions\")\n", + " )\n", + "\n", " # --- Assign Attributes ---\n", " rootgrp.description = \"Example netCDF file\"\n", " rootgrp.history = \"Created \" + time.ctime(time.time())\n", " rootgrp.source = \"test data creation script\"\n", - " \n", + "\n", " groups[\"Position\"].description = \"This group contain position data.\"\n", " groups[\"Statistics\"].description = \"This group contains statistical information.\"\n", - " \n", + "\n", " times.units = \"hours since 0001-01-01 00:00:00.0\"\n", " times.long_name = \"Time of observation\"\n", " times.calendar = \"gregorian\"\n", " times.coordinates = \"time\"\n", - " \n", + "\n", " levels.units = \"hPa\"\n", - " \n", + "\n", " latitudes.units = \"degrees north\"\n", - " \n", + "\n", " longitudes.units = \"degrees east\"\n", - " \n", + "\n", " std_values.long_name = \"standard deviation value for each time\"\n", " std_values.coordinates = \"time\"\n", - " \n", + "\n", " product_temp.long_name = \"temperature\"\n", " product_temp.units = \"Kelvin\"\n", - " \n", + "\n", " quality_flag.units = \"unitless\"\n", - " \n", + "\n", " supplemental_flag.units = \"unitless\"\n", - " \n", + "\n", " # --- Assign Data Values ---\n", - " lats = np.arange(-90, 1, 90)\n", - " lons = np.arange(-180, 0, 90)\n", + " lats = np.arange(-90, 1, 90)\n", + " lons = np.arange(-180, 0, 90)\n", " latitudes[:] = lats\n", " longitudes[:] = lons\n", - " \n", + "\n", " nlats = len(rootgrp.dimensions[\"lat\"])\n", " nlons = len(rootgrp.dimensions[\"lon\"])\n", - " \n", + "\n", " product_temp[0:5, 0:2, :, :] = some_4d_data[:, :, :-1, :-2]\n", - " \n", + "\n", " times[0:5] = [1, 1.5, 2, 2.5, 3]\n", " levels[0:2] = [10, 20]\n", - " \n", - " supplemental_flag = [\n", - " [1, 2],\n", - " [0, 1],\n", - " [1, 2],\n", - " [0, 1],\n", - " [1, 2]\n", - " ]\n", - " \n", + "\n", + " supplemental_flag = [[1, 2], [0, 1], [1, 2], [0, 1], [1, 2]]\n", + "\n", " condition_details = [8.65, 1.23]\n", - " \n", + "\n", "print(\"Done.\")" ] }, diff --git a/tests/test_cli.py b/tests/test_cli.py index 5bb74dc..d314ae8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -29,12 +29,12 @@ def test_console_version(): - exit_status = os.system('ncompare --version') + exit_status = os.system("ncompare --version") assert exit_status == 0 def test_console_help(): - exit_status = os.system('ncompare --help') + exit_status = os.system("ncompare --help") assert exit_status == 0 diff --git a/tests/test_complete_file_output.py b/tests/test_complete_file_output.py index d989733..d4af4ef 100644 --- a/tests/test_complete_file_output.py +++ b/tests/test_complete_file_output.py @@ -42,7 +42,10 @@ def test_full_run_to_text_output(temp_data_dir): file_text=str(out_path), ) - with open(data_for_tests_dir / "a-b_test_golden_file.txt") as f1, open(str(out_path)) as f2: + with ( + open(data_for_tests_dir / "a-b_test_golden_file.txt") as f1, + open(str(out_path)) as f2, + ): exclude_n_lines = 3 for _ in range(exclude_n_lines): @@ -65,7 +68,10 @@ def test_full_run_to_csv_output(temp_data_dir): file_csv=str(out_path), ) - with open(data_for_tests_dir / "a-b_test_golden_file.csv") as f1, open(str(out_path)) as f2: + with ( + open(data_for_tests_dir / "a-b_test_golden_file.csv") as f1, + open(str(out_path)) as f2, + ): exclude_n_lines = 3 for _ in range(exclude_n_lines): diff --git a/tests/test_core.py b/tests/test_core.py index e106274..8d127a6 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -28,6 +28,7 @@ Note that full comparison tests are performed in both directions, i.e., A -> B and B -> A. """ + from contextlib import nullcontext as does_not_raise import pytest @@ -76,10 +77,10 @@ def test_matching_random_values( ds_1dim_1var_allnan_1coord, outputter_to_console, ): - variable_array_1 = xr.open_dataset(ds_3dims_2vars_4coords).variables['z1'] - variable_array_2 = xr.open_dataset(ds_4dims_3vars_5coords).variables['z1'] - variable_array_3 = xr.open_dataset(ds_1dim_1var_1coord).variables['z1'] - variable_array_allnan = xr.open_dataset(ds_1dim_1var_allnan_1coord).variables['z1'] + variable_array_1 = xr.open_dataset(ds_3dims_2vars_4coords).variables["z1"] + variable_array_2 = xr.open_dataset(ds_4dims_3vars_5coords).variables["z1"] + variable_array_3 = xr.open_dataset(ds_1dim_1var_1coord).variables["z1"] + variable_array_allnan = xr.open_dataset(ds_1dim_1var_allnan_1coord).variables["z1"] assert ( _match_random_value( @@ -128,7 +129,10 @@ def test_matching_random_values( def test_print_values_runs_with_no_error(ds_3dims_3vars_4coords_1group, outputter_to_console): with does_not_raise(): _print_sample_values( - outputter_to_console, ds_3dims_3vars_4coords_1group, groupname="Group1", varname="step" + outputter_to_console, + ds_3dims_3vars_4coords_1group, + groupname="Group1", + varname="step", ) @@ -136,7 +140,10 @@ def test_print_values_to_text_file_runs_with_no_error( ds_3dims_3vars_4coords_1group, outputter_to_text_file, temp_test_text_file_path ): _print_sample_values( - outputter_to_text_file, ds_3dims_3vars_4coords_1group, groupname="Group1", varname="step" + outputter_to_text_file, + ds_3dims_3vars_4coords_1group, + groupname="Group1", + varname="step", ) outputter_to_text_file._text_file_obj.close() @@ -192,7 +199,7 @@ def test_comparison_var_no_error_for_duplicate_dataset( def test_get_vars_with_group(ds_3dims_3vars_4coords_1group): result = _get_vars(ds_3dims_3vars_4coords_1group, groupname="Group1") - assert set(result) == {'step', 'var1', 'var2', 'w'} + assert set(result) == {"step", "var1", "var2", "w"} def test_get_vars_error_when_no_group(ds_3dims_2vars_4coords): diff --git a/tests/test_printing.py b/tests/test_printing.py index e6ede64..e3223a3 100644 --- a/tests/test_printing.py +++ b/tests/test_printing.py @@ -26,7 +26,7 @@ def test_list_of_strings_diff(outputter_to_console): left, right, both = outputter_to_console.lists_diff( - ['hey', 'yo', 'beebop'], ['what', 'is', 'this', 'beebop'] + ["hey", "yo", "beebop"], ["what", "is", "this", "beebop"] ) assert (left, right, both) == (2, 3, 1) diff --git a/tests/test_sequence_operations.py b/tests/test_sequence_operations.py index f7af980..d1dd4a1 100644 --- a/tests/test_sequence_operations.py +++ b/tests/test_sequence_operations.py @@ -30,8 +30,8 @@ @pytest.fixture def two_example_lists() -> tuple[list[str], list[str]]: - a = ['yo', 'beebop', 'hey'] - b = ['what', 'does', 'this', 'beebop', 'mean'] + a = ["yo", "beebop", "hey"] + b = ["what", "does", "this", "beebop", "mean"] return a, b @@ -39,13 +39,13 @@ def test_common_elements(two_example_lists): composed_pairs = [e for e in common_elements(*two_example_lists)] should_be = [ - (0, 'beebop', 'beebop'), - (1, '', 'does'), - (2, 'hey', ''), - (3, '', 'mean'), - (4, '', 'this'), - (5, '', 'what'), - (6, 'yo', ''), + (0, "beebop", "beebop"), + (1, "", "does"), + (2, "hey", ""), + (3, "", "mean"), + (4, "", "this"), + (5, "", "what"), + (6, "yo", ""), ] assert composed_pairs == should_be diff --git a/tests/test_utils.py b/tests/test_utils.py index fe800e0..b87f535 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -60,7 +60,7 @@ def test_coerce_int_to_str(): def test_coerce_tuple_to_str(): - assert coerce_to_str(('step', 123)) == "('step', 123)" + assert coerce_to_str(("step", 123)) == "('step', 123)" def test_error_from_not_able_to_coerce_to_str(): From ad00028dad7e3b0b5895d0b54158b0d3ed061a83 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 14 Nov 2024 13:08:44 -0500 Subject: [PATCH 04/10] Revert "[pre-commit.ci] auto fixes from pre-commit.com hooks" This reverts commit 3931a1639e6627c405ec98db691cfcf76c9b7298. --- docs/example/ncompare-example-usage.ipynb | 1060 ++++++++++----------- ncompare/console.py | 16 +- ncompare/core.py | 75 +- ncompare/printing.py | 29 +- ncompare/sequence_operations.py | 5 +- ncompare/utils.py | 1 - tests/conftest.py | 86 +- tests/data/create_a-b_test_netcdfs.ipynb | 283 +++--- tests/test_cli.py | 4 +- tests/test_complete_file_output.py | 10 +- tests/test_core.py | 21 +- tests/test_printing.py | 2 +- tests/test_sequence_operations.py | 18 +- tests/test_utils.py | 2 +- 14 files changed, 769 insertions(+), 843 deletions(-) diff --git a/docs/example/ncompare-example-usage.ipynb b/docs/example/ncompare-example-usage.ipynb index 1fa7d2d..14afb08 100644 --- a/docs/example/ncompare-example-usage.ipynb +++ b/docs/example/ncompare-example-usage.ipynb @@ -1,538 +1,538 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "214b2e0a-4a8a-48bb-b1f5-b457b69ece57", - "metadata": {}, - "source": [ - "# Brief demonstration of `ncompare`: to compare the structure, groups, variables, and attributes of two netCDF files\"" - ] - }, - { - "cell_type": "markdown", - "id": "351983d5-1c2f-45ee-8a24-cd2a3b621405", - "metadata": {}, - "source": [ - "Installation instructions for `ncompare` can be found in either of these locations:\n", - "\n", - "- [GitHub repository](https://github.com/nasa/ncompare)\n", - "- [Pip entry](https://pypi.org/project/ncompare/)" - ] - }, - { - "cell_type": "markdown", - "id": "569c088b-0929-43c3-8d0f-6da3b6c89cce", - "metadata": {}, - "source": [ - "## `ncompare`'s command line arguments, provided by the `--help` description" - ] - }, - { - "cell_type": "markdown", - "id": "6a145933-e57b-4e33-bed1-95b13800878d", - "metadata": {}, - "source": [ - "***✍️ Syntax Note:*** Commands preceeded by an exclamation point \"!\" \n", - "(which is needed to [run shell commands in a Jupyter notebook](https://stackoverflow.com/a/48529220)) can be run from a terminal. \n", - "In a shell/terminal, the exclamation point should not be used." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "07e397b3-4964-4a90-b7f5-ae35185f86e5", - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "usage: ncompare [-h] [-v COMPARISON_VAR_NAME] [-g COMPARISON_VAR_GROUP]\n", - " [--only-diffs] [--file-text FILE_TEXT] [--file-csv FILE_CSV]\n", - " [--file-xlsx FILE_XLSX] [--no-color] [--show-attributes]\n", - " [--show-chunks]\n", - " [--column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS]\n", - " [--version]\n", - " nc_a nc_b\n", - "\n", - "Compare the variables contained within two different NetCDF datasets\n", - "\n", - "positional arguments:\n", - " nc_a First NetCDF file\n", - " nc_b First NetCDF file\n", - "\n", - "options:\n", - " -h, --help show this help message and exit\n", - " -v COMPARISON_VAR_NAME, --comparison_var_name COMPARISON_VAR_NAME\n", - " Comparison variable name\n", - " -g COMPARISON_VAR_GROUP, --comparison_var_group COMPARISON_VAR_GROUP\n", - " Comparison variable group\n", - " --only-diffs Only display variables and attributes that are\n", - " different\n", - " --file-text FILE_TEXT\n", - " A text file to which the output will be written.\n", - " --file-csv FILE_CSV A csv (comma separated values) file to which the\n", - " output will be written.\n", - " --file-xlsx FILE_XLSX\n", - " An Excel file to which the output will be written.\n", - " --no-color Turn off all colorized output\n", - " --show-attributes Include variable attributes in comparison\n", - " --show-chunks Include chunk sizes in the table that compares\n", - " variables\n", - " --column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS\n", - " Width, in number of characters, of the three columns\n", - " in the comparison report\n", - " --version Show the current version.\n" - ] - } - ], - "source": [ - "! ncompare --help" - ] - }, - { - "cell_type": "markdown", - "id": "4028d153-a1d2-4f8b-aad5-ca736b6c8292", - "metadata": {}, - "source": [ - "## Example 1: Two netCDF files with the same groups, variables, and attributes\n", - "----" - ] - }, - { - "cell_type": "markdown", - "id": "6992fa0f-7460-42c8-b0d4-d0634ddcc798", - "metadata": {}, - "source": [ - "Data files are first defined. The examples here rely on three files: two from NOAA National Centers of Environmental Information's (NCEI) (a) _[Global Precipitation Climatology Project (GPCP) Climate Data Record (CDR), Monthly V2.3](https://doi.org/10.7289/V56971M6)_ and one from the (b) _[Climate Data Record (CDR) of Precipitation Estimation from Remotely Sensed Information using Artificial Neural Networks (PERSIANN-CDR), Version 1 Revision 1)](https://doi.org/10.7289/V51V5BWQ)_ (a daily quasi-global precipitation product), accessible via [this GPCP catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html) and [this PERSIANN catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/persiann/catalog.html):\n", - "\n", - "1. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\n", - "2. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\n", - "3. https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "136bbeb8-6d74-4373-8ef7-1c20c1fe6afc", - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "\n", - "file_urls = [\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\",\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\",\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc\",\n", - "]\n", - "\n", - "file_names = [Path(url).name for url in file_urls]" - ] - }, - { - "cell_type": "markdown", - "id": "2b635084-8b99-4824-9f36-27b1c31bd2a5", - "metadata": {}, - "source": [ - "To download these files (e.g., for the first time running this notebook), run the following:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "10a025b9-4483-4925-873e-6653b64441e3", - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "\n", - "for url, filename in zip(file_urls, file_names):\n", - " r = requests.get(url, allow_redirects=True)\n", - " open(filename, \"wb\").write(r.content)" - ] - }, - { - "cell_type": "markdown", - "id": "56b0eeba-20ed-46ed-a14b-593b59c2d9cd", - "metadata": {}, - "source": [ - "Next, we pass the two filepaths to `ncompare`, and any differences would be printed in red. In this case, there are no differences; therefore, all of the variables are printed in black." - ] - }, - { - "cell_type": "markdown", - "id": "a2ea8513-19ce-4089-8494-e0fba9aea789", - "metadata": {}, - "source": [ - "***✍️ Syntax Note:*** the curly brackets, \"{\" and \"}\", that follow are simply a way to [substitute python variables into a shell command](https://stackoverflow.com/a/35497161). \n", - "In a shell/terminal, one can just write out the full arguments, separated by spaces.\n", - "For example, the following command would be run at the terminal as `ncompare notebook_example_data/MOP03JM-202205-L3V95.6.3.he5 notebook_example_data/MOP03JM-202205-L3V95.9.3.he5`\n", - "\n", - "***✍️ `ncompare` Options Note:*** the `--column-widths 33 26 26` arguments are optional, and they are being used here to shrink the columns width-wise from their defaults to a size that fits better in the GitHub notebook renderer." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "43cace42-aa55-469e-84d9-13a45115267e", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "214b2e0a-4a8a-48bb-b1f5-b457b69ece57", + "metadata": {}, + "source": [ + "# Brief demonstration of `ncompare`: to compare the structure, groups, variables, and attributes of two netCDF files\"" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: gpcp_v02r03_monthly_d202302_c20230505.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True.\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36m[('latitude', 72), ('longitude', 144), ('nv', 2), ('time', 1)]\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -------------------------/ -------------------------/\u001b[0m\n", - "\u001b[0m num variables in group: 8 8\u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (72,) (72,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (144,) (144,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 8 8\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 0 0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --column-widths 33 26 26 {file_names[0]} {file_names[1]}" - ] - }, - { - "cell_type": "markdown", - "id": "220888cd-92d1-4bb4-9b5d-8187f89bda87", - "metadata": {}, - "source": [ - "## Example 2: Two netCDF files with different groups, variables, and attributes\n", - "----" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c48728a0-1379-4a05-b7e6-ad50694510df", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "351983d5-1c2f-45ee-8a24-cd2a3b621405", + "metadata": {}, + "source": [ + "Installation instructions for `ncompare` can be found in either of these locations:\n", + "\n", + "- [GitHub repository](https://github.com/nasa/ncompare)\n", + "- [Pip entry](https://pypi.org/project/ncompare/)" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", - " new_vars[k] = decode_cf_variable(\n", - "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", - "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", - "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", - "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --column-widths 33 30 30 {file_names[0]} {file_names[2]}" - ] - }, - { - "cell_type": "markdown", - "id": "11a23041-6f24-491b-a9e3-124ace151736", - "metadata": {}, - "source": [ - "#### More file details can be examined by using the `--show-attributes` and `--show-chunks` options" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "1dd4c51a-394c-4569-b8b1-053743e63cb9", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "569c088b-0929-43c3-8d0f-6da3b6c89cce", + "metadata": {}, + "source": [ + "## `ncompare`'s command line arguments, provided by the `--help` description" + ] + }, + { + "cell_type": "markdown", + "id": "6a145933-e57b-4e33-bed1-95b13800878d", + "metadata": {}, + "source": [ + "***✍️ Syntax Note:*** Commands preceeded by an exclamation point \"!\" \n", + "(which is needed to [run shell commands in a Jupyter notebook](https://stackoverflow.com/a/48529220)) can be run from a terminal. \n", + "In a shell/terminal, the exclamation point should not be used." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "07e397b3-4964-4a90-b7f5-ae35185f86e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "usage: ncompare [-h] [-v COMPARISON_VAR_NAME] [-g COMPARISON_VAR_GROUP]\n", + " [--only-diffs] [--file-text FILE_TEXT] [--file-csv FILE_CSV]\n", + " [--file-xlsx FILE_XLSX] [--no-color] [--show-attributes]\n", + " [--show-chunks]\n", + " [--column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS]\n", + " [--version]\n", + " nc_a nc_b\n", + "\n", + "Compare the variables contained within two different NetCDF datasets\n", + "\n", + "positional arguments:\n", + " nc_a First NetCDF file\n", + " nc_b First NetCDF file\n", + "\n", + "options:\n", + " -h, --help show this help message and exit\n", + " -v COMPARISON_VAR_NAME, --comparison_var_name COMPARISON_VAR_NAME\n", + " Comparison variable name\n", + " -g COMPARISON_VAR_GROUP, --comparison_var_group COMPARISON_VAR_GROUP\n", + " Comparison variable group\n", + " --only-diffs Only display variables and attributes that are\n", + " different\n", + " --file-text FILE_TEXT\n", + " A text file to which the output will be written.\n", + " --file-csv FILE_CSV A csv (comma separated values) file to which the\n", + " output will be written.\n", + " --file-xlsx FILE_XLSX\n", + " An Excel file to which the output will be written.\n", + " --no-color Turn off all colorized output\n", + " --show-attributes Include variable attributes in comparison\n", + " --show-chunks Include chunk sizes in the table that compares\n", + " variables\n", + " --column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS\n", + " Width, in number of characters, of the three columns\n", + " in the comparison report\n", + " --version Show the current version.\n" + ] + } + ], + "source": [ + "! ncompare --help" + ] + }, + { + "cell_type": "markdown", + "id": "4028d153-a1d2-4f8b-aad5-ca736b6c8292", + "metadata": {}, + "source": [ + "## Example 1: Two netCDF files with the same groups, variables, and attributes\n", + "----" + ] + }, + { + "cell_type": "markdown", + "id": "6992fa0f-7460-42c8-b0d4-d0634ddcc798", + "metadata": {}, + "source": [ + "Data files are first defined. The examples here rely on three files: two from NOAA National Centers of Environmental Information's (NCEI) (a) _[Global Precipitation Climatology Project (GPCP) Climate Data Record (CDR), Monthly V2.3](https://doi.org/10.7289/V56971M6)_ and one from the (b) _[Climate Data Record (CDR) of Precipitation Estimation from Remotely Sensed Information using Artificial Neural Networks (PERSIANN-CDR), Version 1 Revision 1)](https://doi.org/10.7289/V51V5BWQ)_ (a daily quasi-global precipitation product), accessible via [this GPCP catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html) and [this PERSIANN catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/persiann/catalog.html):\n", + "\n", + "1. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\n", + "2. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\n", + "3. https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "136bbeb8-6d74-4373-8ef7-1c20c1fe6afc", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "file_urls = [\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\",\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\",\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc\",\n", + "]\n", + "\n", + "file_names = [Path(url).name for url in file_urls]" + ] + }, + { + "cell_type": "markdown", + "id": "2b635084-8b99-4824-9f36-27b1c31bd2a5", + "metadata": {}, + "source": [ + "To download these files (e.g., for the first time running this notebook), run the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "10a025b9-4483-4925-873e-6653b64441e3", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "for url, filename in zip(file_urls, file_names):\n", + " r = requests.get(url, allow_redirects=True)\n", + " open(filename, 'wb').write(r.content)" + ] + }, + { + "cell_type": "markdown", + "id": "56b0eeba-20ed-46ed-a14b-593b59c2d9cd", + "metadata": {}, + "source": [ + "Next, we pass the two filepaths to `ncompare`, and any differences would be printed in red. In this case, there are no differences; therefore, all of the variables are printed in black." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", - " new_vars[k] = decode_cf_variable(\n", - "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", - "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", - "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", - "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: latitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 60.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: longitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 360.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record (CDR) of GPCP Monthly Satellite-Gauge Combined Precipitation \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation amount \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA CDR of GPCP Satellite-Gauge Combined Precipitation Error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_method: sum\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record of PERSIANN-CDR daily precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation_amount\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 999999.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcalendar: Gregorian \u001b[0m\n", - "\u001b[0m long_name: time time\u001b[0m\n", - "\u001b[0m standard_name: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m\u001b[0m" - ] + "cell_type": "markdown", + "id": "a2ea8513-19ce-4089-8494-e0fba9aea789", + "metadata": {}, + "source": [ + "***✍️ Syntax Note:*** the curly brackets, \"{\" and \"}\", that follow are simply a way to [substitute python variables into a shell command](https://stackoverflow.com/a/35497161). \n", + "In a shell/terminal, one can just write out the full arguments, separated by spaces.\n", + "For example, the following command would be run at the terminal as `ncompare notebook_example_data/MOP03JM-202205-L3V95.6.3.he5 notebook_example_data/MOP03JM-202205-L3V95.9.3.he5`\n", + "\n", + "***✍️ `ncompare` Options Note:*** the `--column-widths 33 26 26` arguments are optional, and they are being used here to shrink the columns width-wise from their defaults to a size that fits better in the GitHub notebook renderer." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "43cace42-aa55-469e-84d9-13a45115267e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: gpcp_v02r03_monthly_d202302_c20230505.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True.\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36m[('latitude', 72), ('longitude', 144), ('nv', 2), ('time', 1)]\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -------------------------/ -------------------------/\u001b[0m\n", + "\u001b[0m num variables in group: 8 8\u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (72,) (72,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (144,) (144,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 8 8\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 0 0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m" + ] + } + ], + "source": [ + "! ncompare --column-widths 33 26 26 {file_names[0]} {file_names[1]}" + ] + }, + { + "cell_type": "markdown", + "id": "220888cd-92d1-4bb4-9b5d-8187f89bda87", + "metadata": {}, + "source": [ + "## Example 2: Two netCDF files with different groups, variables, and attributes\n", + "----" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c48728a0-1379-4a05-b7e6-ad50694510df", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", + " new_vars[k] = decode_cf_variable(\n", + "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", + "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", + "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", + "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m\u001b[0m" + ] + } + ], + "source": [ + "! ncompare --column-widths 33 30 30 {file_names[0]} {file_names[2]}" + ] + }, + { + "cell_type": "markdown", + "id": "11a23041-6f24-491b-a9e3-124ace151736", + "metadata": {}, + "source": [ + "#### More file details can be examined by using the `--show-attributes` and `--show-chunks` options" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1dd4c51a-394c-4569-b8b1-053743e63cb9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", + " new_vars[k] = decode_cf_variable(\n", + "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", + "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", + "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", + "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: latitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 60.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: longitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 360.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record (CDR) of GPCP Monthly Satellite-Gauge Combined Precipitation \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation amount \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA CDR of GPCP Satellite-Gauge Combined Precipitation Error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_method: sum\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record of PERSIANN-CDR daily precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation_amount\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 999999.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcalendar: Gregorian \u001b[0m\n", + "\u001b[0m long_name: time time\u001b[0m\n", + "\u001b[0m standard_name: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m\u001b[0m" + ] + } + ], + "source": [ + "! ncompare --show-attributes --show-chunks --column-widths 33 30 30 {file_names[0]} {file_names[2]}" + ] + }, + { + "cell_type": "markdown", + "id": "dccb326d-3b47-4d0f-b96d-93577d3e7c54", + "metadata": {}, + "source": [ + "END of Notebook." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ncompare-jupyter-example", + "language": "python", + "name": "ncompare-jupyter-example" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" } - ], - "source": [ - "! ncompare --show-attributes --show-chunks --column-widths 33 30 30 {file_names[0]} {file_names[2]}" - ] - }, - { - "cell_type": "markdown", - "id": "dccb326d-3b47-4d0f-b96d-93577d3e7c54", - "metadata": {}, - "source": [ - "END of Notebook." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ncompare-jupyter-example", - "language": "python", - "name": "ncompare-jupyter-example" }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/ncompare/console.py b/ncompare/console.py index e530043..91f85a2 100755 --- a/ncompare/console.py +++ b/ncompare/console.py @@ -25,7 +25,6 @@ # See the License for the specific language governing permissions and limitations under the License. """Command line interface for `ncompare` -- to compare the structure of two NetCDF files.""" - import argparse import importlib.metadata import sys @@ -35,7 +34,7 @@ from ncompare.core import compare -__version__ = importlib.metadata.version("ncompare") +__version__ = importlib.metadata.version('ncompare') def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: @@ -66,10 +65,7 @@ def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: ) parser.add_argument("--file-xlsx", help="An Excel file to which the output will be written.") parser.add_argument( - "--no-color", - action="store_true", - default=False, - help="Turn off all colorized output", + "--no-color", action="store_true", default=False, help="Turn off all colorized output" ) parser.add_argument( "--show-attributes", @@ -94,8 +90,8 @@ def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: parser.add_argument( "--version", - action="version", - version=f"%(prog)s {__version__}", + action='version', + version=f'%(prog)s {__version__}', default=False, help="Show the current version.", ) @@ -107,7 +103,7 @@ def main() -> None: # pragma: no cover """Run from the command line.""" args = _cli(None) - delattr(args, "version") + delattr(args, 'version') try: compare(**vars(args)) @@ -117,5 +113,5 @@ def main() -> None: # pragma: no cover sys.exit(0) # a clean, no-issue, exit -if __name__ == "__main__": # pragma: no cover +if __name__ == '__main__': # pragma: no cover main() diff --git a/ncompare/core.py b/ncompare/core.py index f3b553d..8b8d040 100644 --- a/ncompare/core.py +++ b/ncompare/core.py @@ -28,7 +28,6 @@ # pylint: disable=fixme """Compare the structure of two NetCDF files.""" - import random import traceback from collections import namedtuple @@ -196,11 +195,7 @@ def run_through_comparisons( + f"\nChecking multiple random values within specified variable <{comparison_var_name}>:" ) compare_multiple_random_values( - out, - nc_a, - nc_b, - groupname=comparison_var_group, - varname=comparison_var_name, + out, nc_a, nc_b, groupname=comparison_var_group, varname=comparison_var_name ) except KeyError: @@ -285,14 +280,12 @@ def walk_common_groups_tree( # type:ignore[misc] top_b[group_b_name] if (group_b_name and (group_b_name in top_b.groups)) else None, ) for (_, group_a_name, group_b_name) in common_elements( - top_a.groups if top_a is not None else "", - top_b.groups if top_b is not None else "", + top_a.groups if top_a is not None else "", top_b.groups if top_b is not None else "" ) ) for _, subgroup_a_name, subgroup_b_name in common_elements( - top_a.groups if top_a is not None else "", - top_b.groups if top_b is not None else "", + top_a.groups if top_a is not None else "", top_b.groups if top_b is not None else "" ): yield from walk_common_groups_tree( top_a_name + "/" + subgroup_a_name if subgroup_a_name else "", @@ -318,26 +311,18 @@ def compare_two_nc_files( show_attributes: bool = False, ) -> tuple[int, int, int]: """Go through all groups and all variables, and show them side by side - whether they align and where they don't.""" - out.side_by_side(" ", "File A", "File B", force_display_even_if_same=True) + out.side_by_side(' ', 'File A', 'File B', force_display_even_if_same=True) num_var_diffs = {"left": 0, "right": 0, "both": 0} with netCDF4.Dataset(nc_one) as nc_a, netCDF4.Dataset(nc_two) as nc_b: out.side_by_side( - "All Variables", " ", " ", dash_line=False, force_display_even_if_same=True + 'All Variables', ' ', ' ', dash_line=False, force_display_even_if_same=True ) - out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) + out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) group_counter = 0 _print_group_details_side_by_side( - out, - nc_a, - "/", - nc_b, - "/", - group_counter, - num_var_diffs, - show_attributes, - show_chunks, + out, nc_a, "/", nc_b, "/", group_counter, num_var_diffs, show_attributes, show_chunks ) group_counter += 1 @@ -356,20 +341,20 @@ def compare_two_nc_files( ) group_counter += 1 - out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) + out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) out.side_by_side( - "Total number of shared items:", - str(num_var_diffs["both"]), - str(num_var_diffs["both"]), + 'Total number of shared items:', + str(num_var_diffs['both']), + str(num_var_diffs['both']), force_display_even_if_same=True, ) out.side_by_side( - "Total number of non-shared items:", - str(num_var_diffs["left"]), - str(num_var_diffs["right"]), + 'Total number of non-shared items:', + str(num_var_diffs['left']), + str(num_var_diffs['right']), force_display_even_if_same=True, ) - return num_var_diffs["left"], num_var_diffs["right"], num_var_diffs["both"] + return num_var_diffs['left'], num_var_diffs['right'], num_var_diffs['both'] def _print_group_details_side_by_side( @@ -384,12 +369,7 @@ def _print_group_details_side_by_side( show_chunks: bool, ) -> None: out.side_by_side( - " ", - " ", - " ", - dash_line=False, - highlight_diff=False, - force_display_even_if_same=True, + " ", " ", " ", dash_line=False, highlight_diff=False, force_display_even_if_same=True ) out.side_by_side( f"GROUP #{group_counter:02}", @@ -408,19 +388,19 @@ def _print_group_details_side_by_side( if group_b: vars_b_sorted = sorted(group_b.variables) out.side_by_side( - "num variables in group:", + 'num variables in group:', len(vars_a_sorted), len(vars_b_sorted), highlight_diff=True, force_display_even_if_same=True, ) - out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) + out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) # Count differences between the lists of variables in this group. left, right, both = count_diffs(vars_a_sorted, vars_b_sorted) - num_var_diffs["left"] += left - num_var_diffs["right"] += right - num_var_diffs["both"] += both + num_var_diffs['left'] += left + num_var_diffs['right'] += right + num_var_diffs['both'] += both # Go through each variable in the current group. for variable_pair in common_elements(vars_a_sorted, vars_b_sorted): @@ -493,10 +473,7 @@ def _print_var_properties_side_by_side( for attr_a_key, attr_a, attr_b_key, attr_b in get_and_check_variable_attributes(v_a, v_b): # Check whether attr_a_key is empty, because it might be if the variable doesn't exist in File A. out.side_by_side( - f"{attr_a_key if attr_a_key else attr_b_key}:", - attr_a, - attr_b, - highlight_diff=True, + f"{attr_a_key if attr_a_key else attr_b_key}:", attr_a, attr_b, highlight_diff=True ) # Scale Factor @@ -506,14 +483,14 @@ def _print_var_properties_side_by_side( def get_and_check_variable_scale_factor(v_a, v_b) -> Union[None, tuple[str, str]]: - if getattr(v_a.variable, "scale_factor", None): + if getattr(v_a.variable, 'scale_factor', None): sf_a = v_a.variable.scale_factor else: - sf_a = " " - if getattr(v_b.variable, "scale_factor", None): + sf_a = ' ' + if getattr(v_b.variable, 'scale_factor', None): sf_b = v_b.variable.scale_factor else: - sf_b = " " + sf_b = ' ' if (sf_a != " ") or (sf_b != " "): return str(sf_a), str(sf_b) else: diff --git a/ncompare/printing.py b/ncompare/printing.py index a270461..13d9ae3 100644 --- a/ncompare/printing.py +++ b/ncompare/printing.py @@ -25,7 +25,6 @@ # pylint: disable=too-many-arguments """Utility functions for printing to the console or a text file.""" - import csv import re import warnings @@ -44,7 +43,7 @@ # Set up regex remover of ANSI color escape sequences # From ansi_escape = re.compile( - r""" + r''' \x1B # ESC (?: # 7-bit C1 Fe (except CSI) [@-Z\\-_] @@ -54,7 +53,7 @@ [ -/]* # Intermediate bytes [@-~] # Final byte ) -""", +''', re.VERBOSE, ) @@ -132,11 +131,7 @@ def __exit__(self, exc_type, exc_value, exc_traceback): # noqa: D105 self._text_file_obj.close() def print( - self, - string: str = "", - colors: bool = False, - add_to_history: bool = False, - **print_args, + self, string: str = "", colors: bool = False, add_to_history: bool = False, **print_args ) -> None: """Print text using custom options. @@ -161,7 +156,7 @@ def print( # Optional - write text to file if self._text_file_obj: # Remove ANSI escape sequences. - result = ansi_escape.sub("", text_to_print) + result = ansi_escape.sub('', text_to_print) self._text_file_obj.write(result + "\n") # Optional - save text to a history list @@ -173,7 +168,7 @@ def _add_to_history(self, *args): def _parse_single_str(s): # pylint: disable=invalid-name # Remove ANSI escape sequences before adding to a parsed string list. - result = ansi_escape.sub("", s) + result = ansi_escape.sub('', s) # Remove any leading or trailing newlines. return result.strip("\n") @@ -326,16 +321,16 @@ def lists_diff( # print(Fore.RED + "Which items are different? ---> %s." % # str(set(list_a).symmetric_difference(list_b))) - self.side_by_side(" ", "File A", "File B") + self.side_by_side(' ', 'File A', 'File B') self.side_by_side_list_diff(list_a, list_b) - self.side_by_side("Number of non-shared items:", str(left), str(right)) + self.side_by_side('Number of non-shared items:', str(left), str(right)) return left, right, both def write_history_to_csv(self, filename: Union[str, Path] = "test.csv"): """Save the line history that's been stored to a CSV file.""" - headers = ["Info", "File A", "File B", "Other marks"] - with open(filename, "w", encoding="utf-8") as target: + headers = ['Info', 'File A', 'File B', 'Other marks'] + with open(filename, 'w', encoding="utf-8") as target: writer = csv.writer(target) writer.writerow(headers) writer.writerows(self._line_history) @@ -346,7 +341,7 @@ def write_history_to_excel(self, filename: Union[str, Path] = "test.xlsx"): sheet = workbook.active # Add a header row - sheet.append(["Info", "File A", "File B"]) + sheet.append(['Info', 'File A', 'File B']) # Add rows and apply styles for row in self._line_history: @@ -355,7 +350,7 @@ def write_history_to_excel(self, filename: Union[str, Path] = "test.xlsx"): # First, remove difference marker that is redundant with styles applied to the row (unlike in the CSV) del row[3] sheet.append(_excel_red_cells(row, sheet)) - elif (len(row) == 1) or ((len(row) == 3) and ((row[1] == "") and (row[2] == ""))): + elif (len(row) == 1) or ((len(row) == 3) and ((row[1] == '') and (row[2] == ''))): # The case where there is a subheader and no information in the second and third columns. sheet.append(_excel_bold_underline_cells(row, sheet)) else: @@ -384,5 +379,5 @@ def _excel_bold_underline_cells(data, sheet): """Stylize cells in Excel with a bold and underlined font.""" for cell in data: cell = Cell(sheet, column="A", row=1, value=cell) - cell.font = Font(bold=True, underline="single") + cell.font = Font(bold=True, underline='single') yield cell diff --git a/ncompare/sequence_operations.py b/ncompare/sequence_operations.py index 5baef68..10dc8f3 100644 --- a/ncompare/sequence_operations.py +++ b/ncompare/sequence_operations.py @@ -24,7 +24,6 @@ # See the License for the specific language governing permissions and limitations under the License. """Helper functions for operating on iterables, such as lists or sets.""" - from collections.abc import Generator, Iterable from typing import Union @@ -63,9 +62,9 @@ def common_elements( ) if item not in a_sorted: - item_a = "" + item_a = '' elif item not in b_sorted: - item_b = "" + item_b = '' yield i, item_a, item_b diff --git a/ncompare/utils.py b/ncompare/utils.py index 6c2d720..0c03149 100644 --- a/ncompare/utils.py +++ b/ncompare/utils.py @@ -24,7 +24,6 @@ # See the License for the specific language governing permissions and limitations under the License. """Helper utilities.""" - from pathlib import Path from typing import Union diff --git a/tests/conftest.py b/tests/conftest.py index 6a11927..1e33e03 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,7 +35,7 @@ @pytest.fixture(scope="session") def temp_data_dir(tmpdir_factory) -> Path: - return Path(tmpdir_factory.mktemp("data")) + return Path(tmpdir_factory.mktemp('data')) @pytest.fixture(scope="function") @@ -130,25 +130,25 @@ def ds_3dims_3vars_4coords_1group(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_1group.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup("Group1") + grp1 = f.createGroup('Group1') # A root variable - f.createVariable("var0", "i2", ()) + f.createVariable('var0', "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension("x", 2) - grp1.createDimension("step", 3) - grp1.createDimension("track", 7) + grp1.createDimension('x', 2) + grp1.createDimension('step', 3) + grp1.createDimension('track', 7) # Variables in grp1 - grp1.createVariable("var1", "f8", ()) + grp1.createVariable('var1', 'f8', ()) # - grp1.createVariable("var2", "f4", ()) + grp1.createVariable('var2', 'f4', ()) # - grp1.createVariable("step", "f4", ("step",), fill_value=False) - grp1["step"][:] = [-0.9, -1.8, -2.7] + grp1.createVariable('step', 'f4', ('step',), fill_value=False) + grp1['step'][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) + grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) # Wrap up f.close() @@ -161,35 +161,35 @@ def ds_3dims_3vars_4coords_2groups(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_2groups.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup("Group1") - grp2 = f.createGroup("Group2") + grp1 = f.createGroup('Group1') + grp2 = f.createGroup('Group2') # A root variable - f.createVariable("var0", "i2", ()) + f.createVariable('var0', "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension("x", 2) - grp1.createDimension("step", 3) - grp1.createDimension("track", 7) + grp1.createDimension('x', 2) + grp1.createDimension('step', 3) + grp1.createDimension('track', 7) # Variables in grp1 - grp1.createVariable("var1", "f8", ()) + grp1.createVariable('var1', 'f8', ()) # - grp1.createVariable("var2", "f4", ()) + grp1.createVariable('var2', 'f4', ()) # - grp1.createVariable("step", "f4", ("step",), fill_value=False) - grp1["step"][:] = [-0.9, -1.8, -2.7] + grp1.createVariable('step', 'f4', ('step',), fill_value=False) + grp1['step'][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) + grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) # New/modified coordinates in grp2 - grp2.createDimension("x", 2) - grp2.createDimension("step", 3) - grp2.createDimension("track", 7) - grp2.createDimension("level", 4) + grp2.createDimension('x', 2) + grp2.createDimension('step', 3) + grp2.createDimension('track', 7) + grp2.createDimension('level', 4) # Variables in grp2 - grp2.createVariable("var3", "f8", ("level",), fill_value=False) + grp2.createVariable('var3', 'f8', ('level',), fill_value=False) # Wrap up f.close() @@ -202,38 +202,38 @@ def ds_3dims_3vars_4coords_1subgroup(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_1subgroup.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup("Group1") - grp2 = f.createGroup("Group2") - grp2_subgroup = grp2.createGroup("Group2_subgroup") + grp1 = f.createGroup('Group1') + grp2 = f.createGroup('Group2') + grp2_subgroup = grp2.createGroup('Group2_subgroup') # A root variable - f.createVariable("var0", "i2", ()) + f.createVariable('var0', "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension("x", 2) - grp1.createDimension("step", 3) - grp1.createDimension("track", 7) + grp1.createDimension('x', 2) + grp1.createDimension('step', 3) + grp1.createDimension('track', 7) # Variables in grp1 - grp1.createVariable("var1", "f8", ()) + grp1.createVariable('var1', 'f8', ()) # - grp1.createVariable("var2", "f4", ()) + grp1.createVariable('var2', 'f4', ()) # - grp1.createVariable("step", "f4", ("step",), fill_value=False) - grp1["step"][:] = [-0.9, -1.8, -2.7] + grp1.createVariable('step', 'f4', ('step',), fill_value=False) + grp1['step'][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) + grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) # New/modified coordinates in grp2 - grp2.createDimension("step", 3) - grp2.createDimension("level", 4) + grp2.createDimension('step', 3) + grp2.createDimension('level', 4) # Variables in grp2 - grp2.createVariable("var3", "f8", ("step", "level"), fill_value=False) + grp2.createVariable('var3', 'f8', ('step', 'level'), fill_value=False) # New/modified coordinates in grp2 # Variables in grp2 - grp2_subgroup.createVariable("var4", "f8", ("level",), fill_value=False) + grp2_subgroup.createVariable('var4', 'f8', ('level',), fill_value=False) # Wrap up f.close() diff --git a/tests/data/create_a-b_test_netcdfs.ipynb b/tests/data/create_a-b_test_netcdfs.ipynb index 49a396c..afb7ab6 100644 --- a/tests/data/create_a-b_test_netcdfs.ipynb +++ b/tests/data/create_a-b_test_netcdfs.ipynb @@ -8,9 +8,8 @@ "outputs": [], "source": [ "import time\n", - "\n", - "import netCDF4 as nc\n", - "import numpy as np" + "import numpy as np\n", + "import netCDF4 as nc" ] }, { @@ -39,70 +38,72 @@ } ], "source": [ - "some_4d_data = np.array(\n", + "some_4d_data = np.array([\n", " [\n", " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", " ],\n", " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287], \n", + " ]\n", + " ],\n", + " [\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", " ],\n", " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287], \n", + " [300, 301, 295, 287], \n", + " ]\n", + " \n", + " ],\n", + " [\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", " ],\n", " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287], \n", + " [300, 301, 295, 287], \n", + " ]\n", + " \n", + " ],\n", + " [\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", " ],\n", " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", - " ],\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287], \n", + " [300, 301, 295, 287], \n", + " ]\n", + " \n", + " ],\n", + " [\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287], \n", + " [300, 301, 295, 287], \n", + " ]\n", + " \n", " ]\n", - ")\n", + "])\n", "some_4d_data.shape" ] }, @@ -127,95 +128,81 @@ "\n", "with nc.Dataset(\"test_a.nc\", \"w\", format=\"NETCDF4\") as rootgrp:\n", " print(f\"Creating {rootgrp.data_model}...\")\n", - "\n", + " \n", " # --- Create Groups ---\n", " groups[\"Position\"] = rootgrp.createGroup(\"Position\")\n", " groups[\"Statistics\"] = rootgrp.createGroup(\"Statistics\")\n", - "\n", + " \n", " groups[\"Data\"] = rootgrp.createGroup(\"Data\")\n", " groups[\"Data_Products_Subgroup\"] = rootgrp.createGroup(\"/Data/Products\")\n", " groups[\"Data_Quality_Subgroup\"] = rootgrp.createGroup(\"/Data/Quality\")\n", - "\n", + " \n", + " \n", " # --- Create Dimensions ---\n", " dims[\"time\"] = rootgrp.createDimension(\"time\", None)\n", " dims[\"latitude\"] = rootgrp.createDimension(\"lat\", 3)\n", " dims[\"longitude\"] = rootgrp.createDimension(\"lon\", 4)\n", " dims[\"conditions\"] = rootgrp.createDimension(\"conditions\", 2)\n", - "\n", + " \n", " dims[\"level\"] = groups[\"Data\"].createDimension(\"level\", None)\n", - "\n", + " \n", + " \n", " # --- Create Variables ---\n", " conditions = rootgrp.createVariable(\"conditions\", \"i4\", (\"conditions\",))\n", " times = rootgrp.createVariable(\"time\", \"f8\", (\"time\",))\n", - "\n", + " \n", " latitudes = rootgrp.createVariable(\"/Position/lat\", \"f4\", (\"lat\",))\n", " longitudes = rootgrp.createVariable(\"/Position/lon\", \"f4\", (\"lon\",))\n", - "\n", + " \n", " mean_values = rootgrp.createVariable(\"/Statistics/mean_value\", \"f4\", (\"time\",))\n", - "\n", + " \n", " levels = rootgrp.createVariable(\"/Data/level\", \"i4\", (\"level\",))\n", - " product_temp = rootgrp.createVariable(\n", - " \"/Data/Products/temp\",\n", - " \"f4\",\n", - " (\n", - " \"time\",\n", - " \"level\",\n", - " \"lat\",\n", - " \"lon\",\n", - " ),\n", - " )\n", - " quality_flag = rootgrp.createVariable(\n", - " \"/Data/Quality/quality_flag\",\n", - " \"i4\",\n", - " (\n", - " \"time\",\n", - " \"level\",\n", - " \"lat\",\n", - " \"lon\",\n", - " ),\n", - " )\n", - "\n", + " product_temp = rootgrp.createVariable(\"/Data/Products/temp\", \"f4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", + " quality_flag = rootgrp.createVariable(\"/Data/Quality/quality_flag\", \"i4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", + " \n", + " \n", " # --- Assign Attributes ---\n", " rootgrp.description = \"Example netCDF file\"\n", " rootgrp.history = \"Created \" + time.ctime(time.time())\n", " rootgrp.source = \"test data creation script\"\n", - "\n", + " \n", " groups[\"Position\"].description = \"This group contain position data.\"\n", " groups[\"Statistics\"].description = \"This group contains statistical information.\"\n", - "\n", + " \n", " times.units = \"hours since 0001-01-01 00:00:00.0\"\n", " times.long_name = \"Time of observation\"\n", " times.calendar = \"gregorian\"\n", " times.coordinates = \"time\"\n", - "\n", + " \n", " levels.units = \"hPa\"\n", - "\n", + " \n", " latitudes.units = \"degrees north\"\n", - "\n", + " \n", " longitudes.units = \"degrees east\"\n", - "\n", + " \n", " mean_values.long_name = \"average value for each time\"\n", " mean_values.coordinates = \"time\"\n", - "\n", + " \n", " product_temp.long_name = \"temperature\"\n", " product_temp.units = \"K\"\n", - "\n", + " \n", " quality_flag.units = \"unitless\"\n", - "\n", + " \n", + " \n", " # --- Assign Data Values ---\n", - " lats = np.arange(-90, 91, 90)\n", - " lons = np.arange(-180, 180, 90)\n", + " lats = np.arange(-90, 91, 90)\n", + " lons = np.arange(-180, 180, 90)\n", " latitudes[:] = lats\n", " longitudes[:] = lons\n", - "\n", + " \n", " nlats = len(rootgrp.dimensions[\"lat\"])\n", " nlons = len(rootgrp.dimensions[\"lon\"])\n", - "\n", + " \n", " product_temp[0:5, 0:2, :, :] = some_4d_data\n", - "\n", + " \n", " times[0:5] = [1, 1.5, 2, 2.5, 3]\n", " levels[0:2] = [10, 20]\n", - "\n", + " \n", "print(\"Done.\")" ] }, @@ -240,111 +227,97 @@ "\n", "with nc.Dataset(\"test_b.nc\", \"w\", format=\"NETCDF4\") as rootgrp:\n", " print(f\"Creating {rootgrp.data_model}...\")\n", - "\n", + " \n", " # --- Create Groups ---\n", " groups[\"Position\"] = rootgrp.createGroup(\"Position\")\n", " groups[\"Statistics\"] = rootgrp.createGroup(\"Statistics\")\n", - "\n", + " \n", " groups[\"Data\"] = rootgrp.createGroup(\"Data\")\n", " groups[\"Data_Products_Subgroup\"] = rootgrp.createGroup(\"/Data/Products\")\n", " groups[\"Data_Quality_Subgroup\"] = rootgrp.createGroup(\"/Data/Quality\")\n", - "\n", + " \n", " groups[\"Data_Supplemental_Subgroup\"] = rootgrp.createGroup(\"/Data/Supplemental\")\n", " groups[\"Data_Supplemental_Details_Subgroup\"] = rootgrp.createGroup(\"/Data/Supplemental/Details\")\n", - "\n", + " \n", " # --- Create Dimensions ---\n", " dims[\"time\"] = rootgrp.createDimension(\"time\", None)\n", " dims[\"latitude\"] = rootgrp.createDimension(\"lat\", 2)\n", " dims[\"longitude\"] = rootgrp.createDimension(\"lon\", 2)\n", " dims[\"conditions\"] = rootgrp.createDimension(\"conditions\", 2)\n", - "\n", + " \n", " dims[\"level\"] = groups[\"Data\"].createDimension(\"level\", None)\n", - "\n", + " \n", + " \n", " # --- Create Variables ---\n", " conditions = rootgrp.createVariable(\"conditions\", \"i4\", (\"conditions\",))\n", " times = rootgrp.createVariable(\"time\", \"f8\", (\"time\",))\n", - "\n", + " \n", " latitudes = rootgrp.createVariable(\"/Position/lat\", \"f4\", (\"lat\",))\n", " longitudes = rootgrp.createVariable(\"/Position/lon\", \"f4\", (\"lon\",))\n", - "\n", + " \n", " std_values = rootgrp.createVariable(\"/Statistics/std_value\", \"f4\", (\"time\",))\n", - "\n", + " \n", " levels = rootgrp.createVariable(\"/Data/level\", \"i4\", (\"level\",))\n", - " product_temp = rootgrp.createVariable(\n", - " \"/Data/Products/temp\",\n", - " \"f4\",\n", - " (\n", - " \"time\",\n", - " \"level\",\n", - " \"lat\",\n", - " \"lon\",\n", - " ),\n", - " )\n", - " quality_flag = rootgrp.createVariable(\n", - " \"/Data/Quality/quality_flag\",\n", - " \"i4\",\n", - " (\n", - " \"time\",\n", - " \"level\",\n", - " \"lat\",\n", - " \"lon\",\n", - " ),\n", - " )\n", - "\n", - " supplemental_flag = rootgrp.createVariable(\n", - " \"/Data/Supplemental/supplemental_flag\", \"i4\", (\"time\", \"conditions\")\n", - " )\n", - " condition_details = rootgrp.createVariable(\n", - " \"/Data/Supplemental/Details/condition_details\", \"f8\", (\"conditions\")\n", - " )\n", - "\n", + " product_temp = rootgrp.createVariable(\"/Data/Products/temp\", \"f4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", + " quality_flag = rootgrp.createVariable(\"/Data/Quality/quality_flag\", \"i4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", + " \n", + " supplemental_flag = rootgrp.createVariable(\"/Data/Supplemental/supplemental_flag\", \"i4\", (\"time\", \"conditions\"))\n", + " condition_details = rootgrp.createVariable(\"/Data/Supplemental/Details/condition_details\", \"f8\", (\"conditions\"))\n", + " \n", + " \n", " # --- Assign Attributes ---\n", " rootgrp.description = \"Example netCDF file\"\n", " rootgrp.history = \"Created \" + time.ctime(time.time())\n", " rootgrp.source = \"test data creation script\"\n", - "\n", + " \n", " groups[\"Position\"].description = \"This group contain position data.\"\n", " groups[\"Statistics\"].description = \"This group contains statistical information.\"\n", - "\n", + " \n", " times.units = \"hours since 0001-01-01 00:00:00.0\"\n", " times.long_name = \"Time of observation\"\n", " times.calendar = \"gregorian\"\n", " times.coordinates = \"time\"\n", - "\n", + " \n", " levels.units = \"hPa\"\n", - "\n", + " \n", " latitudes.units = \"degrees north\"\n", - "\n", + " \n", " longitudes.units = \"degrees east\"\n", - "\n", + " \n", " std_values.long_name = \"standard deviation value for each time\"\n", " std_values.coordinates = \"time\"\n", - "\n", + " \n", " product_temp.long_name = \"temperature\"\n", " product_temp.units = \"Kelvin\"\n", - "\n", + " \n", " quality_flag.units = \"unitless\"\n", - "\n", + " \n", " supplemental_flag.units = \"unitless\"\n", - "\n", + " \n", " # --- Assign Data Values ---\n", - " lats = np.arange(-90, 1, 90)\n", - " lons = np.arange(-180, 0, 90)\n", + " lats = np.arange(-90, 1, 90)\n", + " lons = np.arange(-180, 0, 90)\n", " latitudes[:] = lats\n", " longitudes[:] = lons\n", - "\n", + " \n", " nlats = len(rootgrp.dimensions[\"lat\"])\n", " nlons = len(rootgrp.dimensions[\"lon\"])\n", - "\n", + " \n", " product_temp[0:5, 0:2, :, :] = some_4d_data[:, :, :-1, :-2]\n", - "\n", + " \n", " times[0:5] = [1, 1.5, 2, 2.5, 3]\n", " levels[0:2] = [10, 20]\n", - "\n", - " supplemental_flag = [[1, 2], [0, 1], [1, 2], [0, 1], [1, 2]]\n", - "\n", + " \n", + " supplemental_flag = [\n", + " [1, 2],\n", + " [0, 1],\n", + " [1, 2],\n", + " [0, 1],\n", + " [1, 2]\n", + " ]\n", + " \n", " condition_details = [8.65, 1.23]\n", - "\n", + " \n", "print(\"Done.\")" ] }, diff --git a/tests/test_cli.py b/tests/test_cli.py index d314ae8..5bb74dc 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -29,12 +29,12 @@ def test_console_version(): - exit_status = os.system("ncompare --version") + exit_status = os.system('ncompare --version') assert exit_status == 0 def test_console_help(): - exit_status = os.system("ncompare --help") + exit_status = os.system('ncompare --help') assert exit_status == 0 diff --git a/tests/test_complete_file_output.py b/tests/test_complete_file_output.py index d4af4ef..d989733 100644 --- a/tests/test_complete_file_output.py +++ b/tests/test_complete_file_output.py @@ -42,10 +42,7 @@ def test_full_run_to_text_output(temp_data_dir): file_text=str(out_path), ) - with ( - open(data_for_tests_dir / "a-b_test_golden_file.txt") as f1, - open(str(out_path)) as f2, - ): + with open(data_for_tests_dir / "a-b_test_golden_file.txt") as f1, open(str(out_path)) as f2: exclude_n_lines = 3 for _ in range(exclude_n_lines): @@ -68,10 +65,7 @@ def test_full_run_to_csv_output(temp_data_dir): file_csv=str(out_path), ) - with ( - open(data_for_tests_dir / "a-b_test_golden_file.csv") as f1, - open(str(out_path)) as f2, - ): + with open(data_for_tests_dir / "a-b_test_golden_file.csv") as f1, open(str(out_path)) as f2: exclude_n_lines = 3 for _ in range(exclude_n_lines): diff --git a/tests/test_core.py b/tests/test_core.py index 8d127a6..e106274 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -28,7 +28,6 @@ Note that full comparison tests are performed in both directions, i.e., A -> B and B -> A. """ - from contextlib import nullcontext as does_not_raise import pytest @@ -77,10 +76,10 @@ def test_matching_random_values( ds_1dim_1var_allnan_1coord, outputter_to_console, ): - variable_array_1 = xr.open_dataset(ds_3dims_2vars_4coords).variables["z1"] - variable_array_2 = xr.open_dataset(ds_4dims_3vars_5coords).variables["z1"] - variable_array_3 = xr.open_dataset(ds_1dim_1var_1coord).variables["z1"] - variable_array_allnan = xr.open_dataset(ds_1dim_1var_allnan_1coord).variables["z1"] + variable_array_1 = xr.open_dataset(ds_3dims_2vars_4coords).variables['z1'] + variable_array_2 = xr.open_dataset(ds_4dims_3vars_5coords).variables['z1'] + variable_array_3 = xr.open_dataset(ds_1dim_1var_1coord).variables['z1'] + variable_array_allnan = xr.open_dataset(ds_1dim_1var_allnan_1coord).variables['z1'] assert ( _match_random_value( @@ -129,10 +128,7 @@ def test_matching_random_values( def test_print_values_runs_with_no_error(ds_3dims_3vars_4coords_1group, outputter_to_console): with does_not_raise(): _print_sample_values( - outputter_to_console, - ds_3dims_3vars_4coords_1group, - groupname="Group1", - varname="step", + outputter_to_console, ds_3dims_3vars_4coords_1group, groupname="Group1", varname="step" ) @@ -140,10 +136,7 @@ def test_print_values_to_text_file_runs_with_no_error( ds_3dims_3vars_4coords_1group, outputter_to_text_file, temp_test_text_file_path ): _print_sample_values( - outputter_to_text_file, - ds_3dims_3vars_4coords_1group, - groupname="Group1", - varname="step", + outputter_to_text_file, ds_3dims_3vars_4coords_1group, groupname="Group1", varname="step" ) outputter_to_text_file._text_file_obj.close() @@ -199,7 +192,7 @@ def test_comparison_var_no_error_for_duplicate_dataset( def test_get_vars_with_group(ds_3dims_3vars_4coords_1group): result = _get_vars(ds_3dims_3vars_4coords_1group, groupname="Group1") - assert set(result) == {"step", "var1", "var2", "w"} + assert set(result) == {'step', 'var1', 'var2', 'w'} def test_get_vars_error_when_no_group(ds_3dims_2vars_4coords): diff --git a/tests/test_printing.py b/tests/test_printing.py index e3223a3..e6ede64 100644 --- a/tests/test_printing.py +++ b/tests/test_printing.py @@ -26,7 +26,7 @@ def test_list_of_strings_diff(outputter_to_console): left, right, both = outputter_to_console.lists_diff( - ["hey", "yo", "beebop"], ["what", "is", "this", "beebop"] + ['hey', 'yo', 'beebop'], ['what', 'is', 'this', 'beebop'] ) assert (left, right, both) == (2, 3, 1) diff --git a/tests/test_sequence_operations.py b/tests/test_sequence_operations.py index d1dd4a1..f7af980 100644 --- a/tests/test_sequence_operations.py +++ b/tests/test_sequence_operations.py @@ -30,8 +30,8 @@ @pytest.fixture def two_example_lists() -> tuple[list[str], list[str]]: - a = ["yo", "beebop", "hey"] - b = ["what", "does", "this", "beebop", "mean"] + a = ['yo', 'beebop', 'hey'] + b = ['what', 'does', 'this', 'beebop', 'mean'] return a, b @@ -39,13 +39,13 @@ def test_common_elements(two_example_lists): composed_pairs = [e for e in common_elements(*two_example_lists)] should_be = [ - (0, "beebop", "beebop"), - (1, "", "does"), - (2, "hey", ""), - (3, "", "mean"), - (4, "", "this"), - (5, "", "what"), - (6, "yo", ""), + (0, 'beebop', 'beebop'), + (1, '', 'does'), + (2, 'hey', ''), + (3, '', 'mean'), + (4, '', 'this'), + (5, '', 'what'), + (6, 'yo', ''), ] assert composed_pairs == should_be diff --git a/tests/test_utils.py b/tests/test_utils.py index b87f535..fe800e0 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -60,7 +60,7 @@ def test_coerce_int_to_str(): def test_coerce_tuple_to_str(): - assert coerce_to_str(("step", 123)) == "('step', 123)" + assert coerce_to_str(('step', 123)) == "('step', 123)" def test_error_from_not_able_to_coerce_to_str(): From 51f9e2493d7500504f044bec707e787f8438011f Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 14 Nov 2024 13:09:25 -0500 Subject: [PATCH 05/10] use black without jupyter --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1288790..19e619b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,7 +45,7 @@ repos: - repo: https://github.com/psf/black rev: 24.10.0 hooks: - - id: black-jupyter + - id: black - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.13.0 From 1cca0fdc8bbd16d1b7cebd71d7a5b35d0f4fb915 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 14 Nov 2024 14:43:13 -0500 Subject: [PATCH 06/10] use only ruff for formatting, remove black --- .pre-commit-config.yaml | 5 - poetry.lock | 1994 ++++++++++++++++++++------------------- pyproject.toml | 7 +- 3 files changed, 1037 insertions(+), 969 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 19e619b..e13c4a7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -42,11 +42,6 @@ repos: args: ["--fix", "--exit-non-zero-on-fix"] - id: ruff-format - - repo: https://github.com/psf/black - rev: 24.10.0 - hooks: - - id: black - - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.13.0 hooks: diff --git a/poetry.lock b/poetry.lock index 8b20633..bfacc94 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "appnope" @@ -31,32 +31,32 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -83,140 +83,108 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "24.8.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "bleach" -version = "6.1.0" +version = "6.2.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, - {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, ] [package.dependencies] -six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.3)"] +css = ["tinycss2 (>=1.1.0,<1.5)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -224,41 +192,47 @@ pycparser = "*" [[package]] name = "cftime" -version = "1.6.4" +version = "1.6.4.post1" description = "Time-handling functionality from netcdf4-python" optional = false python-versions = ">=3.8" files = [ - {file = "cftime-1.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d"}, - {file = "cftime-1.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba"}, - {file = "cftime-1.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e"}, - {file = "cftime-1.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f"}, - {file = "cftime-1.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75"}, - {file = "cftime-1.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7"}, - {file = "cftime-1.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c"}, - {file = "cftime-1.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d"}, - {file = "cftime-1.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639"}, - {file = "cftime-1.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6"}, - {file = "cftime-1.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9"}, - {file = "cftime-1.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44"}, - {file = "cftime-1.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392"}, - {file = "cftime-1.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8"}, - {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd"}, - {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654"}, - {file = "cftime-1.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7"}, - {file = "cftime-1.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667"}, - {file = "cftime-1.6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c"}, - {file = "cftime-1.6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2"}, - {file = "cftime-1.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8"}, - {file = "cftime-1.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7"}, - {file = "cftime-1.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f"}, - {file = "cftime-1.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a"}, - {file = "cftime-1.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e"}, - {file = "cftime-1.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3"}, - {file = "cftime-1.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468"}, - {file = "cftime-1.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea"}, - {file = "cftime-1.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8"}, - {file = "cftime-1.6.4.tar.gz", hash = "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc"}, + {file = "cftime-1.6.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0baa9bc4850929da9f92c25329aa1f651e2d6f23e237504f337ee9e12a769f5d"}, + {file = "cftime-1.6.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bb6b087f4b2513c37670bccd457e2a666ca489c5f2aad6e2c0e94604dc1b5b9"}, + {file = "cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d9bdeb9174962c9ca00015190bfd693de6b0ec3ec0b3dbc35c693a4f48efdcc"}, + {file = "cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e735cfd544878eb94d0108ff5a093bd1a332dba90f979a31a357756d609a90d5"}, + {file = "cftime-1.6.4.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dcd1b140bf50da6775c56bd7ca179e84bd258b2f159b53eefd5c514b341f2bf"}, + {file = "cftime-1.6.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:e60b8f24b20753f7548f410f7510e28b941f336f84bd34e3cfd7874af6e70281"}, + {file = "cftime-1.6.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1bf7be0a0afc87628cb8c8483412aac6e48e83877004faa0936afb5bf8a877ba"}, + {file = "cftime-1.6.4.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f64ca83acc4e3029f737bf3a32530ffa1fbf53124f5bee70b47548bc58671a7"}, + {file = "cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ebdfd81726b0cfb8b524309224fa952898dfa177c13d5f6af5b18cefbf497d"}, + {file = "cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ea0965a4c87739aebd84fe8eed966e5809d10065eeffd35c99c274b6f8da15"}, + {file = "cftime-1.6.4.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:800a18aea4e8cb2b206450397cb8a53b154798738af3cdd3c922ce1ca198b0e6"}, + {file = "cftime-1.6.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:5dcfc872f455db1f12eabe3c3ba98e93757cd60ed3526a53246e966ccde46c8a"}, + {file = "cftime-1.6.4.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a590f73506f4704ba5e154ef55bfbaed5e1b4ac170f3caeb8c58e4f2c619ee4e"}, + {file = "cftime-1.6.4.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:933cb10e1af4e362e77f513e3eb92b34a688729ddbf938bbdfa5ac20a7f44ba0"}, + {file = "cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf17a1b36f62e9e73c4c9363dd811e1bbf1170f5ac26d343fb26012ccf482908"}, + {file = "cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e18021f421aa26527bad8688c1acf0c85fa72730beb6efce969c316743294f2"}, + {file = "cftime-1.6.4.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5835b9d622f9304d1c23a35603a0f068739f428d902860f25e6e7e5a1b7cd8ea"}, + {file = "cftime-1.6.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:7f50bf0d1b664924aaee636eb2933746b942417d1f8b82ab6c1f6e8ba0da6885"}, + {file = "cftime-1.6.4.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5c89766ebf088c097832ea618c24ed5075331f0b7bf8e9c2d4144aefbf2f1850"}, + {file = "cftime-1.6.4.post1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f27113f7ccd1ca32881fdcb9a4bec806a5f54ae621fc1c374f1171f3ed98ef2"}, + {file = "cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da367b23eea7cf4df071c88e014a1600d6c5bbf22e3393a4af409903fa397e28"}, + {file = "cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6579c5c83cdf09d73aa94c7bc34925edd93c5f2c7dd28e074f568f7e376271a0"}, + {file = "cftime-1.6.4.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b731c7133d17b479ca0c3c46a7a04f96197f0a4d753f4c2284c3ff0447279b4"}, + {file = "cftime-1.6.4.post1-cp313-cp313-win_amd64.whl", hash = "sha256:d2a8c223faea7f1248ab469cc0d7795dd46f2a423789038f439fee7190bae259"}, + {file = "cftime-1.6.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9df3e2d49e548c62d1939e923800b08d2ab732d3ac8d75b857edd7982c878552"}, + {file = "cftime-1.6.4.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2892b7e7654142d825655f60eb66c3e1af745901890316907071d44cf9a18d8a"}, + {file = "cftime-1.6.4.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4ab54e6c04e68395d454cd4001188fc4ade2fe48035589ed65af80c4527ef08"}, + {file = "cftime-1.6.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:568b69fc52f406e361db62a4d7a219c6fb0ced138937144c3b3a511648dd6c50"}, + {file = "cftime-1.6.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:640911d2629f4a8f81f6bc0163a983b6b94f86d1007449b8cbfd926136cda253"}, + {file = "cftime-1.6.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44e9f8052600803b55f8cb6bcac2be49405c21efa900ec77a9fb7f692db2f7a6"}, + {file = "cftime-1.6.4.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90b6ef4a3fc65322c212a2c99cec75d1886f1ebaf0ff6189f7b327566762222"}, + {file = "cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652700130dbcca3ae36dbb5b61ff360e62aa09fabcabc42ec521091a14389901"}, + {file = "cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a7fb6cc541a027dab37fdeb695f8a2b21cd7d200be606f81b5abc38f2391e2"}, + {file = "cftime-1.6.4.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fc2c0abe2dbd147e1b1e6d0f3de19a5ea8b04956acc204830fd8418066090989"}, + {file = "cftime-1.6.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:0ee2f5af8643aa1b47b7e388763a1a6e0dc05558cd2902cffb9cbcf954397648"}, + {file = "cftime-1.6.4.post1.tar.gz", hash = "sha256:50ac76cc9f10ab7bd46e44a71c51a6927051b499b4407df4f29ab13d741b942f"}, ] [package.dependencies] @@ -269,101 +243,116 @@ numpy = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -410,63 +399,73 @@ test = ["pytest"] [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.5" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5fc459f1b62aa328b5c6943b4fa060fa63e7749e41c974929c503dc01d0527b"}, + {file = "coverage-7.6.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:197fc6b5e6271c4f822486cabbd91f32e73f784076b69c91179c5a9fec2d1442"}, + {file = "coverage-7.6.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7cab0762dfbf0b0cd6eb22f7bceade31bda0f0647f9420cbb45571de4493a3"}, + {file = "coverage-7.6.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4559597f53455d70b9935e25c21fd05aebbb8d540af04097f7cf6dc7562754"}, + {file = "coverage-7.6.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e68b894ee1a170da94b7da381527f277ec00c67f6141e79aa1ce8eebbb5561"}, + {file = "coverage-7.6.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fe4ea637711f1f1895895578972e3d0ed5efb6ef970ba0e2e26d9fad1e3c820e"}, + {file = "coverage-7.6.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1d5f036235a747cd30be433ef7ba6dab5ac41d8dc69d54094d5438c34fe8d565"}, + {file = "coverage-7.6.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a6ab7b88b1a614bc1db015e68048eb29b0c30ffa01be3d7d04da1f320db0f01"}, + {file = "coverage-7.6.5-cp310-cp310-win32.whl", hash = "sha256:ad712a72cd734fb4265041005011bbf61f8d6cba74e12c91f14a9cda63a80a64"}, + {file = "coverage-7.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:61e03bb66c087b74aea6c28d10a49f72eca98b95438a8db1ae6dfcdd060f9039"}, + {file = "coverage-7.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffec9f67f4eb8bc9c5df720833f1f1ca36b73d86e6f95b422ca5210e264cc26"}, + {file = "coverage-7.6.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fde790ac0024af19fc5327fd50890dad0c31b653f6d2ed91ab2810c046bfe22"}, + {file = "coverage-7.6.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3250186381ec8e9b71234fb92ef77da87d81cbf20df3364f8f5ebf7180ec030d"}, + {file = "coverage-7.6.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecfa205ce1fab6d8e94fe011eec04f6035a6069f70c331efd7cd1cd2d33d897"}, + {file = "coverage-7.6.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15af7bfbc37de33e7df3f740cc735057606c63bbe44aee8b07339a3e7bb8ecf6"}, + {file = "coverage-7.6.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:caf4d6af23af0e0df4e40e9985f6063d7f5434f225ee4d4ed7001f1428302403"}, + {file = "coverage-7.6.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5dcf2da597fe616a41c59e29fd8d390ac2149aeed421172eef14470c7e9dcd06"}, + {file = "coverage-7.6.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebc76107d896a53116e5ef21998f321b630b574a65b78b01176ca64e8978b43e"}, + {file = "coverage-7.6.5-cp311-cp311-win32.whl", hash = "sha256:0e9e4cd48dca252d99bb97b14f13b5940813937cc7ec568418c1a195dec9cbcc"}, + {file = "coverage-7.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:a6eb14739a20c5a46073c8ad066ada17d91d14599ed98d724614db46fbae867b"}, + {file = "coverage-7.6.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9ae01c434cb0d445008257bb42dcd38112190e5bfc3a4480fde49572b16bc2ae"}, + {file = "coverage-7.6.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c72ef3be899f389c9f0934a9d06a28fa097ade096760102c732583c04cc31d75"}, + {file = "coverage-7.6.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2fc574b4fb082a0141d4df00079c4877d46cb98e8ec979cbd9a92426f5abd8a"}, + {file = "coverage-7.6.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bc0eba158ad9d1883efb4f1bf08f88a999e091daf30454fd5f136322e700c72"}, + {file = "coverage-7.6.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a360b282c0acbf3541cc67e8d8a2a65589ea6cfa10c7e8a48e318bf28ca90f94"}, + {file = "coverage-7.6.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b22f96d3f2425942a649d786f57ae431425c9a970afae784cd865c1ffee34bad"}, + {file = "coverage-7.6.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:70eca9c6bf742feaf3ee453c1aaa932c2ab88ca420f411d90aa43ae831127b22"}, + {file = "coverage-7.6.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c4bafec5da3498d498a4ca3136f5a01fded487c6a54f18aea0bcd673feedf1b"}, + {file = "coverage-7.6.5-cp312-cp312-win32.whl", hash = "sha256:edecf498cabb335e8a683eb672558355bb9536d4397c54f1e135d9b8910512a3"}, + {file = "coverage-7.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:e7c40ae56761d3c08f916019b2f8579a147f93be8e12f0f2bf4edc4ea9e1c0ab"}, + {file = "coverage-7.6.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:49ea4a739dc14856d7c5f935da90db123b77a850cfddcfacb490a28de8f87257"}, + {file = "coverage-7.6.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0c51339a28aa43d0f2b1211e57ceeeeed5e09f4deb6fc543d939de68069e81e"}, + {file = "coverage-7.6.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:040c3d5cf4db24e7cb890bf4b547a25bd3a3516c58c9f2a22f822199ee2ad8ed"}, + {file = "coverage-7.6.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0b7e67f9d3b156ab93fce71485fadd043ab04b45d5d88623c6d94f7d16ced5b"}, + {file = "coverage-7.6.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e078bfb114025c55fdbaa802f4c13e20e6ce4e10a96918d7234656b41f69e649"}, + {file = "coverage-7.6.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:559cdb21aca30810e648ac08270535c1d2e17226ebbdf90860a060d3680cb05f"}, + {file = "coverage-7.6.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:23e2dd956277061f24d9eda7539113a9c35a9409a9935647a34ced79b8aacb75"}, + {file = "coverage-7.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3e7c4ccb41dc9830b2ca8592e401045a81740f627c7c0348bdc3b7373ce52f8e"}, + {file = "coverage-7.6.5-cp313-cp313-win32.whl", hash = "sha256:9d3565bb7deaa12d634426f113e6b106028c535667ba7756af65f00464981ba5"}, + {file = "coverage-7.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:5039410420d9ddcd5b8566d3afbb28b89d70c4481dbb283ea543263cbefa2b67"}, + {file = "coverage-7.6.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:77b640aa78d4d9f620fb2e1b2a41b0d196120c188d0a7f678761d668d6251fcc"}, + {file = "coverage-7.6.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bb3799f6279df37e369027128926de4c159e6399000316ebd7a69e55b84dc97f"}, + {file = "coverage-7.6.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55aba7ab64e8af37a18064f23f399dff10041fa3aaf201528f12004968638b9f"}, + {file = "coverage-7.6.5-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6065a988d724dd3328cb21e97378bef0549b2f8b7ac0a3376785d9f7f05dc736"}, + {file = "coverage-7.6.5-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f092d222e4286cdd1ab9707da36944c11ba6294d8c9b18534057f03e6866367"}, + {file = "coverage-7.6.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1dc99aece5f899955eece053a798e279f7fe7059dd5e2a95af82878cfe4a44e1"}, + {file = "coverage-7.6.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1b14515f83ffa7a6787e725d804c6b11dd317a6bd0373d8519a61e4a587fe534"}, + {file = "coverage-7.6.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9fa6d90130165346935541f3762933dae07e237ff7d6d780fae556039f08a470"}, + {file = "coverage-7.6.5-cp313-cp313t-win32.whl", hash = "sha256:1be9ec4c49becb35955b9d69c27e6385aedd40d233f1cf065e8430c59924b30e"}, + {file = "coverage-7.6.5-cp313-cp313t-win_amd64.whl", hash = "sha256:7ff4fd7679df56e36fc838ef227e95e3aa1b0ca0548daede7f8ae6e54479c115"}, + {file = "coverage-7.6.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:23abf0846290aa57d629c4f4181d0d56cbaa45d3999e60cb0df1d2bab7bc6bfe"}, + {file = "coverage-7.6.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4903685e8059e170182ac4681ee72d2dfbb92692225023c1e325a9d85c1be31"}, + {file = "coverage-7.6.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad9621fd9773b1461f8942da4130fbb16ee0a877eb58bc57532ea41cce20d3e"}, + {file = "coverage-7.6.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7324358a77f37ffd8ba94d3c8326eb316c972ec72264f36fc3be04cff8542465"}, + {file = "coverage-7.6.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf182001229411cd6a90d180973b345bd6fe255dbbac362100e6a625dfb107f5"}, + {file = "coverage-7.6.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4601dacd88556c94c9fb5063b9354b1fe971af9a5b25b2575faefd12bf8170a5"}, + {file = "coverage-7.6.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e5aa3d62285ef1b16f655e1ae298c6fa919209637d317934e382e9b99c28c118"}, + {file = "coverage-7.6.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8cb5601620c3d98d2c98847272acc2406333d43c9d7d49386d879bd451677429"}, + {file = "coverage-7.6.5-cp39-cp39-win32.whl", hash = "sha256:c32428f6285344caedd945236f31c46645bb10faae8702d1409bb49df218e55a"}, + {file = "coverage-7.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:809e868eee27d056bc72590c69940c119775d218681b1a8ef9ba0ef8d7693e53"}, + {file = "coverage-7.6.5-pp39.pp310-none-any.whl", hash = "sha256:49145276f39f940b18a539e1e4a378e06c64a127922450ffd2fb82b9fe1ad3d9"}, + {file = "coverage-7.6.5.tar.gz", hash = "sha256:6069188329fbe0a63876719099076261ce7a1adeea95bf236cff4353a8451b0d"}, ] [package.dependencies] @@ -477,33 +476,37 @@ toml = ["tomli"] [[package]] name = "debugpy" -version = "1.8.2" +version = "1.8.8" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, - {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, - {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, - {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, - {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, - {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, - {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, - {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, - {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, - {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, - {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, - {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, - {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, - {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, - {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, - {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, - {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, - {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, - {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, - {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, - {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, - {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, + {file = "debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6"}, + {file = "debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d"}, + {file = "debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f"}, + {file = "debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9"}, + {file = "debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318"}, + {file = "debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba"}, + {file = "debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98"}, + {file = "debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4"}, + {file = "debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996"}, + {file = "debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9"}, + {file = "debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9"}, + {file = "debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864"}, + {file = "debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804"}, + {file = "debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f"}, + {file = "debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add"}, + {file = "debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b"}, + {file = "debugpy-1.8.8-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:143ef07940aeb8e7316de48f5ed9447644da5203726fca378f3a6952a50a9eae"}, + {file = "debugpy-1.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95651bdcbfd3b27a408869a53fbefcc2bcae13b694daee5f1365b1b83a00113"}, + {file = "debugpy-1.8.8-cp38-cp38-win32.whl", hash = "sha256:26b461123a030e82602a750fb24d7801776aa81cd78404e54ab60e8b5fecdad5"}, + {file = "debugpy-1.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3cbf1833e644a3100eadb6120f25be8a532035e8245584c4f7532937edc652a"}, + {file = "debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854"}, + {file = "debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2"}, + {file = "debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2"}, + {file = "debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9"}, + {file = "debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f"}, + {file = "debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091"}, ] [[package]] @@ -530,24 +533,24 @@ files = [ [[package]] name = "et-xmlfile" -version = "1.1.0" +version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, - {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, ] [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -555,13 +558,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -600,33 +603,40 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -711,22 +721,22 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -747,13 +757,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -764,17 +774,17 @@ rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" -version = "2023.12.1" +version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [package.dependencies] @@ -782,13 +792,13 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.2" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -836,13 +846,13 @@ files = [ [[package]] name = "jupytext" -version = "1.16.2" +version = "1.16.4" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.2-py3-none-any.whl", hash = "sha256:197a43fef31dca612b68b311e01b8abd54441c7e637810b16b6cb8f2ab66065e"}, - {file = "jupytext-1.16.2.tar.gz", hash = "sha256:8627dd9becbbebd79cc4a4ed4727d89d78e606b4b464eab72357b3b029023a14"}, + {file = "jupytext-1.16.4-py3-none-any.whl", hash = "sha256:76989d2690e65667ea6fb411d8056abe7cd0437c07bd774660b83d62acf9490a"}, + {file = "jupytext-1.16.4.tar.gz", hash = "sha256:28e33f46f2ce7a41fb9d677a4a2c95327285579b64ca104437c4b9eb1e4174e9"}, ] [package.dependencies] @@ -854,24 +864,24 @@ pyyaml = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] -test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] [[package]] name = "markdown" -version = "3.6" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, - {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] @@ -938,71 +948,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -1021,13 +1032,13 @@ traitlets = "*" [[package]] name = "mdit-py-plugins" -version = "0.4.1" +version = "0.4.2" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, ] [package.dependencies] @@ -1137,13 +1148,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-jupyter" -version = "0.25.0" +version = "0.25.1" description = "Use Jupyter in mkdocs websites" optional = false python-versions = ">=3.9" files = [ - {file = "mkdocs_jupyter-0.25.0-py3-none-any.whl", hash = "sha256:d83d71deef19f0401505945bf92ec3bd5b40615af89308e72d5112929f8ee00b"}, - {file = "mkdocs_jupyter-0.25.0.tar.gz", hash = "sha256:e26c1d341916bc57f96ea3f93d8d0a88fc77c87d4cee222f66d2007798d924f5"}, + {file = "mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8"}, + {file = "mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe"}, ] [package.dependencies] @@ -1156,13 +1167,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.39" +version = "9.5.44" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.39-py3-none-any.whl", hash = "sha256:0f2f68c8db89523cb4a59705cd01b4acd62b2f71218ccb67e1e004e560410d2b"}, - {file = "mkdocs_material-9.5.39.tar.gz", hash = "sha256:25faa06142afa38549d2b781d475a86fb61de93189f532b88e69bf11e5e5c3be"}, + {file = "mkdocs_material-9.5.44-py3-none-any.whl", hash = "sha256:47015f9c167d58a5ff5e682da37441fc4d66a1c79334bfc08d774763cacf69ca"}, + {file = "mkdocs_material-9.5.44.tar.gz", hash = "sha256:f3a6c968e524166b3f3ed1fb97d3ed3e0091183b0545cedf7156a2a6804c56c0"}, ] [package.dependencies] @@ -1196,13 +1207,13 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.26.1" +version = "0.26.2" description = "Automatic documentation from sources, for MkDocs." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mkdocstrings-0.26.1-py3-none-any.whl", hash = "sha256:29738bfb72b4608e8e55cc50fb8a54f325dc7ebd2014e4e3881a49892d5983cf"}, - {file = "mkdocstrings-0.26.1.tar.gz", hash = "sha256:bb8b8854d6713d5348ad05b069a09f3b79edbc6a0f33a34c6821141adb03fe33"}, + {file = "mkdocstrings-0.26.2-py3-none-any.whl", hash = "sha256:1248f3228464f3b8d1a15bd91249ce1701fe3104ac517a5f167a0e01ca850ba5"}, + {file = "mkdocstrings-0.26.2.tar.gz", hash = "sha256:34a8b50f1e6cfd29546c6c09fbe02154adfb0b361bb758834bf56aa284ba876e"}, ] [package.dependencies] @@ -1224,38 +1235,43 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mypy" -version = "1.11.2" +version = "1.13.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, - {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, - {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, - {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, - {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, - {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, - {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [package.dependencies] @@ -1265,6 +1281,7 @@ typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] @@ -1374,36 +1391,41 @@ files = [ [[package]] name = "netcdf4" -version = "1.7.1.post2" +version = "1.7.2" description = "Provides an object-oriented python interface to the netCDF version 4 library" optional = false python-versions = ">=3.8" files = [ - {file = "netCDF4-1.7.1.post2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a1006ae117a754e3cf41a9e704032bf3837cbf53a695cd71deaad3e02e93d570"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:7530d60cf6450d997ea0607f8b68b9b088f2382c42648cddf5e66e6f1280b692"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:756a54cb212c9fc5d0ea74f7c661621821138ab8f63e818317330330cfd6165c"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:156428fc63e2280e8bcab7f49531cde19fbba192c2ffdfb352c6a3f5e813a80b"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-win_amd64.whl", hash = "sha256:79d890ade8b8646bb2833c2b9565392cdf5e97e016cf0319693d13bd8c2dd511"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b2700bd0a188637b740aa6ad09dbf9d21337fb1e0336f9859c2c6e9525404cc0"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:914e210f76c4ce016aed32ba7dfad57e6316a38502bdcbd071fc74ee8fec73ec"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a98731d88889e41e9a92d67cad8ac9d9c4acba612a999db803bd082384462dea"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6369ed38ffd094fce44e066d0823b6420205d5825a715fe048146052b299754c"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-win_amd64.whl", hash = "sha256:9fe939ad543371b5ea46864ba6ac88532b2189ce139804b3187c241eb89a02a6"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:658f38ceb74bb127e293a47fa36f949babba0c872cf3091e2fdafa73caacc7e4"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5f396f150f97831229e47f449fe6acbca8ff9d08b2166560c46790aa6f11b56b"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5216369a0a4a868dadb5c4137d854810a309b9f9ef1d16786269fbeb244101"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12f8ab560320e879763b7837d6f8f5eb285195271f47fc5c18362e5b097ee67c"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-win_amd64.whl", hash = "sha256:2cbca7dcd92075aebe7c242e16f51f20bc5073b6f0f1449394dadc3c17e44b29"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:13dc0d3fa4d46e531f32fa0bb4068bdac35513114b9548ea49f92e85d9702afb"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:f040aecec09a44388e1469725d471e8f1d491d4b70b27c8b2d45fd47db4e8abc"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0691d20fcc2d41cd0a15ef335a4f038ccaf07c013c4c79ad3e39993cac3c9bbb"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa22721d9860181c03506c6d718b3a9daf8d07dcb35a466b376760f8eddfffe5"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:d92bd60dc2b4beba293d81912f3094b2854e9f492ce5e9b4a3ad4fbd725a29e8"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:d8c015cd8c8582b351d715aed4c17da2e68493edaa59e91f6cf12756479fbd53"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bc8ca705e39ac9f4d3950c908867d377f789e5bcc6f94e0a2bdadc4c4612f94"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fef5b27a2325a50ec59793c96e5b1e9945061a390c1ea33d403ed91b7a2fb4"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-win_amd64.whl", hash = "sha256:294b24234fb71ee30640a451ed1428da3569f23383d35f905558093795f3609a"}, - {file = "netcdf4-1.7.1.post2.tar.gz", hash = "sha256:37d557e36654889d7020192bfb56f9d5f93894cb32997eb837ae586c538fd7b6"}, + {file = "netCDF4-1.7.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:5e9b485e3bd9294d25ff7dc9addefce42b3d23c1ee7e3627605277d159819392"}, + {file = "netCDF4-1.7.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:118b476fd00d7e3ab9aa7771186d547da645ae3b49c0c7bdab866793ebf22f07"}, + {file = "netCDF4-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abe5b1837ff209185ecfe50bd71884c866b3ee69691051833e410e57f177e059"}, + {file = "netCDF4-1.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28021c7e886e5bccf9a8ce504c032d1d7f98d86f67495fb7cf2c9564eba04510"}, + {file = "netCDF4-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:7460b638e41c8ce4179d082a81cb6456f0ce083d4d959f4d9e87a95cd86f64cb"}, + {file = "netCDF4-1.7.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:09d61c2ddb6011afb51e77ea0f25cd0bdc28887fb426ffbbc661d920f20c9749"}, + {file = "netCDF4-1.7.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:fd2a16dbddeb8fa7cf48c37bfc1967290332f2862bb82f984eec2007bb120aeb"}, + {file = "netCDF4-1.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f54f5d39ffbcf1726a1e6fd90cb5fa74277ecea739a5fa0f424636d71beafe24"}, + {file = "netCDF4-1.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:902aa50d70f49d002d896212a171d344c38f7b8ca520837c56c922ac1535c4a3"}, + {file = "netCDF4-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3291f9ad0c98c49a4dd16aefad1a9abd3a1b884171db6c81bdcee94671cfabe3"}, + {file = "netCDF4-1.7.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:e73e3baa0b74afc414e53ff5095748fdbec7fb346eda351e567c23f2f0d247f1"}, + {file = "netCDF4-1.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a51da09258b31776f474c1d47e484fc7214914cdc59edf4cee789ba632184591"}, + {file = "netCDF4-1.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb95b11804fe051897d1f2044b05d82a1847bc2549631cdd2f655dde7de77a9c"}, + {file = "netCDF4-1.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d8a848373723f41ef662590b4f5e1832227501c9fd4513e8ad8da58c269977"}, + {file = "netCDF4-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:568ea369e00b581302d77fc5fd0b8f78e520c7e08d0b5af5219ba51f3f1cd694"}, + {file = "netCDF4-1.7.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:205a5f1de3ddb993c7c97fb204a923a22408cc2e5facf08d75a8eb89b3e7e1a8"}, + {file = "netCDF4-1.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:96653fc75057df196010818367c63ba6d7e9af603df0a7fe43fcdad3fe0e9e56"}, + {file = "netCDF4-1.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30d20e56b9ba2c48884eb89c91b63e6c0612b4927881707e34402719153ef17f"}, + {file = "netCDF4-1.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6bfd38ba0bde04d56f06c1554714a2ea9dab75811c89450dc3ec57a9d36b80"}, + {file = "netCDF4-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:5c5fbee6134ee1246c397e1508e5297d825aa19221fdf3fa8dc9727ad824d7a5"}, + {file = "netCDF4-1.7.2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:6bf402c2c7c063474576e5cf89af877d0b0cd097d9316d5bc4fcb22b62f12567"}, + {file = "netCDF4-1.7.2-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:5bdf3b34e6fd4210e34fdc5d1a669a22c4863d96f8a20a3928366acae7b3cbbb"}, + {file = "netCDF4-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657774404b9f78a5e4d26506ac9bfe106e4a37238282a70803cc7ce679c5a6cc"}, + {file = "netCDF4-1.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e896d92f01fbf365e33e2513d5a8c4cfe16ff406aae9b6034e5ba1538c8c7a8"}, + {file = "netCDF4-1.7.2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:eb87c08d1700fe67c301898cf5ba3a3e1f8f2fbb417fcd0e2ac784846b60b058"}, + {file = "netCDF4-1.7.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:59b403032774c723ee749d7f2135be311bad7d00d1db284bebfab58b9d5cdb92"}, + {file = "netCDF4-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:572f71459ef4b30e8554dcc4e1e6f55de515acc82a50968b48fe622244a64548"}, + {file = "netCDF4-1.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f77e72281acc5f331f82271e5f7f014d46f5ca9bcaa5aafe3e46d66cee21320"}, + {file = "netCDF4-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:d0fa7a9674fae8ae4877e813173c3ff7a6beee166b8730bdc847f517b282ed31"}, + {file = "netcdf4-1.7.2.tar.gz", hash = "sha256:a4c6375540b19989896136943abb6d44850ff6f1fa7d3f063253b1ad3f8b7fce"}, ] [package.dependencies] @@ -1484,61 +1506,79 @@ et-xmlfile = "*" [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] name = "paginate" -version = "0.5.6" +version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" files = [ - {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, ] +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" -version = "2.2.2" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] @@ -1629,19 +1669,19 @@ ptyprocess = ">=0.5" [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -1660,13 +1700,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -1674,32 +1714,33 @@ wcwidth = "*" [[package]] name = "psutil" -version = "6.0.0" +version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, - {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, - {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, - {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, - {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, - {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, - {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, - {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, - {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, - {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "ptyprocess" @@ -1714,13 +1755,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -1753,13 +1794,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.8.1" +version = "10.12" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, - {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, + {file = "pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77"}, + {file = "pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7"}, ] [package.dependencies] @@ -1825,96 +1866,102 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] name = "pywin32" -version = "306" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1933,99 +1980,120 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "26.0.3" +version = "26.2.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] @@ -2048,90 +2116,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.5.15" +version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] @@ -2157,110 +2240,101 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.21.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, + {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, + {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, + {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, + {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, + {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, + {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, + {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, + {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, + {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, + {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, + {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, + {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, + {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, + {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, + {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, + {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, ] [[package]] @@ -2303,13 +2377,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] @@ -2333,13 +2407,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "tinycss2" -version = "1.3.0" +version = "1.4.0" description = "A tiny CSS parser" optional = false python-versions = ">=3.8" files = [ - {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, - {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, ] [package.dependencies] @@ -2351,13 +2425,13 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.1.0" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] @@ -2408,24 +2482,24 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -2436,43 +2510,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "4.0.1" +version = "6.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, + {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, + {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, + {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, + {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, ] [package.extras] @@ -2526,20 +2598,24 @@ viz = ["matplotlib", "nc-time-axis", "seaborn"] [[package]] name = "zipp" -version = "3.19.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "f6c24e6a1e4a9102a19d9dbe0ddbf0270daa069fdf70fc87a5cd00e726aefbd5" +content-hash = "138078e284cd3d33eafbbe5773c57dc330bfee18a8cd5d4e84214d5f118cbecb" diff --git a/pyproject.toml b/pyproject.toml index 6584e98..072a8f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,6 @@ openpyxl = ">=3.1.2" [tool.poetry.group.dev.dependencies] pytest = ">=7.4.2,<9.0.0" ruff = ">=0.5.1,<0.6.9" -black = ">=23.9.1,<25.0.0" mypy = ">=1.5.1" pytest-cov = ">=4.1,<6.0" mkdocs = ">=1.5.3" @@ -55,10 +54,6 @@ module = [ ] ignore_missing_imports = true -[tool.black] -line-length = 100 -skip-string-normalization = true - [tool.ruff] builtins = ["ellipsis"] @@ -67,6 +62,8 @@ exclude = [ "doc", "_typed_ops.pyi", ] +# Allow lines to be as long as 100. +line-length = 100 target-version = "py39" [tool.ruff.lint] From c6d8947f2d94b1027220bdf46f8600926724c5d6 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 14 Nov 2024 14:43:46 -0500 Subject: [PATCH 07/10] fixes from pre-commit, including using namedtuple for yield type in core.py --- docs/example/ncompare-example-usage.ipynb | 1060 ++++++++++----------- ncompare/console.py | 16 +- ncompare/core.py | 143 +-- ncompare/printing.py | 33 +- ncompare/sequence_operations.py | 5 +- ncompare/utils.py | 1 + tests/conftest.py | 86 +- tests/data/create_a-b_test_netcdfs.ipynb | 283 +++--- tests/test_cli.py | 4 +- tests/test_complete_file_output.py | 10 +- tests/test_core.py | 21 +- tests/test_printing.py | 2 +- tests/test_sequence_operations.py | 18 +- tests/test_utils.py | 2 +- 14 files changed, 882 insertions(+), 802 deletions(-) diff --git a/docs/example/ncompare-example-usage.ipynb b/docs/example/ncompare-example-usage.ipynb index 14afb08..1fa7d2d 100644 --- a/docs/example/ncompare-example-usage.ipynb +++ b/docs/example/ncompare-example-usage.ipynb @@ -1,538 +1,538 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "214b2e0a-4a8a-48bb-b1f5-b457b69ece57", - "metadata": {}, - "source": [ - "# Brief demonstration of `ncompare`: to compare the structure, groups, variables, and attributes of two netCDF files\"" - ] - }, - { - "cell_type": "markdown", - "id": "351983d5-1c2f-45ee-8a24-cd2a3b621405", - "metadata": {}, - "source": [ - "Installation instructions for `ncompare` can be found in either of these locations:\n", - "\n", - "- [GitHub repository](https://github.com/nasa/ncompare)\n", - "- [Pip entry](https://pypi.org/project/ncompare/)" - ] - }, - { - "cell_type": "markdown", - "id": "569c088b-0929-43c3-8d0f-6da3b6c89cce", - "metadata": {}, - "source": [ - "## `ncompare`'s command line arguments, provided by the `--help` description" - ] - }, - { - "cell_type": "markdown", - "id": "6a145933-e57b-4e33-bed1-95b13800878d", - "metadata": {}, - "source": [ - "***✍️ Syntax Note:*** Commands preceeded by an exclamation point \"!\" \n", - "(which is needed to [run shell commands in a Jupyter notebook](https://stackoverflow.com/a/48529220)) can be run from a terminal. \n", - "In a shell/terminal, the exclamation point should not be used." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "07e397b3-4964-4a90-b7f5-ae35185f86e5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "usage: ncompare [-h] [-v COMPARISON_VAR_NAME] [-g COMPARISON_VAR_GROUP]\n", - " [--only-diffs] [--file-text FILE_TEXT] [--file-csv FILE_CSV]\n", - " [--file-xlsx FILE_XLSX] [--no-color] [--show-attributes]\n", - " [--show-chunks]\n", - " [--column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS]\n", - " [--version]\n", - " nc_a nc_b\n", - "\n", - "Compare the variables contained within two different NetCDF datasets\n", - "\n", - "positional arguments:\n", - " nc_a First NetCDF file\n", - " nc_b First NetCDF file\n", - "\n", - "options:\n", - " -h, --help show this help message and exit\n", - " -v COMPARISON_VAR_NAME, --comparison_var_name COMPARISON_VAR_NAME\n", - " Comparison variable name\n", - " -g COMPARISON_VAR_GROUP, --comparison_var_group COMPARISON_VAR_GROUP\n", - " Comparison variable group\n", - " --only-diffs Only display variables and attributes that are\n", - " different\n", - " --file-text FILE_TEXT\n", - " A text file to which the output will be written.\n", - " --file-csv FILE_CSV A csv (comma separated values) file to which the\n", - " output will be written.\n", - " --file-xlsx FILE_XLSX\n", - " An Excel file to which the output will be written.\n", - " --no-color Turn off all colorized output\n", - " --show-attributes Include variable attributes in comparison\n", - " --show-chunks Include chunk sizes in the table that compares\n", - " variables\n", - " --column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS\n", - " Width, in number of characters, of the three columns\n", - " in the comparison report\n", - " --version Show the current version.\n" - ] - } - ], - "source": [ - "! ncompare --help" - ] - }, - { - "cell_type": "markdown", - "id": "4028d153-a1d2-4f8b-aad5-ca736b6c8292", - "metadata": {}, - "source": [ - "## Example 1: Two netCDF files with the same groups, variables, and attributes\n", - "----" - ] - }, - { - "cell_type": "markdown", - "id": "6992fa0f-7460-42c8-b0d4-d0634ddcc798", - "metadata": {}, - "source": [ - "Data files are first defined. The examples here rely on three files: two from NOAA National Centers of Environmental Information's (NCEI) (a) _[Global Precipitation Climatology Project (GPCP) Climate Data Record (CDR), Monthly V2.3](https://doi.org/10.7289/V56971M6)_ and one from the (b) _[Climate Data Record (CDR) of Precipitation Estimation from Remotely Sensed Information using Artificial Neural Networks (PERSIANN-CDR), Version 1 Revision 1)](https://doi.org/10.7289/V51V5BWQ)_ (a daily quasi-global precipitation product), accessible via [this GPCP catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html) and [this PERSIANN catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/persiann/catalog.html):\n", - "\n", - "1. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\n", - "2. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\n", - "3. https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "136bbeb8-6d74-4373-8ef7-1c20c1fe6afc", - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "\n", - "file_urls = [\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\",\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\",\n", - " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc\",\n", - "]\n", - "\n", - "file_names = [Path(url).name for url in file_urls]" - ] - }, - { - "cell_type": "markdown", - "id": "2b635084-8b99-4824-9f36-27b1c31bd2a5", - "metadata": {}, - "source": [ - "To download these files (e.g., for the first time running this notebook), run the following:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "10a025b9-4483-4925-873e-6653b64441e3", - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "\n", - "for url, filename in zip(file_urls, file_names):\n", - " r = requests.get(url, allow_redirects=True)\n", - " open(filename, 'wb').write(r.content)" - ] - }, - { - "cell_type": "markdown", - "id": "56b0eeba-20ed-46ed-a14b-593b59c2d9cd", - "metadata": {}, - "source": [ - "Next, we pass the two filepaths to `ncompare`, and any differences would be printed in red. In this case, there are no differences; therefore, all of the variables are printed in black." - ] - }, - { - "cell_type": "markdown", - "id": "a2ea8513-19ce-4089-8494-e0fba9aea789", - "metadata": {}, - "source": [ - "***✍️ Syntax Note:*** the curly brackets, \"{\" and \"}\", that follow are simply a way to [substitute python variables into a shell command](https://stackoverflow.com/a/35497161). \n", - "In a shell/terminal, one can just write out the full arguments, separated by spaces.\n", - "For example, the following command would be run at the terminal as `ncompare notebook_example_data/MOP03JM-202205-L3V95.6.3.he5 notebook_example_data/MOP03JM-202205-L3V95.9.3.he5`\n", - "\n", - "***✍️ `ncompare` Options Note:*** the `--column-widths 33 26 26` arguments are optional, and they are being used here to shrink the columns width-wise from their defaults to a size that fits better in the GitHub notebook renderer." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "43cace42-aa55-469e-84d9-13a45115267e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: gpcp_v02r03_monthly_d202302_c20230505.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True.\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36m[('latitude', 72), ('longitude', 144), ('nv', 2), ('time', 1)]\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -------------------------/ -------------------------/\u001b[0m\n", - "\u001b[0m num variables in group: 8 8\u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (72,) (72,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (144,) (144,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", - "\u001b[0m dtype: float32 float32\u001b[0m\n", - "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", - "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 8 8\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 0 0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --column-widths 33 26 26 {file_names[0]} {file_names[1]}" - ] - }, - { - "cell_type": "markdown", - "id": "220888cd-92d1-4bb4-9b5d-8187f89bda87", - "metadata": {}, - "source": [ - "## Example 2: Two netCDF files with different groups, variables, and attributes\n", - "----" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c48728a0-1379-4a05-b7e6-ad50694510df", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", - " new_vars[k] = decode_cf_variable(\n", - "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", - "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", - "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", - "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --column-widths 33 30 30 {file_names[0]} {file_names[2]}" - ] - }, + "cells": [ + { + "cell_type": "markdown", + "id": "214b2e0a-4a8a-48bb-b1f5-b457b69ece57", + "metadata": {}, + "source": [ + "# Brief demonstration of `ncompare`: to compare the structure, groups, variables, and attributes of two netCDF files\"" + ] + }, + { + "cell_type": "markdown", + "id": "351983d5-1c2f-45ee-8a24-cd2a3b621405", + "metadata": {}, + "source": [ + "Installation instructions for `ncompare` can be found in either of these locations:\n", + "\n", + "- [GitHub repository](https://github.com/nasa/ncompare)\n", + "- [Pip entry](https://pypi.org/project/ncompare/)" + ] + }, + { + "cell_type": "markdown", + "id": "569c088b-0929-43c3-8d0f-6da3b6c89cce", + "metadata": {}, + "source": [ + "## `ncompare`'s command line arguments, provided by the `--help` description" + ] + }, + { + "cell_type": "markdown", + "id": "6a145933-e57b-4e33-bed1-95b13800878d", + "metadata": {}, + "source": [ + "***✍️ Syntax Note:*** Commands preceeded by an exclamation point \"!\" \n", + "(which is needed to [run shell commands in a Jupyter notebook](https://stackoverflow.com/a/48529220)) can be run from a terminal. \n", + "In a shell/terminal, the exclamation point should not be used." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "07e397b3-4964-4a90-b7f5-ae35185f86e5", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "id": "11a23041-6f24-491b-a9e3-124ace151736", - "metadata": {}, - "source": [ - "#### More file details can be examined by using the `--show-attributes` and `--show-chunks` options" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "usage: ncompare [-h] [-v COMPARISON_VAR_NAME] [-g COMPARISON_VAR_GROUP]\n", + " [--only-diffs] [--file-text FILE_TEXT] [--file-csv FILE_CSV]\n", + " [--file-xlsx FILE_XLSX] [--no-color] [--show-attributes]\n", + " [--show-chunks]\n", + " [--column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS]\n", + " [--version]\n", + " nc_a nc_b\n", + "\n", + "Compare the variables contained within two different NetCDF datasets\n", + "\n", + "positional arguments:\n", + " nc_a First NetCDF file\n", + " nc_b First NetCDF file\n", + "\n", + "options:\n", + " -h, --help show this help message and exit\n", + " -v COMPARISON_VAR_NAME, --comparison_var_name COMPARISON_VAR_NAME\n", + " Comparison variable name\n", + " -g COMPARISON_VAR_GROUP, --comparison_var_group COMPARISON_VAR_GROUP\n", + " Comparison variable group\n", + " --only-diffs Only display variables and attributes that are\n", + " different\n", + " --file-text FILE_TEXT\n", + " A text file to which the output will be written.\n", + " --file-csv FILE_CSV A csv (comma separated values) file to which the\n", + " output will be written.\n", + " --file-xlsx FILE_XLSX\n", + " An Excel file to which the output will be written.\n", + " --no-color Turn off all colorized output\n", + " --show-attributes Include variable attributes in comparison\n", + " --show-chunks Include chunk sizes in the table that compares\n", + " variables\n", + " --column-widths COLUMN_WIDTHS COLUMN_WIDTHS COLUMN_WIDTHS\n", + " Width, in number of characters, of the three columns\n", + " in the comparison report\n", + " --version Show the current version.\n" + ] + } + ], + "source": [ + "! ncompare --help" + ] + }, + { + "cell_type": "markdown", + "id": "4028d153-a1d2-4f8b-aad5-ca736b6c8292", + "metadata": {}, + "source": [ + "## Example 1: Two netCDF files with the same groups, variables, and attributes\n", + "----" + ] + }, + { + "cell_type": "markdown", + "id": "6992fa0f-7460-42c8-b0d4-d0634ddcc798", + "metadata": {}, + "source": [ + "Data files are first defined. The examples here rely on three files: two from NOAA National Centers of Environmental Information's (NCEI) (a) _[Global Precipitation Climatology Project (GPCP) Climate Data Record (CDR), Monthly V2.3](https://doi.org/10.7289/V56971M6)_ and one from the (b) _[Climate Data Record (CDR) of Precipitation Estimation from Remotely Sensed Information using Artificial Neural Networks (PERSIANN-CDR), Version 1 Revision 1)](https://doi.org/10.7289/V51V5BWQ)_ (a daily quasi-global precipitation product), accessible via [this GPCP catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html) and [this PERSIANN catalog](https://www.ncei.noaa.gov/thredds/catalog/cdr/persiann/catalog.html):\n", + "\n", + "1. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\n", + "2. https://www.ncei.noaa.gov/thredds/catalog/cdr/gpcp_final/2023/catalog.html?dataset=cdr_gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\n", + "3. https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "136bbeb8-6d74-4373-8ef7-1c20c1fe6afc", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "file_urls = [\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202301_c20230411.nc\",\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/gpcp_final/2023/gpcp_v02r03_monthly_d202302_c20230505.nc\",\n", + " \"https://www.ncei.noaa.gov/thredds/fileServer/cdr/persiann/2023/PERSIANN-CDR_v01r01_20230419_c20231030.nc\",\n", + "]\n", + "\n", + "file_names = [Path(url).name for url in file_urls]" + ] + }, + { + "cell_type": "markdown", + "id": "2b635084-8b99-4824-9f36-27b1c31bd2a5", + "metadata": {}, + "source": [ + "To download these files (e.g., for the first time running this notebook), run the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "10a025b9-4483-4925-873e-6653b64441e3", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "for url, filename in zip(file_urls, file_names):\n", + " r = requests.get(url, allow_redirects=True)\n", + " open(filename, \"wb\").write(r.content)" + ] + }, + { + "cell_type": "markdown", + "id": "56b0eeba-20ed-46ed-a14b-593b59c2d9cd", + "metadata": {}, + "source": [ + "Next, we pass the two filepaths to `ncompare`, and any differences would be printed in red. In this case, there are no differences; therefore, all of the variables are printed in black." + ] + }, + { + "cell_type": "markdown", + "id": "a2ea8513-19ce-4089-8494-e0fba9aea789", + "metadata": {}, + "source": [ + "***✍️ Syntax Note:*** the curly brackets, \"{\" and \"}\", that follow are simply a way to [substitute python variables into a shell command](https://stackoverflow.com/a/35497161). \n", + "In a shell/terminal, one can just write out the full arguments, separated by spaces.\n", + "For example, the following command would be run at the terminal as `ncompare notebook_example_data/MOP03JM-202205-L3V95.6.3.he5 notebook_example_data/MOP03JM-202205-L3V95.9.3.he5`\n", + "\n", + "***✍️ `ncompare` Options Note:*** the `--column-widths 33 26 26` arguments are optional, and they are being used here to shrink the columns width-wise from their defaults to a size that fits better in the GitHub notebook renderer." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "43cace42-aa55-469e-84d9-13a45115267e", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 6, - "id": "1dd4c51a-394c-4569-b8b1-053743e63cb9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Dimensions:\u001b[0m\n", - "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", - " new_vars[k] = decode_cf_variable(\n", - "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", - "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", - "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", - "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "Root-level Groups:\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", - "No variable group selected for comparison. Skipping..\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "All variables:\u001b[0m\n", - "\u001b[0m File A File B\u001b[0m\n", - "\u001b[0m All Variables \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m \u001b[0m\n", - "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: latitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 60.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: longitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 360.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record (CDR) of GPCP Monthly Satellite-Gauge Combined Precipitation \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation amount \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA CDR of GPCP Satellite-Gauge Combined Precipitation Error \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", - "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_method: sum\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record of PERSIANN-CDR daily precipitation\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation_amount\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 999999.0\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", - "\u001b[0m shape: (1,) (1,)\u001b[0m\n", - "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcalendar: Gregorian \u001b[0m\n", - "\u001b[0m long_name: time time\u001b[0m\n", - "\u001b[0m standard_name: time time\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", - "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", - "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", - "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", - "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", - "\u001b[0m\u001b[37m\u001b[0m\n", - "Done.\u001b[0m\n", - "\u001b[0m\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "! ncompare --show-attributes --show-chunks --column-widths 33 30 30 {file_names[0]} {file_names[2]}" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: gpcp_v02r03_monthly_d202302_c20230505.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True.\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36m[('latitude', 72), ('longitude', 144), ('nv', 2), ('time', 1)]\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -------------------------/ -------------------------/\u001b[0m\n", + "\u001b[0m num variables in group: 8 8\u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (72,) (72,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (144,) (144,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", + "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", + "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 8 8\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 0 0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m" + ] + } + ], + "source": [ + "! ncompare --column-widths 33 26 26 {file_names[0]} {file_names[1]}" + ] + }, + { + "cell_type": "markdown", + "id": "220888cd-92d1-4bb4-9b5d-8187f89bda87", + "metadata": {}, + "source": [ + "## Example 2: Two netCDF files with different groups, variables, and attributes\n", + "----" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c48728a0-1379-4a05-b7e6-ad50694510df", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "id": "dccb326d-3b47-4d0f-b96d-93577d3e7c54", - "metadata": {}, - "source": [ - "END of Notebook." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", + " new_vars[k] = decode_cf_variable(\n", + "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", + "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", + "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", + "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m\u001b[0m" + ] } - ], - "metadata": { - "kernelspec": { - "display_name": "ncompare-jupyter-example", - "language": "python", - "name": "ncompare-jupyter-example" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.0" + ], + "source": [ + "! ncompare --column-widths 33 30 30 {file_names[0]} {file_names[2]}" + ] + }, + { + "cell_type": "markdown", + "id": "11a23041-6f24-491b-a9e3-124ace151736", + "metadata": {}, + "source": [ + "#### More file details can be examined by using the `--show-attributes` and `--show-chunks` options" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1dd4c51a-394c-4569-b8b1-053743e63cb9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m\u001b[0mFile A: gpcp_v02r03_monthly_d202301_c20230411.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0mFile B: PERSIANN-CDR_v01r01_20230419_c20231030.nc\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Dimensions:\u001b[0m\n", + "/usr/local/Caskroom/miniconda/base/envs/ncompare-jupyter-example/lib/python3.12/site-packages/xarray/conventions.py:428: SerializationWarning: variable 'precipitation' has multiple fill values {-9999.0, -1.0}, decoding all values to NaN.\n", + " new_vars[k] = decode_cf_variable(\n", + "\u001b[0m\u001b[37m\u001b[0m\tAre all items the same? ---> \u001b[31mFalse. (2 items are shared, out of 6 total.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[31mWhich items are different?\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #00 ------------------------------ ------------------('lat', 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #01 --------------('latitude', 72) ------------------------------\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #02 ------------------------------ -----------------('lon', 1440)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m #03 ------------('longitude', 144) ------------------------------\u001b[0m\n", + "\u001b[0m #04 ---------------------('nv', 2) ---------------------('nv', 2)\u001b[0m\n", + "\u001b[0m #05 -------------------('time', 1) -------------------('time', 1)\u001b[0m\n", + "\u001b[0m Number of non-shared items: 2 2\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "Root-level Groups:\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\t\u001b[36mAre all items the same? ---> True. (No items exist.)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[90m\n", + "No variable group selected for comparison. Skipping..\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", + "All variables:\u001b[0m\n", + "\u001b[0m File A File B\u001b[0m\n", + "\u001b[0m All Variables \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m \u001b[0m\n", + "\u001b[0m GROUP #00 -----------------------------/ -----------------------------/\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mnum variables in group: 8 6\u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: latitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 60.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: latitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_north \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: longitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 360.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: Longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: degrees_east \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record (CDR) of GPCP Monthly Satellite-Gauge Combined Precipitation \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation amount \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA CDR of GPCP Satellite-Gauge Combined Precipitation Error \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm/day \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", + "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_method: sum\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mlong_name: NOAA Climate Data Record of PERSIANN-CDR daily precipitation\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mmissing_value: -9999.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mstandard_name: precipitation_amount\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: mm\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_max: 999999.0\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m shape: (1,) (1,)\u001b[0m\n", + "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcalendar: Gregorian \u001b[0m\n", + "\u001b[0m long_name: time time\u001b[0m\n", + "\u001b[0m standard_name: time time\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", + "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", + "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", + "\u001b[0m Total number of shared items: 1 1\u001b[0m\n", + "\u001b[0m Total number of non-shared items: 7 5\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m\n", + "Done.\u001b[0m\n", + "\u001b[0m\u001b[0m\u001b[0m" + ] } + ], + "source": [ + "! ncompare --show-attributes --show-chunks --column-widths 33 30 30 {file_names[0]} {file_names[2]}" + ] + }, + { + "cell_type": "markdown", + "id": "dccb326d-3b47-4d0f-b96d-93577d3e7c54", + "metadata": {}, + "source": [ + "END of Notebook." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ncompare-jupyter-example", + "language": "python", + "name": "ncompare-jupyter-example" }, - "nbformat": 4, - "nbformat_minor": 5 + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/ncompare/console.py b/ncompare/console.py index 91f85a2..e530043 100755 --- a/ncompare/console.py +++ b/ncompare/console.py @@ -25,6 +25,7 @@ # See the License for the specific language governing permissions and limitations under the License. """Command line interface for `ncompare` -- to compare the structure of two NetCDF files.""" + import argparse import importlib.metadata import sys @@ -34,7 +35,7 @@ from ncompare.core import compare -__version__ = importlib.metadata.version('ncompare') +__version__ = importlib.metadata.version("ncompare") def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: @@ -65,7 +66,10 @@ def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: ) parser.add_argument("--file-xlsx", help="An Excel file to which the output will be written.") parser.add_argument( - "--no-color", action="store_true", default=False, help="Turn off all colorized output" + "--no-color", + action="store_true", + default=False, + help="Turn off all colorized output", ) parser.add_argument( "--show-attributes", @@ -90,8 +94,8 @@ def _cli(args: Optional[Sequence[str]]) -> argparse.Namespace: parser.add_argument( "--version", - action='version', - version=f'%(prog)s {__version__}', + action="version", + version=f"%(prog)s {__version__}", default=False, help="Show the current version.", ) @@ -103,7 +107,7 @@ def main() -> None: # pragma: no cover """Run from the command line.""" args = _cli(None) - delattr(args, 'version') + delattr(args, "version") try: compare(**vars(args)) @@ -113,5 +117,5 @@ def main() -> None: # pragma: no cover sys.exit(0) # a clean, no-issue, exit -if __name__ == '__main__': # pragma: no cover +if __name__ == "__main__": # pragma: no cover main() diff --git a/ncompare/core.py b/ncompare/core.py index 8b8d040..66be6a5 100644 --- a/ncompare/core.py +++ b/ncompare/core.py @@ -28,10 +28,11 @@ # pylint: disable=fixme """Compare the structure of two NetCDF files.""" + import random import traceback from collections import namedtuple -from collections.abc import Iterable +from collections.abc import Iterable, Iterator from pathlib import Path from typing import Optional, Union @@ -46,6 +47,12 @@ VarProperties = namedtuple("VarProperties", "varname, variable, dtype, shape, chunking, attributes") +GroupPair = namedtuple( + "GroupPair", + "group_a_name group_a group_b_name group_b", + defaults=("", None, "", None), +) + def compare( nc_a: Union[str, Path], @@ -195,7 +202,11 @@ def run_through_comparisons( + f"\nChecking multiple random values within specified variable <{comparison_var_name}>:" ) compare_multiple_random_values( - out, nc_a, nc_b, groupname=comparison_var_group, varname=comparison_var_name + out, + nc_a, + nc_b, + groupname=comparison_var_group, + varname=comparison_var_name, ) except KeyError: @@ -250,12 +261,12 @@ def compare_multiple_random_values( out.print("Done.", colors=False) -def walk_common_groups_tree( # type:ignore[misc] +def walk_common_groups_tree( top_a_name: str, top_a: Union[netCDF4.Dataset, netCDF4.Group], top_b_name: str, top_b: Union[netCDF4.Dataset, netCDF4.Group], -) -> tuple[str, netCDF4.Group, str, netCDF4.Group]: +) -> Iterator[GroupPair]: """Yield names and groups from a netCDF4's group tree. Parameters @@ -267,25 +278,30 @@ def walk_common_groups_tree( # type:ignore[misc] Yields ------ - group A name : str - group A object : netCDF4.Group - group B name : str - group B object : netCDF4.Group + tuple + group A name : str + group A object : netCDF4.Group or None + group B name : str + group B object : netCDF4.Group or None """ - yield ( - ( - top_a_name + "/" + group_a_name if group_a_name else "", - top_a[group_a_name] if (group_a_name and (group_a_name in top_a.groups)) else None, - top_b_name + "/" + group_b_name if group_b_name else "", - top_b[group_b_name] if (group_b_name and (group_b_name in top_b.groups)) else None, - ) - for (_, group_a_name, group_b_name) in common_elements( - top_a.groups if top_a is not None else "", top_b.groups if top_b is not None else "" + for _, group_a_name, group_b_name in common_elements( + top_a.groups if top_a is not None else "", + top_b.groups if top_b is not None else "", + ): + yield GroupPair( + group_a_name=top_a_name + "/" + group_a_name if group_a_name else "", + group_a=( + top_a[group_a_name] if (group_a_name and (group_a_name in top_a.groups)) else None + ), + group_b_name=top_b_name + "/" + group_b_name if group_b_name else "", + group_b=( + top_b[group_b_name] if (group_b_name and (group_b_name in top_b.groups)) else None + ), ) - ) for _, subgroup_a_name, subgroup_b_name in common_elements( - top_a.groups if top_a is not None else "", top_b.groups if top_b is not None else "" + top_a.groups if top_a is not None else "", + top_b.groups if top_b is not None else "", ): yield from walk_common_groups_tree( top_a_name + "/" + subgroup_a_name if subgroup_a_name else "", @@ -311,50 +327,57 @@ def compare_two_nc_files( show_attributes: bool = False, ) -> tuple[int, int, int]: """Go through all groups and all variables, and show them side by side - whether they align and where they don't.""" - out.side_by_side(' ', 'File A', 'File B', force_display_even_if_same=True) + out.side_by_side(" ", "File A", "File B", force_display_even_if_same=True) num_var_diffs = {"left": 0, "right": 0, "both": 0} with netCDF4.Dataset(nc_one) as nc_a, netCDF4.Dataset(nc_two) as nc_b: out.side_by_side( - 'All Variables', ' ', ' ', dash_line=False, force_display_even_if_same=True + "All Variables", " ", " ", dash_line=False, force_display_even_if_same=True ) - out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) + out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) group_counter = 0 _print_group_details_side_by_side( - out, nc_a, "/", nc_b, "/", group_counter, num_var_diffs, show_attributes, show_chunks + out, + nc_a, + "/", + nc_b, + "/", + group_counter, + num_var_diffs, + show_attributes, + show_chunks, ) group_counter += 1 - for group_pairs in walk_common_groups_tree("", nc_a, "", nc_b): - for group_a_name, group_a, group_b_name, group_b in group_pairs: - _print_group_details_side_by_side( - out, - group_a, - group_a_name, - group_b, - group_b_name, - group_counter, - num_var_diffs, - show_attributes, - show_chunks, - ) - group_counter += 1 + for group_pair in walk_common_groups_tree("", nc_a, "", nc_b): + _print_group_details_side_by_side( + out, + group_pair.group_a, + group_pair.group_a_name, + group_pair.group_b, + group_pair.group_b_name, + group_counter, + num_var_diffs, + show_attributes, + show_chunks, + ) + group_counter += 1 - out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) + out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) out.side_by_side( - 'Total number of shared items:', - str(num_var_diffs['both']), - str(num_var_diffs['both']), + "Total number of shared items:", + str(num_var_diffs["both"]), + str(num_var_diffs["both"]), force_display_even_if_same=True, ) out.side_by_side( - 'Total number of non-shared items:', - str(num_var_diffs['left']), - str(num_var_diffs['right']), + "Total number of non-shared items:", + str(num_var_diffs["left"]), + str(num_var_diffs["right"]), force_display_even_if_same=True, ) - return num_var_diffs['left'], num_var_diffs['right'], num_var_diffs['both'] + return num_var_diffs["left"], num_var_diffs["right"], num_var_diffs["both"] def _print_group_details_side_by_side( @@ -369,7 +392,12 @@ def _print_group_details_side_by_side( show_chunks: bool, ) -> None: out.side_by_side( - " ", " ", " ", dash_line=False, highlight_diff=False, force_display_even_if_same=True + " ", + " ", + " ", + dash_line=False, + highlight_diff=False, + force_display_even_if_same=True, ) out.side_by_side( f"GROUP #{group_counter:02}", @@ -388,19 +416,19 @@ def _print_group_details_side_by_side( if group_b: vars_b_sorted = sorted(group_b.variables) out.side_by_side( - 'num variables in group:', + "num variables in group:", len(vars_a_sorted), len(vars_b_sorted), highlight_diff=True, force_display_even_if_same=True, ) - out.side_by_side('-', '-', '-', dash_line=True, force_display_even_if_same=True) + out.side_by_side("-", "-", "-", dash_line=True, force_display_even_if_same=True) # Count differences between the lists of variables in this group. left, right, both = count_diffs(vars_a_sorted, vars_b_sorted) - num_var_diffs['left'] += left - num_var_diffs['right'] += right - num_var_diffs['both'] += both + num_var_diffs["left"] += left + num_var_diffs["right"] += right + num_var_diffs["both"] += both # Go through each variable in the current group. for variable_pair in common_elements(vars_a_sorted, vars_b_sorted): @@ -473,7 +501,10 @@ def _print_var_properties_side_by_side( for attr_a_key, attr_a, attr_b_key, attr_b in get_and_check_variable_attributes(v_a, v_b): # Check whether attr_a_key is empty, because it might be if the variable doesn't exist in File A. out.side_by_side( - f"{attr_a_key if attr_a_key else attr_b_key}:", attr_a, attr_b, highlight_diff=True + f"{attr_a_key if attr_a_key else attr_b_key}:", + attr_a, + attr_b, + highlight_diff=True, ) # Scale Factor @@ -483,14 +514,14 @@ def _print_var_properties_side_by_side( def get_and_check_variable_scale_factor(v_a, v_b) -> Union[None, tuple[str, str]]: - if getattr(v_a.variable, 'scale_factor', None): + if getattr(v_a.variable, "scale_factor", None): sf_a = v_a.variable.scale_factor else: - sf_a = ' ' - if getattr(v_b.variable, 'scale_factor', None): + sf_a = " " + if getattr(v_b.variable, "scale_factor", None): sf_b = v_b.variable.scale_factor else: - sf_b = ' ' + sf_b = " " if (sf_a != " ") or (sf_b != " "): return str(sf_a), str(sf_b) else: diff --git a/ncompare/printing.py b/ncompare/printing.py index 13d9ae3..339c513 100644 --- a/ncompare/printing.py +++ b/ncompare/printing.py @@ -25,6 +25,7 @@ # pylint: disable=too-many-arguments """Utility functions for printing to the console or a text file.""" + import csv import re import warnings @@ -43,7 +44,7 @@ # Set up regex remover of ANSI color escape sequences # From ansi_escape = re.compile( - r''' + r""" \x1B # ESC (?: # 7-bit C1 Fe (except CSI) [@-Z\\-_] @@ -53,7 +54,7 @@ [ -/]* # Intermediate bytes [@-~] # Final byte ) -''', +""", re.VERBOSE, ) @@ -117,9 +118,7 @@ def __init__( if filepath.exists(): pass # This will overwrite any existing file at this path if one exists. - self._text_file_obj: Optional[TextIO] = open( - filepath, "w", encoding="utf-8" - ) # pylint: disable=consider-using-with + self._text_file_obj: Optional[TextIO] = open(filepath, "w", encoding="utf-8") # pylint: disable=consider-using-with else: self._text_file_obj = None @@ -131,7 +130,11 @@ def __exit__(self, exc_type, exc_value, exc_traceback): # noqa: D105 self._text_file_obj.close() def print( - self, string: str = "", colors: bool = False, add_to_history: bool = False, **print_args + self, + string: str = "", + colors: bool = False, + add_to_history: bool = False, + **print_args, ) -> None: """Print text using custom options. @@ -156,7 +159,7 @@ def print( # Optional - write text to file if self._text_file_obj: # Remove ANSI escape sequences. - result = ansi_escape.sub('', text_to_print) + result = ansi_escape.sub("", text_to_print) self._text_file_obj.write(result + "\n") # Optional - save text to a history list @@ -168,7 +171,7 @@ def _add_to_history(self, *args): def _parse_single_str(s): # pylint: disable=invalid-name # Remove ANSI escape sequences before adding to a parsed string list. - result = ansi_escape.sub('', s) + result = ansi_escape.sub("", s) # Remove any leading or trailing newlines. return result.strip("\n") @@ -321,16 +324,16 @@ def lists_diff( # print(Fore.RED + "Which items are different? ---> %s." % # str(set(list_a).symmetric_difference(list_b))) - self.side_by_side(' ', 'File A', 'File B') + self.side_by_side(" ", "File A", "File B") self.side_by_side_list_diff(list_a, list_b) - self.side_by_side('Number of non-shared items:', str(left), str(right)) + self.side_by_side("Number of non-shared items:", str(left), str(right)) return left, right, both def write_history_to_csv(self, filename: Union[str, Path] = "test.csv"): """Save the line history that's been stored to a CSV file.""" - headers = ['Info', 'File A', 'File B', 'Other marks'] - with open(filename, 'w', encoding="utf-8") as target: + headers = ["Info", "File A", "File B", "Other marks"] + with open(filename, "w", encoding="utf-8") as target: writer = csv.writer(target) writer.writerow(headers) writer.writerows(self._line_history) @@ -341,7 +344,7 @@ def write_history_to_excel(self, filename: Union[str, Path] = "test.xlsx"): sheet = workbook.active # Add a header row - sheet.append(['Info', 'File A', 'File B']) + sheet.append(["Info", "File A", "File B"]) # Add rows and apply styles for row in self._line_history: @@ -350,7 +353,7 @@ def write_history_to_excel(self, filename: Union[str, Path] = "test.xlsx"): # First, remove difference marker that is redundant with styles applied to the row (unlike in the CSV) del row[3] sheet.append(_excel_red_cells(row, sheet)) - elif (len(row) == 1) or ((len(row) == 3) and ((row[1] == '') and (row[2] == ''))): + elif (len(row) == 1) or ((len(row) == 3) and ((row[1] == "") and (row[2] == ""))): # The case where there is a subheader and no information in the second and third columns. sheet.append(_excel_bold_underline_cells(row, sheet)) else: @@ -379,5 +382,5 @@ def _excel_bold_underline_cells(data, sheet): """Stylize cells in Excel with a bold and underlined font.""" for cell in data: cell = Cell(sheet, column="A", row=1, value=cell) - cell.font = Font(bold=True, underline='single') + cell.font = Font(bold=True, underline="single") yield cell diff --git a/ncompare/sequence_operations.py b/ncompare/sequence_operations.py index 10dc8f3..5baef68 100644 --- a/ncompare/sequence_operations.py +++ b/ncompare/sequence_operations.py @@ -24,6 +24,7 @@ # See the License for the specific language governing permissions and limitations under the License. """Helper functions for operating on iterables, such as lists or sets.""" + from collections.abc import Generator, Iterable from typing import Union @@ -62,9 +63,9 @@ def common_elements( ) if item not in a_sorted: - item_a = '' + item_a = "" elif item not in b_sorted: - item_b = '' + item_b = "" yield i, item_a, item_b diff --git a/ncompare/utils.py b/ncompare/utils.py index 0c03149..6c2d720 100644 --- a/ncompare/utils.py +++ b/ncompare/utils.py @@ -24,6 +24,7 @@ # See the License for the specific language governing permissions and limitations under the License. """Helper utilities.""" + from pathlib import Path from typing import Union diff --git a/tests/conftest.py b/tests/conftest.py index 1e33e03..6a11927 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,7 +35,7 @@ @pytest.fixture(scope="session") def temp_data_dir(tmpdir_factory) -> Path: - return Path(tmpdir_factory.mktemp('data')) + return Path(tmpdir_factory.mktemp("data")) @pytest.fixture(scope="function") @@ -130,25 +130,25 @@ def ds_3dims_3vars_4coords_1group(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_1group.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup('Group1') + grp1 = f.createGroup("Group1") # A root variable - f.createVariable('var0', "i2", ()) + f.createVariable("var0", "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension('x', 2) - grp1.createDimension('step', 3) - grp1.createDimension('track', 7) + grp1.createDimension("x", 2) + grp1.createDimension("step", 3) + grp1.createDimension("track", 7) # Variables in grp1 - grp1.createVariable('var1', 'f8', ()) + grp1.createVariable("var1", "f8", ()) # - grp1.createVariable('var2', 'f4', ()) + grp1.createVariable("var2", "f4", ()) # - grp1.createVariable('step', 'f4', ('step',), fill_value=False) - grp1['step'][:] = [-0.9, -1.8, -2.7] + grp1.createVariable("step", "f4", ("step",), fill_value=False) + grp1["step"][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) + grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) # Wrap up f.close() @@ -161,35 +161,35 @@ def ds_3dims_3vars_4coords_2groups(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_2groups.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup('Group1') - grp2 = f.createGroup('Group2') + grp1 = f.createGroup("Group1") + grp2 = f.createGroup("Group2") # A root variable - f.createVariable('var0', "i2", ()) + f.createVariable("var0", "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension('x', 2) - grp1.createDimension('step', 3) - grp1.createDimension('track', 7) + grp1.createDimension("x", 2) + grp1.createDimension("step", 3) + grp1.createDimension("track", 7) # Variables in grp1 - grp1.createVariable('var1', 'f8', ()) + grp1.createVariable("var1", "f8", ()) # - grp1.createVariable('var2', 'f4', ()) + grp1.createVariable("var2", "f4", ()) # - grp1.createVariable('step', 'f4', ('step',), fill_value=False) - grp1['step'][:] = [-0.9, -1.8, -2.7] + grp1.createVariable("step", "f4", ("step",), fill_value=False) + grp1["step"][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) + grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) # New/modified coordinates in grp2 - grp2.createDimension('x', 2) - grp2.createDimension('step', 3) - grp2.createDimension('track', 7) - grp2.createDimension('level', 4) + grp2.createDimension("x", 2) + grp2.createDimension("step", 3) + grp2.createDimension("track", 7) + grp2.createDimension("level", 4) # Variables in grp2 - grp2.createVariable('var3', 'f8', ('level',), fill_value=False) + grp2.createVariable("var3", "f8", ("level",), fill_value=False) # Wrap up f.close() @@ -202,38 +202,38 @@ def ds_3dims_3vars_4coords_1subgroup(temp_data_dir): filepath = temp_data_dir / "test_3dims_3vars_4coords_1subgroup.nc" f = nC.Dataset(filename=filepath, mode="w") - grp1 = f.createGroup('Group1') - grp2 = f.createGroup('Group2') - grp2_subgroup = grp2.createGroup('Group2_subgroup') + grp1 = f.createGroup("Group1") + grp2 = f.createGroup("Group2") + grp2_subgroup = grp2.createGroup("Group2_subgroup") # A root variable - f.createVariable('var0', "i2", ()) + f.createVariable("var0", "i2", ()) # New/modified coordinates in grp1 - grp1.createDimension('x', 2) - grp1.createDimension('step', 3) - grp1.createDimension('track', 7) + grp1.createDimension("x", 2) + grp1.createDimension("step", 3) + grp1.createDimension("track", 7) # Variables in grp1 - grp1.createVariable('var1', 'f8', ()) + grp1.createVariable("var1", "f8", ()) # - grp1.createVariable('var2', 'f4', ()) + grp1.createVariable("var2", "f4", ()) # - grp1.createVariable('step', 'f4', ('step',), fill_value=False) - grp1['step'][:] = [-0.9, -1.8, -2.7] + grp1.createVariable("step", "f4", ("step",), fill_value=False) + grp1["step"][:] = [-0.9, -1.8, -2.7] # - grp1.createVariable('w', 'u1', ('x', 'step'), fill_value=False) + grp1.createVariable("w", "u1", ("x", "step"), fill_value=False) # New/modified coordinates in grp2 - grp2.createDimension('step', 3) - grp2.createDimension('level', 4) + grp2.createDimension("step", 3) + grp2.createDimension("level", 4) # Variables in grp2 - grp2.createVariable('var3', 'f8', ('step', 'level'), fill_value=False) + grp2.createVariable("var3", "f8", ("step", "level"), fill_value=False) # New/modified coordinates in grp2 # Variables in grp2 - grp2_subgroup.createVariable('var4', 'f8', ('level',), fill_value=False) + grp2_subgroup.createVariable("var4", "f8", ("level",), fill_value=False) # Wrap up f.close() diff --git a/tests/data/create_a-b_test_netcdfs.ipynb b/tests/data/create_a-b_test_netcdfs.ipynb index afb7ab6..49a396c 100644 --- a/tests/data/create_a-b_test_netcdfs.ipynb +++ b/tests/data/create_a-b_test_netcdfs.ipynb @@ -8,8 +8,9 @@ "outputs": [], "source": [ "import time\n", - "import numpy as np\n", - "import netCDF4 as nc" + "\n", + "import netCDF4 as nc\n", + "import numpy as np" ] }, { @@ -38,72 +39,70 @@ } ], "source": [ - "some_4d_data = np.array([\n", + "some_4d_data = np.array(\n", " [\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287], \n", - " ]\n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", - " ],\n", - " [\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287],\n", - " [300, 301, 295, 287],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", + " [\n", + " [300, 305, 290, 287],\n", + " [300, 301, 295, 287],\n", + " [300, 301, 295, 287],\n", + " ],\n", " ],\n", - " [\n", - " [300, 305, 290, 287],\n", - " [300, 301, 295, 287], \n", - " [300, 301, 295, 287], \n", - " ]\n", - " \n", " ]\n", - "])\n", + ")\n", "some_4d_data.shape" ] }, @@ -128,81 +127,95 @@ "\n", "with nc.Dataset(\"test_a.nc\", \"w\", format=\"NETCDF4\") as rootgrp:\n", " print(f\"Creating {rootgrp.data_model}...\")\n", - " \n", + "\n", " # --- Create Groups ---\n", " groups[\"Position\"] = rootgrp.createGroup(\"Position\")\n", " groups[\"Statistics\"] = rootgrp.createGroup(\"Statistics\")\n", - " \n", + "\n", " groups[\"Data\"] = rootgrp.createGroup(\"Data\")\n", " groups[\"Data_Products_Subgroup\"] = rootgrp.createGroup(\"/Data/Products\")\n", " groups[\"Data_Quality_Subgroup\"] = rootgrp.createGroup(\"/Data/Quality\")\n", - " \n", - " \n", + "\n", " # --- Create Dimensions ---\n", " dims[\"time\"] = rootgrp.createDimension(\"time\", None)\n", " dims[\"latitude\"] = rootgrp.createDimension(\"lat\", 3)\n", " dims[\"longitude\"] = rootgrp.createDimension(\"lon\", 4)\n", " dims[\"conditions\"] = rootgrp.createDimension(\"conditions\", 2)\n", - " \n", + "\n", " dims[\"level\"] = groups[\"Data\"].createDimension(\"level\", None)\n", - " \n", - " \n", + "\n", " # --- Create Variables ---\n", " conditions = rootgrp.createVariable(\"conditions\", \"i4\", (\"conditions\",))\n", " times = rootgrp.createVariable(\"time\", \"f8\", (\"time\",))\n", - " \n", + "\n", " latitudes = rootgrp.createVariable(\"/Position/lat\", \"f4\", (\"lat\",))\n", " longitudes = rootgrp.createVariable(\"/Position/lon\", \"f4\", (\"lon\",))\n", - " \n", + "\n", " mean_values = rootgrp.createVariable(\"/Statistics/mean_value\", \"f4\", (\"time\",))\n", - " \n", + "\n", " levels = rootgrp.createVariable(\"/Data/level\", \"i4\", (\"level\",))\n", - " product_temp = rootgrp.createVariable(\"/Data/Products/temp\", \"f4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " quality_flag = rootgrp.createVariable(\"/Data/Quality/quality_flag\", \"i4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " \n", - " \n", + " product_temp = rootgrp.createVariable(\n", + " \"/Data/Products/temp\",\n", + " \"f4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + " quality_flag = rootgrp.createVariable(\n", + " \"/Data/Quality/quality_flag\",\n", + " \"i4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + "\n", " # --- Assign Attributes ---\n", " rootgrp.description = \"Example netCDF file\"\n", " rootgrp.history = \"Created \" + time.ctime(time.time())\n", " rootgrp.source = \"test data creation script\"\n", - " \n", + "\n", " groups[\"Position\"].description = \"This group contain position data.\"\n", " groups[\"Statistics\"].description = \"This group contains statistical information.\"\n", - " \n", + "\n", " times.units = \"hours since 0001-01-01 00:00:00.0\"\n", " times.long_name = \"Time of observation\"\n", " times.calendar = \"gregorian\"\n", " times.coordinates = \"time\"\n", - " \n", + "\n", " levels.units = \"hPa\"\n", - " \n", + "\n", " latitudes.units = \"degrees north\"\n", - " \n", + "\n", " longitudes.units = \"degrees east\"\n", - " \n", + "\n", " mean_values.long_name = \"average value for each time\"\n", " mean_values.coordinates = \"time\"\n", - " \n", + "\n", " product_temp.long_name = \"temperature\"\n", " product_temp.units = \"K\"\n", - " \n", + "\n", " quality_flag.units = \"unitless\"\n", - " \n", - " \n", + "\n", " # --- Assign Data Values ---\n", - " lats = np.arange(-90, 91, 90)\n", - " lons = np.arange(-180, 180, 90)\n", + " lats = np.arange(-90, 91, 90)\n", + " lons = np.arange(-180, 180, 90)\n", " latitudes[:] = lats\n", " longitudes[:] = lons\n", - " \n", + "\n", " nlats = len(rootgrp.dimensions[\"lat\"])\n", " nlons = len(rootgrp.dimensions[\"lon\"])\n", - " \n", + "\n", " product_temp[0:5, 0:2, :, :] = some_4d_data\n", - " \n", + "\n", " times[0:5] = [1, 1.5, 2, 2.5, 3]\n", " levels[0:2] = [10, 20]\n", - " \n", + "\n", "print(\"Done.\")" ] }, @@ -227,97 +240,111 @@ "\n", "with nc.Dataset(\"test_b.nc\", \"w\", format=\"NETCDF4\") as rootgrp:\n", " print(f\"Creating {rootgrp.data_model}...\")\n", - " \n", + "\n", " # --- Create Groups ---\n", " groups[\"Position\"] = rootgrp.createGroup(\"Position\")\n", " groups[\"Statistics\"] = rootgrp.createGroup(\"Statistics\")\n", - " \n", + "\n", " groups[\"Data\"] = rootgrp.createGroup(\"Data\")\n", " groups[\"Data_Products_Subgroup\"] = rootgrp.createGroup(\"/Data/Products\")\n", " groups[\"Data_Quality_Subgroup\"] = rootgrp.createGroup(\"/Data/Quality\")\n", - " \n", + "\n", " groups[\"Data_Supplemental_Subgroup\"] = rootgrp.createGroup(\"/Data/Supplemental\")\n", " groups[\"Data_Supplemental_Details_Subgroup\"] = rootgrp.createGroup(\"/Data/Supplemental/Details\")\n", - " \n", + "\n", " # --- Create Dimensions ---\n", " dims[\"time\"] = rootgrp.createDimension(\"time\", None)\n", " dims[\"latitude\"] = rootgrp.createDimension(\"lat\", 2)\n", " dims[\"longitude\"] = rootgrp.createDimension(\"lon\", 2)\n", " dims[\"conditions\"] = rootgrp.createDimension(\"conditions\", 2)\n", - " \n", + "\n", " dims[\"level\"] = groups[\"Data\"].createDimension(\"level\", None)\n", - " \n", - " \n", + "\n", " # --- Create Variables ---\n", " conditions = rootgrp.createVariable(\"conditions\", \"i4\", (\"conditions\",))\n", " times = rootgrp.createVariable(\"time\", \"f8\", (\"time\",))\n", - " \n", + "\n", " latitudes = rootgrp.createVariable(\"/Position/lat\", \"f4\", (\"lat\",))\n", " longitudes = rootgrp.createVariable(\"/Position/lon\", \"f4\", (\"lon\",))\n", - " \n", + "\n", " std_values = rootgrp.createVariable(\"/Statistics/std_value\", \"f4\", (\"time\",))\n", - " \n", + "\n", " levels = rootgrp.createVariable(\"/Data/level\", \"i4\", (\"level\",))\n", - " product_temp = rootgrp.createVariable(\"/Data/Products/temp\", \"f4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " quality_flag = rootgrp.createVariable(\"/Data/Quality/quality_flag\", \"i4\", (\"time\", \"level\", \"lat\", \"lon\",))\n", - " \n", - " supplemental_flag = rootgrp.createVariable(\"/Data/Supplemental/supplemental_flag\", \"i4\", (\"time\", \"conditions\"))\n", - " condition_details = rootgrp.createVariable(\"/Data/Supplemental/Details/condition_details\", \"f8\", (\"conditions\"))\n", - " \n", - " \n", + " product_temp = rootgrp.createVariable(\n", + " \"/Data/Products/temp\",\n", + " \"f4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + " quality_flag = rootgrp.createVariable(\n", + " \"/Data/Quality/quality_flag\",\n", + " \"i4\",\n", + " (\n", + " \"time\",\n", + " \"level\",\n", + " \"lat\",\n", + " \"lon\",\n", + " ),\n", + " )\n", + "\n", + " supplemental_flag = rootgrp.createVariable(\n", + " \"/Data/Supplemental/supplemental_flag\", \"i4\", (\"time\", \"conditions\")\n", + " )\n", + " condition_details = rootgrp.createVariable(\n", + " \"/Data/Supplemental/Details/condition_details\", \"f8\", (\"conditions\")\n", + " )\n", + "\n", " # --- Assign Attributes ---\n", " rootgrp.description = \"Example netCDF file\"\n", " rootgrp.history = \"Created \" + time.ctime(time.time())\n", " rootgrp.source = \"test data creation script\"\n", - " \n", + "\n", " groups[\"Position\"].description = \"This group contain position data.\"\n", " groups[\"Statistics\"].description = \"This group contains statistical information.\"\n", - " \n", + "\n", " times.units = \"hours since 0001-01-01 00:00:00.0\"\n", " times.long_name = \"Time of observation\"\n", " times.calendar = \"gregorian\"\n", " times.coordinates = \"time\"\n", - " \n", + "\n", " levels.units = \"hPa\"\n", - " \n", + "\n", " latitudes.units = \"degrees north\"\n", - " \n", + "\n", " longitudes.units = \"degrees east\"\n", - " \n", + "\n", " std_values.long_name = \"standard deviation value for each time\"\n", " std_values.coordinates = \"time\"\n", - " \n", + "\n", " product_temp.long_name = \"temperature\"\n", " product_temp.units = \"Kelvin\"\n", - " \n", + "\n", " quality_flag.units = \"unitless\"\n", - " \n", + "\n", " supplemental_flag.units = \"unitless\"\n", - " \n", + "\n", " # --- Assign Data Values ---\n", - " lats = np.arange(-90, 1, 90)\n", - " lons = np.arange(-180, 0, 90)\n", + " lats = np.arange(-90, 1, 90)\n", + " lons = np.arange(-180, 0, 90)\n", " latitudes[:] = lats\n", " longitudes[:] = lons\n", - " \n", + "\n", " nlats = len(rootgrp.dimensions[\"lat\"])\n", " nlons = len(rootgrp.dimensions[\"lon\"])\n", - " \n", + "\n", " product_temp[0:5, 0:2, :, :] = some_4d_data[:, :, :-1, :-2]\n", - " \n", + "\n", " times[0:5] = [1, 1.5, 2, 2.5, 3]\n", " levels[0:2] = [10, 20]\n", - " \n", - " supplemental_flag = [\n", - " [1, 2],\n", - " [0, 1],\n", - " [1, 2],\n", - " [0, 1],\n", - " [1, 2]\n", - " ]\n", - " \n", + "\n", + " supplemental_flag = [[1, 2], [0, 1], [1, 2], [0, 1], [1, 2]]\n", + "\n", " condition_details = [8.65, 1.23]\n", - " \n", + "\n", "print(\"Done.\")" ] }, diff --git a/tests/test_cli.py b/tests/test_cli.py index 5bb74dc..d314ae8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -29,12 +29,12 @@ def test_console_version(): - exit_status = os.system('ncompare --version') + exit_status = os.system("ncompare --version") assert exit_status == 0 def test_console_help(): - exit_status = os.system('ncompare --help') + exit_status = os.system("ncompare --help") assert exit_status == 0 diff --git a/tests/test_complete_file_output.py b/tests/test_complete_file_output.py index d989733..d4af4ef 100644 --- a/tests/test_complete_file_output.py +++ b/tests/test_complete_file_output.py @@ -42,7 +42,10 @@ def test_full_run_to_text_output(temp_data_dir): file_text=str(out_path), ) - with open(data_for_tests_dir / "a-b_test_golden_file.txt") as f1, open(str(out_path)) as f2: + with ( + open(data_for_tests_dir / "a-b_test_golden_file.txt") as f1, + open(str(out_path)) as f2, + ): exclude_n_lines = 3 for _ in range(exclude_n_lines): @@ -65,7 +68,10 @@ def test_full_run_to_csv_output(temp_data_dir): file_csv=str(out_path), ) - with open(data_for_tests_dir / "a-b_test_golden_file.csv") as f1, open(str(out_path)) as f2: + with ( + open(data_for_tests_dir / "a-b_test_golden_file.csv") as f1, + open(str(out_path)) as f2, + ): exclude_n_lines = 3 for _ in range(exclude_n_lines): diff --git a/tests/test_core.py b/tests/test_core.py index e106274..8d127a6 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -28,6 +28,7 @@ Note that full comparison tests are performed in both directions, i.e., A -> B and B -> A. """ + from contextlib import nullcontext as does_not_raise import pytest @@ -76,10 +77,10 @@ def test_matching_random_values( ds_1dim_1var_allnan_1coord, outputter_to_console, ): - variable_array_1 = xr.open_dataset(ds_3dims_2vars_4coords).variables['z1'] - variable_array_2 = xr.open_dataset(ds_4dims_3vars_5coords).variables['z1'] - variable_array_3 = xr.open_dataset(ds_1dim_1var_1coord).variables['z1'] - variable_array_allnan = xr.open_dataset(ds_1dim_1var_allnan_1coord).variables['z1'] + variable_array_1 = xr.open_dataset(ds_3dims_2vars_4coords).variables["z1"] + variable_array_2 = xr.open_dataset(ds_4dims_3vars_5coords).variables["z1"] + variable_array_3 = xr.open_dataset(ds_1dim_1var_1coord).variables["z1"] + variable_array_allnan = xr.open_dataset(ds_1dim_1var_allnan_1coord).variables["z1"] assert ( _match_random_value( @@ -128,7 +129,10 @@ def test_matching_random_values( def test_print_values_runs_with_no_error(ds_3dims_3vars_4coords_1group, outputter_to_console): with does_not_raise(): _print_sample_values( - outputter_to_console, ds_3dims_3vars_4coords_1group, groupname="Group1", varname="step" + outputter_to_console, + ds_3dims_3vars_4coords_1group, + groupname="Group1", + varname="step", ) @@ -136,7 +140,10 @@ def test_print_values_to_text_file_runs_with_no_error( ds_3dims_3vars_4coords_1group, outputter_to_text_file, temp_test_text_file_path ): _print_sample_values( - outputter_to_text_file, ds_3dims_3vars_4coords_1group, groupname="Group1", varname="step" + outputter_to_text_file, + ds_3dims_3vars_4coords_1group, + groupname="Group1", + varname="step", ) outputter_to_text_file._text_file_obj.close() @@ -192,7 +199,7 @@ def test_comparison_var_no_error_for_duplicate_dataset( def test_get_vars_with_group(ds_3dims_3vars_4coords_1group): result = _get_vars(ds_3dims_3vars_4coords_1group, groupname="Group1") - assert set(result) == {'step', 'var1', 'var2', 'w'} + assert set(result) == {"step", "var1", "var2", "w"} def test_get_vars_error_when_no_group(ds_3dims_2vars_4coords): diff --git a/tests/test_printing.py b/tests/test_printing.py index e6ede64..e3223a3 100644 --- a/tests/test_printing.py +++ b/tests/test_printing.py @@ -26,7 +26,7 @@ def test_list_of_strings_diff(outputter_to_console): left, right, both = outputter_to_console.lists_diff( - ['hey', 'yo', 'beebop'], ['what', 'is', 'this', 'beebop'] + ["hey", "yo", "beebop"], ["what", "is", "this", "beebop"] ) assert (left, right, both) == (2, 3, 1) diff --git a/tests/test_sequence_operations.py b/tests/test_sequence_operations.py index f7af980..d1dd4a1 100644 --- a/tests/test_sequence_operations.py +++ b/tests/test_sequence_operations.py @@ -30,8 +30,8 @@ @pytest.fixture def two_example_lists() -> tuple[list[str], list[str]]: - a = ['yo', 'beebop', 'hey'] - b = ['what', 'does', 'this', 'beebop', 'mean'] + a = ["yo", "beebop", "hey"] + b = ["what", "does", "this", "beebop", "mean"] return a, b @@ -39,13 +39,13 @@ def test_common_elements(two_example_lists): composed_pairs = [e for e in common_elements(*two_example_lists)] should_be = [ - (0, 'beebop', 'beebop'), - (1, '', 'does'), - (2, 'hey', ''), - (3, '', 'mean'), - (4, '', 'this'), - (5, '', 'what'), - (6, 'yo', ''), + (0, "beebop", "beebop"), + (1, "", "does"), + (2, "hey", ""), + (3, "", "mean"), + (4, "", "this"), + (5, "", "what"), + (6, "yo", ""), ] assert composed_pairs == should_be diff --git a/tests/test_utils.py b/tests/test_utils.py index fe800e0..b87f535 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -60,7 +60,7 @@ def test_coerce_int_to_str(): def test_coerce_tuple_to_str(): - assert coerce_to_str(('step', 123)) == "('step', 123)" + assert coerce_to_str(("step", 123)) == "('step', 123)" def test_error_from_not_able_to_coerce_to_str(): From a9c64a7a8354f25b5b9adbe95279bd203734ce82 Mon Sep 17 00:00:00 2001 From: Daniel Kaufman <114174502+danielfromearth@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:45:50 -0500 Subject: [PATCH 08/10] remove badge for black from README.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 5633037..57a0834 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,6 @@ _____ Package version - - Code style - Mypy checked From 8b72508feea9434f8532dc18ff95876b77b3352d Mon Sep 17 00:00:00 2001 From: Daniel Kaufman <114174502+danielfromearth@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:46:25 -0500 Subject: [PATCH 09/10] remove reference for black from CONTRIBUTING.md --- CONTRIBUTING.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1da842a..56b3a05 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -174,8 +174,7 @@ features or old documentation updated for any changed features ### Python Style Guide -_Ncompare_ follows PEP8 as much as possible. Reference the _ruff_ and -_black_ configuration sections in [pyproject.toml](pyproject.toml) for specific expectations. +_Ncompare_ follows PEP8 as much as possible. Reference the _ruff_ configuration section in [pyproject.toml](pyproject.toml) for specific expectations. ### Documentation From fd0745fda27ec88ad6ea6cdf18d3964840d1958c Mon Sep 17 00:00:00 2001 From: Daniel Kaufman <114174502+danielfromearth@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:49:10 -0500 Subject: [PATCH 10/10] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9877d64..a571750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [unreleased] +### Removed + +- Remove usage of black for code formatting ([#257](https://github.com/nasa/ncompare/pull/257)) ([**@danielfromearth**](https://github.com/danielfromearth)) + +## [1.10.0] - 2024-07-10 + ### Changed - Group dependabot updates into fewer PRs ([#233](https://github.com/nasa/ncompare/issues/233)) ([**@danielfromearth**](https://github.com/danielfromearth))