From 9b1f555dcc064a3f78b2915bc2c6183055627b30 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 6 Mar 2024 23:24:18 +0100 Subject: [PATCH 01/60] added arima model EXPERIMENTAL --- poetry.lock | 70 ++++++++++++++++- pyproject.toml | 1 + .../ml/classical/regression/__init__.py | 2 + src/safeds/ml/classical/regression/_arima.py | 75 +++++++++++++++++++ .../classification/test_arimaModel.py | 33 ++++++++ 5 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/safeds/ml/classical/regression/_arima.py create mode 100644 tests/safeds/ml/classical/classification/test_arimaModel.py diff --git a/poetry.lock b/poetry.lock index 75833ac2b..3af1f4cce 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2538,6 +2538,24 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "patsy" +version = "0.5.6" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = "*" +files = [ + {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, + {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + [[package]] name = "pexpect" version = "4.9.0" @@ -3733,6 +3751,56 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "statsmodels" +version = "0.14.1" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "statsmodels-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43af9c0b07c9d72f275cf14ea54a481a3f20911f0b443181be4769def258fdeb"}, + {file = "statsmodels-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16975ab6ad505d837ba9aee11f92a8c5b49c4fa1ff45b60fe23780b19e5705e"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e278fe74da5ed5e06c11a30851eda1af08ef5af6be8507c2c45d2e08f7550dde"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0564d92cb05b219b4538ed09e77d96658a924a691255e1f7dd23ee338df441b"}, + {file = "statsmodels-0.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5385e22e72159a09c099c4fb975f350a9f3afeb57c1efce273b89dcf1fe44c0f"}, + {file = "statsmodels-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:0a8aae75a2e08ebd990e5fa394f8e32738b55785cb70798449a3f4207085e667"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b69a63ad6c979a6e4cde11870ffa727c76a318c225a7e509f031fbbdfb4e416a"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7562cb18a90a114f39fab6f1c25b9c7b39d9cd5f433d0044b430ca9d44a8b52c"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3abaca4b963259a2bf349c7609cfbb0ce64ad5fb3d92d6f08e21453e4890248"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0f727fe697f6406d5f677b67211abe5a55101896abdfacdb3f38410405f6ad8"}, + {file = "statsmodels-0.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6838ac6bdb286daabb5e91af90fd4258f09d0cec9aace78cc441cb2b17df428"}, + {file = "statsmodels-0.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:709bfcef2dbe66f705b17e56d1021abad02243ee1a5d1efdb90f9bad8b06a329"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f32a7cd424cf33304a54daee39d32cccf1d0265e652c920adeaeedff6d576457"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f8c30181c084173d662aaf0531867667be2ff1bee103b84feb64f149f792dbd2"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de2b97413913d52ad6342dece2d653e77f78620013b7705fad291d4e4266ccb"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3420f88289c593ba2bca33619023059c476674c160733bd7d858564787c83d3"}, + {file = "statsmodels-0.14.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c008e16096f24f0514e53907890ccac6589a16ad6c81c218f2ee6752fdada555"}, + {file = "statsmodels-0.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:bc0351d279c4e080f0ce638a3d886d312aa29eade96042e3ba0a73771b1abdfb"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf293ada63b2859d95210165ad1dfcd97bd7b994a5266d6fbeb23659d8f0bf68"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44ca8cb88fa3d3a4ffaff1fb8eb0e98bbf83fc936fcd9b9eedee258ecc76696a"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5373d176239993c095b00d06036690a50309a4e00c2da553b65b840f956ae6"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a532dfe899f8b6632cd8caa0b089b403415618f51e840d1817a1e4b97e200c73"}, + {file = "statsmodels-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:4fe0a60695952b82139ae8750952786a700292f9e0551d572d7685070944487b"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04293890f153ffe577e60a227bd43babd5f6c1fc50ea56a3ab1862ae85247a95"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e70a2e93d54d40b2cb6426072acbc04f35501b1ea2569f6786964adde6ca572"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab3a73d16c0569adbba181ebb967e5baaa74935f6d2efe86ac6fc5857449b07d"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eefa5bcff335440ee93e28745eab63559a20cd34eea0375c66d96b016de909b3"}, + {file = "statsmodels-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:bc43765710099ca6a942b5ffa1bac7668965052542ba793dd072d26c83453572"}, + {file = "statsmodels-0.14.1.tar.gz", hash = "sha256:2260efdc1ef89f39c670a0bd8151b1d0843567781bcafec6cda0534eb47a94f6"}, +] + +[package.dependencies] +numpy = ">=1.18,<2" +packaging = ">=21.3" +pandas = ">=1.0,<2.1.0 || >2.1.0" +patsy = ">=0.5.4" +scipy = ">=1.4,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.33)"] +develop = ["colorama", "cython (>=0.29.33)", "cython (>=0.29.33,<4.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.3.0)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "sympy" version = "1.12" @@ -4147,4 +4215,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11,<3.13" -content-hash = "bba95c10a3dd3ff93b46a6c90954cb0932bf3fae178bc4d7e0231e63d417d1a1" +content-hash = "47d869cd0628ae5c672a77de178d20afa700e7c1b10c4ad3d0bda55616069907" diff --git a/pyproject.toml b/pyproject.toml index 56d671eff..9984afc22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ scikit-learn = "^1.2.0" seaborn = "^0.13.0" torch = {version = "^2.2.0", source = "torch_cuda121"} torchvision = {version = "^0.17.0", source = "torch_cuda121"} +statsmodels = "^0.14.1" [tool.poetry.group.dev.dependencies] pytest = ">=7.2.1,<9.0.0" diff --git a/src/safeds/ml/classical/regression/__init__.py b/src/safeds/ml/classical/regression/__init__.py index 9d45d16e6..a8a99c3a9 100644 --- a/src/safeds/ml/classical/regression/__init__.py +++ b/src/safeds/ml/classical/regression/__init__.py @@ -11,9 +11,11 @@ from ._regressor import Regressor from ._ridge_regression import RidgeRegression from ._support_vector_machine import SupportVectorMachine +from ._arima import arimaModel __all__ = [ "AdaBoost", + "arimaModel", "DecisionTree", "ElasticNetRegression", "GradientBoosting", diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py new file mode 100644 index 000000000..e5de328d9 --- /dev/null +++ b/src/safeds/ml/classical/regression/_arima.py @@ -0,0 +1,75 @@ +from statsmodels.tsa.arima.model import ARIMA + +import io +from typing import TYPE_CHECKING +import itertools +import matplotlib.pyplot as plt + +from safeds.data.tabular.containers import TimeSeries +from safeds.data.image.containers import Image + +if TYPE_CHECKING: + from sklearn.base import RegressorMixin + from safeds.data.tabular.containers import Table, TaggedTable, TimeSeries + + +class arimaModel(): + """Auto Regressive Integrated Moving Average Model.""" + + def __init__(self) -> None: + # Internal state + self._arima = None + self._order = None + + def fit(self, time_series: TimeSeries): + result = arimaModel() + p = d = q = range(0, 2) + pdq = list(itertools.product(p, d, q)) + best_aic = float("inf") + best_model = None + best_param = None + for param in pdq: + try: + # Create and fit an ARIMA model with the current parameters + size = len(time_series.target._data.values) + mod = ARIMA(time_series.target._data.values[:int(size*0.8)], order=param) + result = mod.fit() + + # Compare the current model's AIC with the best AIC so far + if result.aic < best_aic: + best_aic = result.aic + best_model = result + print(param) + best_param = param + print('ARIMA{} AIC:{}'.format(param, result.aic)) + except Exception as e: + # Skip the iteration if the model cannot be fitted with current parameters + print('ARIMA{} - AIC: skipped due to an error: {}'.format(param, e)) + continue + + self._order = best_param + return result + + def predict(self, time_series: TimeSeries): + print(self._order) + size = len(time_series.target._data.values) + temp_arima =ARIMA(time_series.target._data.values[:int(size*0.8)], order=self._order) + temp_fitted = temp_arima.fit() + + test_data = time_series.target._data.values[int(size*0.8):] + n_steps = len(test_data) + print(n_steps) + forecast_results = temp_fitted.forecast(steps=n_steps) + + print(len(forecast_results)) + fig = plt.figure() + plt.plot(forecast_results, ) + plt.legend(["forecasted"]) + plt.plot(test_data) + plt.tight_layout() + + buffer = io.BytesIO() + fig.savefig(buffer, format="png") + plt.close() # Prevents the figure from being displayed directly + buffer.seek(0) + return Image.from_bytes(buffer.read()) diff --git a/tests/safeds/ml/classical/classification/test_arimaModel.py b/tests/safeds/ml/classical/classification/test_arimaModel.py new file mode 100644 index 000000000..732639019 --- /dev/null +++ b/tests/safeds/ml/classical/classification/test_arimaModel.py @@ -0,0 +1,33 @@ +import pytest +from safeds.ml.classical.regression import arimaModel +from safeds.data.tabular.containers import TimeSeries, Table +from syrupy import SnapshotAssertion +import pandas as pd +import numpy as np + + +def test_arimaModel(snapshot_png: SnapshotAssertion) -> None: + # Define the length of the time series + length_of_series = 100 + + # Generate synthetic data using a random normal distribution + synthetic_data = np.random.randn(length_of_series) + + # Generate a 'Feature' column with random integers + # For example, create random integers between 0 and 100 + feature_data = np.random.randint(0, 100, length_of_series) + + # Create a DataFrame + time_series_df = pd.DataFrame({ + 'Date': range(length_of_series), + 'Value': synthetic_data, + 'Feature': feature_data # Add the feature column with random integers + }) + table = Table._from_pandas_dataframe(time_series_df) + time_series = TimeSeries._from_table_to_time_series(table, target_name="Value", time_name="Date", feature_names=["Feature"]) + model = arimaModel() + #right now the model just saves the best parameter for the predict method in the fit method + trained_model = model.fit(time_series) + snap = model.predict(time_series) + assert snapshot_png == snap + From 5098a6d860bc765f7c00647a1a29ddd78cecf979 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 11 Mar 2024 22:49:18 +0100 Subject: [PATCH 02/60] updated some stuff arima works gotta fix time series bug first --- .../data/tabular/containers/_time_series.py | 55 ++ .../ml/classical/regression/__init__.py | 4 +- src/safeds/ml/classical/regression/_arima.py | 57 +- tests/resources/_datas/US_Inflation_rates.csv | 919 ++++++++++++++++++ .../test_arimaModel/test_arimaModel.png | Bin 0 -> 29802 bytes .../test_arimaModel.py | 22 +- 6 files changed, 1024 insertions(+), 33 deletions(-) create mode 100644 tests/resources/_datas/US_Inflation_rates.csv create mode 100644 tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arimaModel.png rename tests/safeds/ml/classical/{classification => regression}/test_arimaModel.py (58%) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index a755885e1..bf21b8abb 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -16,6 +16,7 @@ IllegalSchemaModificationError, NonNumericColumnError, UnknownColumnNameError, + IndexOutOfBoundsError, ) if TYPE_CHECKING: @@ -1054,3 +1055,57 @@ def plot_scatterplot( buffer.seek(0) self._data = self._data.reset_index() return Image.from_bytes(buffer.read()) + + def slice_rows( + self, + start: int | None = None, + end: int | None = None, + step: int = 1, + ) -> Table: + """ + Slice a part of the time series into a new time series. + + The original table is not modified. + + Parameters + ---------- + start : int | None + The first index of the range to be copied into a new table, None by default. + end : int | None + The last index of the range to be copied into a new table, None by default. + step : int + The step size used to iterate through the table, 1 by default. + + Returns + ------- + result : TimeSeries + The resulting time series. + + Raises + ------ + IndexOutOfBoundsError + If the index is out of bounds. + + Examples + -------- + >>> from safeds.data.tabular.containers import TimeSeries + >>> table = TimeSeries({"time":[1, 2, 3], "target": [3, 4, 6], "feature":[2, 2, 7]}, target_name= "target", time_name="time", feature_names=["feature"], ) + >>> table.slice_rows(0, 2) + time feature target + 0 1 2 3 + 1 2 4 2 + """ + if start is None: + start = 0 + + if end is None: + end = self.number_of_rows + + if end < start: + raise IndexOutOfBoundsError(slice(start, end)) + if start < 0 or end < 0 or start > self.number_of_rows or end > self.number_of_rows: + raise IndexOutOfBoundsError(start if start < 0 or start > self.number_of_rows else end) + + new_df = self._data.iloc[start:end:step] + new_df.columns = self._schema.column_names + return TimeSeries(Table._from_pandas_dataframe(new_df) diff --git a/src/safeds/ml/classical/regression/__init__.py b/src/safeds/ml/classical/regression/__init__.py index a8a99c3a9..6d57b4803 100644 --- a/src/safeds/ml/classical/regression/__init__.py +++ b/src/safeds/ml/classical/regression/__init__.py @@ -11,11 +11,11 @@ from ._regressor import Regressor from ._ridge_regression import RidgeRegression from ._support_vector_machine import SupportVectorMachine -from ._arima import arimaModel +from ._arima import ArimaModel __all__ = [ "AdaBoost", - "arimaModel", + "ArimaModel", "DecisionTree", "ElasticNetRegression", "GradientBoosting", diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index e5de328d9..63682c6d5 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -10,10 +10,10 @@ if TYPE_CHECKING: from sklearn.base import RegressorMixin - from safeds.data.tabular.containers import Table, TaggedTable, TimeSeries + from safeds.data.tabular.containers import TimeSeries -class arimaModel(): +class ArimaModel: """Auto Regressive Integrated Moving Average Model.""" def __init__(self) -> None: @@ -22,7 +22,35 @@ def __init__(self) -> None: self._order = None def fit(self, time_series: TimeSeries): - result = arimaModel() + """ + Create a copy of this ARIMA Model and fit it with the given training data. + + This ARIMA Model is not modified. + + Parameters + ---------- + training_set : TimeSeries + The training data containing the feature and target vectors. + + Returns + ------- + fitted_arima : ArimaModel + The fitted ARIMA Model. + + Raises + ------ + LearningError + If the training data contains invalid values or if the training failed. + UntaggedTableError + If the table is untagged. + NonNumericColumnError + If the training data contains non-numerical values. + MissingValuesColumnError + If the training data contains missing values. + DatasetMissesDataError + If the training data contains no rows. + """ + fitted_arima = ArimaModel() p = d = q = range(0, 2) pdq = list(itertools.product(p, d, q)) best_aic = float("inf") @@ -31,37 +59,28 @@ def fit(self, time_series: TimeSeries): for param in pdq: try: # Create and fit an ARIMA model with the current parameters - size = len(time_series.target._data.values) - mod = ARIMA(time_series.target._data.values[:int(size*0.8)], order=param) + mod = ARIMA(time_series.target._data.values, order=param) result = mod.fit() # Compare the current model's AIC with the best AIC so far if result.aic < best_aic: best_aic = result.aic - best_model = result - print(param) best_param = param - print('ARIMA{} AIC:{}'.format(param, result.aic)) + best_model = result except Exception as e: # Skip the iteration if the model cannot be fitted with current parameters print('ARIMA{} - AIC: skipped due to an error: {}'.format(param, e)) continue - self._order = best_param - return result + fitted_arima._order = best_param + fitted_arima._arima = best_model + return fitted_arima def predict(self, time_series: TimeSeries): - print(self._order) - size = len(time_series.target._data.values) - temp_arima =ARIMA(time_series.target._data.values[:int(size*0.8)], order=self._order) - temp_fitted = temp_arima.fit() - - test_data = time_series.target._data.values[int(size*0.8):] + test_data = time_series.target._data.values n_steps = len(test_data) - print(n_steps) - forecast_results = temp_fitted.forecast(steps=n_steps) + forecast_results = self._arima.forecast(steps=n_steps) - print(len(forecast_results)) fig = plt.figure() plt.plot(forecast_results, ) plt.legend(["forecasted"]) diff --git a/tests/resources/_datas/US_Inflation_rates.csv b/tests/resources/_datas/US_Inflation_rates.csv new file mode 100644 index 000000000..5176069e0 --- /dev/null +++ b/tests/resources/_datas/US_Inflation_rates.csv @@ -0,0 +1,919 @@ +date,value +1947-01-01,21.48 +1947-02-01,21.62 +1947-03-01,22.0 +1947-04-01,22.0 +1947-05-01,21.95 +1947-06-01,22.08 +1947-07-01,22.23 +1947-08-01,22.4 +1947-09-01,22.84 +1947-10-01,22.91 +1947-11-01,23.06 +1947-12-01,23.41 +1948-01-01,23.68 +1948-02-01,23.67 +1948-03-01,23.5 +1948-04-01,23.82 +1948-05-01,24.01 +1948-06-01,24.15 +1948-07-01,24.4 +1948-08-01,24.43 +1948-09-01,24.36 +1948-10-01,24.31 +1948-11-01,24.16 +1948-12-01,24.05 +1949-01-01,24.01 +1949-02-01,23.91 +1949-03-01,23.91 +1949-04-01,23.92 +1949-05-01,23.91 +1949-06-01,23.92 +1949-07-01,23.7 +1949-08-01,23.7 +1949-09-01,23.75 +1949-10-01,23.67 +1949-11-01,23.7 +1949-12-01,23.61 +1950-01-01,23.51 +1950-02-01,23.61 +1950-03-01,23.64 +1950-04-01,23.65 +1950-05-01,23.77 +1950-06-01,23.88 +1950-07-01,24.07 +1950-08-01,24.2 +1950-09-01,24.34 +1950-10-01,24.5 +1950-11-01,24.6 +1950-12-01,24.98 +1951-01-01,25.38 +1951-02-01,25.83 +1951-03-01,25.88 +1951-04-01,25.92 +1951-05-01,25.99 +1951-06-01,25.93 +1951-07-01,25.91 +1951-08-01,25.86 +1951-09-01,26.03 +1951-10-01,26.16 +1951-11-01,26.32 +1951-12-01,26.47 +1952-01-01,26.45 +1952-02-01,26.41 +1952-03-01,26.39 +1952-04-01,26.46 +1952-05-01,26.47 +1952-06-01,26.53 +1952-07-01,26.68 +1952-08-01,26.69 +1952-09-01,26.63 +1952-10-01,26.69 +1952-11-01,26.69 +1952-12-01,26.71 +1953-01-01,26.64 +1953-02-01,26.59 +1953-03-01,26.63 +1953-04-01,26.69 +1953-05-01,26.7 +1953-06-01,26.77 +1953-07-01,26.79 +1953-08-01,26.85 +1953-09-01,26.89 +1953-10-01,26.95 +1953-11-01,26.85 +1953-12-01,26.87 +1954-01-01,26.94 +1954-02-01,26.99 +1954-03-01,26.93 +1954-04-01,26.86 +1954-05-01,26.93 +1954-06-01,26.94 +1954-07-01,26.86 +1954-08-01,26.85 +1954-09-01,26.81 +1954-10-01,26.72 +1954-11-01,26.78 +1954-12-01,26.77 +1955-01-01,26.77 +1955-02-01,26.82 +1955-03-01,26.79 +1955-04-01,26.79 +1955-05-01,26.77 +1955-06-01,26.71 +1955-07-01,26.76 +1955-08-01,26.72 +1955-09-01,26.85 +1955-10-01,26.82 +1955-11-01,26.88 +1955-12-01,26.87 +1956-01-01,26.83 +1956-02-01,26.86 +1956-03-01,26.89 +1956-04-01,26.93 +1956-05-01,27.03 +1956-06-01,27.15 +1956-07-01,27.29 +1956-08-01,27.31 +1956-09-01,27.35 +1956-10-01,27.51 +1956-11-01,27.51 +1956-12-01,27.63 +1957-01-01,27.67 +1957-02-01,27.8 +1957-03-01,27.86 +1957-04-01,27.93 +1957-05-01,28.0 +1957-06-01,28.11 +1957-07-01,28.19 +1957-08-01,28.28 +1957-09-01,28.32 +1957-10-01,28.32 +1957-11-01,28.41 +1957-12-01,28.47 +1958-01-01,28.64 +1958-02-01,28.7 +1958-03-01,28.87 +1958-04-01,28.94 +1958-05-01,28.94 +1958-06-01,28.91 +1958-07-01,28.89 +1958-08-01,28.94 +1958-09-01,28.91 +1958-10-01,28.91 +1958-11-01,28.95 +1958-12-01,28.97 +1959-01-01,29.01 +1959-02-01,29.0 +1959-03-01,28.97 +1959-04-01,28.98 +1959-05-01,29.04 +1959-06-01,29.11 +1959-07-01,29.15 +1959-08-01,29.18 +1959-09-01,29.25 +1959-10-01,29.35 +1959-11-01,29.35 +1959-12-01,29.41 +1960-01-01,29.37 +1960-02-01,29.41 +1960-03-01,29.41 +1960-04-01,29.54 +1960-05-01,29.57 +1960-06-01,29.61 +1960-07-01,29.55 +1960-08-01,29.61 +1960-09-01,29.61 +1960-10-01,29.75 +1960-11-01,29.78 +1960-12-01,29.81 +1961-01-01,29.84 +1961-02-01,29.84 +1961-03-01,29.84 +1961-04-01,29.81 +1961-05-01,29.84 +1961-06-01,29.84 +1961-07-01,29.92 +1961-08-01,29.94 +1961-09-01,29.98 +1961-10-01,29.98 +1961-11-01,29.98 +1961-12-01,30.01 +1962-01-01,30.04 +1962-02-01,30.11 +1962-03-01,30.17 +1962-04-01,30.21 +1962-05-01,30.24 +1962-06-01,30.21 +1962-07-01,30.22 +1962-08-01,30.28 +1962-09-01,30.42 +1962-10-01,30.38 +1962-11-01,30.38 +1962-12-01,30.38 +1963-01-01,30.44 +1963-02-01,30.48 +1963-03-01,30.51 +1963-04-01,30.48 +1963-05-01,30.51 +1963-06-01,30.61 +1963-07-01,30.69 +1963-08-01,30.75 +1963-09-01,30.72 +1963-10-01,30.75 +1963-11-01,30.78 +1963-12-01,30.88 +1964-01-01,30.94 +1964-02-01,30.91 +1964-03-01,30.94 +1964-04-01,30.95 +1964-05-01,30.98 +1964-06-01,31.01 +1964-07-01,31.02 +1964-08-01,31.05 +1964-09-01,31.08 +1964-10-01,31.12 +1964-11-01,31.21 +1964-12-01,31.25 +1965-01-01,31.28 +1965-02-01,31.28 +1965-03-01,31.31 +1965-04-01,31.38 +1965-05-01,31.48 +1965-06-01,31.61 +1965-07-01,31.58 +1965-08-01,31.55 +1965-09-01,31.62 +1965-10-01,31.65 +1965-11-01,31.75 +1965-12-01,31.85 +1966-01-01,31.88 +1966-02-01,32.08 +1966-03-01,32.18 +1966-04-01,32.28 +1966-05-01,32.35 +1966-06-01,32.38 +1966-07-01,32.45 +1966-08-01,32.65 +1966-09-01,32.75 +1966-10-01,32.85 +1966-11-01,32.88 +1966-12-01,32.92 +1967-01-01,32.9 +1967-02-01,33.0 +1967-03-01,33.0 +1967-04-01,33.1 +1967-05-01,33.1 +1967-06-01,33.3 +1967-07-01,33.4 +1967-08-01,33.5 +1967-09-01,33.6 +1967-10-01,33.7 +1967-11-01,33.9 +1967-12-01,34.0 +1968-01-01,34.1 +1968-02-01,34.2 +1968-03-01,34.3 +1968-04-01,34.4 +1968-05-01,34.5 +1968-06-01,34.7 +1968-07-01,34.9 +1968-08-01,35.0 +1968-09-01,35.1 +1968-10-01,35.3 +1968-11-01,35.4 +1968-12-01,35.6 +1969-01-01,35.7 +1969-02-01,35.8 +1969-03-01,36.1 +1969-04-01,36.3 +1969-05-01,36.4 +1969-06-01,36.6 +1969-07-01,36.8 +1969-08-01,36.9 +1969-09-01,37.1 +1969-10-01,37.3 +1969-11-01,37.5 +1969-12-01,37.7 +1970-01-01,37.9 +1970-02-01,38.1 +1970-03-01,38.3 +1970-04-01,38.5 +1970-05-01,38.6 +1970-06-01,38.8 +1970-07-01,38.9 +1970-08-01,39.0 +1970-09-01,39.2 +1970-10-01,39.4 +1970-11-01,39.6 +1970-12-01,39.8 +1971-01-01,39.9 +1971-02-01,39.9 +1971-03-01,40.0 +1971-04-01,40.1 +1971-05-01,40.3 +1971-06-01,40.5 +1971-07-01,40.6 +1971-08-01,40.7 +1971-09-01,40.8 +1971-10-01,40.9 +1971-11-01,41.0 +1971-12-01,41.1 +1972-01-01,41.2 +1972-02-01,41.4 +1972-03-01,41.4 +1972-04-01,41.5 +1972-05-01,41.6 +1972-06-01,41.7 +1972-07-01,41.8 +1972-08-01,41.9 +1972-09-01,42.1 +1972-10-01,42.2 +1972-11-01,42.4 +1972-12-01,42.5 +1973-01-01,42.7 +1973-02-01,43.0 +1973-03-01,43.4 +1973-04-01,43.7 +1973-05-01,43.9 +1973-06-01,44.2 +1973-07-01,44.2 +1973-08-01,45.0 +1973-09-01,45.2 +1973-10-01,45.6 +1973-11-01,45.9 +1973-12-01,46.3 +1974-01-01,46.8 +1974-02-01,47.3 +1974-03-01,47.8 +1974-04-01,48.1 +1974-05-01,48.6 +1974-06-01,49.0 +1974-07-01,49.3 +1974-08-01,49.9 +1974-09-01,50.6 +1974-10-01,51.0 +1974-11-01,51.5 +1974-12-01,51.9 +1975-01-01,52.3 +1975-02-01,52.6 +1975-03-01,52.8 +1975-04-01,53.0 +1975-05-01,53.1 +1975-06-01,53.5 +1975-07-01,54.0 +1975-08-01,54.2 +1975-09-01,54.6 +1975-10-01,54.9 +1975-11-01,55.3 +1975-12-01,55.6 +1976-01-01,55.8 +1976-02-01,55.9 +1976-03-01,56.0 +1976-04-01,56.1 +1976-05-01,56.4 +1976-06-01,56.7 +1976-07-01,57.0 +1976-08-01,57.3 +1976-09-01,57.6 +1976-10-01,57.9 +1976-11-01,58.1 +1976-12-01,58.4 +1977-01-01,58.7 +1977-02-01,59.3 +1977-03-01,59.6 +1977-04-01,60.0 +1977-05-01,60.2 +1977-06-01,60.5 +1977-07-01,60.8 +1977-08-01,61.1 +1977-09-01,61.3 +1977-10-01,61.6 +1977-11-01,62.0 +1977-12-01,62.3 +1978-01-01,62.7 +1978-02-01,63.0 +1978-03-01,63.4 +1978-04-01,63.9 +1978-05-01,64.5 +1978-06-01,65.0 +1978-07-01,65.5 +1978-08-01,65.9 +1978-09-01,66.5 +1978-10-01,67.1 +1978-11-01,67.5 +1978-12-01,67.9 +1979-01-01,68.5 +1979-02-01,69.2 +1979-03-01,69.9 +1979-04-01,70.6 +1979-05-01,71.4 +1979-06-01,72.2 +1979-07-01,73.0 +1979-08-01,73.7 +1979-09-01,74.4 +1979-10-01,75.2 +1979-11-01,76.0 +1979-12-01,76.9 +1980-01-01,78.0 +1980-02-01,79.0 +1980-03-01,80.1 +1980-04-01,80.9 +1980-05-01,81.7 +1980-06-01,82.5 +1980-07-01,82.6 +1980-08-01,83.2 +1980-09-01,83.9 +1980-10-01,84.7 +1980-11-01,85.6 +1980-12-01,86.4 +1981-01-01,87.2 +1981-02-01,88.0 +1981-03-01,88.6 +1981-04-01,89.1 +1981-05-01,89.7 +1981-06-01,90.5 +1981-07-01,91.5 +1981-08-01,92.2 +1981-09-01,93.1 +1981-10-01,93.4 +1981-11-01,93.8 +1981-12-01,94.1 +1982-01-01,94.4 +1982-02-01,94.7 +1982-03-01,94.7 +1982-04-01,95.0 +1982-05-01,95.9 +1982-06-01,97.0 +1982-07-01,97.5 +1982-08-01,97.7 +1982-09-01,97.7 +1982-10-01,98.1 +1982-11-01,98.0 +1982-12-01,97.7 +1983-01-01,97.9 +1983-02-01,98.0 +1983-03-01,98.1 +1983-04-01,98.8 +1983-05-01,99.2 +1983-06-01,99.4 +1983-07-01,99.8 +1983-08-01,100.1 +1983-09-01,100.4 +1983-10-01,100.8 +1983-11-01,101.1 +1983-12-01,101.4 +1984-01-01,102.1 +1984-02-01,102.6 +1984-03-01,102.9 +1984-04-01,103.3 +1984-05-01,103.5 +1984-06-01,103.7 +1984-07-01,104.1 +1984-08-01,104.4 +1984-09-01,104.7 +1984-10-01,105.1 +1984-11-01,105.3 +1984-12-01,105.5 +1985-01-01,105.7 +1985-02-01,106.3 +1985-03-01,106.8 +1985-04-01,107.0 +1985-05-01,107.2 +1985-06-01,107.5 +1985-07-01,107.7 +1985-08-01,107.9 +1985-09-01,108.1 +1985-10-01,108.5 +1985-11-01,109.0 +1985-12-01,109.5 +1986-01-01,109.9 +1986-02-01,109.7 +1986-03-01,109.1 +1986-04-01,108.7 +1986-05-01,109.0 +1986-06-01,109.4 +1986-07-01,109.5 +1986-08-01,109.6 +1986-09-01,110.0 +1986-10-01,110.2 +1986-11-01,110.4 +1986-12-01,110.8 +1987-01-01,111.4 +1987-02-01,111.8 +1987-03-01,112.2 +1987-04-01,112.7 +1987-05-01,113.0 +1987-06-01,113.5 +1987-07-01,113.8 +1987-08-01,114.3 +1987-09-01,114.7 +1987-10-01,115.0 +1987-11-01,115.4 +1987-12-01,115.6 +1988-01-01,116.0 +1988-02-01,116.2 +1988-03-01,116.5 +1988-04-01,117.2 +1988-05-01,117.5 +1988-06-01,118.0 +1988-07-01,118.5 +1988-08-01,119.0 +1988-09-01,119.5 +1988-10-01,119.9 +1988-11-01,120.3 +1988-12-01,120.7 +1989-01-01,121.2 +1989-02-01,121.6 +1989-03-01,122.2 +1989-04-01,123.1 +1989-05-01,123.7 +1989-06-01,124.1 +1989-07-01,124.5 +1989-08-01,124.5 +1989-09-01,124.8 +1989-10-01,125.4 +1989-11-01,125.9 +1989-12-01,126.3 +1990-01-01,127.5 +1990-02-01,128.0 +1990-03-01,128.6 +1990-04-01,128.9 +1990-05-01,129.1 +1990-06-01,129.9 +1990-07-01,130.5 +1990-08-01,131.6 +1990-09-01,132.5 +1990-10-01,133.4 +1990-11-01,133.7 +1990-12-01,134.2 +1991-01-01,134.7 +1991-02-01,134.8 +1991-03-01,134.8 +1991-04-01,135.1 +1991-05-01,135.6 +1991-06-01,136.0 +1991-07-01,136.2 +1991-08-01,136.6 +1991-09-01,137.0 +1991-10-01,137.2 +1991-11-01,137.8 +1991-12-01,138.2 +1992-01-01,138.3 +1992-02-01,138.6 +1992-03-01,139.1 +1992-04-01,139.4 +1992-05-01,139.7 +1992-06-01,140.1 +1992-07-01,140.5 +1992-08-01,140.8 +1992-09-01,141.1 +1992-10-01,141.7 +1992-11-01,142.1 +1992-12-01,142.3 +1993-01-01,142.8 +1993-02-01,143.1 +1993-03-01,143.3 +1993-04-01,143.8 +1993-05-01,144.2 +1993-06-01,144.3 +1993-07-01,144.5 +1993-08-01,144.8 +1993-09-01,145.0 +1993-10-01,145.6 +1993-11-01,146.0 +1993-12-01,146.3 +1994-01-01,146.3 +1994-02-01,146.7 +1994-03-01,147.1 +1994-04-01,147.2 +1994-05-01,147.5 +1994-06-01,147.9 +1994-07-01,148.4 +1994-08-01,149.0 +1994-09-01,149.3 +1994-10-01,149.4 +1994-11-01,149.8 +1994-12-01,150.1 +1995-01-01,150.5 +1995-02-01,150.9 +1995-03-01,151.2 +1995-04-01,151.8 +1995-05-01,152.1 +1995-06-01,152.4 +1995-07-01,152.6 +1995-08-01,152.9 +1995-09-01,153.1 +1995-10-01,153.5 +1995-11-01,153.7 +1995-12-01,153.9 +1996-01-01,154.7 +1996-02-01,155.0 +1996-03-01,155.5 +1996-04-01,156.1 +1996-05-01,156.4 +1996-06-01,156.7 +1996-07-01,157.0 +1996-08-01,157.2 +1996-09-01,157.7 +1996-10-01,158.2 +1996-11-01,158.7 +1996-12-01,159.1 +1997-01-01,159.4 +1997-02-01,159.7 +1997-03-01,159.8 +1997-04-01,159.9 +1997-05-01,159.9 +1997-06-01,160.2 +1997-07-01,160.4 +1997-08-01,160.8 +1997-09-01,161.2 +1997-10-01,161.5 +1997-11-01,161.7 +1997-12-01,161.8 +1998-01-01,162.0 +1998-02-01,162.0 +1998-03-01,162.0 +1998-04-01,162.2 +1998-05-01,162.6 +1998-06-01,162.8 +1998-07-01,163.2 +1998-08-01,163.4 +1998-09-01,163.5 +1998-10-01,163.9 +1998-11-01,164.1 +1998-12-01,164.4 +1999-01-01,164.7 +1999-02-01,164.7 +1999-03-01,164.8 +1999-04-01,165.9 +1999-05-01,166.0 +1999-06-01,166.0 +1999-07-01,166.7 +1999-08-01,167.1 +1999-09-01,167.8 +1999-10-01,168.1 +1999-11-01,168.4 +1999-12-01,168.8 +2000-01-01,169.3 +2000-02-01,170.0 +2000-03-01,171.0 +2000-04-01,170.9 +2000-05-01,171.2 +2000-06-01,172.2 +2000-07-01,172.7 +2000-08-01,172.7 +2000-09-01,173.6 +2000-10-01,173.9 +2000-11-01,174.2 +2000-12-01,174.6 +2001-01-01,175.6 +2001-02-01,176.0 +2001-03-01,176.1 +2001-04-01,176.4 +2001-05-01,177.3 +2001-06-01,177.7 +2001-07-01,177.4 +2001-08-01,177.4 +2001-09-01,178.1 +2001-10-01,177.6 +2001-11-01,177.5 +2001-12-01,177.4 +2002-01-01,177.7 +2002-02-01,178.0 +2002-03-01,178.5 +2002-04-01,179.3 +2002-05-01,179.5 +2002-06-01,179.6 +2002-07-01,180.0 +2002-08-01,180.5 +2002-09-01,180.8 +2002-10-01,181.2 +2002-11-01,181.5 +2002-12-01,181.8 +2003-01-01,182.600 +2003-02-01,183.600 +2003-03-01,183.900 +2003-04-01,183.200 +2003-05-01,182.900 +2003-06-01,183.100 +2003-07-01,183.700 +2003-08-01,184.5 +2003-09-01,185.100 +2003-10-01,184.9 +2003-11-01,185.000 +2003-12-01,185.500 +2004-01-01,186.300 +2004-02-01,186.700 +2004-03-01,187.100 +2004-04-01,187.400 +2004-05-01,188.200 +2004-06-01,188.900 +2004-07-01,189.100 +2004-08-01,189.200 +2004-09-01,189.800 +2004-10-01,190.8 +2004-11-01,191.700 +2004-12-01,191.700 +2005-01-01,191.600 +2005-02-01,192.400 +2005-03-01,193.100 +2005-04-01,193.700 +2005-05-01,193.600 +2005-06-01,193.700 +2005-07-01,194.900 +2005-08-01,196.100 +2005-09-01,198.800 +2005-10-01,199.100 +2005-11-01,198.100 +2005-12-01,198.100 +2006-01-01,199.300 +2006-02-01,199.400 +2006-03-01,199.700 +2006-04-01,200.700 +2006-05-01,201.300 +2006-06-01,201.800 +2006-07-01,202.900 +2006-08-01,203.800 +2006-09-01,202.800 +2006-10-01,201.900 +2006-11-01,202.000 +2006-12-01,203.100 +2007-01-01,203.437 +2007-02-01,204.226 +2007-03-01,205.288 +2007-04-01,205.904 +2007-05-01,206.755 +2007-06-01,207.234 +2007-07-01,207.603 +2007-08-01,207.667 +2007-09-01,208.547 +2007-10-01,209.190 +2007-11-01,210.834 +2007-12-01,211.445 +2008-01-01,212.174 +2008-02-01,212.687 +2008-03-01,213.448 +2008-04-01,213.942 +2008-05-01,215.208 +2008-06-01,217.463 +2008-07-01,219.016 +2008-08-01,218.690 +2008-09-01,218.877 +2008-10-01,216.995 +2008-11-01,213.153 +2008-12-01,211.398 +2009-01-01,211.933 +2009-02-01,212.705 +2009-03-01,212.495 +2009-04-01,212.709 +2009-05-01,213.022 +2009-06-01,214.790 +2009-07-01,214.726 +2009-08-01,215.445 +2009-09-01,215.861 +2009-10-01,216.509 +2009-11-01,217.234 +2009-12-01,217.347 +2010-01-01,217.488 +2010-02-01,217.281 +2010-03-01,217.353 +2010-04-01,217.403 +2010-05-01,217.290 +2010-06-01,217.199 +2010-07-01,217.605 +2010-08-01,217.923 +2010-09-01,218.275 +2010-10-01,219.035 +2010-11-01,219.590 +2010-12-01,220.472 +2011-01-01,221.187 +2011-02-01,221.898 +2011-03-01,223.046 +2011-04-01,224.093 +2011-05-01,224.806 +2011-06-01,224.806 +2011-07-01,225.395 +2011-08-01,226.106 +2011-09-01,226.597 +2011-10-01,226.750 +2011-11-01,227.169 +2011-12-01,227.223 +2012-01-01,227.842 +2012-02-01,228.329 +2012-03-01,228.807 +2012-04-01,229.187 +2012-05-01,228.713 +2012-06-01,228.524 +2012-07-01,228.590 +2012-08-01,229.918 +2012-09-01,231.015 +2012-10-01,231.638 +2012-11-01,231.249 +2012-12-01,231.221 +2013-01-01,231.679 +2013-02-01,232.937 +2013-03-01,232.282 +2013-04-01,231.797 +2013-05-01,231.893 +2013-06-01,232.445 +2013-07-01,232.900 +2013-08-01,233.456 +2013-09-01,233.544 +2013-10-01,233.669 +2013-11-01,234.100 +2013-12-01,234.719 +2014-01-01,235.288 +2014-02-01,235.547 +2014-03-01,236.028 +2014-04-01,236.468 +2014-05-01,236.918 +2014-06-01,237.231 +2014-07-01,237.498 +2014-08-01,237.460 +2014-09-01,237.477 +2014-10-01,237.430 +2014-11-01,236.983 +2014-12-01,236.252 +2015-01-01,234.747 +2015-02-01,235.342 +2015-03-01,235.976 +2015-04-01,236.222 +2015-05-01,237.001 +2015-06-01,237.657 +2015-07-01,238.034 +2015-08-01,238.033 +2015-09-01,237.498 +2015-10-01,237.733 +2015-11-01,238.017 +2015-12-01,237.761 +2016-01-01,237.652 +2016-02-01,237.336 +2016-03-01,238.080 +2016-04-01,238.992 +2016-05-01,239.557 +2016-06-01,240.222 +2016-07-01,240.101 +2016-08-01,240.545 +2016-09-01,241.176 +2016-10-01,241.741 +2016-11-01,242.026 +2016-12-01,242.637 +2017-01-01,243.618 +2017-02-01,244.006 +2017-03-01,243.892 +2017-04-01,244.193 +2017-05-01,244.004 +2017-06-01,244.163 +2017-07-01,244.243 +2017-08-01,245.183 +2017-09-01,246.435 +2017-10-01,246.626 +2017-11-01,247.284 +2017-12-01,247.805 +2018-01-01,248.859 +2018-02-01,249.529 +2018-03-01,249.577 +2018-04-01,250.227 +2018-05-01,250.792 +2018-06-01,251.018 +2018-07-01,251.214 +2018-08-01,251.663 +2018-09-01,252.182 +2018-10-01,252.772 +2018-11-01,252.594 +2018-12-01,252.767 +2019-01-01,252.718 +2019-02-01,253.322 +2019-03-01,254.202 +2019-04-01,255.211 +2019-05-01,255.290 +2019-06-01,255.159 +2019-07-01,255.685 +2019-08-01,256.059 +2019-09-01,256.511 +2019-10-01,257.244 +2019-11-01,257.803 +2019-12-01,258.616 +2020-01-01,259.037 +2020-02-01,259.248 +2020-03-01,258.124 +2020-04-01,256.092 +2020-05-01,255.868 +2020-06-01,256.986 +2020-07-01,258.278 +2020-08-01,259.411 +2020-09-01,260.029 +2020-10-01,260.286 +2020-11-01,260.813 +2020-12-01,262.035 +2021-01-01,262.650 +2021-02-01,263.638 +2021-03-01,264.914 +2021-04-01,266.670 +2021-05-01,268.444 +2021-06-01,270.559 +2021-07-01,271.764 +2021-08-01,272.870 +2021-09-01,274.028 +2021-10-01,276.522 +2021-11-01,278.711 +2021-12-01,280.887 +2022-01-01,282.599 +2022-02-01,284.610 +2022-03-01,287.472 +2022-04-01,288.611 +2022-05-01,291.268 +2022-06-01,294.728 +2022-07-01,294.628 +2022-08-01,295.320 +2022-09-01,296.539 +2022-10-01,297.987 +2022-11-01,298.598 +2022-12-01,298.990 +2023-01-01,300.536 +2023-02-01,301.648 +2023-03-01,301.808 +2023-04-01,302.918 +2023-05-01,303.294 +2023-06-01,303.841 diff --git a/tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arimaModel.png b/tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arimaModel.png new file mode 100644 index 0000000000000000000000000000000000000000..02794222157615a1a458f6d867e28d9bdd00f27e GIT binary patch literal 29802 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 literal 0 HcmV?d00001 diff --git a/tests/safeds/ml/classical/classification/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py similarity index 58% rename from tests/safeds/ml/classical/classification/test_arimaModel.py rename to tests/safeds/ml/classical/regression/test_arimaModel.py index 732639019..7d85261db 100644 --- a/tests/safeds/ml/classical/classification/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -1,6 +1,6 @@ import pytest -from safeds.ml.classical.regression import arimaModel -from safeds.data.tabular.containers import TimeSeries, Table +from safeds.ml.classical.regression import ArimaModel +from safeds.data.tabular.containers import TimeSeries, Table, Column from syrupy import SnapshotAssertion import pandas as pd import numpy as np @@ -18,16 +18,14 @@ def test_arimaModel(snapshot_png: SnapshotAssertion) -> None: feature_data = np.random.randint(0, 100, length_of_series) # Create a DataFrame - time_series_df = pd.DataFrame({ - 'Date': range(length_of_series), - 'Value': synthetic_data, - 'Feature': feature_data # Add the feature column with random integers - }) - table = Table._from_pandas_dataframe(time_series_df) - time_series = TimeSeries._from_table_to_time_series(table, target_name="Value", time_name="Date", feature_names=["Feature"]) - model = arimaModel() + table = Table.from_csv_file("C:/Users/ettel/PycharmProjects/Library/tests/resources/_datas/US_Inflation_rates.csv") + col = Column("feature", range(0,918)) + table = table.add_column(col) + time_series = TimeSeries._from_table_to_time_series(table, target_name="value", time_name="date", feature_names=["feature"]) + tuple_ts = time_series.split_rows() + model = ArimaModel() #right now the model just saves the best parameter for the predict method in the fit method - trained_model = model.fit(time_series) - snap = model.predict(time_series) + trained_model =model.fit(time_series) + snap = trained_model.predict(time_series) assert snapshot_png == snap From ee8655e3d93b097a149bce9effa484cd07de2c09 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 18 Mar 2024 20:57:50 +0100 Subject: [PATCH 03/60] added split_rows to time series added correction of dtypes for empty columns in time series They are now always type object! This was caused by the get_column method, so maybe we have an more occuring error with pandas dtypes with empty columns. --- .../data/tabular/containers/_time_series.py | 80 ++++++++++--------- tests/helpers/_assertions.py | 4 +- .../containers/_table/test_split_rows.py | 1 - .../_time_series/test_split_rows.py | 64 +++++++++++++++ .../classical/regression/test_arimaModel.py | 15 +--- 5 files changed, 109 insertions(+), 55 deletions(-) create mode 100644 tests/safeds/data/tabular/containers/_time_series/test_split_rows.py diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 2db2f096a..9ced13355 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -11,6 +11,8 @@ from safeds.data.image.containers import Image from safeds.data.tabular.containers import Column, Row, Table, TaggedTable +from safeds.data.tabular.typing import ColumnType +from safeds.data.tabular.typing import Schema from safeds.exceptions import ( ColumnIsTargetError, ColumnIsTimeError, @@ -30,6 +32,7 @@ class TimeSeries(Table): # ------------------------------------------------------------------------------------------------------------------ # Creation # ------------------------------------------------------------------------------------------------------------------ + @staticmethod def _from_tagged_table( tagged_table: TaggedTable, @@ -129,12 +132,17 @@ def _from_table( if target_name not in table.column_names: raise UnknownColumnNameError([target_name]) - result = object.__new__(TimeSeries) result._data = table._data + result._schema = table._schema result._time = table.get_column(time_name) result._target = table.get_column(target_name) + #empty Columns have dtype Object + if len(result._time._data) == 0: + result._time._data = pd.Series(name=time_name) + if len(result.target._data) == 0: + result.target._data = pd.Series(name=target_name) if feature_names is None or len(feature_names) == 0: result._feature_names = [] result._features = Table() @@ -204,6 +212,11 @@ def __init__( raise UnknownColumnNameError([time_name]) self._time: Column = _data.get_column(time_name) self._target: Column = _data.get_column(target_name) + #empty Columns have dtype Object + if len(self._time._data) == 0: + self._time._data = pd.Series(name=time_name) + if len(self.target._data) == 0: + self.target._data = pd.Series(name=target_name) def __eq__(self, other: object) -> bool: """ @@ -217,6 +230,7 @@ def __eq__(self, other: object) -> bool: return NotImplemented if self is other: return True + return ( self.time == other.time and self.target == other.target @@ -1115,56 +1129,44 @@ def plot_scatterplot( self._data = self._data.reset_index() return Image.from_bytes(buffer.read()) - def slice_rows( - self, - start: int | None = None, - end: int | None = None, - step: int = 1, - ) -> Table: + def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries]: """ - Slice a part of the time series into a new time series. + Split the table into two new tables. The original table is not modified. Parameters ---------- - start : int | None - The first index of the range to be copied into a new table, None by default. - end : int | None - The last index of the range to be copied into a new table, None by default. - step : int - The step size used to iterate through the table, 1 by default. + percentage_in_first : float + The desired size of the first table in percentage to the given table; must be between 0 and 1. Returns ------- - result : TimeSeries - The resulting time series. + result : (Table, Table) + A tuple containing the two resulting tables. The first table has the specified size, the second table + contains the rest of the data. Raises ------ - IndexOutOfBoundsError - If the index is out of bounds. + ValueError: + if the 'percentage_in_first' is not between 0 and 1. Examples -------- - >>> from safeds.data.tabular.containers import TimeSeries - >>> table = TimeSeries({"time":[1, 2, 3], "target": [3, 4, 6], "feature":[2, 2, 7]}, target_name= "target", time_name="time", feature_names=["feature"], ) - >>> table.slice_rows(0, 2) - time feature target - 0 1 2 3 - 1 2 4 2 - """ - if start is None: - start = 0 - - if end is None: - end = self.number_of_rows - - if end < start: - raise IndexOutOfBoundsError(slice(start, end)) - if start < 0 or end < 0 or start > self.number_of_rows or end > self.number_of_rows: - raise IndexOutOfBoundsError(start if start < 0 or start > self.number_of_rows else end) - - new_df = self._data.iloc[start:end:step] - new_df.columns = self._schema.column_names - return TimeSeries(Table._from_pandas_dataframe(new_df) + >>> from safeds.data.tabular.containers import Table + >>> table = TimeSeries({"time":[0, 1, 2, 3, 4]"temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}) + >>> slices = table.split_rows(0.4) + >>> slices[0] + time temperature sales + 0 0 10 54 + 1 1 15 74 + >>> slices[1] + time temperature sales + 0 2 20 90 + 1 3 25 206 + 2 4 30 210 + """ + temp = self._as_table() + t1, t2 = temp.split_rows(percentage_in_first = percentage_in_first) + return(TimeSeries._from_table(t1, time_name=self.time.name, target_name=self._target.name, feature_names= self._feature_names), + TimeSeries._from_table(t2, time_name=self.time.name, target_name=self._target.name, feature_names= self._feature_names)) diff --git a/tests/helpers/_assertions.py b/tests/helpers/_assertions.py index e71d1cdaf..a199fae74 100644 --- a/tests/helpers/_assertions.py +++ b/tests/helpers/_assertions.py @@ -54,7 +54,7 @@ def assert_that_time_series_are_equal(table1: TimeSeries, table2: TimeSeries) -> """ assert table1.schema == table2.schema assert table1._feature_names == table2._feature_names - assert table1.features == table2._features - assert table1.target == table2._target + assert table1.features == table2.features + assert table1.target == table2.target assert table1.time == table2.time assert table1 == table2 diff --git a/tests/safeds/data/tabular/containers/_table/test_split_rows.py b/tests/safeds/data/tabular/containers/_table/test_split_rows.py index e366a65ba..daa5708a6 100644 --- a/tests/safeds/data/tabular/containers/_table/test_split_rows.py +++ b/tests/safeds/data/tabular/containers/_table/test_split_rows.py @@ -50,7 +50,6 @@ def test_should_split_table( ) def test_should_raise_if_value_not_in_range(percentage_in_first: float) -> None: table = Table({"col1": [1, 2, 1], "col2": [1, 2, 4]}) - with pytest.raises(ValueError, match=r"The given percentage is not between 0 and 1"): table.split_rows(percentage_in_first) diff --git a/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py b/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py new file mode 100644 index 000000000..3cd753061 --- /dev/null +++ b/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py @@ -0,0 +1,64 @@ +import pandas as pd +import pytest +from tests.helpers import assert_that_time_series_are_equal +from safeds.data.tabular.containers import TimeSeries, Table +from safeds.data.tabular.typing import Integer, Nothing, Schema + +@pytest.mark.parametrize( + ("table", "result_train_table", "result_test_table", "percentage_in_first"), + [ + ( + TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), + TimeSeries({"col1": [1, 2], "col2": [1, 2]}, time_name="col1", target_name="col2"), + TimeSeries({"col1": [1], "col2": [4]}, time_name="col1", target_name="col2"), + 2 / 3, + ), + ( + TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), + TimeSeries._from_table(Table._from_pandas_dataframe(pd.DataFrame(), Schema({"col1": Nothing(), "col2": Nothing()})), + time_name="col1", target_name="col2"), + TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), + 0, + ), + ( + TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), + TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), + TimeSeries._from_table(Table._from_pandas_dataframe(pd.DataFrame(), Schema({"col1": Integer(), "col2": Integer()})), + time_name="col1", target_name="col2"), + 1, + ), + ], + ids=["2/3%", "0%", "100%"], +) +def test_should_split_table( + table: TimeSeries, + result_train_table: TimeSeries, + result_test_table: TimeSeries, + percentage_in_first: int, +) -> None: + train_table, test_table = table.split_rows(percentage_in_first) + print(result_test_table.time._data) + assert result_test_table == test_table + assert result_train_table.schema == train_table.schema + assert result_train_table == train_table + + +@pytest.mark.parametrize( + "percentage_in_first", + [ + -1.0, + 2.0, + ], + ids=["-100%", "200%"], +) +def test_should_raise_if_value_not_in_range(percentage_in_first: float) -> None: + table = Table({"col1": [1, 2, 1], "col2": [1, 2, 4]}) + + with pytest.raises(ValueError, match=r"The given percentage is not between 0 and 1"): + table.split_rows(percentage_in_first) + + +def test_should_split_empty_table() -> None: + t1, t2 = Table().split_rows(0.4) + assert t1.number_of_rows == 0 + assert t2.number_of_rows == 0 diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index 7d85261db..287370722 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -7,23 +7,12 @@ def test_arimaModel(snapshot_png: SnapshotAssertion) -> None: - # Define the length of the time series - length_of_series = 100 - - # Generate synthetic data using a random normal distribution - synthetic_data = np.random.randn(length_of_series) - - # Generate a 'Feature' column with random integers - # For example, create random integers between 0 and 100 - feature_data = np.random.randint(0, 100, length_of_series) - # Create a DataFrame table = Table.from_csv_file("C:/Users/ettel/PycharmProjects/Library/tests/resources/_datas/US_Inflation_rates.csv") - col = Column("feature", range(0,918)) - table = table.add_column(col) - time_series = TimeSeries._from_table_to_time_series(table, target_name="value", time_name="date", feature_names=["feature"]) + time_series = TimeSeries._from_table(table, target_name="value", time_name="date", feature_names=["feature"]) tuple_ts = time_series.split_rows() model = ArimaModel() + #right now the model just saves the best parameter for the predict method in the fit method trained_model =model.fit(time_series) snap = trained_model.predict(time_series) From 4c21e3c831acaaed4e7049e262a855942e7e4f62 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 19 Mar 2024 14:28:04 +0100 Subject: [PATCH 04/60] updated test --- .../safeds/ml/classical/regression/test_arimaModel.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index 287370722..b818edf9b 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -8,13 +8,12 @@ def test_arimaModel(snapshot_png: SnapshotAssertion) -> None: # Create a DataFrame + np.random.seed(42) table = Table.from_csv_file("C:/Users/ettel/PycharmProjects/Library/tests/resources/_datas/US_Inflation_rates.csv") - time_series = TimeSeries._from_table(table, target_name="value", time_name="date", feature_names=["feature"]) - tuple_ts = time_series.split_rows() + time_series = TimeSeries._from_table(table, target_name="value", time_name="date") + train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() - #right now the model just saves the best parameter for the predict method in the fit method - trained_model =model.fit(time_series) - snap = trained_model.predict(time_series) - assert snapshot_png == snap + trained_model = model.fit(train_ts) + assert snapshot_png == trained_model.predict(test_ts) From 4fde946a1fcb12c06cfbb9033f8a06bf230a5e56 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 19 Mar 2024 17:32:23 +0100 Subject: [PATCH 05/60] added arima functionalitie and docstrings --- .../data/tabular/containers/_time_series.py | 73 ++++++++++++-- src/safeds/ml/classical/regression/_arima.py | 97 ++++++++++++++++--- .../classical/regression/test_arimaModel.py | 14 +-- 3 files changed, 153 insertions(+), 31 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 9ced13355..51bdc3eb0 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING import matplotlib.pyplot as plt +from pathlib import Path import pandas as pd import seaborn as sns import xxhash @@ -19,6 +20,7 @@ IllegalSchemaModificationError, NonNumericColumnError, UnknownColumnNameError, + WrongFileExtensionError, IndexOutOfBoundsError, ) @@ -33,6 +35,57 @@ class TimeSeries(Table): # Creation # ------------------------------------------------------------------------------------------------------------------ + @staticmethod + def timeseries_from_csv_file(path: str | Path, + target_name: str, + time_name: str, + feature_names: list[str] | None = None, + ) -> TimeSeries: + """ + Read data from a CSV file into a table. + + Parameters + ---------- + path : + The path to the CSV file. + + target_name: + The name of the target column + + time_name : + The name of the time column + + feature_names: + The name(s) of the column(s) + + + Returns + ------- + table : + The time series created from the CSV file. + + Raises + ------ + FileNotFoundError + If the specified file does not exist. + WrongFileExtensionError + If the file is not a csv file. + + Examples + -------- + >>> from safeds.data.tabular.containers import Table + >>> TimeSeries.timeseries_from_csv_file('./src/resources/from_csv_file.csv') + a b c + 0 1 2 1 + 1 0 0 7 + """ + return TimeSeries._from_table( + Table.from_csv_file(path=path), + target_name=target_name, + time_name=time_name, + feature_names=feature_names + ) + @staticmethod def _from_tagged_table( tagged_table: TaggedTable, @@ -138,7 +191,7 @@ def _from_table( result._schema = table._schema result._time = table.get_column(time_name) result._target = table.get_column(target_name) - #empty Columns have dtype Object + # empty Columns have dtype Object if len(result._time._data) == 0: result._time._data = pd.Series(name=time_name) if len(result.target._data) == 0: @@ -212,7 +265,7 @@ def __init__( raise UnknownColumnNameError([time_name]) self._time: Column = _data.get_column(time_name) self._target: Column = _data.get_column(target_name) - #empty Columns have dtype Object + # empty Columns have dtype Object if len(self._time._data) == 0: self._time._data = pd.Series(name=time_name) if len(self.target._data) == 0: @@ -413,7 +466,7 @@ def add_columns_as_features(self, columns: list[Column] | Table) -> TimeSeries: time_name=self.time.name, target_name=self._target.name, feature_names=self._feature_names - + [col.name for col in (columns.to_columns() if isinstance(columns, Table) else columns)], + + [col.name for col in (columns.to_columns() if isinstance(columns, Table) else columns)], ) def add_columns(self, columns: list[Column] | Table) -> TimeSeries: @@ -834,8 +887,8 @@ def replace_column(self, old_column_name: str, new_columns: list[Column]) -> Tim self._feature_names if old_column_name not in self._feature_names else self._feature_names[: self._feature_names.index(old_column_name)] - + [col.name for col in new_columns] - + self._feature_names[self._feature_names.index(old_column_name) + 1 :] + + [col.name for col in new_columns] + + self._feature_names[self._feature_names.index(old_column_name) + 1:] ), ) @@ -879,7 +932,7 @@ def slice_rows( def sort_columns( self, comparator: Callable[[Column, Column], int] = lambda col1, col2: (col1.name > col2.name) - - (col1.name < col2.name), + - (col1.name < col2.name), ) -> TimeSeries: """ Sort the columns of a `TimeSeries` with the given comparator and return a new `TimeSeries`. @@ -1167,6 +1220,8 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries 2 4 30 210 """ temp = self._as_table() - t1, t2 = temp.split_rows(percentage_in_first = percentage_in_first) - return(TimeSeries._from_table(t1, time_name=self.time.name, target_name=self._target.name, feature_names= self._feature_names), - TimeSeries._from_table(t2, time_name=self.time.name, target_name=self._target.name, feature_names= self._feature_names)) + t1, t2 = temp.split_rows(percentage_in_first=percentage_in_first) + return (TimeSeries._from_table(t1, time_name=self.time.name, target_name=self._target.name, + feature_names=self._feature_names), + TimeSeries._from_table(t2, time_name=self.time.name, target_name=self._target.name, + feature_names=self._feature_names)) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 63682c6d5..72bfbc2bb 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -5,12 +5,16 @@ import itertools import matplotlib.pyplot as plt -from safeds.data.tabular.containers import TimeSeries +from safeds.data.tabular.containers import TimeSeries, Column from safeds.data.image.containers import Image if TYPE_CHECKING: from sklearn.base import RegressorMixin from safeds.data.tabular.containers import TimeSeries +from safeds.exceptions import ( + ModelNotFittedError, + PredictionError +) class ArimaModel: @@ -20,6 +24,7 @@ def __init__(self) -> None: # Internal state self._arima = None self._order = None + self._fitted = False def fit(self, time_series: TimeSeries): """ @@ -57,26 +62,77 @@ def fit(self, time_series: TimeSeries): best_model = None best_param = None for param in pdq: - try: - # Create and fit an ARIMA model with the current parameters - mod = ARIMA(time_series.target._data.values, order=param) - result = mod.fit() - - # Compare the current model's AIC with the best AIC so far - if result.aic < best_aic: - best_aic = result.aic - best_param = param - best_model = result - except Exception as e: - # Skip the iteration if the model cannot be fitted with current parameters - print('ARIMA{} - AIC: skipped due to an error: {}'.format(param, e)) - continue + # Create and fit an ARIMA model with the current parameters + mod = ARIMA(time_series.target._data.values, order=param) + result = mod.fit() + + # Compare the current model's AIC with the best AIC so far + if result.aic < best_aic: + best_aic = result.aic + best_param = param + best_model = result fitted_arima._order = best_param fitted_arima._arima = best_model + fitted_arima._fitted = True return fitted_arima def predict(self, time_series: TimeSeries): + """ + Predict a target vector using a time series target column. The model has to be trained first. + + Parameters + ---------- + time_series : TimeSeries + The time series containing the target vector. + + Returns + ------- + table : TimeSeries + A timeseries containing the old time series vectors and the predicted target vector. + + Raises + ------ + ModelNotFittedError + If the model has not been fitted yet. + PredictionError + If predicting with the given dataset failed. + """ + if not self.is_fitted(): + raise ModelNotFittedError + + test_data = time_series.target._data.to_numpy() + n_steps = len(test_data) + try: + forecast_results = self._arima.forecast(steps=n_steps) + except any: + raise PredictionError + + # create new TimeSeries + result = time_series.add_column(Column(name="forecasted", data = forecast_results)) + return result + + def plot_predictions(self, time_series: TimeSeries)-> Image: + """ + Plot the predictions of the given time series target + Parameters + ---------- + time_series : TimeSeries + The time series containing the target vector. + + Returns + ------- + image : Image + Plots predictions of the given time series to the given target Column + + Raises + ------ + ModelNotFittedError + If the model has not been fitted yet. + PredictionError + If predicting with the given dataset failed. + + """ test_data = time_series.target._data.values n_steps = len(test_data) forecast_results = self._arima.forecast(steps=n_steps) @@ -92,3 +148,14 @@ def predict(self, time_series: TimeSeries): plt.close() # Prevents the figure from being displayed directly buffer.seek(0) return Image.from_bytes(buffer.read()) + + def is_fitted(self) -> bool: + """ + Check if the classifier is fitted. + + Returns + ------- + is_fitted : bool + Whether the regressor is fitted. + """ + return self._fitted diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index b818edf9b..b9a4be8ce 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -1,19 +1,19 @@ import pytest from safeds.ml.classical.regression import ArimaModel -from safeds.data.tabular.containers import TimeSeries, Table, Column +from safeds.data.tabular.containers import TimeSeries, Table from syrupy import SnapshotAssertion -import pandas as pd import numpy as np -def test_arimaModel(snapshot_png: SnapshotAssertion) -> None: +def test_arima_model(snapshot_png: SnapshotAssertion) -> None: # Create a DataFrame np.random.seed(42) - table = Table.from_csv_file("C:/Users/ettel/PycharmProjects/Library/tests/resources/_datas/US_Inflation_rates.csv") - time_series = TimeSeries._from_table(table, target_name="value", time_name="date") + time_series = TimeSeries.timeseries_from_csv_file("C:/Users/ettel/PycharmProjects/Library/tests/resources/_datas/US_Inflation_rates.csv", target_name= "value", time_name="date") train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() - trained_model = model.fit(train_ts) - assert snapshot_png == trained_model.predict(test_ts) + predictions = trained_model.predict(test_ts) + print(predictions) + assert snapshot_png == trained_model.plot_predictions(test_ts) + assert False From c8fa2c6270b05a72ca11956e5aee177927046c2d Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 13:12:11 +0100 Subject: [PATCH 06/60] updated poetry --- poetry.lock | 73 ++++++++++++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 1 + 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 09160fda7..1e87f14da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "anyio" @@ -2538,6 +2538,24 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "patsy" +version = "0.5.6" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = "*" +files = [ + {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, + {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + [[package]] name = "pexpect" version = "4.9.0" @@ -2943,6 +2961,7 @@ files = [ {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"}, @@ -3732,6 +3751,56 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "statsmodels" +version = "0.14.1" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "statsmodels-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43af9c0b07c9d72f275cf14ea54a481a3f20911f0b443181be4769def258fdeb"}, + {file = "statsmodels-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16975ab6ad505d837ba9aee11f92a8c5b49c4fa1ff45b60fe23780b19e5705e"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e278fe74da5ed5e06c11a30851eda1af08ef5af6be8507c2c45d2e08f7550dde"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0564d92cb05b219b4538ed09e77d96658a924a691255e1f7dd23ee338df441b"}, + {file = "statsmodels-0.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5385e22e72159a09c099c4fb975f350a9f3afeb57c1efce273b89dcf1fe44c0f"}, + {file = "statsmodels-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:0a8aae75a2e08ebd990e5fa394f8e32738b55785cb70798449a3f4207085e667"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b69a63ad6c979a6e4cde11870ffa727c76a318c225a7e509f031fbbdfb4e416a"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7562cb18a90a114f39fab6f1c25b9c7b39d9cd5f433d0044b430ca9d44a8b52c"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3abaca4b963259a2bf349c7609cfbb0ce64ad5fb3d92d6f08e21453e4890248"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0f727fe697f6406d5f677b67211abe5a55101896abdfacdb3f38410405f6ad8"}, + {file = "statsmodels-0.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6838ac6bdb286daabb5e91af90fd4258f09d0cec9aace78cc441cb2b17df428"}, + {file = "statsmodels-0.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:709bfcef2dbe66f705b17e56d1021abad02243ee1a5d1efdb90f9bad8b06a329"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f32a7cd424cf33304a54daee39d32cccf1d0265e652c920adeaeedff6d576457"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f8c30181c084173d662aaf0531867667be2ff1bee103b84feb64f149f792dbd2"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de2b97413913d52ad6342dece2d653e77f78620013b7705fad291d4e4266ccb"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3420f88289c593ba2bca33619023059c476674c160733bd7d858564787c83d3"}, + {file = "statsmodels-0.14.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c008e16096f24f0514e53907890ccac6589a16ad6c81c218f2ee6752fdada555"}, + {file = "statsmodels-0.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:bc0351d279c4e080f0ce638a3d886d312aa29eade96042e3ba0a73771b1abdfb"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf293ada63b2859d95210165ad1dfcd97bd7b994a5266d6fbeb23659d8f0bf68"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44ca8cb88fa3d3a4ffaff1fb8eb0e98bbf83fc936fcd9b9eedee258ecc76696a"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5373d176239993c095b00d06036690a50309a4e00c2da553b65b840f956ae6"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a532dfe899f8b6632cd8caa0b089b403415618f51e840d1817a1e4b97e200c73"}, + {file = "statsmodels-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:4fe0a60695952b82139ae8750952786a700292f9e0551d572d7685070944487b"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04293890f153ffe577e60a227bd43babd5f6c1fc50ea56a3ab1862ae85247a95"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e70a2e93d54d40b2cb6426072acbc04f35501b1ea2569f6786964adde6ca572"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab3a73d16c0569adbba181ebb967e5baaa74935f6d2efe86ac6fc5857449b07d"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eefa5bcff335440ee93e28745eab63559a20cd34eea0375c66d96b016de909b3"}, + {file = "statsmodels-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:bc43765710099ca6a942b5ffa1bac7668965052542ba793dd072d26c83453572"}, + {file = "statsmodels-0.14.1.tar.gz", hash = "sha256:2260efdc1ef89f39c670a0bd8151b1d0843567781bcafec6cda0534eb47a94f6"}, +] + +[package.dependencies] +numpy = ">=1.18,<2" +packaging = ">=21.3" +pandas = ">=1.0,<2.1.0 || >2.1.0" +patsy = ">=0.5.4" +scipy = ">=1.4,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.33)"] +develop = ["colorama", "cython (>=0.29.33)", "cython (>=0.29.33,<4.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.3.0)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "sympy" version = "1.12" @@ -4263,4 +4332,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11,<3.13" -content-hash = "aee323d4eab275af4ac0f640c75782aab622b457f38e4d0e8dc6802e0bd633cc" +content-hash = "7731a1ff90b2148ef05104f0d00d63766aec04396d5192ebdae15b062a778ef2" diff --git a/pyproject.toml b/pyproject.toml index 4525700a0..34f3a5381 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ seaborn = "^0.13.0" torch = {version = "^2.2.0", source = "torch_cuda121"} torchvision = {version = "^0.17.0", source = "torch_cuda121"} xxhash = "^3.4.1" +statsmodels = "^0.14.1" [tool.poetry.group.dev.dependencies] pytest = ">=7.2.1,<9.0.0" From bd355fbcf4e8109b9c985e871fc06fe376689282 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 13:18:16 +0100 Subject: [PATCH 07/60] updated test --- .../test_arimaModel/test_arimaModel.png | Bin 29802 -> 0 bytes .../ml/classical/regression/test_arimaModel.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arimaModel.png diff --git a/tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arimaModel.png b/tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arimaModel.png deleted file mode 100644 index 02794222157615a1a458f6d867e28d9bdd00f27e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29802 zcmaHTRX|l;6y^m4q*3V<6cFj|k_G_5gkMOf4KQe*~a`cL1F z7d)`iV6qQ!|H#g!okhp!XFdE7E9<;J?6f{()^Igz{E+A4Mye49X1k~a_?rs~9!CxV ze=-NkFuX^P9@%lA`%;5HYbk^`;P;Nf7qBq!b1gBlDERde&kxuO@au{R9!wItJpwTk zx;y3V|Nmx|LJV7i;C3+`9WpU7u_;UL!hYy!^z1Tid<-D+DFS)jUp!&|ChGCDjfH`6l*R*TklzSU3?YOEfk$9ULG3tjB!xDCY5? z6=J3V(evleKc}WzI?*e4yb>1=4G9@>{S4MkxWtVBe|?UDgG2Z9spxVmGI5ZYi3x3J zXejJm!Mom-Fd&s2ZOubp=LR8>>v#tBp)LEYhZk2@NT0ucm2q{gWkwAT2}upsc0}ZJ z7}gUN_3ez8vEx13EbmZe{Nu40QAOf zHS@tqHlgtC4-}iGlZ0_&prtr1bYGgeR6d9E>!aZ$E(?N#g9A?Uv7W6jB_Xd;fEIg~ z3DQL6D!r~w-{vdR@H_ssl^o{5L~59iN=&@X1Mls~B4~YVc@AF|gtsDfbafe4PUnF) zOixb>o-g?a1P8BfZg#7x>vqmmSsZ0ln*OG?FKShnT;%4yfJpFc&f#658kU}(9`&EOIwMsOQ-hghiUC+rTa4ar&H|KEKt0(&yUlz4wK& z^WL0nEUf~xG(GPN8cOeTs@WQwO(4ofl)#?;!Ad8LOvpWMC{18>d%OP=GKNNrw~))c z6QP@%8!Rh3o6T~HHGxUH3z&4CN-nn7iC#%<`BMFZ+ zW-Cj}^{e=os$W?R5WyyPbax|}Y@3w6Z>l}$A_a@aSoFCQ>Q7)Y8u-d~kzoWjj7-?` zYaj;U;i!_xK^rRNTJ#YeFjMs&+eh^D^eFmSSy`!-`^W!AyQ0ViB1UtSHf3de`~cix)lT zCzEvwyPXv2bv3R)LsOuU|(X5LrwV z^)9wJY$_u0ZdTpydHO7XHFf@4X2oo1>RH?{tlLzs-HkNJb=Z{; zlzJ^Td#!D3{3$o;zP4IeSomo+8k8pBLcm)MqQphN$JrhY2S@DQd;=jbEgfC(#$XCk znb{~UztdJgP0g9x;?-2Sk>JUg3ZvG~5MWF@&H_nENx&ZvZGkZzO=#P^tu#?^KiQJZ z5cc{zS-L2>FErQa#-UwpNpGt;$%;vajf#p*rhm3K@9O6EyTZ8t`sQSNl8%$}Sg)BL zL?Vo}^dLe1GMAZq2h`zR@rl(`K?o3za>(tr%t$KQS`Bie5>hzQu zwDYmmVG!Mz56Q z7tZ9s^%#_tlnE?)iYHs+2oBZZz*P@N#Bp@tZohy3KEJ$tOiJ264qmokl+0=N3;2$h zwe_AG((K`S|HYC&&fn2o99S?8`rdq*YqHy{fI}<-!S= z;0Fh7)-{B@&642+J5%NUGgZTPgjwDKqOV_L_V)G?UKc^zzt^gK zZpZr}9d^fBdvWxb{I)d`DRa=IVMV@N4Gk0X!&u&1!OOot0s;fy7He_QDkMvQ!2C=q zqIT)%)2C0aYcbNU=gYx%ykt5~9~cdehm$kM~XP z$6Mp!9{Wv+y|Hww>+7B3I6}vz#qrRJsm(+NJSd!B^Gq^u2hBG7Rg5z+Z7b&y+R`5# z_Om#wM)I(K=)u+cY1+2X=yuihHTp;!N#y2OMKO&ZYz7k%`v;lZH=G{>f`SeYx+zD? zjijNCZge|>T$x_IgbenC_VvPlz$bdv{98o$$bx1$ZgqX7;H zDXEQ?y*PT6kcf!2t-?~1rB=TPGQNt|D^N~o7><8%EgjTb9!6mbY6}sOmpn%*BMvgq z&<)_o%E@{B`0*<_IdqWAkxz|{jqR3N5x#%_4nI1o%zH)8e0fChD26(|3}3jO1XEzF zo}gaIH>9gm>sP1!aP|w`Nl~aUDO$5_Eh;xT52t|Dcp5lKs!JsLLjTV^-o>)qLjtEq zYNFNB9mH3;uUqQyi0SnADmM*zXw{%K12)?g>)myCMy? zJ1#>bBVsOdJPbnStk+5Gn55hhp-<>m*4I-#xBmT;H8p(!l`Ft(^(&`S4`-C^iT+m& z1GaqSpWFKA9;kOxv@cOo`5%hKjI7%g7TVRnqAPl-S^x)z2XZ($X8Te&OLL~r-L2(Z zZ45}BhwyeB4v$ky@9P8USFc_XahPBtp<;iyI9!KK?K)qc?#fF@JYY~OdMYfO{!Ki1 zWp{T_o~7yCUmRB{@PnxLL%d0R5|ZS*O(szGOe^mBuiGT`H|e1)K9%pMN0(%OBBP-} zRN8#`l4suW3I5A>`def9bB?15u$`Hza1<<(GW&HoP@Ht{x7-amP3lVP=;(MCE(KG1 z_te_0@_JwM3JVJ-9;YYrQ&-Ph)A8`sz$umGp4-^iR9%OL$Shx9Qfl1Q@%49;w}_%O znrnPFK`fu$y#~(l;lqcKW-pJ4QavSWYv%cSr+$$f5T-zh!XyGK(W(2=6-i21`+TnQ zqmoo4NhgTUW($oMZi@^80x3H?JJ%;;V`K6Kzeh(^5X68*4Y8~~x4a$F*}K*V#q=3k zinC_auCdMr`vgL({i4?yo7D{G_a8rGWn@~ryMsqYMi9Hzi!@>a0v^DCTc8KDa9j=V zG<*g-3jX=!PNm9R^`qx~;r?-3#J`a-Zw#}bs-X&N~{n3YXyCBF)O2)@^bDXGWjJK(LUN?d|P|L&)Fs zuQ+9teAyr23N3}br=Hwfa@FFF`9|Y0RYy(SJF;y1IV}weLkFj)Cb!oY7gvUch9QxW z*`QQ~{j^z3FV?Oh_zN=lo(>4rp;1xHVTa(M66oxh8Yj(la~l-!`k#tIxjyyGK(9g+xV}^n9jzoy-{u6rb+CMK2XiQA{8VmP+s5UEQAA zP36tudLh;?z;cma=ZreaO|jmD>=CNKPDjm~X0&N~XjTx1^`amQqj&^?m5nV1nEYc( zN~qRVNakFQ7P-v?wFs;c6k4vXuC^eO6A(ST#8gsJG8s(n1f{p>VzZE+pC9DAXisSI zsyV@%V=yW=e`P4OCEp>nBcwNvY#TphJS$Za(t|VTbp?9}Od8rYm_Im=+v%MM`#>hj zfafeo25z%^HvJFY{$}cI(#rfdQs&iz7uq-9l^E#TN+lwZpk7XSC7UuhpGSO73XbiY zk|Wymp3qBfA!(_`mL*s*xvf+u6X#4A7W~uf6S6^qcH; zWSo{a@P@Ok^9xCPb5u*cVV16GHlw+rbt!T!v6 z*F!Jn$3c_~(RtbKYiyI;ZzYw^bInJFQd!e=G|@P}Ban_DssY~aT+;jbG+X36ZJ8wF z6?p90BAEuJ9cgPn<;;S*exd=gE&EV`{NdPD8)pZl`bRBKGz}VA~$tvnt3onv; zZ8I=Gcv|}o_Q|uUwn0T?= z{RW@#N3^kGChYLFkvh0kUf8n3{DjlzoK*2#^i*R%!zMAkKmOMtZ);!HUre2wsHHw! zinLL$*c+jTT{j64PkcjpCNTM&5q_BC%TWB^!>c+=KIvAnT2cr;_Q4V<)x`2GO+T8Xw*MYVvHjeA*Og ztYhPk{uZmQ!JG_V{Vv08giA>*R=bGl=YxCbAx4>oh9faLVaKTN&_8vkYIM|y$>zdS ze=p){8+B=`dwEN`_+_QUea4Parg|n2J*-Z)*4}v~)8B`bsX6{8ojwCaz%Ns7!_N%O z_QVJzuI(_U<$H~1N%Z$saX2|KQZml;haQu`wp1}!V$x6kPCO->O=L+yeSh@)ClMkx zs;jGphFx#&z4mF8)92fUNu%JWjY1vS9}wO&>A;K{CbRWoWdsE+^@(s>rafO}=WP7= zwb=6C3LbYZvwp4ON(b88Xbr`LQGdE|EwdoEwpK;98E!#tR6(U;Ko<1MeC1_<&K&qZ zC1b_(M{aoRb`nkGOp}FxOYpb-M%UaQ(*NwwcoyYe(P(HBH-rIO7joE*i4r?8r z^tFo0t=!$pm97>G6y6#xL=Ek&CjO+!>Kn_}PWdFxNuyQS6oCV=OUua1 zza>@5!v9kYb)r3gA`am`*jl6y>-@04S|X{^9^*f}CE)Q*rgOAM<*$(7%^hmu2>&VN zq4E06g<+?du*T2mxY0V;&!YDUc1>HOv@eTnS-dw6ZL;?68g%|cdK^EZ*m(nKR_;hT z>J(jxDYjJ?Q=8gN7_L+P-nKC0+^l&Ijoh~fSA=5keWD*z!P39w zfF+lpAm2K}|DK0ec$%>m&)0C+eTabtHyPlnVi62+Fvy}2y<{tM6YZ25^0MN|ynkw7 z#WUu3S)U!lw*z+f&TglQ_pG!;wk*Ttcca;k+!31~i6?XAS=qg3^~Cd~#`SLdbg>#a zkOd*Ur{K1>P>Dw^Eq3^4bfKG%BtOtik`{LAr4x4#s_7&=`8VBIqtCKfBrH)f4_m6I zjd#tG7BY{+VN9pSX5^y$!B04RRY!EcDRs}2_}n}zj$xEc3(`_iT&ErkJv}8 zyO&(ZcOxr4K7{`*cGH*$1;d%<@NmCj>S*#avugXbThT|a5)0*CJ|KUnfBju)+5Psd zk)`0!9sRKp(DZtW#v1JC2A|=_v{uK`W1++OXJ0qu2n(&Bnc1qSVq^s!#=60Z>$`eyHl^DIZr6BPEdXgp_me}UXXW!m%{R{?$9OgFU11+2TJEBB1R$dy@;7&+4@~)B}$w1_>3ich-6VM^LM!i zcj)5x7Y{PdJESIh&vp)-zk^YWU%O^~6hh%Fj0g^v6!Ku{%&~dOMB(`<)10)hkbeAL zHFF(NweM(en`5&*6k)h)o1K3x%sCpxv924L_NK3F6f-`#4JY^OcKNxW)w7i2-FuIn z9f(M7yTe2|R)S#$zBRd#RJ-Qz)~YIc(!WMdZiyys;h)_ezZ?s$KGW1y$iEL>E8qWA z*e5lbQf4p)Ye9-q~}rucVMxEyU&DXQ`>&H{CG&QubZ*8j>uFp6pCHU zNmt|DyRAq>9g~m=?%=c!L6%a0z z)Z6did^kJt0EXx#Sa+8^6H)uJU~PEmEm82T^PQgAPMglBdvlI^L!ay5=Ck}>SkL=2 zSpyOd>D){`364vtxa;SP@pb&Bsg}Jv6;#~Z`_xBoV84ra9Uu>M-a)Ef7uwU5~+R+qo%gPFrgNyLZvkq z^PQz7kXstE=&T1*DPOxVDxE9NOZ`&&kuO=RrFE^XRPkAcl?6W^#fRw{3#(ZnrH3&L z<=DIfp7p9XiLa5%21l=$KVaSfN*pCoZzJlexy8JhS-}nbKj%EhZhRzP-TMoon=`7) zWXECG-2C%9rwqNbzhQ#Yxd>c+4I`pM>eM_Krvn^`7S82A@zk@S0INKZu*Ww9#3{Sd z;D?>OL^*ifV#+_kY-49k)3M<8IToc&HPfB}^ry1-yVSV`vhMrTCVw}9CkQV{mjIAaOK`4<*}zX26mtAK=}2z5-z@RonVW;1Rk+_-TrzBbJrLMHX5)pTefP|| z>t(&^mh=N{9bNj$b&sR+-=ey=O#fv;bAco6QRM`HT=PnooSE&+&;+4i-v@?(Eg99mx9uOlOGq#}sK+}+&``a#28 z#~5V5`cWHkenDd(<;XcUemm3Z9Z@CaPRG#=Dg8CyY{Gtkt=lqq=ffk?%#sF%Yv+rjD&QH+*uppi?ov@s+R7uId}(ktEU$sc`(ey}<(Hh5wEL4f4l zpReAMhLe^@JO#z0dzkYycw66_@Z<_B{^9RG{XRbc!0Xik`G$I z`mrLNg`}EbP}4sjHdtEy*VZ${1)`?bgY&=E`P8uqu+mA6#O}RMOL7wvDq(osXS_E> zin6i@PZ@VCOY^YF`QbNbi=#C*dSG660p>G3eSP2M6PaN}0HXmg$~7Eyq*$9rP*6~# z$(@U5&bFOzKNf%w&d$!a?&jtNl_CI_tmO@EU)scyb~RSSr28}Iqf*b6*E2fFmFZq5 z8eZst#MY7&9j{G)jn9#bA{yM@2EbYgfT)-O?D_T-%!d55ZJOeN8kX1BB}GMHqd5vc z0QT$a7OfB3{I*|>jSn#}o>5UPH|}!*a5mlN*6m{g3z)U8WmLM3F;ez$+cYr^!N9V>1r!dfRr$l-TceVpylIB0zm8AW>2>qrHmn_nz>(K zieffbdw}0Gd48};EZ}SjEeo2CGQGP21KUf*oR1u4ikOR~0+?SbT?MBg2aWjET{u$H z)t}ub7l;%-XpG!yxcL*tYclZldWaN^U3(XsZ5D+WJobgEt!AYFeuQ8;^OGKEbsgw> zvmHm|IW_esVE%}uiHV8Qz|=vfz3C+aW_O-mTxy@ewvsfo>u)7%yicnPA8Q$0VJmU* zdTCA&y;9>sG3Ah{WA&nRp`{amBqOYt6s}7MISMIV-zCFC!opsbiEwZ{f#F1dx+^?9 zKJHkyg+Vynm)KZMFku68#|QdtpOAUUuxF~Rw5J|Rf=RU%f9k;KXifP^o?C{yzg%16 zNDEc5xhVlof9k&*?G~0P&P-=JfT@Ck9VY-Wjk_X0PfzZqV%nKT_C|ZFhZ92Ss77S|G zm4>QdHq3{ICo3&NTlS!bb9LLYFEu{2*B{n#sJnHVm{`d{7s8C#Ma=i=i=)S+6ejZp z^FKHM8Y?ZQ+5e1==7T9@wBVtPpMk-bFJB-WwdMAbfr5f!&UH1i@n}c@KoYSm=AVrL(m)RMS@$h&_ttjEhQ6 zmLUo#nV^lMJ+_g!(poQKddp* zpigzG*Vc{Hh7x>?vcX5sm%{^7T{HfDZd>VF3)|IxNc5(hE#O@_NOkv_ltxN1-9I{UZ!_(}qi4tgikw~mKk!M^0{DTJ zZaQ99GxCPfu0?UNIP6{;Dz#maUKQXcP#=t4)pzjAS8A-l*399TJemp7M3v4^KgEbF@~{8vE8#rr|{kiq$zR~P+Uapz6G5?;c7PhoQ{e$ z0hx|9GXpGv=w5e>8+*K64jeTOoEMz1CK4(5&dKk0=)b>uGw;G*_6T4ZQ$KC=8z1k{ zyEhOSas}Z*a5aZZHyi9_@FmALAMtwbJX1SkWyV|Y3-vU2Im~;VJq94JN&@B5V4VkV znnibidzVm}#o6Vm=(3` z^lDdx;=j}Yf-uOervA+5o=Bq@3vdxx2j_#qEe%*7itCX?2Fl!6MOfFd1J9}8xmRl4 zocV*e-<;kwp-`QImux^ZFrCm^$x##gH36%Ysknf(*#)T&`Dk_#9`UaKU z>K%Km=l1Jj@2{Q(MUV+Bq;pF-xcva4^4Ht&j)B00~rCVvf&hYe(zcm&Q6@Xd0rA){cwG6xlx>{++FT zJbW5XD>ya0(wEhtarB667Tx>Xh}S0|kL0~PlAsvf@TqiW^->{&#ZY;_{<|1r{X4l= z{FZk8A>(=Bs`MEeuExTQ``UNN3f3Bdd*+@|2{&;RVgI#8g34?*$6MxngD)UHrhB+}pQ_N4C66 z(Jd(M*1{cRmy&XVkl7&&TzGWfRm9JC|3UcsE?1BR+w^snJpzF`EzQgXC6zVOd7Pg` z`pN8jD60guMKfArrE?%YpIcJ;gT z#2emWU@WcsMgDuEE$-4|JazfwV#o5zp{g@dR2;JQ>mrmv^19mU0^ zptpT~Yi0ijeZv}iD*uCnl)>~CtP<$)ukRmE&3wVBq_EiaNjDTW7X5G~o;1bOl(3Gy z!6YeqT)=!}QyH?Jj!pp1EEa{X$AkEio)#RPi;AP8o#Ihi5*VErhJ^JRRg&ZA-S1NW`E;#-82U7 z+U3I>OSJtGtxYB3D@aB(Q$K8$Zv0@rO90#~a2++noPL9J zt%<}Re)NI1%`bbS0#QF7YI;`?C&*-04l-)W?j%rPUMcTZ>b$Y?an~&Dj92WP2T|Iw z@kzz%v_J?^hjfyKC*R)(HFf9is*Esve=j$XE!;UH%4*r|G)Y^yDM_(@R%6rSfsKh# z-pUxQ#WGik@Alw%+Oash($`^3zK9j9p5!mW(=@+jo`nlJgj|veF`wYs_UX0RTtOm+ zK5%EpyzDmD>=3KV!jn=(oQEYJteBKvKr74c+1FlmbMN9-%(5Wip*K0znK~}6oAV5* zs*?Ezp&N0Cbbl({oV%P&Y$8!JtvlHp-BnZ+R%tsw4(s&D1hk^RsmUE5m!Z19Rv)xP z7V?6_LvxDCQrPJf+jIx%0_rHJi;Q8;nE>4jt0$<5pHo?`hk(O`my1b2SPOH7OdavCo|Hfpcr!bi67rTv~e% z#|{YM0g;*aK9+YrR<0nr>n9-SB16rzTgQFhP)C1{;k*v0dXnJ`J6u9yhZ0 z7}68IgQH~EnmS>S0v~aJ0&IfP;1`Gl{X^}O{r=J(6RSf}Z_Q6)zx1-|FF0)2kBZ^q z8JO{{ctYkR`GSor{Gi3s__jm>maLAkUX_wkFs>w5-E_1(!VW(UwCDoG8Xf|qb87wn z!puO#ZdU40XZNUoaKohWhmZ5ybTp~$2uB$liL-M^RH}?j(qTbRyo-hMLcZC@O}Lc~ zU%;e|nVjwkJpPaV70c%`d{6&xqdvtYQepR@;K@xhS2|s;%`^IEs4O_7IL^iGF9tWL zvLzK!1~T-ST|9B`Q)XBM^xP+@eLc(5NwZ0HeAxF^=q;~8A{7Lw#Q6NkOh))YTl}}( z7lnl})LD?#${ab98D0M@CR6I~8g1{&E3`P!pX5Jx%?AsO5jxVJ&)qom#c5S1kJm{8 z&+oyP<4fxg&~t$w1wDg}VY9Sv^YCPwjlZ$Lcv7d6B+F{_vu^HGIB&Z1kA2o($d7dV zIvb)n_Hvn?XPFpOw)H4-xz&2;UN;IAGb^ke0uGwl*(>)?eCyhiAB#(5!XR7kF_sw~ zTJ4+`ICma2fPL>nJ)9X-FxAxM>6fQ>e^Aaaz;=h?{XiH&O`WC_st?y57ti>7 zxw|b(`q7(*TT`=ETf2Pehd-=k`FNRQCaL58s+Qw69 z%nW7`Ujxx`R-gAx`SiQy36=GnF$_jTtX5gXw|x?=tH_nl`?UJeY#1*J`1spb6@k?xdHaWkq)LO)-J0Z;tH&+HAsNbg z|2g}=oGu;hmha=)p?Fb3I2*!N%ry;4%fkwg!mitISN}!a7;vOu(;!R!h)@Uf%#NoY{Om7oa`^E-iQi%gtaF{`QZEh`2UV zE76e!)G&Z7paQ<7!R|~|1ThB+PIRS>h$~#b+GcSGfJ_jZSU!Q#V67)6kV#2m?K@_> zepk+qV^;?@`Lonk;Lw|wl1JmZR-u?+^dk6ZllLd0@YaLi1b-#mV-Hfnrs5Jg#t(pO zZo7d&A>y41huadcyoZ*GU^-bsKHuQ78A$k^ci#cx**ZFMT1=K?1IPk4ki-!z>~(3o z*7FFkfbUMcR8&;Z(9o!8Xabj(^f$epKC;t({{BgC|d(XaY27d3o9K z?}%R*K7;+qxH@RWE3P;HZ?Msc+aevH^#Dc>q6k3G%ne>s3oUB>+F?3yb)Ryr)z3!YgAaqIyYl?gc*?0e?TkZ3J>8JEVE zVR;jy1(B1?KR}}OPwXm*I|5h_C#F9tg{!aGXihm`tpgSz`c5few#UT8Y+_2G*gsl(r-fqR9>JaCd*Ljm9A5ArOoAip7Qk&H=n~+f_S&R z%b*8W`KVbMJ7Z$!NAw{V^OogEQ-?zD%u!Ueba#?A*)h*|A8}ldZ(|^dpy1>#Zm=+C zjUd|6ChTYHNIpP;amM%{y1$mopdSaf;c+8U<{1OJ z&tWM#IgCyz9aA)sSr^?hgWVXtJs1ad>02-bH3LI9z`eeLJpuyufxwWjy1j#yzvy{{ z1%R+`z-|90kLhqoU>~nq@R6N(_h<$2*%1N34!aFgU4gS3RNp+J@&?U|H46_$b3Fo> z-)(d8i|xz4VI%ny-QK_iI8{Ygm@{(@W~E8-hSkpz9lamCauR907RZf8GR243N-!vO z&JAnxCdB~E12y`rU>G!OaQKKNg&|uztAMHH1%;=0=J0bXP)=vb|-;P8`?Mg3A*u-~L%4w^NE1He@QRRI1vvUC=4Lcxon6bRptUclJC`r0xT# zVU)M5gi~KHx+JVe@46`EzA%aSC({)2G@RkdMgK&`5K6sp>8nBJO_8DYC+^LTr+js} zEVuO-bhlh<^6Gi><7Vq&+YVd2pcd++AKueH{O;8#*hTOe~tn{6!6%=g@L{p>xU-cYaZ4L3sC9_n;2~>r;1_ z1UJKn@)heb#23`rVSsGaxcp*xa841Fi(<|1UlWadMi_i)bhUZ&j#{m^KWHDN?N)MW z8Oux0KcSuF<^l^fS-i7jfQ<#oa{Eg)?^*LG zo|zmeqSD1bae$HpOy!UVTj1KWhWNG-$pDV?X0@Q-BeIX_X%uN3pP``m`ZFkMHS!l6_MDT4N{ms|#V?Qw! z7LjW|H{#l5WM(9rTLSD-c2uuD_GUOxnKGm@(`h$n+QHD}QDanCo+j1j8XGIc)t6L| zTsXbK%af=Ei-=`zt&th;YistiO%krZ5Jpvo| z0&D{j@YvfqJIs6b$mO5{8qS1Zv+}1b%HSlUf&NNZbK3^ZboE)1Kc7JVcyvyn@9@Ydo*?fNFPx2jjp)i(Uvpr``X*}DB98HBS^ zGED~?d?goJs4M1+d|CJ-SmVPPC94l2peghH+o<+E1c3y*m^D|AL66Y-;_)w1JTIa2 zg*V$;N75Z=pn2&~MpgU(&)Da#SO-9r|IEA9f7>LuOF#6K3}aM+mvS41P()ys8#GgZ zi8CIAw0!9@_Lwd^!Mi;yga$xF-2fu8-f(7j*n#@@zR1Xb<9S~|IVs@4tKVhHajj~B zGueXC7C$K8((Nqz%jCrqgcJ9aSqV9aeMj$1pHwHv=EYE1(}6TnVnSrIFcTq1b$fUC zI)=LX^vThCfqfVe93fy_u%T2=9!QJ~uq>H!Er+L}!OgQWI&uVnFVuCK*WZ+8v78@8 zVOSM=rN2S^C=}I1+ zC+3cy)SiJlIZFlo{48`@|5|7aX zgEjNk$##{leqU)0YFK$C!F(h7=4YUY3mHNvrgw zb&JzIp^OO^@qO8)Wlc}6us9eL`AscwXb&=M2Fq_CqUK_*Fd(6}<|IANs^ukPy>rvJ zO{ja{^bByZ@{s^57RR4NUCcIX`Z6&d-N{3=Ux4dJa4ii`S)C!E8C+qU9Rdz4FJ=hf z)in4gkLKBjK*q+GW~sPXZIMv7u#Q%H$;L57)BQ@3Hm0HC2;jLUR_!0Oy`yhri3mXKEmS zKnKxN@M6(d3e)mi`Dhjq-%go1JLq~(SFnmvczh7zwKa5;Wb&aodm^L2@DM{wH+=dK z3C0h=5VAZlDC~a+Oc8>7n(o=1H5qU3mI=r8`7e+{_O8} zu)Qs!&f0|&_=)nqEWKe6LbprXo{0XwV2CbSlpq`{h~mzlKzuw#e2pELYfnpZ^}$0W zg;^=7sI&@%1qkke;Cd&`l`U{&fN3!Wi8~{Nz7{}KwR;K*v$XaQ$8zlxd&QBfNtd(t zg1+MB1oz8`8XF5miI5B+W&iBqkLk+EbgL4NOVM{99lE0U=bskkRGoyz*@GRme-9!x zvCzqmqcx6GVL#w%t^WHaZ>1bShOKcfqH$Rd?dMM-loNNqj3C0tb`bnY51^oCU5Bp_ z6y%%^rR@dcu~hE22B01*VP=_4O>yaVbZA-?A2}f&{6nSu0EqZp4|o#!fJEg zBZEwzl;aTlJ<)@txutz)&93?2TB0K#T>8Lw*N#3SsXhjY4&WhW2O7ifbEEmR6!mKi zlAX)GJ9s_3Xq6P7{N>vOVAd($&Z;gMDW9^YUW2gpvhk`0pb;^2A?k$rL9eo11jI<{A|kT_vD=4 zU#P3S`=;TOH^_g_GpkNQYN0lq=Swn>OT=cmrWg(87+un1!NWxZ#!LXyT+b#86v<#q zEcKFGR_cKGEY^noF(0~K&&yaU(?ZzX{=9Dk|HKGbxqA>oC2$~;cV<}XkyZ87kD#I2 z$_kJr93RyUOa#_uunOW%Hg9INM}FQ1(uS#14#2OWSg^fmAeqw4dH~RUI|IPrB0d`> z*s$bbxj41dh>-=-bm##!eSN+gyx5)8pGFx7N12#-M(qpYO#h50Z_;lS9^17svqm8+ z!QZ(E?E-(ll;ZtJtJJ@|+0Y+e{%t$nuBQH++6ROC+>4#@)xaeLxT*%p7oQO@q*QcG7^lDEm@@CuX zlO@*lfWOBnqbhx{z2hOBdXy11h=Su(+z&uo$OW5~UjqVcd&VG=xejtwLsGG~0atO! zYl&Mh*pQ*;{HQG$eOnv&b4L)Gf}C0n))gqa74|=NF(hI=E6tzRnn(81tEr{{BphHJ z*)k>bZT&6#D^Q(hs@lZ3KfmxP1Xl!<>@}5MBpp_;40hWS-onC1G5x?&mE}5eQ%wfO zB8x;E(S2jU9ME*w-POY#;C;1ejbvX%+I05dusF2)=UYP0Z~X#zl7Fuho*S=0aFGRo z?>@FagygB(js4{`WDizMQzGI4RDW$iJkJENzk$D* zbVJ03*~N{_vtL6yIz;CYvS`fXEijt7yRd!&QM~ovq?ilNvXF?_C_&Q4Ct`^#BG)D1 zI&uAM90fUi4INUe=r%Sjo5_~cW93Tt+38xgUu5k!H+)DQo_#l&DRhMOrJ(3m@w1Gu zI5i+YO^5-}YfbOZU=l2w-VWgmw2QyL)Z_aXF)Qe3nv+>xqU^YVGAnQH@y@iZqY#-U zMlQBkpTSg3t6=jTDy~lNOtNGabZAa4Bw|O90)W#k)=^0Jd}c6^d2qQ^n$Ih1@|e+W z9Mj48$J0jP=X>m%droUf-HhJEo}UK#8-s4r>nHQd9Vd7vK@Q7uiNmi z+rXuD8~{})*+35dSOVcq77^4GgV|Zq#Uw5Z7(*F;33843u0I@@g!5}7f5W{r6o6_~ zT%j_dKYY9-!lnR%I(K&B?o27)4M1(c1h!R|#yX&u1P$`_>5HATkIt8W&$xdQ89J#_ zD@Qne7U)Px$d8C1fW`k5ZX}(lWzzkF)Ru+6g%_Op5|AsUIH9A z7)0B9+}|&sRI~2xIqX?U*vi4e$-x9J%gSrbeE8ABsiWMwg-dHw7ZE_n;d?!ZSL!VfY_R zH!~XP>CI_mpkBjAylA0f$|tAz0ICynP@S-#ipnv@h5CxA+{59IW0Z47CbMW2Q)RX% ziov%Ls09U65s*-DpFD9`Fv4ojblG13xDa4>z1P>Xv}6P);%J^e^#uSb1Qi_~9-?cf z%f$2#RUQH0BI3%8fzKIL=sN?uk)w2=h+XqJ6I@e?<2rEs(<7gk*P%W5^o|%yfVD>q zxKH3v9W4Od=+a$3Q3$!08FgcWQ^^=)SKxemn#*5|hIvJBj2;{T)$a_$2cIB-$c5kw z8E*fw6VbK5%f#>{fFo+9la*B5#3@*}vrWurF8Ptc!9lK%=qfhb!d&!!_v;S_g>>0= zv%I05+v=0ZimL!;dwGwLqbWrcU0r#@30ZQ$0qBca9&k1h9MOhG|`=K1pg0ONvFfoT^p5NTs}mxu5Rzf}?p; z&0Ye7DH#H(V$ROo;0qZS+xhwVL)S#qgdd1d^h)_Vj#~Df4ja4yG%89gGug;Pzq{KH zG2v{OARH027?yO?iC>#IOtU<2Z^BeS^+S0?81u^B9OlSNCU`s|?zl4*1J04I+xURP z>iCY^iR>TUAN>@0>LUb^2Zxiu*C@b;D;i^864r5Q);R;4iv$Nb5ID0_cw-D& zuhGhOupDlZ>8KhJ$Yv2v$xIz^9;97Snm&qQSRV7Kf(8PB&!-2HiPgU3hf1Lj4(>xAaLCKcL%gB{-|+zF z?)MO9!7dJ@*fh(wcyHWUf^T>Xg9FSmhKAJ3%Nq*Ez#M4+MfdODzrPY**mr{R57Yu* z&##z4HvTKu=E<2wquP!L{PgOE7?=w*C(AWI(-zIsW^T-Fix|lEdnG4wrYw`hOoH z6^vo9=cSL0(JTH4Xl`J-p1w8fyG(BW*IUFcJ&@(qjvQ#Xs768m1Df{`QoBAH{f~mV zfcJQPI%@-nf>|R8JHkW$i&oG1I1&$yJwfax_*tkqv{lg&zmw)tU9*3(|Kd7SrhIe? zpV|j><>0{A=D3LSGHWK7Rth)%K#qTP4WRol?Lz|%_J2D>o-hDgPJV2?qTCb*Q|#Lz z%fZ443X=JU2nITD{ve#Mzjvq`e`xCJf3!{b=z>r&1Fhp_GMWVXs$*1|w9m{y(f=sz zE90VS<2DBnkQNmLBve!$1nHDgFp+vxkdjooM`;)k0TmUCZUGUbdk7goLSO(zI))HN z$$_DU-2Zu=-F@Hv?Yd@wBU>C#48qfoTaYVkHrsC~`MtYxVmkdr-&6iWG&+0| z=8j)YN$Vofk!MfkXBJ{X3^6kH=62kR9S;?y$=k>#W`2zYo9-+-x?~&rUa)XYs8xrS zaDpUk?NUJu66`YF5NE1?11uq!-+P5k0V*KX-|ubY)LiBBEap`5;-EJGlO zf1R&!zlyz}SI0J=#MV-tv^})8burUpof9$I>_1?OpTp{(y zS~z-^lf5DnwRw#8B9?bQv8&?mX$w`JAJ5y;st5%GzaBJ3FIiHQY)wW{040&^$YWLW zchGM4#mx(S;)jdho^%oXW%D>j&2;-{sX)Lqc`A9twtOd(Ke+gB38#;P>Rzf?qryG( zU$^U-pQ^@4?316V6z({aOMEGfBy)Uw!>LoDssH}?9Y9}`lZuj-`uOR_w?4k9@vuJf za_Md&t02R;fl2#ubg9C}~C zq+uHy6BD6s^OoXW#0nEm%qRH3wLwjJr$0WBoSkDq>i7f}{(k>2O(G&3u$`JymF{o9 zd@-E9gG4<3@K3?*@-Xf`1Iz(*bA8)JhadTZn#Z4lH}9x!yUI425AsO(%e`l)OVmaC z9Nqc1-l`~?zAhzLXR532z=?ol(w`Lje~L6(7cWaT{?S>mmx!gpw~6$TIG9Ru#jjBhE=f7cejVSwV-3LspTf#4`0>CM#K-tv(FQq-5M~J{azN?idt=*=3Si`-#rvo{l8K20{8Efy;M|KeIr{qv!6QGGgBK_($Wwn z-eK*#(>4DPxSKOaQBBi3MJmBX1lLo7EjrVB7*+nE=fAJBu-wU*_aPB)7y7OYI#00R z+iTahInDX__=5z(a6`JO3jq@77mBT=c$%$Rn)6{t&Ef6O#KPM%gPvfN*3Sn$=7JjP z7j4-NF*(Hfsonp|IT6}G9x6X#{M`AlOP`hSShom2@1(5&e0`!WU(m)d?$2p}E03!M z)9pU50Kb#NAY?REzv{`q4=e?Axe!VMM1#rm!zfo>p-v7FqNXCXIpIKySA2=-2{So6jkUiH=s&(hP`{7<{8>uL+iCNM=@$wbj}rN)nSywY9EFusO~=aJ@VD~#xQ3LctyhHMDj>~i z?Klgih)UCYEsp;67$NTjMd}bw!P(U_rIVH=iuvY00?~dCFi@lYT zVKcolUUA&$D4I8jzPfKBE&q{BWr=jsfHht1yX_N{*FKRc6AIO8pAN73=+`;``3=A& zVOiGX*6~I0euN^e=E{b2tbW;NrO>g8fm3!pCb9JKFijgUR6Y%LCi?Y@e~sS)EgZlu znRg6}mJV!SN`ilNn1cFy)7wsj=kDJJ6|Z^n%$qZpRR>oPGS#{yEGQ-tOFp zdwS(zl-p-(>}EOG*>6G{J=^Hb(NI=HE5WJXM|};7_w}0%A>x7~l}wF6OG`n!5hrp= z6!%6mM^a+^xdHyZwq2l6m4DS*qaQB!K4T9c+CtLzKi=d zG$QLsUu_Wfmi5oxvO;_BNHUyyECPM2R@Kc;k=KmY+>EV4J9Hc~A`+KC3j^z;YscC- zXA2y?-WQ#sXc!NDdZ_n@Z9#D4g(-R!A|%Z~TK<)1lJGs<@=5Q5C?^xl6Kj)td9JNG zHsSDzcB(@a>}S1#<_Ido0PKy`-0^?NH=sN|l$ADx>9GF^t$iM8sbYzvg>@?VOb+>ATRz33d4GF)M9` z#^28Dt!l0s0`bUUeuHBtsDV+IB0Adjw5$JZbkem19?K5ip1&u=DH1ybS<-}lq3t4e zyCdb>!ZIXl>nhr|g=co& z{l1DnS};+Sc6v@dFCSo#0j2&OO7-)X9m0d>WU-_BKRZC%U)gFC*$sk5wsw1GeCf6j5iaCku%Y%-EX_({R<>hIEhy?hU zN2{|xTO+hlsIQ}Y+gC6e#<%ic6hKE{4mXGok)~Pon{(O(m7M!27>;sq9&)p8;TM9> zA*JzIR;S!JmCn}oU?aAK_VZ!tWu6GKdP)ocnCDjj_uQv=3X;9fP?HECPeD67KU&|c z)?aE|PCBH=TBYLpNET-M1{kfa2>&0xcCpAw5T~;t=j$-ecQ%Bo-gTTd+zP{vOkr%Y z*uZ<`6p+`hIP^^1N9Ijnv(cJi6RLb;@z6)1Y5aBgo=m%HT-X0iLV5e9>{q@xQaG!D#s0h0j0D5olLP1uXC)gPE;3Dh6dh^4 ze)gBm#Y`K$I#+jtbI|+RwD+z=Pre1r6}ZIzP~j2i1LWMKRkwGY{C>px)or}}5Guz@ zCd(p%a6sVE<7hASBsk%8dR^L;I6*TWFC?o1_K`=KV5yAik%vnVOo<`#hhprp~`9hoQc!=QF&w)a_({uRS;32f^|HOap1>#{v>12~HZ6T*|>2Ri<^PgSn_(wV*1MPL;k!8Xi;IJubQoe%h3aBqn{*5fGUG>L0p-OuI_f z$60BHE{86E=R5z8zTW5x&{YDl$36EP^85cV>=MGIIQDk2a>t+C5gvkR|FRfpoAaMG zT1qT$B>C6;Ozd0u7_IO9C#-qX8(V+qtdTHjVZqIg+j}c^W2@|o$$3y--g5X0)%HLM zoPyGp~{MjC)LCkK!Gn98+o#aKWB2!;5%~W78x3HlgWjRIb10)OjA2I8;rLQTKDwZ z1;yxQlCYy`eaSrI)_GjV6L?a4A*~G|AxsdaONUDcp7h3yKqedk>W#F z^024HL8>)B9oNr#gClw_GUfHY&`D_A|b5&-Kb!WUw5w=2@)#Ffeby zuRVqx_?ns*d90xpWlE5F3&$z{u3w3*mf=Qh^7mt7=zxrF4Ui1qQ)l1LGp9~jL75{T?dV1NDsDn?-(^QFemVDiIe=&U52H%Jf)Bu= z(mOts1nVuT&6rR}gm;pgr;F(Q8G~HTfz0G@b61POu_N9Ce$v&rdJ zQkalNdxOzKJ(QMYuxCyw4%>V$+7`3?ppDcACMH&oj5^UC0;2xkO&7O$elA%%s~|TA zh0t*$q~r=LOD@e-b}%^jD?({lPgWE+Tb$T35fsO!ZpQg@p8EV!DID%W9Sv=ztwr#D z5BPyr{%Go>m&N|dr5tHgpqrmIJ+2zA(T-C>ZPn&s{lUOW>>^cn6SOSw50_^JBvGr* zrq7`Ce4bLl#7tiC%62CarDr_)ZPT1sZX$-p!rzXf?im907zA2mkaXdAXQq)E*Dci2 zZ0}E3)=43joYFA44G;mq=YIAP_4|Vqdd1sf_Ug=%Ce&B9`4Ka~j)yfuhE*)wS&d5W z_x1(vO2fI2uwcIvMpdN(z&WzpWGp9eqaMh&@RhF?T#d>V`)oHr94|gUI4v4GCw*wV;nH2`2+!b6za}~_?+~lC?-Ld6 zjL$sL4X^m<&uxy}U1%M5m*#{LM^0Hd2il0zx|*7k01c*s-zL}--v)zFet*)X zTeog8*692f;Cg#oTNxQwah%*pu&$k5R^Pvx&$kCW#hBfbl-G*gYP*5zfPw{AZ^} zMpx!mg+bw~P;~t9XIyvOq4^IQ!_ZBRN+wuxg-M%}Kn4zM^AccyU+`M=AG1cR85b+3 zSf!+-NGmIo0C5wm=JEx>ZySiu)FhD1OSz0Fyb@4*71>qSW%QpV`t(XWD zc1o+r%*=-7S6h?_sMOs9H)(zkmIwiI?nL-9I(R19*zZ-QBq@aBEALG~<<=O1MaQMB z2{wy8G7x1L9;fwi?7;_S{Fa?`5s0~9k$MQs1~dLnze-d=jAm;{4NPDzDupot@5x{i z{jUO{)29e=yx zV=2BJ&U2o#zxdZ@m%{EZbk?#ZyX2hd96b``t!-KI`z1Hl; zddvC&It&n%dayDDoNZkjkK7_jURG=!T%a`&p!wbpl1BJI5pMtRqM3o_YXz>#U`Rck zxNC23j~KzGrk(%^d{{+=*WQ<>PY(i5++ciDdJY>6NEiJ^3 zYJSv;YamTDB0iD*rf9rRq@vq6O4i{gY8=Mw3m)0$V35ns#fA7XdsC)k$bO9b35VsG zUs&Q=`qf9mN`}>QF3tWeF+Z~v^sRe-omv-4JXVr2$j6kO5Eb{L-Q8L)ri$(@aVSXe z(~c=}8YN0k%#iu+&cMjjsyiz0)+DvXyu)TLJyf~vmW2}{txC>|WTw#E`%h(#Rq$uZ$-F!|(HV%2Mz{MM?B{^)TLT& zoWGNY^r{a>K0keU|HaFKC67o8XWcA>Gk8N^xADR@sIaRKoY9iNc?Q|3^vQ}TM}KH< z)d}wvXn5P-LF%7pty~v|(_yG=>=}cuoK)oW?39TaekCP9)2^|rY8#n7_MLacdoFT5 zC*WA4s!3zfPp5OCo6Al2oIjaJe%hQ9(^2FubYT?rJ0hhUJ3PDoIMDS^aRID@?6*;( zjE<^waB@BQQei)6Kn6?8dR_=UDnFuJplWaAIr}7LBBFZe5cjNk%^GJGY|VDrb1AKf zgkz~rM@`8GWUAPeM^a--U~n}ZMJ1hA;zM-D6~_Z6rasV*$L=1a`c|DCUmJ!EqvtQFQ%e@&S&W2jDzkg09)|~Dh2t2p_&*ESuq?&3A@lloh4;4h7s^J(b5n)BU zepk{iAFW1;`N7NOL9I46Sy3vOhCiptL}qYVFs%32QoUcka;7C-ZF?r61xmX7F7=2s z#y}XDoVQR9Ki2S;tTCsWrJy~B`REWKZiS;2m7Omh&o!sk6rGG(PDu4=w-Q}fUKbA& z2v3+0_eFtSA_vb!xBK<4xYw1R4%>;vWTS#7Xz3m0m|GR7gf?*BYG)#2)JkiQQIDkB z!ne83kcIlK6&`&_hv$9v!8drO`8GJc?)FO93^1YQm)j%+HIIyy^L&*Jp@{&z!;xlu zqKvd~qR>`jcW%5{x1LO$6`pnMj&s07fAL_4h2cl)J4<>pYp^S7nVFv^tcAa=M7J5=Dp~ntQp9XN)*JowP#syVO9<80E9KY5KWwl{d!;z;Kf)zB{*cFOdgQofOxOTodz)kFoYDLvXhW8pKmR{7E z(}`&g2L{Knq3A%o+MF9Iw*iNNNODLS>O$k>T~x@_w6XMjmLP}^s(yaP{i;8|yn%h< zreAb&KJm{^GLFFn4zAFK@$U^cA7m(AbB{>tUP_v*CV*?eWzD0sxP}Y-)@BB@i!bMH zCR@5`klVDXvKhvbV+L@>M^%DvzrwZL!@KY9<$u?98#O@yxKl1#RE4i!P>vLGv+k8v z+z~8P45?q?P1c*vz6eF;QOO!ob6O2u)tR*$^8Pk0W z$H{Z?n3`|)BVNogA5h-3QtM(u3wfTGA1s~fA)ToqlrTHo&T|v@osl9*3LU_)V9NGn ztG@HvfPwbqU#<@sHa!&P?{}m;A*|duFnOZy({+y}wm&~UUYRf-HbPUU=*amUrI8W1 zRoRcY^u%PKyt&`%@V9)Kw5E2K819SX(Gcp%u;C!qY{sDs2X5kq10UCjmRu<+KJqvl z`cNe=Ew25LasDZRI|1<-n=~VmD@A181<%Zeea0a0XmsE`aLsIt%;z~Edpx?RcMlok6u8e>S6wz@c%8H{vnZ0AEhb4*kVN5GFT=C0Fa=MPoi*5VJO=+fEGfcTDJdKEe(P!J-S6i5sZ!~tAcSIvC$ zB_X0`18uqGBBn*aH~rbhN(9Isn_(opwB&-o6?Sg!XW=c=gzrSD^Fd&n1m$(+z?is# zLgmk7nJe1=amB}_naR~%)7UQwOd<;ed{pU9Qku>QXv+T_ePnhPie5yQ2az0kVwqpR zd!gO80+AmM{Zoxq2v9o)w`o`%t<)0&=QqH_WgMu$tnPo09D=jkf4>H^m>5fmF6OWgwO4q9l4aUyI%N8 zNo4F?e?dx}8mRJ+RE>O7Mevepd?`QH3YO-gxs{vXM>dtX1YtRn;1`G6?TkBfGrGIL zTn)6eMT1U|;!=wXY?SbxiL*s`SD-+AIM??Qe5k<2PFVOEIK~|TJu(CZKzzmt6_r{p zwJYB%2fQFIsU6((?Z8$JyvZTpK?;~*u&-sTX{K~m#Fz(SW7VFKcZYqXfr)}v^#XM< zBk$BJB8%G?K}{~8zO^%VRggG3MASb zpZ_bbyQ2z=$$pC`!Oef)_D9AIPJPoF9yuq&akRKeIhfCbC0R#7-Ci3wthWN&?O8;G zHJIUX8kqP);E&0;UmS>_Q4qX?-jiH>*ok=i!_SUk_IJsPDKhqlmukqYVB>c3^WB28 zux(FP@p~H;6@}@5^o2p7eF018L0_(ss8R8gH-gtV`>*{ab!^)O5*!8#EopSsc4Z*M zXdK$%12x>OxyoQGCxw!tNh1+opMS_Cj1gmNTEM*`&DMp_)vy!(_c%nRc( z2X5AIi0s)=v1M+QKv@H2iZTa(1ASD&4DPw(48bd51qB7m5SzpU)_(wGz<&dgIHd)l z=Y`>Iq(Mn+>{NEF3==3%guN^ejRctRy|2py!ca31t&B>WjOP6bc-Skw0GYEnN%4Yf z=PaSF&K+P7&VdYhPK?8w{NL08X6h~ zFCaS8>Gqf`*zms)P)mmB43RbwPrvo~lTuP|<7FMCK(P*~7gR|25@_6MJJTQs3PE`) zl)^ncJT|xH3b1qe)rEsjl;P2}L`oK9Q@notT5sGGG}URK^Q92m0GVK5VL{aAlol8c zNFtFzf!V!zSrg$iXJ8CowX?GeUVwlmDUj`_gZW;~*6e3Ut1-H5A!z~|Mi{j}Ki`dn zM|1~T)=t0$S1sVQS+CCzf`orEF<{YS3?{~l_Mon2fM6jG5d+b}TC1k#5Ma^%At#sU zrr`ZME&TUDk>E=n*)~Gp_Cm#NNJ@esiv&MSHNO;uUIqH_rUr)yGth@qKm?wBw}2lg zk;?l!WXQvM1~2mF_3NO>$S%eG>-ztuMmRE-w}SN|B5#JcD9Z52TB2f#G_jEqNJt!v zdHwn#2zP^b&CJXoI0xHHc^?(k1Y?{_#_kZzx0GQ4fXN_X<`T%yA-%%__<_I(B{v^; zH8gboKG*yC7_{W+bLXA|w{Q9D5#8=;FIVVk&$66KEFJRFJr z1)Fypcy`)FG!5g3?vF}$YmkOt?$5tBSm7!F9JzCgQW4rqW3}X%1Q~mE_@CKkwHMTO zNHj1#fWK#VMI^y?GTWp= z49S=RQ^dqXUKoT-yi+bjfDXcAlAwtkRJn9|?|_yK`tr zA^|+IMKMP0-Y86;5NvgSk09u!>e{&pX+`#f#b;o?+wHf$w^dVAbxhNK1tOWa!3>}o zj8t79BdQTn@G^iv>Hyh%hWCt%cw`;kvmZWe1zgY8r_ks3zjbuTz-+d@IO?bsD^YJ) z;gW*IejliGPp9H?tyvB$ za-VA6NzR3dq8NEtNNQ^wD1H#}y$*vBJa?{50kQaS1gx*!Zmb4dGw!A5=~)iAZjn_JBNCn_g9HIWlwKDyx4ncE zCN7O|*0Rla9Aiyi5}>4-dUK6m5=NpuuYwy6dSCMQ4_BDdfpmM-z`$V7v2w}>eN|KQ zIs2hQ7Fx;5ltg0niVs>9I?^9#by?)?H#axAoQFy!!TRCBqZ>`E3QJvJJqhjmVqm~9 z9hSnYhK8{db90VA^Y0CNuYSMw68PATOyYEq5%U?z8EkB6Y58P|Eq0&FtKflQfhSMO!DFZ7?snXhgdb>g@$#XX^+*o z(k%^XHi#5UhtYcV`t_$1M53*XT{q4fA+$e9{V@yeZDaEhDk-*f^-x9tUn`J6yeX(N z6tmtm@O33ft8V=kY$Ol}*L8GMiIjZ*vBXHc1atcJ1TG}yB;)dT70~PdFNNcOulD|5 l%IE)CD*oSGJhM;5UP`SN@`?5pWQd|}T+z9luWs@9zX5rl2IT+% diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index b9a4be8ce..f92ed9419 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -15,5 +15,5 @@ def test_arima_model(snapshot_png: SnapshotAssertion) -> None: predictions = trained_model.predict(test_ts) print(predictions) assert snapshot_png == trained_model.plot_predictions(test_ts) - assert False + From efb5074d97822c5092d7936c289d945e4d5cd1cf Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 13:44:59 +0100 Subject: [PATCH 08/60] updated test --- .../test_arimaModel/test_arima_model.png | Bin 0 -> 29802 bytes .../ml/classical/regression/test_arimaModel.py | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arima_model.png diff --git a/tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arima_model.png b/tests/safeds/ml/classical/regression/__snapshots__/test_arimaModel/test_arima_model.png new file mode 100644 index 0000000000000000000000000000000000000000..02794222157615a1a458f6d867e28d9bdd00f27e GIT binary patch literal 29802 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 literal 0 HcmV?d00001 diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index f92ed9419..c706125eb 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -3,17 +3,21 @@ from safeds.data.tabular.containers import TimeSeries, Table from syrupy import SnapshotAssertion import numpy as np +import os + +from tests.helpers import resolve_resource_path def test_arima_model(snapshot_png: SnapshotAssertion) -> None: # Create a DataFrame + _inflation_path = "_datas/US_Inflation_rates.csv" np.random.seed(42) - time_series = TimeSeries.timeseries_from_csv_file("C:/Users/ettel/PycharmProjects/Library/tests/resources/_datas/US_Inflation_rates.csv", target_name= "value", time_name="date") + time_series = TimeSeries.timeseries_from_csv_file(path=resolve_resource_path(_inflation_path), target_name= "value", time_name="date") train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() trained_model = model.fit(train_ts) predictions = trained_model.predict(test_ts) + print(os.getcwd) print(predictions) assert snapshot_png == trained_model.plot_predictions(test_ts) - From f4ec286c2199c220b5b17c730efe085ac711e63e Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 14:15:12 +0100 Subject: [PATCH 09/60] added test for timeseries_from_csv --- .../test_timeseries_from_csv_file.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py diff --git a/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py b/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py new file mode 100644 index 000000000..2b6d11512 --- /dev/null +++ b/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py @@ -0,0 +1,59 @@ +from pathlib import Path + +import pytest +from safeds.data.tabular.containers import TimeSeries +from safeds.exceptions import WrongFileExtensionError + +from tests.helpers import resolve_resource_path + + +@pytest.mark.parametrize( + ("path", "expected"), + [ + ("table.csv", TimeSeries({"A": [1], "B": [2]}, time_name="A", target_name="B"),), + (Path("table.csv"), TimeSeries({"A": [1], "B": [2]}, time_name="A", target_name="B")), + ], + ids=["by String", "by path"], +) +def test_should_create_table_from_csv_file(path: str | Path, expected: TimeSeries) -> None: + table = TimeSeries.timeseries_from_csv_file(resolve_resource_path(path), time_name="A", target_name="B") + assert table.schema == expected.schema + assert table == expected + + +@pytest.mark.parametrize( + ("path", "expected_error_message"), + [ + ("test_table_from_csv_file_invalid.csv", r"test_table_from_csv_file_invalid.csv\" does not exist"), + (Path("test_table_from_csv_file_invalid.csv"), r"test_table_from_csv_file_invalid.csv\" does not exist"), + ], + ids=["by String", "by path"], +) +def test_should_raise_error_if_file_not_found(path: str | Path, expected_error_message: str) -> None: + with pytest.raises(FileNotFoundError, match=expected_error_message): + TimeSeries.timeseries_from_csv_file(resolve_resource_path(path), time_name="A", target_name="B") + + +@pytest.mark.parametrize( + ("path", "expected_error_message"), + [ + ( + "invalid_file_extension.file_extension", + ( + r"invalid_file_extension.file_extension has a wrong file extension. Please provide a file with the" + r" following extension\(s\): .csv" + ), + ), + ( + Path("invalid_file_extension.file_extension"), + ( + r"invalid_file_extension.file_extension has a wrong file extension. Please provide a file with the" + r" following extension\(s\): .csv" + ), + ), + ], + ids=["by String", "by path"], +) +def test_should_raise_error_if_wrong_file_extension(path: str | Path, expected_error_message: str) -> None: + with pytest.raises(WrongFileExtensionError, match=expected_error_message): + TimeSeries.timeseries_from_csv_file(resolve_resource_path(path), time_name="A", target_name="B") From 1fb3f7c532ed28b120216d2725241544895bb9cb Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 14:22:45 +0100 Subject: [PATCH 10/60] updated test --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 51bdc3eb0..4f8b41358 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1207,7 +1207,7 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries Examples -------- >>> from safeds.data.tabular.containers import Table - >>> table = TimeSeries({"time":[0, 1, 2, 3, 4]"temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}) + >>> table = TimeSeries({"time":[0, 1, 2, 3, 4]"temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}, time_name="time", target_name="sales") >>> slices = table.split_rows(0.4) >>> slices[0] time temperature sales From ccd52e9ce9c475a23210cfe61b51cb9014b0d1f6 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 14:28:22 +0100 Subject: [PATCH 11/60] updated test --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 4f8b41358..8d3d7cb1a 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1207,7 +1207,7 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries Examples -------- >>> from safeds.data.tabular.containers import Table - >>> table = TimeSeries({"time":[0, 1, 2, 3, 4]"temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}, time_name="time", target_name="sales") + >>> table = TimeSeries({"time":[0, 1, 2, 3, 4], "temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}, time_name="time", target_name="sales") >>> slices = table.split_rows(0.4) >>> slices[0] time temperature sales From 451145fd88245a240be83c59f54387ebbfc48326 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 14:37:41 +0100 Subject: [PATCH 12/60] updated test --- .../data/tabular/containers/_time_series.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 8d3d7cb1a..5063eb3b1 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -71,13 +71,6 @@ def timeseries_from_csv_file(path: str | Path, WrongFileExtensionError If the file is not a csv file. - Examples - -------- - >>> from safeds.data.tabular.containers import Table - >>> TimeSeries.timeseries_from_csv_file('./src/resources/from_csv_file.csv') - a b c - 0 1 2 1 - 1 0 0 7 """ return TimeSeries._from_table( Table.from_csv_file(path=path), @@ -1211,13 +1204,13 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries >>> slices = table.split_rows(0.4) >>> slices[0] time temperature sales - 0 0 10 54 - 1 1 15 74 + 0 0 10 54 + 1 1 15 74 >>> slices[1] time temperature sales - 0 2 20 90 - 1 3 25 206 - 2 4 30 210 + 0 2 20 90 + 1 3 25 206 + 2 4 30 210 """ temp = self._as_table() t1, t2 = temp.split_rows(percentage_in_first=percentage_in_first) From 0fe552737f767f6f00bf498a16ab137981fe4b5d Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 20 Mar 2024 16:25:49 +0100 Subject: [PATCH 13/60] saved files for now --- src/safeds/exceptions/_ml.py | 12 ++++ src/safeds/ml/classical/regression/_arima.py | 56 ++++++++++++++++--- .../classical/regression/test_arimaModel.py | 37 +++++++++++- 3 files changed, 96 insertions(+), 9 deletions(-) diff --git a/src/safeds/exceptions/_ml.py b/src/safeds/exceptions/_ml.py index 1cc83ebc0..933d52a75 100644 --- a/src/safeds/exceptions/_ml.py +++ b/src/safeds/exceptions/_ml.py @@ -78,3 +78,15 @@ def __init__(self) -> None: " features and which are the target to predict.\nUse Table.tag_column() to create a tagged table." ), ) + + +class NonTimeSeriesError(Exception): + """Raised when a table is used instead of a TimeSeries in a regression or classification.""" + + def __init__(self) -> None: + super().__init__( + ( + "This method needs a time series.\nA time series is a table that additionally knows which columns are" + " time and which are the target to predict.\n" + ), + ) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 72bfbc2bb..88d4e8d33 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -13,7 +13,7 @@ from safeds.data.tabular.containers import TimeSeries from safeds.exceptions import ( ModelNotFittedError, - PredictionError + PredictionError, DatasetMissesDataError, NonNumericColumnError, MissingValuesColumnError, LearningError ) @@ -46,8 +46,8 @@ def fit(self, time_series: TimeSeries): ------ LearningError If the training data contains invalid values or if the training failed. - UntaggedTableError - If the table is untagged. + NonTimeSeriesError + If the table is not a TimeSeries object. NonNumericColumnError If the training data contains non-numerical values. MissingValuesColumnError @@ -55,6 +55,20 @@ def fit(self, time_series: TimeSeries): DatasetMissesDataError If the training data contains no rows. """ + + if time_series.number_of_rows == 0: + raise DatasetMissesDataError + if not time_series.target.type.is_numeric(): + raise NonNumericColumnError( + time_series.target.name, "The target Column of your time series contains non-numerical values." + ) + if time_series.target.has_missing_values(): + raise MissingValuesColumnError( + time_series.target.name, + "You can use the Imputer to replace the missing values based on different strategies.\nIf you want to" + "remove the missing values entirely you can use the method " + "`TimeSeries.remove_rows_with_missing_values`.", + ) fitted_arima = ArimaModel() p = d = q = range(0, 2) pdq = list(itertools.product(p, d, q)) @@ -64,7 +78,10 @@ def fit(self, time_series: TimeSeries): for param in pdq: # Create and fit an ARIMA model with the current parameters mod = ARIMA(time_series.target._data.values, order=param) - result = mod.fit() + try: + result = mod.fit() + except ValueError as exception: + raise LearningError(str(exception)) from exception # Compare the current model's AIC with the best AIC so far if result.aic < best_aic: @@ -84,7 +101,7 @@ def predict(self, time_series: TimeSeries): Parameters ---------- time_series : TimeSeries - The time series containing the target vector. + The time series where the target column contains the predicted values. Returns ------- @@ -95,12 +112,33 @@ def predict(self, time_series: TimeSeries): ------ ModelNotFittedError If the model has not been fitted yet. + DatasetContainsTargetError + If the dataset contains the target column already. PredictionError If predicting with the given dataset failed. - """ + MissingValuesColumnError + If the dataset contains missing values. + DatasetMissesDataError + If the dataset contains no rows. + """ if not self.is_fitted(): raise ModelNotFittedError + if time_series.number_of_rows == 0: + raise DatasetMissesDataError + if not time_series.target.type.is_numeric(): + raise NonNumericColumnError( + time_series.target.name, "The target Column of your time series contains non-numerical values." + ) + if time_series.target.has_missing_values(): + raise MissingValuesColumnError( + time_series.target.name, + "You can use the Imputer to replace the missing values based on different strategies.\nIf you want to" + "remove the missing values entirely you can use the method " + "`TimeSeries.remove_rows_with_missing_values`.", + ) + table = time_series._as_table() + table = table.remove_columns([time_series.time.name]) test_data = time_series.target._data.to_numpy() n_steps = len(test_data) try: @@ -109,10 +147,10 @@ def predict(self, time_series: TimeSeries): raise PredictionError # create new TimeSeries - result = time_series.add_column(Column(name="forecasted", data = forecast_results)) + result = time_series._from_table(table.add_column(Column(name=time_series.target.name, data=forecast_results))) return result - def plot_predictions(self, time_series: TimeSeries)-> Image: + def plot_predictions(self, time_series: TimeSeries) -> Image: """ Plot the predictions of the given time series target Parameters @@ -133,6 +171,8 @@ def plot_predictions(self, time_series: TimeSeries)-> Image: If predicting with the given dataset failed. """ + if not self.is_fitted(): + raise ModelNotFittedError test_data = time_series.target._data.values n_steps = len(test_data) forecast_results = self._arima.forecast(steps=n_steps) diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index c706125eb..687071b3b 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -12,7 +12,8 @@ def test_arima_model(snapshot_png: SnapshotAssertion) -> None: # Create a DataFrame _inflation_path = "_datas/US_Inflation_rates.csv" np.random.seed(42) - time_series = TimeSeries.timeseries_from_csv_file(path=resolve_resource_path(_inflation_path), target_name= "value", time_name="date") + time_series = TimeSeries.timeseries_from_csv_file(path=resolve_resource_path(_inflation_path), target_name="value", + time_name="date") train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() trained_model = model.fit(train_ts) @@ -21,3 +22,37 @@ def test_arima_model(snapshot_png: SnapshotAssertion) -> None: print(predictions) assert snapshot_png == trained_model.plot_predictions(test_ts) + +def create_test_data() -> TimeSeries: + return TimeSeries({"time": [1, 2, 3, 4, 5, 6, 7, 8, 9], "value": [1, 2, 3, 4, 5, 6, 7, 8, 9]}, + time_name="time", target_name="value") + + +def test_should_succeed_on_valid_data() -> None: + valid_data = create_test_data() + model = ArimaModel() + model.fit(valid_data) + assert True + + +def test_should_succeed_on_valid_data_plot() -> None: + valid_data = create_test_data() + model = ArimaModel() + fitted_model = model.fit(valid_data) + fitted_model.plot_predictions(valid_data) + assert True + + +def test_should_not_change_input_regressor() -> None: + valid_data = create_test_data() + model = ArimaModel() + model.fit(valid_data) + assert not model.is_fitted() + + +def test_should_not_change_input_table() -> None: + valid_data = create_test_data() + valid_data_copy = create_test_data() + model = ArimaModel() + model.fit(valid_data) + assert valid_data_copy == valid_data From 80dee606280038a94ceb4772e820a100e2ffaa55 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 14:04:10 +0100 Subject: [PATCH 14/60] saved files for now --- src/safeds/exceptions/__init__.py | 2 + src/safeds/exceptions/_data.py | 2 + src/safeds/ml/classical/regression/_arima.py | 66 ++++----- .../classical/regression/test_arimaModel.py | 131 ++++++++++++++++-- 4 files changed, 152 insertions(+), 49 deletions(-) diff --git a/src/safeds/exceptions/__init__.py b/src/safeds/exceptions/__init__.py index ca193270b..d51f8fd43 100644 --- a/src/safeds/exceptions/__init__.py +++ b/src/safeds/exceptions/__init__.py @@ -30,6 +30,7 @@ ModelNotFittedError, PredictionError, UntaggedTableError, + NonTimeSeriesError, ) __all__ = [ @@ -58,6 +59,7 @@ "ModelNotFittedError", "PredictionError", "UntaggedTableError", + "NonTimeSeriesError", # Other "Bound", "ClosedBound", diff --git a/src/safeds/exceptions/_data.py b/src/safeds/exceptions/_data.py index a1318d8b7..c75b8f0da 100644 --- a/src/safeds/exceptions/_data.py +++ b/src/safeds/exceptions/_data.py @@ -162,3 +162,5 @@ class IllegalFormatError(Exception): def __init__(self, formats: list[str] | str) -> None: super().__init__(f"This format is illegal. Use one of the following formats: {formats}") + + diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 88d4e8d33..14d1da349 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -1,3 +1,4 @@ +import pandas as pd from statsmodels.tsa.arima.model import ARIMA import io @@ -5,7 +6,7 @@ import itertools import matplotlib.pyplot as plt -from safeds.data.tabular.containers import TimeSeries, Column +from safeds.data.tabular.containers import TimeSeries, Column, Table from safeds.data.image.containers import Image if TYPE_CHECKING: @@ -13,7 +14,12 @@ from safeds.data.tabular.containers import TimeSeries from safeds.exceptions import ( ModelNotFittedError, - PredictionError, DatasetMissesDataError, NonNumericColumnError, MissingValuesColumnError, LearningError + PredictionError, + DatasetMissesDataError, + NonNumericColumnError, + MissingValuesColumnError, + LearningError, + NonTimeSeriesError, ) @@ -34,8 +40,8 @@ def fit(self, time_series: TimeSeries): Parameters ---------- - training_set : TimeSeries - The training data containing the feature and target vectors. + time_series : TimeSeries + The time series containing the target column, which will be used. Returns ------- @@ -55,12 +61,13 @@ def fit(self, time_series: TimeSeries): DatasetMissesDataError If the training data contains no rows. """ - + if not isinstance(time_series, TimeSeries) and isinstance(time_series, Table): + raise NonTimeSeriesError if time_series.number_of_rows == 0: raise DatasetMissesDataError if not time_series.target.type.is_numeric(): raise NonNumericColumnError( - time_series.target.name, "The target Column of your time series contains non-numerical values." + time_series.target.name ) if time_series.target.has_missing_values(): raise MissingValuesColumnError( @@ -94,61 +101,46 @@ def fit(self, time_series: TimeSeries): fitted_arima._fitted = True return fitted_arima - def predict(self, time_series: TimeSeries): + def predict(self, forecast_horizon: int): """ Predict a target vector using a time series target column. The model has to be trained first. Parameters ---------- - time_series : TimeSeries - The time series where the target column contains the predicted values. + forecast_horizon : TimeSeries + The forecast horizon for the predicted value. Returns ------- table : TimeSeries - A timeseries containing the old time series vectors and the predicted target vector. + A timeseries containing the predicted target vector and a time dummy as time column. Raises ------ ModelNotFittedError If the model has not been fitted yet. - DatasetContainsTargetError - If the dataset contains the target column already. + IndexError + If the forecast horizon is not greater than zero. PredictionError If predicting with the given dataset failed. - MissingValuesColumnError - If the dataset contains missing values. - DatasetMissesDataError - If the dataset contains no rows. """ + #Validation + if forecast_horizon <= 0: + raise IndexError("forecast_horizon must be greater 0") if not self.is_fitted(): raise ModelNotFittedError - if time_series.number_of_rows == 0: - raise DatasetMissesDataError - if not time_series.target.type.is_numeric(): - raise NonNumericColumnError( - time_series.target.name, "The target Column of your time series contains non-numerical values." - ) - if time_series.target.has_missing_values(): - raise MissingValuesColumnError( - time_series.target.name, - "You can use the Imputer to replace the missing values based on different strategies.\nIf you want to" - "remove the missing values entirely you can use the method " - "`TimeSeries.remove_rows_with_missing_values`.", - ) - table = time_series._as_table() - table = table.remove_columns([time_series.time.name]) - test_data = time_series.target._data.to_numpy() - n_steps = len(test_data) try: - forecast_results = self._arima.forecast(steps=n_steps) + forecast_results = self._arima.forecast(steps=forecast_horizon) except any: raise PredictionError - + target_column = Column(name="target", data=forecast_results) + time_column = Column(name="time", data= pd.Series(range(0, forecast_horizon), name="time")) # create new TimeSeries - result = time_series._from_table(table.add_column(Column(name=time_series.target.name, data=forecast_results))) - return result + result = Table() + result = result.add_column(target_column) + result = result.add_column(time_column) + return TimeSeries._from_table(result, time_name="time", target_name="target") def plot_predictions(self, time_series: TimeSeries) -> Image: """ diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arimaModel.py index 687071b3b..ff6f20a96 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arimaModel.py @@ -1,11 +1,20 @@ import pytest from safeds.ml.classical.regression import ArimaModel from safeds.data.tabular.containers import TimeSeries, Table +from typing import TYPE_CHECKING, Any from syrupy import SnapshotAssertion import numpy as np import os from tests.helpers import resolve_resource_path +from safeds.exceptions import ( + NonTimeSeriesError, + DatasetMissesDataError, + MissingValuesColumnError, + NonNumericColumnError, + ModelNotFittedError, + +) def test_arima_model(snapshot_png: SnapshotAssertion) -> None: @@ -17,10 +26,9 @@ def test_arima_model(snapshot_png: SnapshotAssertion) -> None: train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() trained_model = model.fit(train_ts) - predictions = trained_model.predict(test_ts) - print(os.getcwd) - print(predictions) - assert snapshot_png == trained_model.plot_predictions(test_ts) + trained_model.plot_predictions(test_ts) + # suggest it ran through + assert True def create_test_data() -> TimeSeries: @@ -35,14 +43,6 @@ def test_should_succeed_on_valid_data() -> None: assert True -def test_should_succeed_on_valid_data_plot() -> None: - valid_data = create_test_data() - model = ArimaModel() - fitted_model = model.fit(valid_data) - fitted_model.plot_predictions(valid_data) - assert True - - def test_should_not_change_input_regressor() -> None: valid_data = create_test_data() model = ArimaModel() @@ -56,3 +56,110 @@ def test_should_not_change_input_table() -> None: model = ArimaModel() model.fit(valid_data) assert valid_data_copy == valid_data + + +def test_should_succeed_on_valid_data_plot() -> None: + valid_data = create_test_data() + model = ArimaModel() + fitted_model = model.fit(valid_data) + fitted_model.plot_predictions(valid_data) + assert True + + +@pytest.mark.parametrize( + ("invalid_data", "expected_error", "expected_error_msg"), + [ + ( + Table( + { + "id": [1, 4], + "feat1": [1, 5], + "feat2": [3, 6], + "target": ["0", 1], + }, + ).time_columns(target_name="target", feature_names=["feat1", "feat2"], time_name="id"), + NonNumericColumnError, + r'Tried to do a numerical operation on one or multiple non-numerical columns: \ntarget', + ), + ( + Table( + { + "id": [1, 4], + "feat1": [1, 5], + "feat2": [3, 6], + "target": [None, 1], + }, + ).time_columns(target_name="target", feature_names=["feat1", "feat2"], time_name="id"), + MissingValuesColumnError, + r'Tried to do an operation on one or multiple columns containing missing values: \ntarget\nYou can use the Imputer to replace the missing values based on different strategies.\nIf you want toremove the missing values entirely you can use the method `TimeSeries.remove_rows_with_missing_values`.', + ), + ( + Table( + { + "id": [], + "feat1": [], + "feat2": [], + "target": [], + }, + ).time_columns(target_name="target", feature_names=["feat1", "feat2"], time_name="id"), + DatasetMissesDataError, + r"Dataset contains no rows", + ), + ], + ids=["non-numerical data", "missing values in data", "no rows in data"], +) +def test_should_raise_on_invalid_data( + invalid_data: TimeSeries, + expected_error: Any, + expected_error_msg: str, +) -> None: + with pytest.raises(expected_error, match=expected_error_msg): + model = ArimaModel() + model.fit(invalid_data) + + +@pytest.mark.parametrize( + "table", + [ + Table( + { + "a": [1.0, 0.0, 0.0, 0.0], + "b": [0.0, 1.0, 1.0, 0.0], + "c": [0.0, 0.0, 0.0, 1.0], + }, + ), + ], + ids=["untagged_table"], +) +def test_should_raise_if_table_is_not_tagged(table: Table) -> None: + with pytest.raises(NonTimeSeriesError): + model = ArimaModel() + model.fit(table) # type: ignore[arg-type] + + +def test_correct_structure_of_time_series() -> None: + data = create_test_data() + model = ArimaModel() + model = model.fit(data) + predics_ts = model.predict(5) + assert len(predics_ts.time) == 5 + assert len(predics_ts.target) == 5 + assert predics_ts.time.name == "time" + assert predics_ts.target.name == "target" + + +def test_should_raise_if_not_fitted() -> None: + model = ArimaModel() + with pytest.raises(ModelNotFittedError): + model.predict(forecast_horizon=5) + + +def test_if_fitted_not_fitted() -> None: + model = ArimaModel() + assert not model.is_fitted() + + +def test_if_fitted_fitted() -> None: + model = ArimaModel() + model = model.fit(create_test_data()) + assert model.is_fitted() From 6b2e4346e55864cdbe288e4f9344f0ecfb0d3399 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 15:10:51 +0100 Subject: [PATCH 15/60] fixed linter changes --- src/safeds/data/tabular/containers/_time_series.py | 2 +- src/safeds/ml/classical/regression/_arima.py | 10 +++++----- .../{test_arimaModel.py => test_arima_model.py} | 7 +++---- 3 files changed, 9 insertions(+), 10 deletions(-) rename tests/safeds/ml/classical/regression/{test_arimaModel.py => test_arima_model.py} (97%) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 5063eb3b1..2cd7feda9 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -5,7 +5,6 @@ from typing import TYPE_CHECKING import matplotlib.pyplot as plt -from pathlib import Path import pandas as pd import seaborn as sns import xxhash @@ -27,6 +26,7 @@ if TYPE_CHECKING: from collections.abc import Callable, Mapping, Sequence from typing import Any + from pathlib import Path class TimeSeries(Table): diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 14d1da349..e3d69a945 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -11,7 +11,6 @@ if TYPE_CHECKING: from sklearn.base import RegressorMixin - from safeds.data.tabular.containers import TimeSeries from safeds.exceptions import ( ModelNotFittedError, PredictionError, @@ -132,8 +131,8 @@ def predict(self, forecast_horizon: int): try: forecast_results = self._arima.forecast(steps=forecast_horizon) - except any: - raise PredictionError + except any as exception: + raise PredictionError(str(exception)) from exception target_column = Column(name="target", data=forecast_results) time_column = Column(name="time", data= pd.Series(range(0, forecast_horizon), name="time")) # create new TimeSeries @@ -144,7 +143,8 @@ def predict(self, forecast_horizon: int): def plot_predictions(self, time_series: TimeSeries) -> Image: """ - Plot the predictions of the given time series target + Plot the predictions of the given time series target. + Parameters ---------- time_series : TimeSeries @@ -165,7 +165,7 @@ def plot_predictions(self, time_series: TimeSeries) -> Image: """ if not self.is_fitted(): raise ModelNotFittedError - test_data = time_series.target._data.values + test_data = time_series.target._data.to_numpy() n_steps = len(test_data) forecast_results = self._arima.forecast(steps=n_steps) diff --git a/tests/safeds/ml/classical/regression/test_arimaModel.py b/tests/safeds/ml/classical/regression/test_arima_model.py similarity index 97% rename from tests/safeds/ml/classical/regression/test_arimaModel.py rename to tests/safeds/ml/classical/regression/test_arima_model.py index ff6f20a96..a02a3438d 100644 --- a/tests/safeds/ml/classical/regression/test_arimaModel.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -17,10 +17,9 @@ ) -def test_arima_model(snapshot_png: SnapshotAssertion) -> None: +def test_arima_model() -> None: # Create a DataFrame _inflation_path = "_datas/US_Inflation_rates.csv" - np.random.seed(42) time_series = TimeSeries.timeseries_from_csv_file(path=resolve_resource_path(_inflation_path), target_name="value", time_name="date") train_ts, test_ts = time_series.split_rows(0.8) @@ -113,8 +112,8 @@ def test_should_raise_on_invalid_data( expected_error: Any, expected_error_msg: str, ) -> None: + model = ArimaModel() with pytest.raises(expected_error, match=expected_error_msg): - model = ArimaModel() model.fit(invalid_data) @@ -132,8 +131,8 @@ def test_should_raise_on_invalid_data( ids=["untagged_table"], ) def test_should_raise_if_table_is_not_tagged(table: Table) -> None: + model = ArimaModel() with pytest.raises(NonTimeSeriesError): - model = ArimaModel() model.fit(table) # type: ignore[arg-type] From 410f1427ea3b4da3ef1edb077f8ad26a50d42cc5 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 15:13:51 +0100 Subject: [PATCH 16/60] fixed linter changes --- .../data/tabular/containers/_time_series/test_split_rows.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py b/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py index 3cd753061..26e7c5b75 100644 --- a/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py +++ b/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py @@ -37,7 +37,6 @@ def test_should_split_table( percentage_in_first: int, ) -> None: train_table, test_table = table.split_rows(percentage_in_first) - print(result_test_table.time._data) assert result_test_table == test_table assert result_train_table.schema == train_table.schema assert result_train_table == train_table From ffcfdb2b11ec692ad6f169d5c36ec48b66423f09 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 15:37:21 +0100 Subject: [PATCH 17/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index e3d69a945..fdbbb214d 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -2,7 +2,7 @@ from statsmodels.tsa.arima.model import ARIMA import io -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Tuple, Optional import itertools import matplotlib.pyplot as plt @@ -27,11 +27,11 @@ class ArimaModel: def __init__(self) -> None: # Internal state - self._arima = None + self._arima: ARIMA | None = None self._order = None self._fitted = False - def fit(self, time_series: TimeSeries): + def fit(self, time_series: TimeSeries) -> TimeSeries: """ Create a copy of this ARIMA Model and fit it with the given training data. @@ -80,7 +80,7 @@ def fit(self, time_series: TimeSeries): pdq = list(itertools.product(p, d, q)) best_aic = float("inf") best_model = None - best_param = None + best_param: Optional[Tuple[int, int, int]] = None for param in pdq: # Create and fit an ARIMA model with the current parameters mod = ARIMA(time_series.target._data.values, order=param) @@ -100,7 +100,7 @@ def fit(self, time_series: TimeSeries): fitted_arima._fitted = True return fitted_arima - def predict(self, forecast_horizon: int): + def predict(self, forecast_horizon: int) -> TimeSeries: """ Predict a target vector using a time series target column. The model has to be trained first. @@ -131,10 +131,10 @@ def predict(self, forecast_horizon: int): try: forecast_results = self._arima.forecast(steps=forecast_horizon) - except any as exception: + except ValueError as exception: raise PredictionError(str(exception)) from exception - target_column = Column(name="target", data=forecast_results) - time_column = Column(name="time", data= pd.Series(range(0, forecast_horizon), name="time")) + target_column: Column = Column(name="target", data=forecast_results) + time_column: Column = Column(name="time", data= pd.Series(range(0, forecast_horizon), name="time")) # create new TimeSeries result = Table() result = result.add_column(target_column) From 23e2accf6e0f38065d359c5c24de66554f7b9572 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 15:48:19 +0100 Subject: [PATCH 18/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index fdbbb214d..8ab3822bf 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import pandas as pd from statsmodels.tsa.arima.model import ARIMA import io -from typing import TYPE_CHECKING, Tuple, Optional +from typing import TYPE_CHECKING, Optional import itertools import matplotlib.pyplot as plt @@ -31,7 +33,7 @@ def __init__(self) -> None: self._order = None self._fitted = False - def fit(self, time_series: TimeSeries) -> TimeSeries: + def fit(self, time_series: TimeSeries) -> ArimaModel: """ Create a copy of this ARIMA Model and fit it with the given training data. @@ -80,7 +82,7 @@ def fit(self, time_series: TimeSeries) -> TimeSeries: pdq = list(itertools.product(p, d, q)) best_aic = float("inf") best_model = None - best_param: Optional[Tuple[int, int, int]] = None + best_param: Optional[tuple[int, int, int]] = None for param in pdq: # Create and fit an ARIMA model with the current parameters mod = ARIMA(time_series.target._data.values, order=param) @@ -123,7 +125,7 @@ def predict(self, forecast_horizon: int) -> TimeSeries: PredictionError If predicting with the given dataset failed. """ - #Validation + # Validation if forecast_horizon <= 0: raise IndexError("forecast_horizon must be greater 0") if not self.is_fitted(): @@ -134,7 +136,7 @@ def predict(self, forecast_horizon: int) -> TimeSeries: except ValueError as exception: raise PredictionError(str(exception)) from exception target_column: Column = Column(name="target", data=forecast_results) - time_column: Column = Column(name="time", data= pd.Series(range(0, forecast_horizon), name="time")) + time_column: Column = Column(name="time", data=pd.Series(range(0, forecast_horizon), name="time")) # create new TimeSeries result = Table() result = result.add_column(target_column) From 86bc0c915f6bf486985144140af6eab4a209c0bd Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 15:59:23 +0100 Subject: [PATCH 19/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 8ab3822bf..ea7a223cf 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -82,7 +82,8 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: pdq = list(itertools.product(p, d, q)) best_aic = float("inf") best_model = None - best_param: Optional[tuple[int, int, int]] = None + # best param will get overwritten + best_param = (-1, -1, -1) for param in pdq: # Create and fit an ARIMA model with the current parameters mod = ARIMA(time_series.target._data.values, order=param) @@ -130,6 +131,8 @@ def predict(self, forecast_horizon: int) -> TimeSeries: raise IndexError("forecast_horizon must be greater 0") if not self.is_fitted(): raise ModelNotFittedError + if self._arima is None: + raise ModelNotFittedError try: forecast_results = self._arima.forecast(steps=forecast_horizon) From d3d881b1ec0c6a30163137ad05483b205984aa32 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 16:03:02 +0100 Subject: [PATCH 20/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index ea7a223cf..8bb8a1381 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -83,7 +83,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: best_aic = float("inf") best_model = None # best param will get overwritten - best_param = (-1, -1, -1) + best_param = (0, 0, 0) for param in pdq: # Create and fit an ARIMA model with the current parameters mod = ARIMA(time_series.target._data.values, order=param) @@ -170,6 +170,8 @@ def plot_predictions(self, time_series: TimeSeries) -> Image: """ if not self.is_fitted(): raise ModelNotFittedError + if self._arima is None: + raise ModelNotFittedError test_data = time_series.target._data.to_numpy() n_steps = len(test_data) forecast_results = self._arima.forecast(steps=n_steps) From bc4d99d2077703c6c0d0fb6e3e9ff483a9d86520 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 25 Mar 2024 16:07:49 +0100 Subject: [PATCH 21/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 8bb8a1381..d2fed04f8 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -30,7 +30,7 @@ class ArimaModel: def __init__(self) -> None: # Internal state self._arima: ARIMA | None = None - self._order = None + self._order: tuple[int, int, int] | None = None self._fitted = False def fit(self, time_series: TimeSeries) -> ArimaModel: From add42a98d2668cdd73eeb3e5a62d9ffa5948c759 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:09:26 +0000 Subject: [PATCH 22/60] style: apply automated linter fixes --- .../data/tabular/containers/_time_series.py | 42 ++++++----- src/safeds/exceptions/__init__.py | 2 +- src/safeds/exceptions/_data.py | 2 - .../ml/classical/regression/__init__.py | 2 +- src/safeds/ml/classical/regression/_arima.py | 72 +++++++++---------- .../_time_series/test_split_rows.py | 18 +++-- .../test_timeseries_from_csv_file.py | 5 +- .../classical/regression/test_arima_model.py | 35 ++++----- 8 files changed, 90 insertions(+), 88 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 2cd7feda9..3fd17b407 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -11,22 +11,18 @@ from safeds.data.image.containers import Image from safeds.data.tabular.containers import Column, Row, Table, TaggedTable -from safeds.data.tabular.typing import ColumnType -from safeds.data.tabular.typing import Schema from safeds.exceptions import ( ColumnIsTargetError, ColumnIsTimeError, IllegalSchemaModificationError, NonNumericColumnError, UnknownColumnNameError, - WrongFileExtensionError, - IndexOutOfBoundsError, ) if TYPE_CHECKING: from collections.abc import Callable, Mapping, Sequence - from typing import Any from pathlib import Path + from typing import Any class TimeSeries(Table): @@ -36,11 +32,12 @@ class TimeSeries(Table): # ------------------------------------------------------------------------------------------------------------------ @staticmethod - def timeseries_from_csv_file(path: str | Path, - target_name: str, - time_name: str, - feature_names: list[str] | None = None, - ) -> TimeSeries: + def timeseries_from_csv_file( + path: str | Path, + target_name: str, + time_name: str, + feature_names: list[str] | None = None, + ) -> TimeSeries: """ Read data from a CSV file into a table. @@ -73,10 +70,7 @@ def timeseries_from_csv_file(path: str | Path, """ return TimeSeries._from_table( - Table.from_csv_file(path=path), - target_name=target_name, - time_name=time_name, - feature_names=feature_names + Table.from_csv_file(path=path), target_name=target_name, time_name=time_name, feature_names=feature_names, ) @staticmethod @@ -459,7 +453,7 @@ def add_columns_as_features(self, columns: list[Column] | Table) -> TimeSeries: time_name=self.time.name, target_name=self._target.name, feature_names=self._feature_names - + [col.name for col in (columns.to_columns() if isinstance(columns, Table) else columns)], + + [col.name for col in (columns.to_columns() if isinstance(columns, Table) else columns)], ) def add_columns(self, columns: list[Column] | Table) -> TimeSeries: @@ -880,8 +874,8 @@ def replace_column(self, old_column_name: str, new_columns: list[Column]) -> Tim self._feature_names if old_column_name not in self._feature_names else self._feature_names[: self._feature_names.index(old_column_name)] - + [col.name for col in new_columns] - + self._feature_names[self._feature_names.index(old_column_name) + 1:] + + [col.name for col in new_columns] + + self._feature_names[self._feature_names.index(old_column_name) + 1 :] ), ) @@ -925,7 +919,7 @@ def slice_rows( def sort_columns( self, comparator: Callable[[Column, Column], int] = lambda col1, col2: (col1.name > col2.name) - - (col1.name < col2.name), + - (col1.name < col2.name), ) -> TimeSeries: """ Sort the columns of a `TimeSeries` with the given comparator and return a new `TimeSeries`. @@ -1214,7 +1208,11 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries """ temp = self._as_table() t1, t2 = temp.split_rows(percentage_in_first=percentage_in_first) - return (TimeSeries._from_table(t1, time_name=self.time.name, target_name=self._target.name, - feature_names=self._feature_names), - TimeSeries._from_table(t2, time_name=self.time.name, target_name=self._target.name, - feature_names=self._feature_names)) + return ( + TimeSeries._from_table( + t1, time_name=self.time.name, target_name=self._target.name, feature_names=self._feature_names, + ), + TimeSeries._from_table( + t2, time_name=self.time.name, target_name=self._target.name, feature_names=self._feature_names, + ), + ) diff --git a/src/safeds/exceptions/__init__.py b/src/safeds/exceptions/__init__.py index d51f8fd43..bc38abe8f 100644 --- a/src/safeds/exceptions/__init__.py +++ b/src/safeds/exceptions/__init__.py @@ -28,9 +28,9 @@ DatasetMissesFeaturesError, LearningError, ModelNotFittedError, + NonTimeSeriesError, PredictionError, UntaggedTableError, - NonTimeSeriesError, ) __all__ = [ diff --git a/src/safeds/exceptions/_data.py b/src/safeds/exceptions/_data.py index c75b8f0da..a1318d8b7 100644 --- a/src/safeds/exceptions/_data.py +++ b/src/safeds/exceptions/_data.py @@ -162,5 +162,3 @@ class IllegalFormatError(Exception): def __init__(self, formats: list[str] | str) -> None: super().__init__(f"This format is illegal. Use one of the following formats: {formats}") - - diff --git a/src/safeds/ml/classical/regression/__init__.py b/src/safeds/ml/classical/regression/__init__.py index 6d57b4803..fd880ccd0 100644 --- a/src/safeds/ml/classical/regression/__init__.py +++ b/src/safeds/ml/classical/regression/__init__.py @@ -1,6 +1,7 @@ """Models for regression tasks.""" from ._ada_boost import AdaBoost +from ._arima import ArimaModel from ._decision_tree import DecisionTree from ._elastic_net_regression import ElasticNetRegression from ._gradient_boosting import GradientBoosting @@ -11,7 +12,6 @@ from ._regressor import Regressor from ._ridge_regression import RidgeRegression from ._support_vector_machine import SupportVectorMachine -from ._arima import ArimaModel __all__ = [ "AdaBoost", diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index d2fed04f8..72024f0ee 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -1,26 +1,22 @@ from __future__ import annotations -import pandas as pd -from statsmodels.tsa.arima.model import ARIMA - import io -from typing import TYPE_CHECKING, Optional import itertools + import matplotlib.pyplot as plt +import pandas as pd +from statsmodels.tsa.arima.model import ARIMA -from safeds.data.tabular.containers import TimeSeries, Column, Table from safeds.data.image.containers import Image - -if TYPE_CHECKING: - from sklearn.base import RegressorMixin +from safeds.data.tabular.containers import Column, Table, TimeSeries from safeds.exceptions import ( - ModelNotFittedError, - PredictionError, DatasetMissesDataError, - NonNumericColumnError, - MissingValuesColumnError, LearningError, + MissingValuesColumnError, + ModelNotFittedError, + NonNumericColumnError, NonTimeSeriesError, + PredictionError, ) @@ -67,9 +63,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: if time_series.number_of_rows == 0: raise DatasetMissesDataError if not time_series.target.type.is_numeric(): - raise NonNumericColumnError( - time_series.target.name - ) + raise NonNumericColumnError(time_series.target.name) if time_series.target.has_missing_values(): raise MissingValuesColumnError( time_series.target.name, @@ -78,7 +72,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: "`TimeSeries.remove_rows_with_missing_values`.", ) fitted_arima = ArimaModel() - p = d = q = range(0, 2) + p = d = q = range(2) pdq = list(itertools.product(p, d, q)) best_aic = float("inf") best_model = None @@ -105,26 +99,26 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: def predict(self, forecast_horizon: int) -> TimeSeries: """ - Predict a target vector using a time series target column. The model has to be trained first. - - Parameters - ---------- - forecast_horizon : TimeSeries - The forecast horizon for the predicted value. - - Returns - ------- - table : TimeSeries - A timeseries containing the predicted target vector and a time dummy as time column. - - Raises - ------ - ModelNotFittedError - If the model has not been fitted yet. - IndexError - If the forecast horizon is not greater than zero. - PredictionError - If predicting with the given dataset failed. + Predict a target vector using a time series target column. The model has to be trained first. + + Parameters + ---------- + forecast_horizon : TimeSeries + The forecast horizon for the predicted value. + + Returns + ------- + table : TimeSeries + A timeseries containing the predicted target vector and a time dummy as time column. + + Raises + ------ + ModelNotFittedError + If the model has not been fitted yet. + IndexError + If the forecast horizon is not greater than zero. + PredictionError + If predicting with the given dataset failed. """ # Validation if forecast_horizon <= 0: @@ -139,7 +133,7 @@ def predict(self, forecast_horizon: int) -> TimeSeries: except ValueError as exception: raise PredictionError(str(exception)) from exception target_column: Column = Column(name="target", data=forecast_results) - time_column: Column = Column(name="time", data=pd.Series(range(0, forecast_horizon), name="time")) + time_column: Column = Column(name="time", data=pd.Series(range(forecast_horizon), name="time")) # create new TimeSeries result = Table() result = result.add_column(target_column) @@ -177,7 +171,9 @@ def plot_predictions(self, time_series: TimeSeries) -> Image: forecast_results = self._arima.forecast(steps=n_steps) fig = plt.figure() - plt.plot(forecast_results, ) + plt.plot( + forecast_results, + ) plt.legend(["forecasted"]) plt.plot(test_data) plt.tight_layout() diff --git a/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py b/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py index 26e7c5b75..faee9fc23 100644 --- a/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py +++ b/tests/safeds/data/tabular/containers/_time_series/test_split_rows.py @@ -1,9 +1,9 @@ import pandas as pd import pytest -from tests.helpers import assert_that_time_series_are_equal -from safeds.data.tabular.containers import TimeSeries, Table +from safeds.data.tabular.containers import Table, TimeSeries from safeds.data.tabular.typing import Integer, Nothing, Schema + @pytest.mark.parametrize( ("table", "result_train_table", "result_test_table", "percentage_in_first"), [ @@ -15,16 +15,22 @@ ), ( TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), - TimeSeries._from_table(Table._from_pandas_dataframe(pd.DataFrame(), Schema({"col1": Nothing(), "col2": Nothing()})), - time_name="col1", target_name="col2"), + TimeSeries._from_table( + Table._from_pandas_dataframe(pd.DataFrame(), Schema({"col1": Nothing(), "col2": Nothing()})), + time_name="col1", + target_name="col2", + ), TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), 0, ), ( TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), TimeSeries({"col1": [1, 2, 1], "col2": [1, 2, 4]}, time_name="col1", target_name="col2"), - TimeSeries._from_table(Table._from_pandas_dataframe(pd.DataFrame(), Schema({"col1": Integer(), "col2": Integer()})), - time_name="col1", target_name="col2"), + TimeSeries._from_table( + Table._from_pandas_dataframe(pd.DataFrame(), Schema({"col1": Integer(), "col2": Integer()})), + time_name="col1", + target_name="col2", + ), 1, ), ], diff --git a/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py b/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py index 2b6d11512..0ca5073c6 100644 --- a/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py +++ b/tests/safeds/data/tabular/containers/_time_series/test_timeseries_from_csv_file.py @@ -10,7 +10,10 @@ @pytest.mark.parametrize( ("path", "expected"), [ - ("table.csv", TimeSeries({"A": [1], "B": [2]}, time_name="A", target_name="B"),), + ( + "table.csv", + TimeSeries({"A": [1], "B": [2]}, time_name="A", target_name="B"), + ), (Path("table.csv"), TimeSeries({"A": [1], "B": [2]}, time_name="A", target_name="B")), ], ids=["by String", "by path"], diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index a02a3438d..39a1dc86c 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -1,27 +1,25 @@ -import pytest -from safeds.ml.classical.regression import ArimaModel -from safeds.data.tabular.containers import TimeSeries, Table -from typing import TYPE_CHECKING, Any -from syrupy import SnapshotAssertion -import numpy as np -import os +from typing import Any -from tests.helpers import resolve_resource_path +import pytest +from safeds.data.tabular.containers import Table, TimeSeries from safeds.exceptions import ( - NonTimeSeriesError, DatasetMissesDataError, MissingValuesColumnError, - NonNumericColumnError, ModelNotFittedError, - + NonNumericColumnError, + NonTimeSeriesError, ) +from safeds.ml.classical.regression import ArimaModel + +from tests.helpers import resolve_resource_path def test_arima_model() -> None: # Create a DataFrame _inflation_path = "_datas/US_Inflation_rates.csv" - time_series = TimeSeries.timeseries_from_csv_file(path=resolve_resource_path(_inflation_path), target_name="value", - time_name="date") + time_series = TimeSeries.timeseries_from_csv_file( + path=resolve_resource_path(_inflation_path), target_name="value", time_name="date", + ) train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() trained_model = model.fit(train_ts) @@ -31,8 +29,11 @@ def test_arima_model() -> None: def create_test_data() -> TimeSeries: - return TimeSeries({"time": [1, 2, 3, 4, 5, 6, 7, 8, 9], "value": [1, 2, 3, 4, 5, 6, 7, 8, 9]}, - time_name="time", target_name="value") + return TimeSeries( + {"time": [1, 2, 3, 4, 5, 6, 7, 8, 9], "value": [1, 2, 3, 4, 5, 6, 7, 8, 9]}, + time_name="time", + target_name="value", + ) def test_should_succeed_on_valid_data() -> None: @@ -78,7 +79,7 @@ def test_should_succeed_on_valid_data_plot() -> None: }, ).time_columns(target_name="target", feature_names=["feat1", "feat2"], time_name="id"), NonNumericColumnError, - r'Tried to do a numerical operation on one or multiple non-numerical columns: \ntarget', + r"Tried to do a numerical operation on one or multiple non-numerical columns: \ntarget", ), ( Table( @@ -90,7 +91,7 @@ def test_should_succeed_on_valid_data_plot() -> None: }, ).time_columns(target_name="target", feature_names=["feat1", "feat2"], time_name="id"), MissingValuesColumnError, - r'Tried to do an operation on one or multiple columns containing missing values: \ntarget\nYou can use the Imputer to replace the missing values based on different strategies.\nIf you want toremove the missing values entirely you can use the method `TimeSeries.remove_rows_with_missing_values`.', + r"Tried to do an operation on one or multiple columns containing missing values: \ntarget\nYou can use the Imputer to replace the missing values based on different strategies.\nIf you want toremove the missing values entirely you can use the method `TimeSeries.remove_rows_with_missing_values`.", ), ( Table( From 52f6542a94292845a096abe499953d2e80077d32 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:10:54 +0000 Subject: [PATCH 23/60] style: apply automated linter fixes --- .../data/tabular/containers/_time_series.py | 15 ++++++++++++--- .../ml/classical/regression/test_arima_model.py | 4 +++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 3fd17b407..4c281b1bc 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -70,7 +70,10 @@ def timeseries_from_csv_file( """ return TimeSeries._from_table( - Table.from_csv_file(path=path), target_name=target_name, time_name=time_name, feature_names=feature_names, + Table.from_csv_file(path=path), + target_name=target_name, + time_name=time_name, + feature_names=feature_names, ) @staticmethod @@ -1210,9 +1213,15 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries t1, t2 = temp.split_rows(percentage_in_first=percentage_in_first) return ( TimeSeries._from_table( - t1, time_name=self.time.name, target_name=self._target.name, feature_names=self._feature_names, + t1, + time_name=self.time.name, + target_name=self._target.name, + feature_names=self._feature_names, ), TimeSeries._from_table( - t2, time_name=self.time.name, target_name=self._target.name, feature_names=self._feature_names, + t2, + time_name=self.time.name, + target_name=self._target.name, + feature_names=self._feature_names, ), ) diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 39a1dc86c..43caeaf51 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -18,7 +18,9 @@ def test_arima_model() -> None: # Create a DataFrame _inflation_path = "_datas/US_Inflation_rates.csv" time_series = TimeSeries.timeseries_from_csv_file( - path=resolve_resource_path(_inflation_path), target_name="value", time_name="date", + path=resolve_resource_path(_inflation_path), + target_name="value", + time_name="date", ) train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() From f81a7c51c8edec91d8b32b984e8413689e4a46b4 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 26 Mar 2024 17:56:17 +0100 Subject: [PATCH 24/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 24 +++++++++---------- .../classical/regression/test_arima_model.py | 22 +++++++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 72024f0ee..fb10ec04a 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -81,10 +81,11 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: for param in pdq: # Create and fit an ARIMA model with the current parameters mod = ARIMA(time_series.target._data.values, order=param) - try: - result = mod.fit() - except ValueError as exception: - raise LearningError(str(exception)) from exception + + # I wasnt able to invoke an learning Error + # Add try catch when an learning error is found + result = mod.fit() + # Compare the current model's AIC with the best AIC so far if result.aic < best_aic: @@ -123,9 +124,7 @@ def predict(self, forecast_horizon: int) -> TimeSeries: # Validation if forecast_horizon <= 0: raise IndexError("forecast_horizon must be greater 0") - if not self.is_fitted(): - raise ModelNotFittedError - if self._arima is None: + if not self.is_fitted() or self._arima is None: raise ModelNotFittedError try: @@ -140,9 +139,10 @@ def predict(self, forecast_horizon: int) -> TimeSeries: result = result.add_column(time_column) return TimeSeries._from_table(result, time_name="time", target_name="target") - def plot_predictions(self, time_series: TimeSeries) -> Image: + def plot_predictions(self, test_series: TimeSeries) -> Image: """ - Plot the predictions of the given time series target. + Plot the predictions of the trained model to the given target of the time series. So you can see the predictions + and the actual values in one plot. Parameters ---------- @@ -162,11 +162,9 @@ def plot_predictions(self, time_series: TimeSeries) -> Image: If predicting with the given dataset failed. """ - if not self.is_fitted(): - raise ModelNotFittedError - if self._arima is None: + if not self.is_fitted() or self._arima is None: raise ModelNotFittedError - test_data = time_series.target._data.to_numpy() + test_data = test_series.target._data.to_numpy() n_steps = len(test_data) forecast_results = self._arima.forecast(steps=n_steps) diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 39a1dc86c..6347d2425 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -8,7 +8,10 @@ ModelNotFittedError, NonNumericColumnError, NonTimeSeriesError, + LearningError, + PredictionError, ) + from safeds.ml.classical.regression import ArimaModel from tests.helpers import resolve_resource_path @@ -163,3 +166,22 @@ def test_if_fitted_fitted() -> None: model = ArimaModel() model = model.fit(create_test_data()) assert model.is_fitted() + + +def test_should_raise_if_horizon_too_small() -> None: + model = ArimaModel() + with pytest.raises(IndexError): + model.predict(forecast_horizon=0) + + +def test_should_raise_if_horizon_too_small_plot() -> None: + model = ArimaModel() + with pytest.raises(ModelNotFittedError): + model.plot_predictions(create_test_data()) + +def test_value_error_predict() -> None: + model = ArimaModel() + ts = TimeSeries._from_table(Table({"time": [1, 2, 3], "value": [4, 5, 6]}), target_name="value", time_name="time") + with pytest.raises(PredictionError): + model = model.fit(ts) + model.predict(forecast_horizon=3000000000000000000000000000) From 6162161f1cffd5728d4eaec932848c373924b0d2 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 26 Mar 2024 18:00:15 +0100 Subject: [PATCH 25/60] fixed linter changes --- src/safeds/ml/classical/regression/_arima.py | 3 +-- tests/safeds/ml/classical/regression/test_arima_model.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index fb10ec04a..c8f1ed1a6 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -141,8 +141,7 @@ def predict(self, forecast_horizon: int) -> TimeSeries: def plot_predictions(self, test_series: TimeSeries) -> Image: """ - Plot the predictions of the trained model to the given target of the time series. So you can see the predictions - and the actual values in one plot. + Plot the predictions of the trained model to the given target of the time series. So you can see the predictions and the actual values in one plot. Parameters ---------- diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index f0ca284e3..8cd08248f 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -184,6 +184,6 @@ def test_should_raise_if_horizon_too_small_plot() -> None: def test_value_error_predict() -> None: model = ArimaModel() ts = TimeSeries._from_table(Table({"time": [1, 2, 3], "value": [4, 5, 6]}), target_name="value", time_name="time") + model = model.fit(ts) with pytest.raises(PredictionError): - model = model.fit(ts) model.predict(forecast_horizon=3000000000000000000000000000) From a610b72e9aa4e67bebb875034f181072ac5bb96d Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:01:52 +0000 Subject: [PATCH 26/60] style: apply automated linter fixes --- src/safeds/ml/classical/regression/_arima.py | 2 -- tests/safeds/ml/classical/regression/test_arima_model.py | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index c8f1ed1a6..2f9449e1c 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -11,7 +11,6 @@ from safeds.data.tabular.containers import Column, Table, TimeSeries from safeds.exceptions import ( DatasetMissesDataError, - LearningError, MissingValuesColumnError, ModelNotFittedError, NonNumericColumnError, @@ -86,7 +85,6 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: # Add try catch when an learning error is found result = mod.fit() - # Compare the current model's AIC with the best AIC so far if result.aic < best_aic: best_aic = result.aic diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 8cd08248f..5304bf189 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -8,10 +8,8 @@ ModelNotFittedError, NonNumericColumnError, NonTimeSeriesError, - LearningError, PredictionError, ) - from safeds.ml.classical.regression import ArimaModel from tests.helpers import resolve_resource_path @@ -181,6 +179,7 @@ def test_should_raise_if_horizon_too_small_plot() -> None: with pytest.raises(ModelNotFittedError): model.plot_predictions(create_test_data()) + def test_value_error_predict() -> None: model = ArimaModel() ts = TimeSeries._from_table(Table({"time": [1, 2, 3], "value": [4, 5, 6]}), target_name="value", time_name="time") From 2c265afa8ebb509cfd4c75bf2397513f1054c27b Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 26 Mar 2024 20:12:22 +0100 Subject: [PATCH 27/60] fixed mk docs --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 2f9449e1c..fd83c7ec2 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -143,7 +143,7 @@ def plot_predictions(self, test_series: TimeSeries) -> Image: Parameters ---------- - time_series : TimeSeries + test_series : TimeSeries The time series containing the target vector. Returns From a8edca8bacf7ffbdd03552a2177af389d65a2499 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 27 Mar 2024 21:28:56 +0100 Subject: [PATCH 28/60] added the compared plot --- .../data/tabular/containers/_time_series.py | 42 +++++++ .../test_should_return_table.png | Bin 11563 -> 0 bytes .../test_plot_compare_time_series.py | 114 ++++++++++++++++++ 3 files changed, 156 insertions(+) delete mode 100644 tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_lag/test_should_return_table.png create mode 100644 tests/safeds/data/tabular/containers/_time_series/test_plot_compare_time_series.py diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 4c281b1bc..c0d5f1d72 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1225,3 +1225,45 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries feature_names=self._feature_names, ), ) + + def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: + """ + Creates a plot where the given time series targets are plotted by the time on the x-axis. + + Parameters + ---------- + time_series + A list of time series to be plotted. + + Returns + ------- + A plot with all the time series targets plotted by the time on the x-axis. + + """ + if not self._target.type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + + + data = pd.DataFrame() + data[self.time.name] = self.time._data + data[self.target.name] = self.target._data + index = 0 + for ts in time_series: + if not ts.target.type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + data[ts.target.name+str(index)] = ts.target._data + index = index+1 + fig = plt.figure() + + data= pd.melt(data, [self.time.name]) + sns.lineplot(x=self.time.name, y='value', hue = 'variable', data=data) + plt.title("Multiple Series Plot") + plt.xlabel("Time") + + plt.tight_layout() + buffer = io.BytesIO() + fig.savefig(buffer, format="png") + plt.close() # Prevents the figure from being displayed directly + buffer.seek(0) + self._data = self._data.reset_index() + return Image.from_bytes(buffer.read()) diff --git a/tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_lag/test_should_return_table.png b/tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_lag/test_should_return_table.png deleted file mode 100644 index 0f17b4726090b563dbe797d06ad0f652a2783536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11563 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 list[TimeSeries]: + table1 = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + table2 = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "target": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + return [table1, table2] + + +def create_invalid_time_series_list() -> list[TimeSeries]: + table1 = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": ["9", 10, 11, 12, 13, 14, 15, 16, 17, 18], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + table2 = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "target": ["4", 5, 6, 7, 8, 9, 10, 11, 12, 13], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + return [table1, table2] + + +def test_legit_compare(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_compare_time_series(create_time_series_list()) + assert plot == snapshot_png + + + +def test_should_raise_if_column_contains_non_numerical_values_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_compare_time_series(create_time_series_list()) + + +def test_with_non_valid_list() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_compare_time_series(create_invalid_time_series_list()) From a9d33b3416e75de5d622f712935a13b4b5427b1c Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 27 Mar 2024 22:23:22 +0100 Subject: [PATCH 29/60] pushed pictures --- .../test_legit_compare.png | Bin 0 -> 34723 bytes .../test_plot_lag/test_should_return_table.png | Bin 0 -> 11563 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_compare_time_series/test_legit_compare.png create mode 100644 tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_lag/test_should_return_table.png diff --git a/tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_compare_time_series/test_legit_compare.png b/tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_compare_time_series/test_legit_compare.png new file mode 100644 index 0000000000000000000000000000000000000000..b83ad67b439083343aadcefe7d1bac23c2418d5a GIT binary patch literal 34723 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 Date: Thu, 28 Mar 2024 00:40:41 +0100 Subject: [PATCH 30/60] fixed linter --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index c0d5f1d72..4b00a4d7c 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1228,7 +1228,7 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: """ - Creates a plot where the given time series targets are plotted by the time on the x-axis. + Plot the given time series targets along the time on the x-axis. Parameters ---------- From e970daa52289e06b3bd576294c73b922fc81034b Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Wed, 27 Mar 2024 23:42:20 +0000 Subject: [PATCH 31/60] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 9 ++++----- .../_time_series/test_plot_compare_time_series.py | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 4b00a4d7c..dc9a3183d 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1243,7 +1243,6 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: if not self._target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - data = pd.DataFrame() data[self.time.name] = self.time._data data[self.target.name] = self.target._data @@ -1251,12 +1250,12 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: for ts in time_series: if not ts.target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - data[ts.target.name+str(index)] = ts.target._data - index = index+1 + data[ts.target.name + str(index)] = ts.target._data + index = index + 1 fig = plt.figure() - data= pd.melt(data, [self.time.name]) - sns.lineplot(x=self.time.name, y='value', hue = 'variable', data=data) + data = pd.melt(data, [self.time.name]) + sns.lineplot(x=self.time.name, y="value", hue="variable", data=data) plt.title("Multiple Series Plot") plt.xlabel("Time") diff --git a/tests/safeds/data/tabular/containers/_time_series/test_plot_compare_time_series.py b/tests/safeds/data/tabular/containers/_time_series/test_plot_compare_time_series.py index 53ebe0c4b..47e28ca73 100644 --- a/tests/safeds/data/tabular/containers/_time_series/test_plot_compare_time_series.py +++ b/tests/safeds/data/tabular/containers/_time_series/test_plot_compare_time_series.py @@ -1,6 +1,6 @@ import pytest from safeds.data.tabular.containers import TimeSeries -from safeds.exceptions import NonNumericColumnError, UnknownColumnNameError +from safeds.exceptions import NonNumericColumnError from syrupy import SnapshotAssertion @@ -67,7 +67,6 @@ def test_legit_compare(snapshot_png: SnapshotAssertion) -> None: assert plot == snapshot_png - def test_should_raise_if_column_contains_non_numerical_values_x() -> None: table = TimeSeries( { From faf3964f863dc9e53c4bd16eed15ac71127315dd Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Thu, 28 Mar 2024 14:09:59 +0100 Subject: [PATCH 32/60] changed the workflow with arima model --- .../data/tabular/containers/_time_series.py | 2 +- src/safeds/ml/classical/regression/_arima.py | 23 ++++++++----- .../classical/regression/test_arima_model.py | 33 +++++++++++++++---- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 4b00a4d7c..d83f7ae8c 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1251,7 +1251,7 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: for ts in time_series: if not ts.target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - data[ts.target.name+str(index)] = ts.target._data + data[ts.target.name+" "+str(index)] = ts.target._data index = index+1 fig = plt.figure() diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index fd83c7ec2..98f4196d5 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -96,14 +96,14 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: fitted_arima._fitted = True return fitted_arima - def predict(self, forecast_horizon: int) -> TimeSeries: + def predict(self, time_series: TimeSeries) -> TimeSeries: """ Predict a target vector using a time series target column. The model has to be trained first. Parameters ---------- - forecast_horizon : TimeSeries - The forecast horizon for the predicted value. + time_series : TimeSeries + The test dataset of the time series. Returns ------- @@ -119,23 +119,28 @@ def predict(self, forecast_horizon: int) -> TimeSeries: PredictionError If predicting with the given dataset failed. """ + # make a table without + forecast_horizon = len(time_series.target._data) + result_table = time_series._as_table() + result_table = result_table.remove_columns([time_series.target.name]) # Validation if forecast_horizon <= 0: raise IndexError("forecast_horizon must be greater 0") if not self.is_fitted() or self._arima is None: raise ModelNotFittedError + # forecast try: forecast_results = self._arima.forecast(steps=forecast_horizon) except ValueError as exception: raise PredictionError(str(exception)) from exception - target_column: Column = Column(name="target", data=forecast_results) - time_column: Column = Column(name="time", data=pd.Series(range(forecast_horizon), name="time")) + target_column: Column = Column(name=time_series.target.name + " " + str("forecasted"), data=forecast_results) + # create new TimeSeries - result = Table() - result = result.add_column(target_column) - result = result.add_column(time_column) - return TimeSeries._from_table(result, time_name="time", target_name="target") + result_table = result_table.add_column(target_column) + return TimeSeries._from_table(result_table, time_name=time_series.time.name, + target_name=time_series.target.name + " " + str("forecasted"), + feature_names=time_series.features.column_names) def plot_predictions(self, test_series: TimeSeries) -> Image: """ diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 5304bf189..42058148f 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -26,7 +26,8 @@ def test_arima_model() -> None: train_ts, test_ts = time_series.split_rows(0.8) model = ArimaModel() trained_model = model.fit(train_ts) - trained_model.plot_predictions(test_ts) + predicted_ts = trained_model.predict(test_ts) + predicted_ts.plot_compare_time_series([test_ts]) # suggest it ran through assert True @@ -37,6 +38,14 @@ def create_test_data() -> TimeSeries: time_name="time", target_name="value", ) +def create_test_data_with_feature() -> TimeSeries: + return TimeSeries( + {"time": [1, 2, 3, 4, 5, 6, 7, 8, 9], + "value": [1, 2, 3, 4, 5, 6, 7, 8, 9], + "feature": [1, 2, 3, 4, 5, 6, 7, 8, 9]}, + time_name="time", + target_name="value", + ) def test_should_succeed_on_valid_data() -> None: @@ -140,15 +149,27 @@ def test_should_raise_if_table_is_not_tagged(table: Table) -> None: model.fit(table) # type: ignore[arg-type] +def test_correct_structure_of_time_series_with_features() -> None: + data = create_test_data_with_feature() + model = ArimaModel() + model = model.fit(data) + predics_ts = model.predict(data) + assert len(predics_ts.time) == len(data.time) + assert len(predics_ts.target) == len(data.target) + assert predics_ts.time.name == data.time.name + assert predics_ts.target.name == data.target.name + " " + "forecasted" + assert predics_ts.features.column_names == data.features.column_names + def test_correct_structure_of_time_series() -> None: data = create_test_data() model = ArimaModel() model = model.fit(data) - predics_ts = model.predict(5) - assert len(predics_ts.time) == 5 - assert len(predics_ts.target) == 5 - assert predics_ts.time.name == "time" - assert predics_ts.target.name == "target" + predics_ts = model.predict(data) + assert len(predics_ts.time) == len(data.time) + assert len(predics_ts.target) == len(data.target) + assert predics_ts.time.name == data.time.name + assert predics_ts.target.name == data.target.name + " " + "forecasted" + assert predics_ts.features.column_names == data.features.column_names def test_should_raise_if_not_fitted() -> None: From 9b168215dd5c3dcc81c56246806790c850e4f783 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Thu, 28 Mar 2024 14:25:36 +0100 Subject: [PATCH 33/60] fixed linter and snapshot --- src/safeds/ml/classical/regression/_arima.py | 8 ++------ .../test_legit_compare.png | Bin 34723 -> 34728 bytes .../classical/regression/test_arima_model.py | 12 +----------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 98f4196d5..1b5200c54 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -124,16 +124,12 @@ def predict(self, time_series: TimeSeries) -> TimeSeries: result_table = time_series._as_table() result_table = result_table.remove_columns([time_series.target.name]) # Validation - if forecast_horizon <= 0: - raise IndexError("forecast_horizon must be greater 0") if not self.is_fitted() or self._arima is None: raise ModelNotFittedError # forecast - try: - forecast_results = self._arima.forecast(steps=forecast_horizon) - except ValueError as exception: - raise PredictionError(str(exception)) from exception + # couldn't invoke prediction error, will be added when found + forecast_results = self._arima.forecast(steps=forecast_horizon) target_column: Column = Column(name=time_series.target.name + " " + str("forecasted"), data=forecast_results) # create new TimeSeries diff --git a/tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_compare_time_series/test_legit_compare.png b/tests/safeds/data/tabular/containers/_time_series/__snapshots__/test_plot_compare_time_series/test_legit_compare.png index b83ad67b439083343aadcefe7d1bac23c2418d5a..5078adf5c0d9c7d7c3ff8905fe797cf053985bac 100644 GIT binary patch literal 34728 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 q?}}o{gFB~GO5v{lU;e=91TB^}Zd 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 None: def test_should_raise_if_not_fitted() -> None: model = ArimaModel() with pytest.raises(ModelNotFittedError): - model.predict(forecast_horizon=5) + model.predict(create_test_data()) def test_if_fitted_not_fitted() -> None: @@ -189,10 +189,6 @@ def test_if_fitted_fitted() -> None: assert model.is_fitted() -def test_should_raise_if_horizon_too_small() -> None: - model = ArimaModel() - with pytest.raises(IndexError): - model.predict(forecast_horizon=0) def test_should_raise_if_horizon_too_small_plot() -> None: @@ -201,9 +197,3 @@ def test_should_raise_if_horizon_too_small_plot() -> None: model.plot_predictions(create_test_data()) -def test_value_error_predict() -> None: - model = ArimaModel() - ts = TimeSeries._from_table(Table({"time": [1, 2, 3], "value": [4, 5, 6]}), target_name="value", time_name="time") - model = model.fit(ts) - with pytest.raises(PredictionError): - model.predict(forecast_horizon=3000000000000000000000000000) From 172950d657d6c91061fa53094de6432273037b5f Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:27:08 +0000 Subject: [PATCH 34/60] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 4 ++-- src/safeds/ml/classical/regression/_arima.py | 13 +++++++------ .../ml/classical/regression/test_arima_model.py | 14 +++++++------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 17b001804..a2b952138 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1250,8 +1250,8 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: for ts in time_series: if not ts.target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - data[ts.target.name+" "+str(index)] = ts.target._data - index = index+1 + data[ts.target.name + " " + str(index)] = ts.target._data + index = index + 1 fig = plt.figure() data = pd.melt(data, [self.time.name]) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 1b5200c54..9e5bc1f49 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -4,7 +4,6 @@ import itertools import matplotlib.pyplot as plt -import pandas as pd from statsmodels.tsa.arima.model import ARIMA from safeds.data.image.containers import Image @@ -15,7 +14,6 @@ ModelNotFittedError, NonNumericColumnError, NonTimeSeriesError, - PredictionError, ) @@ -130,13 +128,16 @@ def predict(self, time_series: TimeSeries) -> TimeSeries: # forecast # couldn't invoke prediction error, will be added when found forecast_results = self._arima.forecast(steps=forecast_horizon) - target_column: Column = Column(name=time_series.target.name + " " + str("forecasted"), data=forecast_results) + target_column: Column = Column(name=time_series.target.name + " " + "forecasted", data=forecast_results) # create new TimeSeries result_table = result_table.add_column(target_column) - return TimeSeries._from_table(result_table, time_name=time_series.time.name, - target_name=time_series.target.name + " " + str("forecasted"), - feature_names=time_series.features.column_names) + return TimeSeries._from_table( + result_table, + time_name=time_series.time.name, + target_name=time_series.target.name + " " + "forecasted", + feature_names=time_series.features.column_names, + ) def plot_predictions(self, test_series: TimeSeries) -> Image: """ diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 02aab7565..44ba8dbb8 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -8,7 +8,6 @@ ModelNotFittedError, NonNumericColumnError, NonTimeSeriesError, - PredictionError, ) from safeds.ml.classical.regression import ArimaModel @@ -38,11 +37,15 @@ def create_test_data() -> TimeSeries: time_name="time", target_name="value", ) + + def create_test_data_with_feature() -> TimeSeries: return TimeSeries( - {"time": [1, 2, 3, 4, 5, 6, 7, 8, 9], + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9], "value": [1, 2, 3, 4, 5, 6, 7, 8, 9], - "feature": [1, 2, 3, 4, 5, 6, 7, 8, 9]}, + "feature": [1, 2, 3, 4, 5, 6, 7, 8, 9], + }, time_name="time", target_name="value", ) @@ -160,6 +163,7 @@ def test_correct_structure_of_time_series_with_features() -> None: assert predics_ts.target.name == data.target.name + " " + "forecasted" assert predics_ts.features.column_names == data.features.column_names + def test_correct_structure_of_time_series() -> None: data = create_test_data() model = ArimaModel() @@ -189,11 +193,7 @@ def test_if_fitted_fitted() -> None: assert model.is_fitted() - - def test_should_raise_if_horizon_too_small_plot() -> None: model = ArimaModel() with pytest.raises(ModelNotFittedError): model.plot_predictions(create_test_data()) - - From 5eaacaf566ef8bfc741ab2658c1a6053a5d9c2f6 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 1 Apr 2024 13:34:35 +0200 Subject: [PATCH 35/60] added Hash function --- src/safeds/ml/classical/regression/_arima.py | 12 ++++++++++ .../classical/regression/test_arima_model.py | 22 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 9e5bc1f49..08a0fe258 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -2,6 +2,7 @@ import io import itertools +import xxhash import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA @@ -19,7 +20,18 @@ class ArimaModel: """Auto Regressive Integrated Moving Average Model.""" + def __hash__(self) -> int: + """ + Return a deterministic hash value for a regressor. + Returns + ------- + hash : int + The hash value. + """ + return xxhash.xxh3_64(self.__class__.__qualname__.encode("utf-8") + + (1 if self.is_fitted() else 0).to_bytes(1)+ + (bytes((9, 9, 9)) if self._order is None else bytes(self._order))).intdigest() def __init__(self) -> None: # Internal state self._arima: ARIMA | None = None diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 44ba8dbb8..1136a0fdc 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -9,7 +9,7 @@ NonNumericColumnError, NonTimeSeriesError, ) -from safeds.ml.classical.regression import ArimaModel +from safeds.ml.classical.regression import ArimaModel, LassoRegression from tests.helpers import resolve_resource_path @@ -197,3 +197,23 @@ def test_should_raise_if_horizon_too_small_plot() -> None: model = ArimaModel() with pytest.raises(ModelNotFittedError): model.plot_predictions(create_test_data()) + +def test_should_return_same_hash_for_equal_regressor() -> None: + regressor1 = ArimaModel() + regressor2 = ArimaModel() + assert hash(regressor1) == hash(regressor2) +def test_should_return_different_hash_for_unequal_regressor() -> None: + regressor1 = ArimaModel() + regressor2 = LassoRegression() + assert hash(regressor1) != hash(regressor2) + +def test_should_return_different_hash_for_same_regressor_fit() -> None: + regressor1 = ArimaModel() + regressor1_fit = regressor1.fit(create_test_data()) + assert hash(regressor1) != hash(regressor1_fit) + +def test_should_return_different_hash_for_regressor_fit() -> None: + regressor1 = ArimaModel() + regressor2 = ArimaModel() + regressor1_fit = regressor1.fit(create_test_data()) + assert hash(regressor1_fit) != hash(regressor2) From ded48181211e2f251e6c0b262faba236ac2e756a Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 1 Apr 2024 13:56:44 +0200 Subject: [PATCH 36/60] resolved merge conflict --- .../ml/classical/regression/__init__.py | 36 ++++++++-------- src/safeds/ml/classical/regression/_arima.py | 8 ++-- .../classical/regression/test_arima_model.py | 42 +++++++++---------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/safeds/ml/classical/regression/__init__.py b/src/safeds/ml/classical/regression/__init__.py index c1cbc3c23..1bd71ac05 100644 --- a/src/safeds/ml/classical/regression/__init__.py +++ b/src/safeds/ml/classical/regression/__init__.py @@ -1,28 +1,28 @@ """Models for regression tasks.""" -from ._ada_boost import AdaBoost -from ._arima import ArimaModel -from ._decision_tree import DecisionTree -from ._elastic_net_regression import ElasticNetRegression -from ._gradient_boosting import GradientBoosting -from ._k_nearest_neighbors import KNearestNeighbors -from ._lasso_regression import LassoRegression -from ._linear_regression import LinearRegression -from ._random_forest import RandomForest +from ._ada_boost import AdaBoostRegressor +from ._arima import ArimaModelRegressor +from ._decision_tree import DecisionTreeRegressor +from ._elastic_net_regression import ElasticNetRegressor +from ._gradient_boosting import GradientBoostingRegressor +from ._k_nearest_neighbors import KNearestNeighborsRegressor +from ._lasso_regression import LassoRegressor +from ._linear_regression import LinearRegressionRegressor +from ._random_forest import RandomForestRegressor from ._regressor import Regressor from ._ridge_regression import RidgeRegressor from ._support_vector_machine import SupportVectorMachineRegressor __all__ = [ - "AdaBoost", - "ArimaModel", - "DecisionTree", - "ElasticNetRegression", - "GradientBoosting", - "KNearestNeighbors", - "LassoRegression", - "LinearRegression", - "RandomForest", + "AdaBoostRegressor", + "ArimaModelRegressor", + "DecisionTreeRegressor", + "ElasticNetRegressor", + "GradientBoostingRegressor", + "KNearestNeighborsRegressor", + "LassoRegressor", + "LinearRegressionRegressor", + "RandomForestRegressor", "Regressor", "RidgeRegressor", "SupportVectorMachineRegressor", diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 08a0fe258..9f8ad4aef 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -18,7 +18,7 @@ ) -class ArimaModel: +class ArimaModelRegressor: """Auto Regressive Integrated Moving Average Model.""" def __hash__(self) -> int: """ @@ -38,7 +38,7 @@ def __init__(self) -> None: self._order: tuple[int, int, int] | None = None self._fitted = False - def fit(self, time_series: TimeSeries) -> ArimaModel: + def fit(self, time_series: TimeSeries) -> ArimaModelRegressor: """ Create a copy of this ARIMA Model and fit it with the given training data. @@ -51,7 +51,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: Returns ------- - fitted_arima : ArimaModel + fitted_arima : ArimaModelRegressor The fitted ARIMA Model. Raises @@ -80,7 +80,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModel: "remove the missing values entirely you can use the method " "`TimeSeries.remove_rows_with_missing_values`.", ) - fitted_arima = ArimaModel() + fitted_arima = ArimaModelRegressor() p = d = q = range(2) pdq = list(itertools.product(p, d, q)) best_aic = float("inf") diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index 1136a0fdc..fe54f64ea 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -9,7 +9,7 @@ NonNumericColumnError, NonTimeSeriesError, ) -from safeds.ml.classical.regression import ArimaModel, LassoRegression +from safeds.ml.classical.regression import ArimaModelRegressor, LassoRegressor from tests.helpers import resolve_resource_path @@ -23,7 +23,7 @@ def test_arima_model() -> None: time_name="date", ) train_ts, test_ts = time_series.split_rows(0.8) - model = ArimaModel() + model = ArimaModelRegressor() trained_model = model.fit(train_ts) predicted_ts = trained_model.predict(test_ts) predicted_ts.plot_compare_time_series([test_ts]) @@ -53,14 +53,14 @@ def create_test_data_with_feature() -> TimeSeries: def test_should_succeed_on_valid_data() -> None: valid_data = create_test_data() - model = ArimaModel() + model = ArimaModelRegressor() model.fit(valid_data) assert True def test_should_not_change_input_regressor() -> None: valid_data = create_test_data() - model = ArimaModel() + model = ArimaModelRegressor() model.fit(valid_data) assert not model.is_fitted() @@ -68,14 +68,14 @@ def test_should_not_change_input_regressor() -> None: def test_should_not_change_input_table() -> None: valid_data = create_test_data() valid_data_copy = create_test_data() - model = ArimaModel() + model = ArimaModelRegressor() model.fit(valid_data) assert valid_data_copy == valid_data def test_should_succeed_on_valid_data_plot() -> None: valid_data = create_test_data() - model = ArimaModel() + model = ArimaModelRegressor() fitted_model = model.fit(valid_data) fitted_model.plot_predictions(valid_data) assert True @@ -128,7 +128,7 @@ def test_should_raise_on_invalid_data( expected_error: Any, expected_error_msg: str, ) -> None: - model = ArimaModel() + model = ArimaModelRegressor() with pytest.raises(expected_error, match=expected_error_msg): model.fit(invalid_data) @@ -147,14 +147,14 @@ def test_should_raise_on_invalid_data( ids=["untagged_table"], ) def test_should_raise_if_table_is_not_tagged(table: Table) -> None: - model = ArimaModel() + model = ArimaModelRegressor() with pytest.raises(NonTimeSeriesError): model.fit(table) # type: ignore[arg-type] def test_correct_structure_of_time_series_with_features() -> None: data = create_test_data_with_feature() - model = ArimaModel() + model = ArimaModelRegressor() model = model.fit(data) predics_ts = model.predict(data) assert len(predics_ts.time) == len(data.time) @@ -166,7 +166,7 @@ def test_correct_structure_of_time_series_with_features() -> None: def test_correct_structure_of_time_series() -> None: data = create_test_data() - model = ArimaModel() + model = ArimaModelRegressor() model = model.fit(data) predics_ts = model.predict(data) assert len(predics_ts.time) == len(data.time) @@ -177,43 +177,43 @@ def test_correct_structure_of_time_series() -> None: def test_should_raise_if_not_fitted() -> None: - model = ArimaModel() + model = ArimaModelRegressor() with pytest.raises(ModelNotFittedError): model.predict(create_test_data()) def test_if_fitted_not_fitted() -> None: - model = ArimaModel() + model = ArimaModelRegressor() assert not model.is_fitted() def test_if_fitted_fitted() -> None: - model = ArimaModel() + model = ArimaModelRegressor() model = model.fit(create_test_data()) assert model.is_fitted() def test_should_raise_if_horizon_too_small_plot() -> None: - model = ArimaModel() + model = ArimaModelRegressor() with pytest.raises(ModelNotFittedError): model.plot_predictions(create_test_data()) def test_should_return_same_hash_for_equal_regressor() -> None: - regressor1 = ArimaModel() - regressor2 = ArimaModel() + regressor1 = ArimaModelRegressor() + regressor2 = ArimaModelRegressor() assert hash(regressor1) == hash(regressor2) def test_should_return_different_hash_for_unequal_regressor() -> None: - regressor1 = ArimaModel() - regressor2 = LassoRegression() + regressor1 = ArimaModelRegressor() + regressor2 = LassoRegressor() assert hash(regressor1) != hash(regressor2) def test_should_return_different_hash_for_same_regressor_fit() -> None: - regressor1 = ArimaModel() + regressor1 = ArimaModelRegressor() regressor1_fit = regressor1.fit(create_test_data()) assert hash(regressor1) != hash(regressor1_fit) def test_should_return_different_hash_for_regressor_fit() -> None: - regressor1 = ArimaModel() - regressor2 = ArimaModel() + regressor1 = ArimaModelRegressor() + regressor2 = ArimaModelRegressor() regressor1_fit = regressor1.fit(create_test_data()) assert hash(regressor1_fit) != hash(regressor2) From f50b2f7319bb305c0757749e838ad5925b5c9295 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:58:21 +0000 Subject: [PATCH 37/60] style: apply automated linter fixes --- src/safeds/ml/classical/regression/_arima.py | 12 ++++++++---- .../ml/classical/regression/test_arima_model.py | 11 ++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 9f8ad4aef..dcf4c4e4e 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -2,9 +2,9 @@ import io import itertools -import xxhash import matplotlib.pyplot as plt +import xxhash from statsmodels.tsa.arima.model import ARIMA from safeds.data.image.containers import Image @@ -20,6 +20,7 @@ class ArimaModelRegressor: """Auto Regressive Integrated Moving Average Model.""" + def __hash__(self) -> int: """ Return a deterministic hash value for a regressor. @@ -29,9 +30,12 @@ def __hash__(self) -> int: hash : int The hash value. """ - return xxhash.xxh3_64(self.__class__.__qualname__.encode("utf-8") + - (1 if self.is_fitted() else 0).to_bytes(1)+ - (bytes((9, 9, 9)) if self._order is None else bytes(self._order))).intdigest() + return xxhash.xxh3_64( + self.__class__.__qualname__.encode("utf-8") + + (1 if self.is_fitted() else 0).to_bytes(1) + + (bytes((9, 9, 9)) if self._order is None else bytes(self._order)), + ).intdigest() + def __init__(self) -> None: # Internal state self._arima: ARIMA | None = None diff --git a/tests/safeds/ml/classical/regression/test_arima_model.py b/tests/safeds/ml/classical/regression/test_arima_model.py index fe54f64ea..b8ca54693 100644 --- a/tests/safeds/ml/classical/regression/test_arima_model.py +++ b/tests/safeds/ml/classical/regression/test_arima_model.py @@ -198,20 +198,25 @@ def test_should_raise_if_horizon_too_small_plot() -> None: with pytest.raises(ModelNotFittedError): model.plot_predictions(create_test_data()) + def test_should_return_same_hash_for_equal_regressor() -> None: - regressor1 = ArimaModelRegressor() - regressor2 = ArimaModelRegressor() - assert hash(regressor1) == hash(regressor2) + regressor1 = ArimaModelRegressor() + regressor2 = ArimaModelRegressor() + assert hash(regressor1) == hash(regressor2) + + def test_should_return_different_hash_for_unequal_regressor() -> None: regressor1 = ArimaModelRegressor() regressor2 = LassoRegressor() assert hash(regressor1) != hash(regressor2) + def test_should_return_different_hash_for_same_regressor_fit() -> None: regressor1 = ArimaModelRegressor() regressor1_fit = regressor1.fit(create_test_data()) assert hash(regressor1) != hash(regressor1_fit) + def test_should_return_different_hash_for_regressor_fit() -> None: regressor1 = ArimaModelRegressor() regressor2 = ArimaModelRegressor() From 4c150a942468ddba034d0170be8dbc4e50a8ca91 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:59:26 +0200 Subject: [PATCH 38/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: WinPlay02 --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index a2b952138..ee9587f57 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1185,7 +1185,7 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries Returns ------- - result : (Table, Table) + result : (TimeSeries, TimeSeries) A tuple containing the two resulting tables. The first table has the specified size, the second table contains the rest of the data. From d0c1f12663e337340202f8499403e3fec627cdb5 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:01:03 +0200 Subject: [PATCH 39/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index ee9587f57..fa19342ae 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1180,7 +1180,7 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries Parameters ---------- - percentage_in_first : float + percentage_in_first: The desired size of the first table in percentage to the given table; must be between 0 and 1. Returns From bbadc77d591f5db06ee3d7b40c4300a2e7c1c179 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:01:13 +0200 Subject: [PATCH 40/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index dcf4c4e4e..367986999 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -203,7 +203,7 @@ def is_fitted(self) -> bool: Returns ------- - is_fitted : bool + is_fitted: Whether the regressor is fitted. """ return self._fitted From 43deda5204cb6c2619f234ba8ff27cf9a8fe913a Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:01:26 +0200 Subject: [PATCH 41/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index fa19342ae..3bacd2b2f 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1232,7 +1232,7 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: Parameters ---------- - time_series + time_series: A list of time series to be plotted. Returns From 4fc6c848116c45d71d92a2dc6a24f601591faa15 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:01:43 +0200 Subject: [PATCH 42/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/data/tabular/containers/_time_series.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 3bacd2b2f..e8eaac5e2 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1237,6 +1237,7 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: Returns ------- + plot: A plot with all the time series targets plotted by the time on the x-axis. """ From d21c8d84af67ab86fc2518de6891fd74f7aef27c Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:02:01 +0200 Subject: [PATCH 43/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 367986999..92a4da39b 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -174,7 +174,7 @@ def plot_predictions(self, test_series: TimeSeries) -> Image: ModelNotFittedError If the model has not been fitted yet. PredictionError - If predicting with the given dataset failed. + If predicting with the given dataset failed. """ if not self.is_fitted() or self._arima is None: From 5c090573124f014a39285493f00eb71022ec1888 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:02:14 +0200 Subject: [PATCH 44/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 92a4da39b..c886d3727 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -121,7 +121,7 @@ def predict(self, time_series: TimeSeries) -> TimeSeries: Returns ------- - table : TimeSeries + table: A timeseries containing the predicted target vector and a time dummy as time column. Raises From b232e3c7beece85bb0466ff0e94d23ba78130d5b Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:02:21 +0200 Subject: [PATCH 45/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index c886d3727..8cfa8d78e 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -166,7 +166,7 @@ def plot_predictions(self, test_series: TimeSeries) -> Image: Returns ------- - image : Image + image: Plots predictions of the given time series to the given target Column Raises From 94769a5da570ee6df0e2186ad5e7ca25243813aa Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:12:20 +0200 Subject: [PATCH 46/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 8cfa8d78e..7d4f37c42 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -161,7 +161,7 @@ def plot_predictions(self, test_series: TimeSeries) -> Image: Parameters ---------- - test_series : TimeSeries + test_series: The time series containing the target vector. Returns From c052d0636dd5beff16ebf3e05e67bf7d9a4cfc3c Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:13:37 +0200 Subject: [PATCH 47/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 7d4f37c42..0ab4c0363 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -50,7 +50,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModelRegressor: Parameters ---------- - time_series : TimeSeries + time_series: The time series containing the target column, which will be used. Returns From b32efaf3081d7fc36ded7fe03f141a7bc9f600cb Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:13:54 +0200 Subject: [PATCH 48/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 0ab4c0363..8b911825c 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -55,7 +55,7 @@ def fit(self, time_series: TimeSeries) -> ArimaModelRegressor: Returns ------- - fitted_arima : ArimaModelRegressor + fitted_arima: The fitted ARIMA Model. Raises From 069b944ff64b7dc4adb910ccdaad100149fe40b8 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:14:07 +0200 Subject: [PATCH 49/60] Update src/safeds/ml/classical/regression/_arima.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/ml/classical/regression/_arima.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 8b911825c..43f624661 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -116,7 +116,7 @@ def predict(self, time_series: TimeSeries) -> TimeSeries: Parameters ---------- - time_series : TimeSeries + time_series: The test dataset of the time series. Returns From 5d246ba68cebb4d5e6d57beb53d44e0ddb12f010 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 2 Apr 2024 16:16:10 +0200 Subject: [PATCH 50/60] added code review changes --- src/safeds/data/tabular/containers/_time_series.py | 10 ++++++++++ src/safeds/exceptions/__init__.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index e8eaac5e2..13ced4d38 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -67,6 +67,12 @@ def timeseries_from_csv_file( If the specified file does not exist. WrongFileExtensionError If the file is not a csv file. + UnknownColumnNameError + If target_name or time_name matches none of the column names. + Value Error + If one column is target and feature + Value Error + If one column is time and feature """ return TimeSeries._from_table( @@ -1239,6 +1245,10 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: ------- plot: A plot with all the time series targets plotted by the time on the x-axis. + Raises + ----- + NonNumericColumnError + if the target column contains non numerical values """ if not self._target.type.is_numeric(): diff --git a/src/safeds/exceptions/__init__.py b/src/safeds/exceptions/__init__.py index bc38abe8f..de3423ec7 100644 --- a/src/safeds/exceptions/__init__.py +++ b/src/safeds/exceptions/__init__.py @@ -46,6 +46,7 @@ "IllegalSchemaModificationError", "IndexOutOfBoundsError", "MissingValuesColumnError", + "NonTimeSeriesError", "NonNumericColumnError", "TransformerNotFittedError", "UnknownColumnNameError", @@ -59,7 +60,6 @@ "ModelNotFittedError", "PredictionError", "UntaggedTableError", - "NonTimeSeriesError", # Other "Bound", "ClosedBound", From c55c83c1b647315fc18379e06784edc1c34a3c4a Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 2 Apr 2024 18:28:39 +0200 Subject: [PATCH 51/60] added enumerate --- src/safeds/data/tabular/containers/_time_series.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 13ced4d38..e638ec0dd 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1258,11 +1258,10 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: data[self.time.name] = self.time._data data[self.target.name] = self.target._data index = 0 - for ts in time_series: + for index,ts in enumerate(time_series): if not ts.target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") data[ts.target.name + " " + str(index)] = ts.target._data - index = index + 1 fig = plt.figure() data = pd.melt(data, [self.time.name]) From bd912580495b78872ab2e9a827fde52dfe7c81ae Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 2 Apr 2024 18:53:05 +0200 Subject: [PATCH 52/60] delted useless var --- src/safeds/data/tabular/containers/_time_series.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index e638ec0dd..b9770bc71 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1257,7 +1257,6 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: data = pd.DataFrame() data[self.time.name] = self.time._data data[self.target.name] = self.target._data - index = 0 for index,ts in enumerate(time_series): if not ts.target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") From 9ba25c3428549836e3f2fc0491dc65c3d755d4a6 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 2 Apr 2024 19:16:08 +0200 Subject: [PATCH 53/60] delted useless var --- src/safeds/data/tabular/containers/_time_series.py | 2 +- src/safeds/exceptions/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index b9770bc71..347472653 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1257,7 +1257,7 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: data = pd.DataFrame() data[self.time.name] = self.time._data data[self.target.name] = self.target._data - for index,ts in enumerate(time_series): + for index, ts in enumerate(time_series): if not ts.target.type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") data[ts.target.name + " " + str(index)] = ts.target._data diff --git a/src/safeds/exceptions/__init__.py b/src/safeds/exceptions/__init__.py index de3423ec7..4c1c60331 100644 --- a/src/safeds/exceptions/__init__.py +++ b/src/safeds/exceptions/__init__.py @@ -46,7 +46,6 @@ "IllegalSchemaModificationError", "IndexOutOfBoundsError", "MissingValuesColumnError", - "NonTimeSeriesError", "NonNumericColumnError", "TransformerNotFittedError", "UnknownColumnNameError", @@ -58,6 +57,7 @@ "DatasetMissesFeaturesError", "LearningError", "ModelNotFittedError", + "NonTimeSeriesError", "PredictionError", "UntaggedTableError", # Other From 4de046e957c2f02fd5e52b68ced63810ead112bf Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 2 Apr 2024 19:40:32 +0200 Subject: [PATCH 54/60] merge conflict --- poetry.lock | 1623 +++++++++++++++++++++++++++------------------------ 1 file changed, 845 insertions(+), 778 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1e87f14da..b3f71eb2d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -22,13 +22,13 @@ trio = ["trio (>=0.23)"] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] @@ -171,19 +171,22 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -207,13 +210,13 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -406,13 +409,13 @@ files = [ [[package]] name = "comm" -version = "0.2.1" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" files = [ - {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, - {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -486,63 +489,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.4.0" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, - {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, - {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, - {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, - {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, - {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, - {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, - {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, - {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, - {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, - {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, - {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, - {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, - {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.extras] @@ -565,29 +568,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.0" +version = "1.8.1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, - {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, - {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, - {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, - {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, - {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, - {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, - {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, - {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, - {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, - {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, - {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, - {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, - {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, - {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, - {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, - {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, - {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, ] [[package]] @@ -653,76 +660,76 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, + {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] name = "fonttools" -version = "4.47.2" +version = "4.50.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, - {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, - {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, - {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, - {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, - {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, - {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, - {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, - {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, - {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, - {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, - {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, - {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"}, + {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"}, + {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"}, + {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"}, + {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"}, + {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"}, + {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"}, + {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"}, + {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"}, + {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"}, + {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"}, + {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"}, + {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -745,13 +752,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.3.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.extras] @@ -769,7 +776,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -797,18 +804,74 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "griffe" -version = "0.38.1" +version = "0.42.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.38.1-py3-none-any.whl", hash = "sha256:334c79d3b5964ade65c05dfcaf53518c576dedd387aaba5c9fd71212f34f1483"}, - {file = "griffe-0.38.1.tar.gz", hash = "sha256:bd68d7da7f3d87bc57eb9962b250db123efd9bbcc06c11c1a91b6e583b2a9361"}, + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, ] [package.dependencies] colorama = ">=0.4" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "idna" version = "3.6" @@ -822,13 +885,13 @@ files = [ [[package]] name = "imageio" -version = "2.33.1" +version = "2.34.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.8" files = [ - {file = "imageio-2.33.1-py3-none-any.whl", hash = "sha256:c5094c48ccf6b2e6da8b4061cd95e1209380afafcbeae4a4e280938cce227e1d"}, - {file = "imageio-2.33.1.tar.gz", hash = "sha256:78722d40b137bd98f5ec7312119f8aea9ad2049f76f434748eb306b6937cc1ce"}, + {file = "imageio-2.34.0-py3-none-any.whl", hash = "sha256:08082bf47ccb54843d9c73fe9fc8f3a88c72452ab676b58aca74f36167e8ccba"}, + {file = "imageio-2.34.0.tar.gz", hash = "sha256:ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53"}, ] [package.dependencies] @@ -865,13 +928,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.28.0" +version = "6.29.4" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.28.0-py3-none-any.whl", hash = "sha256:c6e9a9c63a7f4095c0a22a79f765f079f9ec7be4f2430a898ddea889e8665661"}, - {file = "ipykernel-6.28.0.tar.gz", hash = "sha256:69c11403d26de69df02225916f916b37ea4b9af417da0a8c827f84328d88e5f3"}, + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, ] [package.dependencies] @@ -894,17 +957,17 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.22.1" +version = "8.23.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.22.1-py3-none-any.whl", hash = "sha256:869335e8cded62ffb6fac8928e5287a05433d6462e3ebaac25f4216474dd6bc4"}, - {file = "ipython-8.22.1.tar.gz", hash = "sha256:39c6f9efc079fb19bfb0f17eee903978fe9a290b1b82d68196c641cecb76ea22"}, + {file = "ipython-8.23.0-py3-none-any.whl", hash = "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1"}, + {file = "ipython-8.23.0.tar.gz", hash = "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d"}, ] [package.dependencies] @@ -917,12 +980,14 @@ prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5.13.0" +typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [package.extras] -all = ["ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,terminal]", "ipython[test,test-extra]"] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] kernel = ["ipykernel"] +matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] @@ -933,21 +998,21 @@ test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "num [[package]] name = "ipywidgets" -version = "8.1.1" +version = "8.1.2" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, - {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, + {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, + {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.9,<3.1.0" +jupyterlab-widgets = ">=3.0.10,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.9,<4.1.0" +widgetsnbextension = ">=4.0.10,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1015,18 +1080,15 @@ files = [ [[package]] name = "json5" -version = "0.9.14" +version = "0.9.24" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, - {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, + {file = "json5-0.9.24-py3-none-any.whl", hash = "sha256:4ca101fd5c7cb47960c055ef8f4d0e31e15a7c6c48c3b6f1473fc83b6c462a13"}, + {file = "json5-0.9.24.tar.gz", hash = "sha256:0c638399421da959a20952782800e5c1a78c14e08e1dc9738fa10d8ec14d58c8"}, ] -[package.extras] -dev = ["hypothesis"] - [[package]] name = "jsonpointer" version = "2.4" @@ -1040,13 +1102,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.20.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, - {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1103,13 +1165,13 @@ qtconsole = "*" [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, ] [package.dependencies] @@ -1149,13 +1211,13 @@ test = ["flaky", "pexpect", "pytest"] [[package]] name = "jupyter-core" -version = "5.7.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, - {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -1165,17 +1227,17 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.9.0" +version = "0.10.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, - {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, ] [package.dependencies] @@ -1194,13 +1256,13 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.2.2" +version = "2.2.4" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter-lsp-2.2.2.tar.gz", hash = "sha256:256d24620542ae4bba04a50fc1f6ffe208093a07d8e697fea0a8d1b8ca1b7e5b"}, - {file = "jupyter_lsp-2.2.2-py3-none-any.whl", hash = "sha256:3b95229e4168355a8c91928057c1621ac3510ba98b2a925e82ebd77f078b1aa5"}, + {file = "jupyter-lsp-2.2.4.tar.gz", hash = "sha256:5e50033149344065348e688608f3c6d654ef06d9856b67655bd7b6bac9ee2d59"}, + {file = "jupyter_lsp-2.2.4-py3-none-any.whl", hash = "sha256:da61cb63a16b6dff5eac55c2699cc36eac975645adee02c41bdfc03bf4802e77"}, ] [package.dependencies] @@ -1208,13 +1270,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.12.3" +version = "2.13.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.12.3-py3-none-any.whl", hash = "sha256:6f85310ea5e6068568a521f079fba99d8d17e4884dd1d602ab0f43b3115204a8"}, - {file = "jupyter_server-2.12.3.tar.gz", hash = "sha256:a1d2d51e497b1a6256c48b6940b0dd49b2553981baf1690077c37792f1fa23a1"}, + {file = "jupyter_server-2.13.0-py3-none-any.whl", hash = "sha256:77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b"}, + {file = "jupyter_server-2.13.0.tar.gz", hash = "sha256:c80bfb049ea20053c3d9641c2add4848b38073bf79f1729cea1faed32fc1c78e"}, ] [package.dependencies] @@ -1240,17 +1302,17 @@ websocket-client = "*" [package.extras] docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] [[package]] name = "jupyter-server-terminals" -version = "0.5.1" +version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.5.1-py3-none-any.whl", hash = "sha256:5e63e947ddd97bb2832db5ef837a258d9ccd4192cd608c1270850ad947ae5dd7"}, - {file = "jupyter_server_terminals-0.5.1.tar.gz", hash = "sha256:16d3be9cf48be6a1f943f3a6c93c033be259cf4779184c66421709cf63dccfea"}, + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, ] [package.dependencies] @@ -1263,17 +1325,18 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.0.11" +version = "4.1.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.11-py3-none-any.whl", hash = "sha256:536bf0e78723153a5016ca7efb88ed0ecd7070d3f1555d5b0e2770658f900a3c"}, - {file = "jupyterlab-4.0.11.tar.gz", hash = "sha256:d1aec24712566bc25a36229788242778e498ca4088028e2f9aa156b8b7fdc8fc"}, + {file = "jupyterlab-4.1.5-py3-none-any.whl", hash = "sha256:3bc843382a25e1ab7bc31d9e39295a9f0463626692b7995597709c0ab236ab2c"}, + {file = "jupyterlab-4.1.5.tar.gz", hash = "sha256:c9ad75290cb10bfaff3624bf3fbb852319b4cce4c456613f8ebbaa98d03524db"}, ] [package.dependencies] async-lru = ">=1.0.0" +httpx = ">=0.25.0" ipykernel = "*" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -1286,9 +1349,9 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.6)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] [[package]] @@ -1304,13 +1367,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.25.2" +version = "2.25.4" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab_server-2.25.2-py3-none-any.whl", hash = "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf"}, - {file = "jupyterlab_server-2.25.2.tar.gz", hash = "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63"}, + {file = "jupyterlab_server-2.25.4-py3-none-any.whl", hash = "sha256:eb645ecc8f9b24bac5decc7803b6d5363250e16ec5af814e516bc2c54dd88081"}, + {file = "jupyterlab_server-2.25.4.tar.gz", hash = "sha256:2098198e1e82e0db982440f9b5136175d73bea2cd42a6480aa6fd502cb23c4f9"}, ] [package.dependencies] @@ -1325,32 +1388,32 @@ requests = ">=2.31" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" -version = "3.0.9" +version = "3.0.10" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, - {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, + {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, + {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, ] [[package]] name = "jupytext" -version = "1.16.0" +version = "1.16.1" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.0-py3-none-any.whl", hash = "sha256:c2b951ac72871f39cd6cd242b56bc43219b7ed8169598bae5359811fb1f54d28"}, - {file = "jupytext-1.16.0.tar.gz", hash = "sha256:94c7e67775e90e1792c39ab7fca4e0459bf7c35656123e8dc2e9e1b3e953baf8"}, + {file = "jupytext-1.16.1-py3-none-any.whl", hash = "sha256:796ec4f68ada663569e5d38d4ef03738a01284bfe21c943c485bc36433898bd0"}, + {file = "jupytext-1.16.1.tar.gz", hash = "sha256:68c7b68685e870e80e60fda8286fbd6269e9c74dc1df4316df6fe46eabc94c99"}, ] [package.dependencies] -markdown-it-py = ">=1.0.0" +markdown-it-py = ">=1.0" mdit-py-plugins = "*" nbformat = "*" packaging = "*" @@ -1599,13 +1662,13 @@ rapidfuzz = ">=3.1.0,<4.0.0" [[package]] name = "markdown" -version = "3.5.2" +version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, - {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.extras] @@ -1638,71 +1701,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {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"}, ] [[package]] @@ -1938,13 +2001,13 @@ mkdocs = ">=1.0.3" [[package]] name = "mkdocs-material" -version = "9.5.12" +version = "9.5.17" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.12-py3-none-any.whl", hash = "sha256:d6f0c269f015e48c76291cdc79efb70f7b33bbbf42d649cfe475522ebee61b1f"}, - {file = "mkdocs_material-9.5.12.tar.gz", hash = "sha256:5f69cef6a8aaa4050b812f72b1094fda3d079b9a51cf27a247244c03ec455e97"}, + {file = "mkdocs_material-9.5.17-py3-none-any.whl", hash = "sha256:14a2a60119a785e70e765dd033e6211367aca9fc70230e577c1cf6a326949571"}, + {file = "mkdocs_material-9.5.17.tar.gz", hash = "sha256:06ae1275a72db1989cf6209de9e9ecdfbcfdbc24c58353877b2bb927dbe413e4"}, ] [package.dependencies] @@ -2050,13 +2113,13 @@ tests = ["pytest (>=4.6)"] [[package]] name = "nbclient" -version = "0.9.0" +version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, - {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, ] [package.dependencies] @@ -2068,17 +2131,17 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.14.0" -description = "Converting Jupyter Notebooks" +version = "7.16.3" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.14.0-py3-none-any.whl", hash = "sha256:483dde47facdaa4875903d651305ad53cd76e2255ae3c61efe412a95f2d22a24"}, - {file = "nbconvert-7.14.0.tar.gz", hash = "sha256:92b9a44b63e5a7fb4f6fa0ef41261e35c16925046ccd1c04a5c8099bf100476e"}, + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, ] [package.dependencies] @@ -2104,18 +2167,18 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.3" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, + {file = "nbformat-5.10.3-py3-none-any.whl", hash = "sha256:d9476ca28676799af85385f409b49d95e199951477a159a576ef2a675151e5e8"}, + {file = "nbformat-5.10.3.tar.gz", hash = "sha256:60ed5e910ef7c6264b87d644f276b1b49e24011930deef54605188ddeb211685"}, ] [package.dependencies] @@ -2130,13 +2193,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -2159,18 +2222,18 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "notebook" -version = "7.0.7" +version = "7.1.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.7-py3-none-any.whl", hash = "sha256:289b606d7e173f75a18beb1406ef411b43f97f7a9c55ba03efa3622905a62346"}, - {file = "notebook-7.0.7.tar.gz", hash = "sha256:3bcff00c17b3ac142ef5f436d50637d936b274cfa0b41f6ac0175363de9b4e09"}, + {file = "notebook-7.1.2-py3-none-any.whl", hash = "sha256:fc6c24b9aef18d0cd57157c9c47e95833b9b0bdc599652639acf0bdb61dc7d5f"}, + {file = "notebook-7.1.2.tar.gz", hash = "sha256:efc2c80043909e0faa17fce9e9b37c059c03af0ec99a4d4db84cb21d9d2e936a"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.0.2,<5" +jupyterlab = ">=4.1.1,<4.2" jupyterlab-server = ">=2.22.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" @@ -2182,13 +2245,13 @@ test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4 [[package]] name = "notebook-shim" -version = "0.2.3" +version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" files = [ - {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, - {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, ] [package.dependencies] @@ -2199,47 +2262,47 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -2363,13 +2426,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.3.101" +version = "12.4.99" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:64335a8088e2b9d196ae8665430bc6a2b7e6ef2eb877a9c735c804bd4ff6467c"}, - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-win_amd64.whl", hash = "sha256:1b2e317e437433753530792f13eece58f0aec21a2b05903be7bffe58a606cbd1"}, + {file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_aarch64.whl", hash = "sha256:75d6498c96d9adb9435f2bbdbddb479805ddfb97b5c1b32395c694185c20ca57"}, + {file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c6428836d20fe7e327191c175791d38570e10762edc588fb46749217cd444c74"}, + {file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-win_amd64.whl", hash = "sha256:991905ffa2144cb603d8ca7962d75c35334ae82bf92820b6ba78157277da1ad2"}, ] [[package]] @@ -2399,24 +2463,24 @@ et-xmlfile = "*" [[package]] name = "overrides" -version = "7.4.0" +version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, - {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -2503,13 +2567,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] @@ -2572,79 +2636,80 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] @@ -2657,28 +2722,28 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" 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.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +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)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -2687,13 +2752,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prometheus-client" -version = "0.19.0" +version = "0.20.0" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, - {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, ] [package.extras] @@ -2715,27 +2780,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -2768,13 +2833,13 @@ tests = ["pytest"] [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -2794,13 +2859,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.7" +version = "10.7.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, - {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, ] [package.dependencies] @@ -2812,13 +2877,13 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -2826,23 +2891,23 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.0.2" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, - {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.3.0,<2.0" +pluggy = ">=1.4,<2.0" [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" @@ -2864,13 +2929,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -2889,13 +2954,13 @@ files = [ [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -2923,17 +2988,17 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.12" +version = "2.0.13" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, - {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, - {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, - {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, - {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, - {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, ] [[package]] @@ -3159,101 +3224,101 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "rapidfuzz" -version = "3.6.1" +version = "3.7.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"}, - {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:860f438238f1807532aa5c5c25e74c284232ccc115fe84697b78e25d48f364f7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bb9285abeb0477cdb2f8ea0cf7fd4b5f72ed5a9a7d3f0c0bb4a5239db2fc1ed"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:08671280e0c04d2bb3f39511f13cae5914e6690036fd1eefc3d47a47f9fae634"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04bae4d9c16ce1bab6447d196fb8258d98139ed8f9b288a38b84887985e4227b"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1efa2268b51b68156fb84d18ca1720311698a58051c4a19c40d670057ce60519"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:600b4d4315f33ec0356c0dab3991a5d5761102420bcff29e0773706aa48936e8"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18bc2f13c73d5d34499ff6ada55b052c445d3aa64d22c2639e5ab45472568046"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e11c5e6593be41a555475c9c20320342c1f5585d635a064924956944c465ad4"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d7878025248b99ccca3285891899373f98548f2ca13835d83619ffc42241c626"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b4a7e37fe136022d944374fcd8a2f72b8a19f7b648d2cdfb946667e9ede97f9f"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b5881856f830351aaabd869151124f64a80bf61560546d9588a630a4e933a5de"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c788b11565cc176fab8fab6dfcd469031e906927db94bf7e422afd8ef8f88a5a"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17a3092e74025d896ef1d67ac236c83494da37a78ef84c712e4e2273c115f1"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win32.whl", hash = "sha256:e499c823206c9ffd9d89aa11f813a4babdb9219417d4efe4c8a6f8272da00e98"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:91f798cc00cd94a0def43e9befc6e867c9bd8fa8f882d1eaa40042f528b7e2c7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:d5a3872f35bec89f07b993fa1c5401d11b9e68bcdc1b9737494e279308a38a5f"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ef6b6ab64c4c91c57a6b58e1d690b59453bfa1f1e9757a7e52e59b4079e36631"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f9070b42c0ba030b045bba16a35bdb498a0d6acb0bdb3ff4e325960e685e290"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:63044c63565f50818d885bfcd40ac369947da4197de56b4d6c26408989d48edf"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b0c47860c733a3d73a4b70b97b35c8cbf24ef24f8743732f0d1c412a8c85de"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1b14489b038f007f425a06fcf28ac6313c02cb603b54e3a28d9cfae82198cc0"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be08f39e397a618aab907887465d7fabc2d1a4d15d1a67cb8b526a7fb5202a3e"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16895dc62a7b92028f9c8b6d22830f1cbc77306ee794f461afc6028e1a8d7539"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:579cce49dfa57ffd8c8227b3fb53cced54b4df70cec502e63e9799b4d1f44004"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:40998c8dc35fdd221790b8b5134a8d7499adbfab9a5dd9ec626c7e92e17a43ed"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:dc3fdb4738a6b83ae27f1d8923b00d3a9c2b5c50da75b9f8b81841839c6e3e1f"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:92b8146fbfb37ac358ef7e0f6b79619e4f793fbbe894b99ea87920f9c0a9d77d"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfceaa7c2914585bb8a043265c39ec09078f13fbf53b5525722fc074306b6fa"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f332d61f51b0b9c8b55a0fb052b4764b6ad599ea8ce948ac47a4388e9083c35e"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win32.whl", hash = "sha256:dfd1e4819f1f3c47141f86159b44b7360ecb19bf675080b3b40437bf97273ab9"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:594b9c33fc1a86784962043ee3fbaaed875fbaadff72e467c2f7a83cd6c5d69d"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b13a6823a1b83ae43f8bf35955df35032bee7bec0daf9b5ab836e0286067434"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:075a419a0ec29be44b3d7f4bcfa5cb7e91e419379a85fc05eb33de68315bd96f"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a5b96d2081c3afbef1842a61d63e55d0a5a201473e6975a80190ff2d6f22ca"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9460d8fddac7ea46dff9298eee9aa950dbfe79f2eb509a9f18fbaefcd10894c"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39eb1513ee139ba6b5c01fe47ddf2d87e9560dd7fdee1068f7f6efbae70de34"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eace9fdde58a425d4c9a93021b24a0cac830df167a5b2fc73299e2acf9f41493"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cc77237242303733de47829028a0a8b6ab9188b23ec9d9ff0a674fdcd3c8e7f"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74e692357dd324dff691d379ef2c094c9ec526c0ce83ed43a066e4e68fe70bf6"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2075ac9ee5c15d33d24a1efc8368d095602b5fd9634c5b5f24d83e41903528"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5a8ba64d72329a940ff6c74b721268c2004eecc48558f648a38e96915b5d1c1b"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a1f268a2a37cd22573b4a06eccd481c04504b246d3cadc2d8e8dfa64b575636d"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:42c2e8a2341363c7caf276efdbe1a673fc5267a02568c47c8e980f12e9bc8727"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a9acca34b34fb895ee6a84c436bb919f3b9cd8f43e7003d43e9573a1d990ff74"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9bad6a0fe3bc1753dacaa6229a8ba7d9844eb7ae24d44d17c5f4c51c91a8a95e"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win32.whl", hash = "sha256:c86bc4b1d2380739e6485396195e30021df509b4923f3f757914e171587bce7c"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d7361608c8e73a1dc0203a87d151cddebdade0098a047c46da43c469c07df964"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fdc26e7863e0f63c2185d53bb61f5173ad4451c1c8287b535b30ea25a419a5a"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9b6167468f76779a14b9af66210f68741af94d32d086f19118de4e919f00585c"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bd394e28ff221557ea4d8152fcec3e66d9f620557feca5f2bedc4c21f8cf2f9"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8e70f876ca89a6df344f8157ac60384e8c05a0dfb442da2490c3f1c45238ccf5"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c837f89d86a5affe9ee6574dad6b195475676a6ab171a67920fc99966f2ab2c"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cda4550a98658f9a8bcdc03d0498ed1565c1563880e3564603a9eaae28d51b2a"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecd70212fd9f1f8b1d3bdd8bcb05acc143defebd41148bdab43e573b043bb241"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187db4cc8fb54f8c49c67b7f38ef3a122ce23be273032fa2ff34112a2694c3d8"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4604dfc1098920c4eb6d0c6b5cc7bdd4bf95b48633e790c1d3f100a25870691d"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01581b688c5f4f6665b779135e32db0edab1d78028abf914bb91469928efa383"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0828b55ec8ad084febdf4ab0c942eb1f81c97c0935f1cb0be0b4ea84ce755988"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:150c98b65faff17b917b9d36bff8a4d37b6173579c6bc2e38ff2044e209d37a4"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7e4eea225d2bff1aff4c85fcc44716596d3699374d99eb5906b7a7560297460e"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7bc944d7e830cfce0f8b4813875f05904207017b66e25ab7ee757507001310a9"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-win32.whl", hash = "sha256:3e55f02105c451ab6ff0edaaba57cab1b6c0a0241cfb2b306d4e8e1503adba50"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:41851620d2900791d66d9b6092fc163441d7dd91a460c73b07957ff1c517bc30"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e8041c6b2d339766efe6298fa272f79d6dd799965df364ef4e50f488c101c899"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4e09d81008e212fc824ea23603ff5270d75886e72372fa6c7c41c1880bcb57ed"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:419c8961e861fb5fc5590056c66a279623d1ea27809baea17e00cdc313f1217a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1522eaab91b9400b3ef16eebe445940a19e70035b5bc5d98aef23d66e9ac1df0"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:611278ce3136f4544d596af18ab8849827d64372e1d8888d9a8d071bf4a3f44d"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4efa9bfc5b955b6474ee077eee154e240441842fa304f280b06e6b6aa58a1d1e"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cc9d3c8261457af3f8756b1f71a9fdc4892978a9e8b967976d2803e08bf972"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce728e2b582fd396bc2559160ee2e391e6a4b5d2e455624044699d96abe8a396"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a6a36c9299e059e0bee3409218bc5235a46570c20fc980cdee5ed21ea6110ad"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9ea720db8def684c1eb71dadad1f61c9b52f4d979263eb5d443f2b22b0d5430a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:358692f1df3f8aebcd48e69c77c948c9283b44c0efbaf1eeea01739efe3cd9a6"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:faded69ffe79adcefa8da08f414a0fd52375e2b47f57be79471691dad9656b5a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f9f3dc14fadbd553975f824ac48c381f42192cec9d7e5711b528357662a8d8e"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win32.whl", hash = "sha256:7be5f460ff42d7d27729115bfe8a02e83fa0284536d8630ee900d17b75c29e65"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd5ad2c12dab2b98340c4b7b9592c8f349730bda9a2e49675ea592bbcbc1360b"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:aa163257a0ac4e70f9009d25e5030bdd83a8541dfa3ba78dc86b35c9e16a80b4"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4e50840a8a8e0229563eeaf22e21a203359859557db8829f4d0285c17126c5fb"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:632f09e19365ace5ff2670008adc8bf23d03d668b03a30230e5b60ff9317ee93"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:209dda6ae66b702f74a78cef555397cdc2a83d7f48771774a20d2fc30808b28c"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bc0b78572626af6ab134895e4dbfe4f4d615d18dcc43b8d902d8e45471aabba"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ba14850cc8258b3764ea16b8a4409ac2ba16d229bde7a5f495dd479cd9ccd56"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b917764fd2b267addc9d03a96d26f751f6117a95f617428c44a069057653b528"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1252ca156e1b053e84e5ae1c8e9e062ee80468faf23aa5c543708212a42795fd"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86c7676a32d7524e40bc73546e511a408bc831ae5b163029d325ea3a2027d089"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e7d729af2e5abb29caa070ec048aba042f134091923d9ca2ac662b5604577e"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86eea3e6c314a9238de568254a9c591ec73c2985f125675ed5f171d869c47773"}, + {file = "rapidfuzz-3.7.0.tar.gz", hash = "sha256:620df112c39c6d27316dc1e22046dc0382d6d91fd60d7c51bd41ca0333d867e9"}, ] [package.extras] @@ -3261,13 +3326,13 @@ full = ["numpy"] [[package]] name = "referencing" -version = "0.32.1" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.32.1-py3-none-any.whl", hash = "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554"}, - {file = "referencing-0.32.1.tar.gz", hash = "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -3424,110 +3489,110 @@ files = [ [[package]] name = "rpds-py" -version = "0.16.2" +version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f"}, - {file = "rpds_py-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9"}, - {file = "rpds_py-0.16.2-cp310-none-win32.whl", hash = "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82"}, - {file = "rpds_py-0.16.2-cp310-none-win_amd64.whl", hash = "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e"}, - {file = "rpds_py-0.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb"}, - {file = "rpds_py-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8"}, - {file = "rpds_py-0.16.2-cp311-none-win32.whl", hash = "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3"}, - {file = "rpds_py-0.16.2-cp311-none-win_amd64.whl", hash = "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d"}, - {file = "rpds_py-0.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d"}, - {file = "rpds_py-0.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58"}, - {file = "rpds_py-0.16.2-cp312-none-win32.whl", hash = "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3"}, - {file = "rpds_py-0.16.2-cp312-none-win_amd64.whl", hash = "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5"}, - {file = "rpds_py-0.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60"}, - {file = "rpds_py-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365"}, - {file = "rpds_py-0.16.2-cp38-none-win32.whl", hash = "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff"}, - {file = "rpds_py-0.16.2-cp38-none-win_amd64.whl", hash = "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851"}, - {file = "rpds_py-0.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e"}, - {file = "rpds_py-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45"}, - {file = "rpds_py-0.16.2-cp39-none-win32.whl", hash = "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d"}, - {file = "rpds_py-0.16.2-cp39-none-win_amd64.whl", hash = "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac"}, - {file = "rpds_py-0.16.2.tar.gz", hash = "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, ] [[package]] @@ -3622,45 +3687,45 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc ( [[package]] name = "scipy" -version = "1.11.4" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "seaborn" @@ -3712,13 +3777,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -3831,13 +3896,13 @@ pytest = ">=7.0.0,<9.0.0" [[package]] name = "terminado" -version = "0.18.0" +version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" files = [ - {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, - {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, ] [package.dependencies] @@ -3852,24 +3917,24 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.4.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, + {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, + {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, ] [[package]] name = "tifffile" -version = "2023.12.9" +version = "2024.2.12" description = "Read and write TIFF files" optional = false python-versions = ">=3.9" files = [ - {file = "tifffile-2023.12.9-py3-none-any.whl", hash = "sha256:9b066e4b1a900891ea42ffd33dab8ba34c537935618b9893ddef42d7d422692f"}, - {file = "tifffile-2023.12.9.tar.gz", hash = "sha256:9dd1da91180a6453018a241ff219e1905f169384355cd89c9ef4034c1b46cdb8"}, + {file = "tifffile-2024.2.12-py3-none-any.whl", hash = "sha256:870998f82fbc94ff7c3528884c1b0ae54863504ff51dbebea431ac3fa8fb7c21"}, + {file = "tifffile-2024.2.12.tar.gz", hash = "sha256:4920a3ec8e8e003e673d3c6531863c99eedd570d1b8b7e141c072ed78ff8030d"}, ] [package.dependencies] @@ -3909,21 +3974,21 @@ files = [ [[package]] name = "torch" -version = "2.2.0+cu121" +version = "2.2.2+cu121" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.2.0+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:c441021672ebe2e5afbdb34817aa85e6d32130f94df2da9ad4cb78a9d4b81370"}, - {file = "torch-2.2.0+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:8f54c647ee19c8b4c0aad158c73b83b2c06cb62351e9cfa981540ce7295a9015"}, - {file = "torch-2.2.0+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:0bc59ae71528f0a6013f1b01670f039cc6d01b2ced7a7219ca16ee194c305116"}, - {file = "torch-2.2.0+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:d79324159c622243429ec214a86b8613c1d7d46fc4821374d324800f1df6ade1"}, - {file = "torch-2.2.0+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:330293cdae296bdb7b925412c561ec3d53cdc82c38104e43385fdbc4eb8f0e72"}, - {file = "torch-2.2.0+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:26ddc071aec9ac36beaded4036bf0c1ca04a8c82cbdf8615376948761b5f304a"}, - {file = "torch-2.2.0+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:a27daf0405b924359795c39a5a73ff31151880d63f65e3f0051c22f9bb3b231e"}, - {file = "torch-2.2.0+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:e28673afadfb189bc3ef24683674db908af1f823d8bf60315745d8428668edf5"}, - {file = "torch-2.2.0+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:71c631faed5358961d2fa582a370e1d29f8bec64fc02eb6ff6f4eb2c56acfd85"}, - {file = "torch-2.2.0+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:ea5b283a8f3ae2b7919ed5d83827664883476560f1161b3e17129827511d8568"}, + {file = "torch-2.2.2+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:cade4fd6c8ce7d826dbcfabd65f1d53b0ee0a058db8c1809d65bfd6051b55530"}, + {file = "torch-2.2.2+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:d300055aac0e2063f9a2659924e9766605db06d5683532c6eabbdef6bec865dd"}, + {file = "torch-2.2.2+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:4c94e4d1a22d70abbdff716dec99ba5eff94b4340ffa73b4fb629f940dbb8a75"}, + {file = "torch-2.2.2+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:efbcfdd4399197d06b32f7c0e1711c615188cdd65427b933648c7478fb880b3f"}, + {file = "torch-2.2.2+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:badc14d413ff1847d15021a1ec0affa479d24dfc83e6d51b9b4b9fbfaad1b14c"}, + {file = "torch-2.2.2+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:5b5b91c7fcda5f02e5e5644a32f593c6c17f301a1180213e353e34b51cc63b9f"}, + {file = "torch-2.2.2+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:c178beb2bb01f773601777bc481c7651be5b1f189cf180f0c0aceac0789aa9a5"}, + {file = "torch-2.2.2+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:aa67db6ad36d42305eac8236d8412d9fecea81f965cc0b374581cbd2b846ad0d"}, + {file = "torch-2.2.2+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:114e9395867ee860166562d8cc1f2809225f9e29783dd5e72175d9a9a7a8505c"}, + {file = "torch-2.2.2+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:2de773282a7855dd39139aabc37ffc4ba1b4b28b4594e5f56dd30010b064e8b0"}, ] [package.dependencies] @@ -3943,7 +4008,7 @@ nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \" nvidia-nccl-cu12 = {version = "2.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} typing-extensions = ">=4.8.0" [package.extras] @@ -3957,28 +4022,27 @@ reference = "torch_cuda121" [[package]] name = "torchvision" -version = "0.17.0+cu121" +version = "0.17.2+cu121" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.8" files = [ - {file = "torchvision-0.17.0+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:e1273e9862fc821febc4c716f13849b1ffa87c0d69f6ab824356c5532c490f08"}, - {file = "torchvision-0.17.0+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:b5ba1adc6f9f1a40af9608ebc447ceed6c8816dcb926d59675c81111b8676966"}, - {file = "torchvision-0.17.0+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:fd66c9554fc1448633c232eeddcbd90a9bcd135ae94e682f4cb721984974ca9b"}, - {file = "torchvision-0.17.0+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:307e52c2887c1d2b50cc3581cf5f4c169130b8352462e361e71eeda19e0dd263"}, - {file = "torchvision-0.17.0+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:c39ee5b3e832b88137e10b0f99e9d0b7c13fa73fc00e1469e8b88d8f657eb80e"}, - {file = "torchvision-0.17.0+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:ad2c7f7c317ed9ebe0ebe9dcf805393320a0fec81c7fdec95f971cdd8884518f"}, - {file = "torchvision-0.17.0+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:de5dbc480fcc100792e3aacf90edffe5bcee4ced3abc4fc1d210d2347fc36e05"}, - {file = "torchvision-0.17.0+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:1c58b331dc8a46bd378b6776a841d067f739c1699085d1387159e4aed4d0f088"}, - {file = "torchvision-0.17.0+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:bf50506b5870848e5cf0a57e6526b9d00cf4e7c69929491ba91fb9fc384abc38"}, - {file = "torchvision-0.17.0+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:8036fc7815025dab85bccef3ead1102afc3236e9b16c42c132402cbb06bc6afe"}, + {file = "torchvision-0.17.2+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:c0f325635f8834fa55e69ab61075fb2bbcbb45395a985bba1db378b15627104b"}, + {file = "torchvision-0.17.2+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:c780783d4113cf3f86297f1b51a0f3a5c1f9487c5ec690b9a470d7d6e4f67e62"}, + {file = "torchvision-0.17.2+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:059f86a1c8d2b276b266c84a8f5a92cc8426d43c2a2c248dc73c140ab3a822f3"}, + {file = "torchvision-0.17.2+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:10ad542aab6b47dbe73c441381986d50a7ed5021cbe01d593a14477ec1f067a0"}, + {file = "torchvision-0.17.2+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:958d5438a56e83f22dedbb78a3b4301688d5ac433845650d2ccba3285fd27213"}, + {file = "torchvision-0.17.2+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:ecd9d4eb4f68a144da9936d2760ca3f4cbbfa092fc8d744ca746afff9f4053be"}, + {file = "torchvision-0.17.2+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:df8e74cbbb4de0a60f11cd7c28d820116027cd3949893f97c55b6f12326bd7af"}, + {file = "torchvision-0.17.2+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:8bbd04880ed39e0f12f78dbb52dcd88b00ffc65fe834059fc0482cb5999f5711"}, + {file = "torchvision-0.17.2+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:f37f592e3128bf3d99968ada5a128f118f9aed1dab609e272ac7231146fc6843"}, + {file = "torchvision-0.17.2+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:f37a529e82a633db0b7e9a8d37503d14d8f1033c454f80c844c1595637519b98"}, ] [package.dependencies] numpy = "*" pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" -requests = "*" -torch = "2.2.0" +torch = "2.2.2" [package.extras] scipy = ["scipy"] @@ -4010,18 +4074,18 @@ files = [ [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, + {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "triton" @@ -4048,35 +4112,35 @@ tutorials = ["matplotlib", "pandas", "tabulate", "torch"] [[package]] name = "types-python-dateutil" -version = "2.8.19.20240106" +version = "2.9.0.20240316" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, - {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, ] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -4095,54 +4159,57 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, ] [package.extras] @@ -4203,13 +4270,13 @@ test = ["websockets"] [[package]] name = "widgetsnbextension" -version = "4.0.9" +version = "4.0.10" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, - {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, + {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, + {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, ] [[package]] From 67a7a2c9aab54d0b1192e192214341b9b8c1bbbb Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 2 Apr 2024 21:56:23 +0200 Subject: [PATCH 55/60] changed lock for docs --- poetry.lock | 1546 ++++++++++++++++++++++++++++----------------------- 1 file changed, 838 insertions(+), 708 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3bac07894..32df8fe24 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -22,13 +22,13 @@ trio = ["trio (>=0.23)"] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] @@ -171,19 +171,22 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -207,13 +210,13 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -406,13 +409,13 @@ files = [ [[package]] name = "comm" -version = "0.2.1" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" files = [ - {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, - {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -486,63 +489,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.4.0" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, - {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, - {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, - {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, - {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, - {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, - {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, - {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, - {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, - {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, - {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, - {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, - {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, - {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.extras] @@ -565,29 +568,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.0" +version = "1.8.1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, - {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, - {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, - {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, - {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, - {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, - {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, - {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, - {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, - {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, - {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, - {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, - {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, - {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, - {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, - {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, - {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, - {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, ] [[package]] @@ -653,76 +660,76 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, + {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] name = "fonttools" -version = "4.47.2" +version = "4.50.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, - {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, - {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, - {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, - {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, - {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, - {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, - {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, - {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, - {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, - {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, - {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, - {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"}, + {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"}, + {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"}, + {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"}, + {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"}, + {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"}, + {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"}, + {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"}, + {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"}, + {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"}, + {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"}, + {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"}, + {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -745,13 +752,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.3.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.extras] @@ -769,7 +776,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -797,18 +804,74 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "griffe" -version = "0.38.1" +version = "0.42.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.38.1-py3-none-any.whl", hash = "sha256:334c79d3b5964ade65c05dfcaf53518c576dedd387aaba5c9fd71212f34f1483"}, - {file = "griffe-0.38.1.tar.gz", hash = "sha256:bd68d7da7f3d87bc57eb9962b250db123efd9bbcc06c11c1a91b6e583b2a9361"}, + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, ] [package.dependencies] colorama = ">=0.4" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "idna" version = "3.6" @@ -822,13 +885,13 @@ files = [ [[package]] name = "imageio" -version = "2.33.1" +version = "2.34.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.8" files = [ - {file = "imageio-2.33.1-py3-none-any.whl", hash = "sha256:c5094c48ccf6b2e6da8b4061cd95e1209380afafcbeae4a4e280938cce227e1d"}, - {file = "imageio-2.33.1.tar.gz", hash = "sha256:78722d40b137bd98f5ec7312119f8aea9ad2049f76f434748eb306b6937cc1ce"}, + {file = "imageio-2.34.0-py3-none-any.whl", hash = "sha256:08082bf47ccb54843d9c73fe9fc8f3a88c72452ab676b58aca74f36167e8ccba"}, + {file = "imageio-2.34.0.tar.gz", hash = "sha256:ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53"}, ] [package.dependencies] @@ -865,13 +928,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.28.0" +version = "6.29.4" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.28.0-py3-none-any.whl", hash = "sha256:c6e9a9c63a7f4095c0a22a79f765f079f9ec7be4f2430a898ddea889e8665661"}, - {file = "ipykernel-6.28.0.tar.gz", hash = "sha256:69c11403d26de69df02225916f916b37ea4b9af417da0a8c827f84328d88e5f3"}, + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, ] [package.dependencies] @@ -894,7 +957,7 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" @@ -935,21 +998,21 @@ test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "num [[package]] name = "ipywidgets" -version = "8.1.1" +version = "8.1.2" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, - {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, + {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, + {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.9,<3.1.0" +jupyterlab-widgets = ">=3.0.10,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.9,<4.1.0" +widgetsnbextension = ">=4.0.10,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1017,18 +1080,15 @@ files = [ [[package]] name = "json5" -version = "0.9.14" +version = "0.9.24" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, - {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, + {file = "json5-0.9.24-py3-none-any.whl", hash = "sha256:4ca101fd5c7cb47960c055ef8f4d0e31e15a7c6c48c3b6f1473fc83b6c462a13"}, + {file = "json5-0.9.24.tar.gz", hash = "sha256:0c638399421da959a20952782800e5c1a78c14e08e1dc9738fa10d8ec14d58c8"}, ] -[package.extras] -dev = ["hypothesis"] - [[package]] name = "jsonpointer" version = "2.4" @@ -1042,13 +1102,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.20.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, - {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1105,13 +1165,13 @@ qtconsole = "*" [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, ] [package.dependencies] @@ -1151,13 +1211,13 @@ test = ["flaky", "pexpect", "pytest"] [[package]] name = "jupyter-core" -version = "5.7.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, - {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -1167,17 +1227,17 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.9.0" +version = "0.10.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, - {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, ] [package.dependencies] @@ -1196,13 +1256,13 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.2.2" +version = "2.2.4" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter-lsp-2.2.2.tar.gz", hash = "sha256:256d24620542ae4bba04a50fc1f6ffe208093a07d8e697fea0a8d1b8ca1b7e5b"}, - {file = "jupyter_lsp-2.2.2-py3-none-any.whl", hash = "sha256:3b95229e4168355a8c91928057c1621ac3510ba98b2a925e82ebd77f078b1aa5"}, + {file = "jupyter-lsp-2.2.4.tar.gz", hash = "sha256:5e50033149344065348e688608f3c6d654ef06d9856b67655bd7b6bac9ee2d59"}, + {file = "jupyter_lsp-2.2.4-py3-none-any.whl", hash = "sha256:da61cb63a16b6dff5eac55c2699cc36eac975645adee02c41bdfc03bf4802e77"}, ] [package.dependencies] @@ -1210,13 +1270,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.12.3" +version = "2.13.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.12.3-py3-none-any.whl", hash = "sha256:6f85310ea5e6068568a521f079fba99d8d17e4884dd1d602ab0f43b3115204a8"}, - {file = "jupyter_server-2.12.3.tar.gz", hash = "sha256:a1d2d51e497b1a6256c48b6940b0dd49b2553981baf1690077c37792f1fa23a1"}, + {file = "jupyter_server-2.13.0-py3-none-any.whl", hash = "sha256:77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b"}, + {file = "jupyter_server-2.13.0.tar.gz", hash = "sha256:c80bfb049ea20053c3d9641c2add4848b38073bf79f1729cea1faed32fc1c78e"}, ] [package.dependencies] @@ -1242,17 +1302,17 @@ websocket-client = "*" [package.extras] docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] [[package]] name = "jupyter-server-terminals" -version = "0.5.1" +version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.5.1-py3-none-any.whl", hash = "sha256:5e63e947ddd97bb2832db5ef837a258d9ccd4192cd608c1270850ad947ae5dd7"}, - {file = "jupyter_server_terminals-0.5.1.tar.gz", hash = "sha256:16d3be9cf48be6a1f943f3a6c93c033be259cf4779184c66421709cf63dccfea"}, + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, ] [package.dependencies] @@ -1265,17 +1325,18 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.0.11" +version = "4.1.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.11-py3-none-any.whl", hash = "sha256:536bf0e78723153a5016ca7efb88ed0ecd7070d3f1555d5b0e2770658f900a3c"}, - {file = "jupyterlab-4.0.11.tar.gz", hash = "sha256:d1aec24712566bc25a36229788242778e498ca4088028e2f9aa156b8b7fdc8fc"}, + {file = "jupyterlab-4.1.5-py3-none-any.whl", hash = "sha256:3bc843382a25e1ab7bc31d9e39295a9f0463626692b7995597709c0ab236ab2c"}, + {file = "jupyterlab-4.1.5.tar.gz", hash = "sha256:c9ad75290cb10bfaff3624bf3fbb852319b4cce4c456613f8ebbaa98d03524db"}, ] [package.dependencies] async-lru = ">=1.0.0" +httpx = ">=0.25.0" ipykernel = "*" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -1288,9 +1349,9 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.6)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] [[package]] @@ -1306,13 +1367,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.25.2" +version = "2.25.4" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab_server-2.25.2-py3-none-any.whl", hash = "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf"}, - {file = "jupyterlab_server-2.25.2.tar.gz", hash = "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63"}, + {file = "jupyterlab_server-2.25.4-py3-none-any.whl", hash = "sha256:eb645ecc8f9b24bac5decc7803b6d5363250e16ec5af814e516bc2c54dd88081"}, + {file = "jupyterlab_server-2.25.4.tar.gz", hash = "sha256:2098198e1e82e0db982440f9b5136175d73bea2cd42a6480aa6fd502cb23c4f9"}, ] [package.dependencies] @@ -1327,32 +1388,32 @@ requests = ">=2.31" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" -version = "3.0.9" +version = "3.0.10" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, - {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, + {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, + {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, ] [[package]] name = "jupytext" -version = "1.16.0" +version = "1.16.1" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.0-py3-none-any.whl", hash = "sha256:c2b951ac72871f39cd6cd242b56bc43219b7ed8169598bae5359811fb1f54d28"}, - {file = "jupytext-1.16.0.tar.gz", hash = "sha256:94c7e67775e90e1792c39ab7fca4e0459bf7c35656123e8dc2e9e1b3e953baf8"}, + {file = "jupytext-1.16.1-py3-none-any.whl", hash = "sha256:796ec4f68ada663569e5d38d4ef03738a01284bfe21c943c485bc36433898bd0"}, + {file = "jupytext-1.16.1.tar.gz", hash = "sha256:68c7b68685e870e80e60fda8286fbd6269e9c74dc1df4316df6fe46eabc94c99"}, ] [package.dependencies] -markdown-it-py = ">=1.0.0" +markdown-it-py = ">=1.0" mdit-py-plugins = "*" nbformat = "*" packaging = "*" @@ -1601,13 +1662,13 @@ rapidfuzz = ">=3.1.0,<4.0.0" [[package]] name = "markdown" -version = "3.5.2" +version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, - {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.extras] @@ -1640,71 +1701,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {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"}, ] [[package]] @@ -1940,13 +2001,13 @@ mkdocs = ">=1.0.3" [[package]] name = "mkdocs-material" -version = "9.5.16" +version = "9.5.17" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.16-py3-none-any.whl", hash = "sha256:32fce3cd8ecbd5dca6e5887cc0cf5bc78707a36f7d0f6f1bbbe9edaf428b8055"}, - {file = "mkdocs_material-9.5.16.tar.gz", hash = "sha256:8b89b639592660f24657bb058de4aff0060cd0383148f8f51711201730f17503"}, + {file = "mkdocs_material-9.5.17-py3-none-any.whl", hash = "sha256:14a2a60119a785e70e765dd033e6211367aca9fc70230e577c1cf6a326949571"}, + {file = "mkdocs_material-9.5.17.tar.gz", hash = "sha256:06ae1275a72db1989cf6209de9e9ecdfbcfdbc24c58353877b2bb927dbe413e4"}, ] [package.dependencies] @@ -1994,13 +2055,13 @@ mkdocs = ">=1.2" [[package]] name = "mkdocstrings" -version = "0.24.1" +version = "0.24.2" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings-0.24.1-py3-none-any.whl", hash = "sha256:b4206f9a2ca8a648e222d5a0ca1d36ba7dee53c88732818de183b536f9042b5d"}, - {file = "mkdocstrings-0.24.1.tar.gz", hash = "sha256:cc83f9a1c8724fc1be3c2fa071dd73d91ce902ef6a79710249ec8d0ee1064401"}, + {file = "mkdocstrings-0.24.2-py3-none-any.whl", hash = "sha256:61440b77542170238099a7d87882c3417897771950e3aafe6e22abff3d1c51fb"}, + {file = "mkdocstrings-0.24.2.tar.gz", hash = "sha256:b91b9cdd9490ef2e8957000bff1d34a4b308b9cd57b10f26169f085def4c6a92"}, ] [package.dependencies] @@ -2020,19 +2081,18 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.9.0" +version = "1.9.2" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings_python-1.9.0-py3-none-any.whl", hash = "sha256:fad27d7314b4ec9c0359a187b477fb94c65ef561fdae941dca1b717c59aae96f"}, - {file = "mkdocstrings_python-1.9.0.tar.gz", hash = "sha256:6e1a442367cf75d30cf69774cbb1ad02aebec58bfff26087439df4955efecfde"}, + {file = "mkdocstrings_python-1.9.2-py3-none-any.whl", hash = "sha256:96d82f6424e08db6245e4a15ca95619f4ecd0ddd254c0aa590d4181814e16ee5"}, + {file = "mkdocstrings_python-1.9.2.tar.gz", hash = "sha256:8546a103c9b22e1778c72c887696acc39a6635fedde3c912ce00f967518a8847"}, ] [package.dependencies] griffe = ">=0.37" -markdown = ">=3.3,<3.6" -mkdocstrings = ">=0.20" +mkdocstrings = ">=0.24.2" [[package]] name = "mpmath" @@ -2053,13 +2113,13 @@ tests = ["pytest (>=4.6)"] [[package]] name = "nbclient" -version = "0.9.0" +version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, - {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, ] [package.dependencies] @@ -2071,17 +2131,17 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.14.0" -description = "Converting Jupyter Notebooks" +version = "7.16.3" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.14.0-py3-none-any.whl", hash = "sha256:483dde47facdaa4875903d651305ad53cd76e2255ae3c61efe412a95f2d22a24"}, - {file = "nbconvert-7.14.0.tar.gz", hash = "sha256:92b9a44b63e5a7fb4f6fa0ef41261e35c16925046ccd1c04a5c8099bf100476e"}, + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, ] [package.dependencies] @@ -2107,18 +2167,18 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.3" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, + {file = "nbformat-5.10.3-py3-none-any.whl", hash = "sha256:d9476ca28676799af85385f409b49d95e199951477a159a576ef2a675151e5e8"}, + {file = "nbformat-5.10.3.tar.gz", hash = "sha256:60ed5e910ef7c6264b87d644f276b1b49e24011930deef54605188ddeb211685"}, ] [package.dependencies] @@ -2133,13 +2193,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -2162,18 +2222,18 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "notebook" -version = "7.0.7" +version = "7.1.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.7-py3-none-any.whl", hash = "sha256:289b606d7e173f75a18beb1406ef411b43f97f7a9c55ba03efa3622905a62346"}, - {file = "notebook-7.0.7.tar.gz", hash = "sha256:3bcff00c17b3ac142ef5f436d50637d936b274cfa0b41f6ac0175363de9b4e09"}, + {file = "notebook-7.1.2-py3-none-any.whl", hash = "sha256:fc6c24b9aef18d0cd57157c9c47e95833b9b0bdc599652639acf0bdb61dc7d5f"}, + {file = "notebook-7.1.2.tar.gz", hash = "sha256:efc2c80043909e0faa17fce9e9b37c059c03af0ec99a4d4db84cb21d9d2e936a"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.0.2,<5" +jupyterlab = ">=4.1.1,<4.2" jupyterlab-server = ">=2.22.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" @@ -2185,13 +2245,13 @@ test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4 [[package]] name = "notebook-shim" -version = "0.2.3" +version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" files = [ - {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, - {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, ] [package.dependencies] @@ -2202,47 +2262,47 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -2366,14 +2426,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.3.101" +version = "12.4.99" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:64335a8088e2b9d196ae8665430bc6a2b7e6ef2eb877a9c735c804bd4ff6467c"}, - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-manylinux2014_aarch64.whl", hash = "sha256:211a63e7b30a9d62f1a853e19928fbb1a750e3f17a13a3d1f98ff0ced19478dd"}, - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-win_amd64.whl", hash = "sha256:1b2e317e437433753530792f13eece58f0aec21a2b05903be7bffe58a606cbd1"}, + {file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_aarch64.whl", hash = "sha256:75d6498c96d9adb9435f2bbdbddb479805ddfb97b5c1b32395c694185c20ca57"}, + {file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c6428836d20fe7e327191c175791d38570e10762edc588fb46749217cd444c74"}, + {file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-win_amd64.whl", hash = "sha256:991905ffa2144cb603d8ca7962d75c35334ae82bf92820b6ba78157277da1ad2"}, ] [[package]] @@ -2403,24 +2463,24 @@ et-xmlfile = "*" [[package]] name = "overrides" -version = "7.4.0" +version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, - {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -2507,13 +2567,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] @@ -2542,6 +2602,24 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "patsy" +version = "0.5.6" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = "*" +files = [ + {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, + {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + [[package]] name = "pexpect" version = "4.9.0" @@ -2644,18 +2722,18 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" 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.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +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)"] [[package]] name = "pluggy" @@ -2674,13 +2752,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prometheus-client" -version = "0.19.0" +version = "0.20.0" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, - {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, ] [package.extras] @@ -2702,27 +2780,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -2755,13 +2833,13 @@ tests = ["pytest"] [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -2781,13 +2859,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.7" +version = "10.7.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, - {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, ] [package.dependencies] @@ -2799,13 +2877,13 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -2851,13 +2929,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -2876,13 +2954,13 @@ files = [ [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -2910,17 +2988,17 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.12" +version = "2.0.13" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, - {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, - {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, - {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, - {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, - {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, ] [[package]] @@ -3146,101 +3224,101 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "rapidfuzz" -version = "3.6.1" +version = "3.7.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"}, - {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:860f438238f1807532aa5c5c25e74c284232ccc115fe84697b78e25d48f364f7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bb9285abeb0477cdb2f8ea0cf7fd4b5f72ed5a9a7d3f0c0bb4a5239db2fc1ed"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:08671280e0c04d2bb3f39511f13cae5914e6690036fd1eefc3d47a47f9fae634"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04bae4d9c16ce1bab6447d196fb8258d98139ed8f9b288a38b84887985e4227b"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1efa2268b51b68156fb84d18ca1720311698a58051c4a19c40d670057ce60519"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:600b4d4315f33ec0356c0dab3991a5d5761102420bcff29e0773706aa48936e8"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18bc2f13c73d5d34499ff6ada55b052c445d3aa64d22c2639e5ab45472568046"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e11c5e6593be41a555475c9c20320342c1f5585d635a064924956944c465ad4"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d7878025248b99ccca3285891899373f98548f2ca13835d83619ffc42241c626"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b4a7e37fe136022d944374fcd8a2f72b8a19f7b648d2cdfb946667e9ede97f9f"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b5881856f830351aaabd869151124f64a80bf61560546d9588a630a4e933a5de"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c788b11565cc176fab8fab6dfcd469031e906927db94bf7e422afd8ef8f88a5a"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17a3092e74025d896ef1d67ac236c83494da37a78ef84c712e4e2273c115f1"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win32.whl", hash = "sha256:e499c823206c9ffd9d89aa11f813a4babdb9219417d4efe4c8a6f8272da00e98"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:91f798cc00cd94a0def43e9befc6e867c9bd8fa8f882d1eaa40042f528b7e2c7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:d5a3872f35bec89f07b993fa1c5401d11b9e68bcdc1b9737494e279308a38a5f"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ef6b6ab64c4c91c57a6b58e1d690b59453bfa1f1e9757a7e52e59b4079e36631"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f9070b42c0ba030b045bba16a35bdb498a0d6acb0bdb3ff4e325960e685e290"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:63044c63565f50818d885bfcd40ac369947da4197de56b4d6c26408989d48edf"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b0c47860c733a3d73a4b70b97b35c8cbf24ef24f8743732f0d1c412a8c85de"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1b14489b038f007f425a06fcf28ac6313c02cb603b54e3a28d9cfae82198cc0"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be08f39e397a618aab907887465d7fabc2d1a4d15d1a67cb8b526a7fb5202a3e"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16895dc62a7b92028f9c8b6d22830f1cbc77306ee794f461afc6028e1a8d7539"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:579cce49dfa57ffd8c8227b3fb53cced54b4df70cec502e63e9799b4d1f44004"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:40998c8dc35fdd221790b8b5134a8d7499adbfab9a5dd9ec626c7e92e17a43ed"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:dc3fdb4738a6b83ae27f1d8923b00d3a9c2b5c50da75b9f8b81841839c6e3e1f"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:92b8146fbfb37ac358ef7e0f6b79619e4f793fbbe894b99ea87920f9c0a9d77d"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfceaa7c2914585bb8a043265c39ec09078f13fbf53b5525722fc074306b6fa"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f332d61f51b0b9c8b55a0fb052b4764b6ad599ea8ce948ac47a4388e9083c35e"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win32.whl", hash = "sha256:dfd1e4819f1f3c47141f86159b44b7360ecb19bf675080b3b40437bf97273ab9"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:594b9c33fc1a86784962043ee3fbaaed875fbaadff72e467c2f7a83cd6c5d69d"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b13a6823a1b83ae43f8bf35955df35032bee7bec0daf9b5ab836e0286067434"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:075a419a0ec29be44b3d7f4bcfa5cb7e91e419379a85fc05eb33de68315bd96f"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a5b96d2081c3afbef1842a61d63e55d0a5a201473e6975a80190ff2d6f22ca"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9460d8fddac7ea46dff9298eee9aa950dbfe79f2eb509a9f18fbaefcd10894c"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39eb1513ee139ba6b5c01fe47ddf2d87e9560dd7fdee1068f7f6efbae70de34"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eace9fdde58a425d4c9a93021b24a0cac830df167a5b2fc73299e2acf9f41493"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cc77237242303733de47829028a0a8b6ab9188b23ec9d9ff0a674fdcd3c8e7f"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74e692357dd324dff691d379ef2c094c9ec526c0ce83ed43a066e4e68fe70bf6"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2075ac9ee5c15d33d24a1efc8368d095602b5fd9634c5b5f24d83e41903528"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5a8ba64d72329a940ff6c74b721268c2004eecc48558f648a38e96915b5d1c1b"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a1f268a2a37cd22573b4a06eccd481c04504b246d3cadc2d8e8dfa64b575636d"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:42c2e8a2341363c7caf276efdbe1a673fc5267a02568c47c8e980f12e9bc8727"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a9acca34b34fb895ee6a84c436bb919f3b9cd8f43e7003d43e9573a1d990ff74"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9bad6a0fe3bc1753dacaa6229a8ba7d9844eb7ae24d44d17c5f4c51c91a8a95e"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win32.whl", hash = "sha256:c86bc4b1d2380739e6485396195e30021df509b4923f3f757914e171587bce7c"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d7361608c8e73a1dc0203a87d151cddebdade0098a047c46da43c469c07df964"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fdc26e7863e0f63c2185d53bb61f5173ad4451c1c8287b535b30ea25a419a5a"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9b6167468f76779a14b9af66210f68741af94d32d086f19118de4e919f00585c"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bd394e28ff221557ea4d8152fcec3e66d9f620557feca5f2bedc4c21f8cf2f9"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8e70f876ca89a6df344f8157ac60384e8c05a0dfb442da2490c3f1c45238ccf5"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c837f89d86a5affe9ee6574dad6b195475676a6ab171a67920fc99966f2ab2c"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cda4550a98658f9a8bcdc03d0498ed1565c1563880e3564603a9eaae28d51b2a"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecd70212fd9f1f8b1d3bdd8bcb05acc143defebd41148bdab43e573b043bb241"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187db4cc8fb54f8c49c67b7f38ef3a122ce23be273032fa2ff34112a2694c3d8"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4604dfc1098920c4eb6d0c6b5cc7bdd4bf95b48633e790c1d3f100a25870691d"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01581b688c5f4f6665b779135e32db0edab1d78028abf914bb91469928efa383"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0828b55ec8ad084febdf4ab0c942eb1f81c97c0935f1cb0be0b4ea84ce755988"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:150c98b65faff17b917b9d36bff8a4d37b6173579c6bc2e38ff2044e209d37a4"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7e4eea225d2bff1aff4c85fcc44716596d3699374d99eb5906b7a7560297460e"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7bc944d7e830cfce0f8b4813875f05904207017b66e25ab7ee757507001310a9"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-win32.whl", hash = "sha256:3e55f02105c451ab6ff0edaaba57cab1b6c0a0241cfb2b306d4e8e1503adba50"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:41851620d2900791d66d9b6092fc163441d7dd91a460c73b07957ff1c517bc30"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e8041c6b2d339766efe6298fa272f79d6dd799965df364ef4e50f488c101c899"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4e09d81008e212fc824ea23603ff5270d75886e72372fa6c7c41c1880bcb57ed"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:419c8961e861fb5fc5590056c66a279623d1ea27809baea17e00cdc313f1217a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1522eaab91b9400b3ef16eebe445940a19e70035b5bc5d98aef23d66e9ac1df0"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:611278ce3136f4544d596af18ab8849827d64372e1d8888d9a8d071bf4a3f44d"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4efa9bfc5b955b6474ee077eee154e240441842fa304f280b06e6b6aa58a1d1e"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cc9d3c8261457af3f8756b1f71a9fdc4892978a9e8b967976d2803e08bf972"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce728e2b582fd396bc2559160ee2e391e6a4b5d2e455624044699d96abe8a396"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a6a36c9299e059e0bee3409218bc5235a46570c20fc980cdee5ed21ea6110ad"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9ea720db8def684c1eb71dadad1f61c9b52f4d979263eb5d443f2b22b0d5430a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:358692f1df3f8aebcd48e69c77c948c9283b44c0efbaf1eeea01739efe3cd9a6"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:faded69ffe79adcefa8da08f414a0fd52375e2b47f57be79471691dad9656b5a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f9f3dc14fadbd553975f824ac48c381f42192cec9d7e5711b528357662a8d8e"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win32.whl", hash = "sha256:7be5f460ff42d7d27729115bfe8a02e83fa0284536d8630ee900d17b75c29e65"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd5ad2c12dab2b98340c4b7b9592c8f349730bda9a2e49675ea592bbcbc1360b"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:aa163257a0ac4e70f9009d25e5030bdd83a8541dfa3ba78dc86b35c9e16a80b4"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4e50840a8a8e0229563eeaf22e21a203359859557db8829f4d0285c17126c5fb"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:632f09e19365ace5ff2670008adc8bf23d03d668b03a30230e5b60ff9317ee93"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:209dda6ae66b702f74a78cef555397cdc2a83d7f48771774a20d2fc30808b28c"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bc0b78572626af6ab134895e4dbfe4f4d615d18dcc43b8d902d8e45471aabba"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ba14850cc8258b3764ea16b8a4409ac2ba16d229bde7a5f495dd479cd9ccd56"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b917764fd2b267addc9d03a96d26f751f6117a95f617428c44a069057653b528"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1252ca156e1b053e84e5ae1c8e9e062ee80468faf23aa5c543708212a42795fd"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86c7676a32d7524e40bc73546e511a408bc831ae5b163029d325ea3a2027d089"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e7d729af2e5abb29caa070ec048aba042f134091923d9ca2ac662b5604577e"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86eea3e6c314a9238de568254a9c591ec73c2985f125675ed5f171d869c47773"}, + {file = "rapidfuzz-3.7.0.tar.gz", hash = "sha256:620df112c39c6d27316dc1e22046dc0382d6d91fd60d7c51bd41ca0333d867e9"}, ] [package.extras] @@ -3248,13 +3326,13 @@ full = ["numpy"] [[package]] name = "referencing" -version = "0.32.1" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.32.1-py3-none-any.whl", hash = "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554"}, - {file = "referencing-0.32.1.tar.gz", hash = "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -3411,110 +3489,110 @@ files = [ [[package]] name = "rpds-py" -version = "0.16.2" +version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f"}, - {file = "rpds_py-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9"}, - {file = "rpds_py-0.16.2-cp310-none-win32.whl", hash = "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82"}, - {file = "rpds_py-0.16.2-cp310-none-win_amd64.whl", hash = "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e"}, - {file = "rpds_py-0.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb"}, - {file = "rpds_py-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8"}, - {file = "rpds_py-0.16.2-cp311-none-win32.whl", hash = "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3"}, - {file = "rpds_py-0.16.2-cp311-none-win_amd64.whl", hash = "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d"}, - {file = "rpds_py-0.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d"}, - {file = "rpds_py-0.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58"}, - {file = "rpds_py-0.16.2-cp312-none-win32.whl", hash = "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3"}, - {file = "rpds_py-0.16.2-cp312-none-win_amd64.whl", hash = "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5"}, - {file = "rpds_py-0.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60"}, - {file = "rpds_py-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365"}, - {file = "rpds_py-0.16.2-cp38-none-win32.whl", hash = "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff"}, - {file = "rpds_py-0.16.2-cp38-none-win_amd64.whl", hash = "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851"}, - {file = "rpds_py-0.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e"}, - {file = "rpds_py-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45"}, - {file = "rpds_py-0.16.2-cp39-none-win32.whl", hash = "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d"}, - {file = "rpds_py-0.16.2-cp39-none-win_amd64.whl", hash = "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac"}, - {file = "rpds_py-0.16.2.tar.gz", hash = "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, ] [[package]] @@ -3609,45 +3687,45 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc ( [[package]] name = "scipy" -version = "1.11.4" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "seaborn" @@ -3699,13 +3777,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -3738,6 +3816,56 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "statsmodels" +version = "0.14.1" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "statsmodels-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43af9c0b07c9d72f275cf14ea54a481a3f20911f0b443181be4769def258fdeb"}, + {file = "statsmodels-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16975ab6ad505d837ba9aee11f92a8c5b49c4fa1ff45b60fe23780b19e5705e"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e278fe74da5ed5e06c11a30851eda1af08ef5af6be8507c2c45d2e08f7550dde"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0564d92cb05b219b4538ed09e77d96658a924a691255e1f7dd23ee338df441b"}, + {file = "statsmodels-0.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5385e22e72159a09c099c4fb975f350a9f3afeb57c1efce273b89dcf1fe44c0f"}, + {file = "statsmodels-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:0a8aae75a2e08ebd990e5fa394f8e32738b55785cb70798449a3f4207085e667"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b69a63ad6c979a6e4cde11870ffa727c76a318c225a7e509f031fbbdfb4e416a"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7562cb18a90a114f39fab6f1c25b9c7b39d9cd5f433d0044b430ca9d44a8b52c"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3abaca4b963259a2bf349c7609cfbb0ce64ad5fb3d92d6f08e21453e4890248"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0f727fe697f6406d5f677b67211abe5a55101896abdfacdb3f38410405f6ad8"}, + {file = "statsmodels-0.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6838ac6bdb286daabb5e91af90fd4258f09d0cec9aace78cc441cb2b17df428"}, + {file = "statsmodels-0.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:709bfcef2dbe66f705b17e56d1021abad02243ee1a5d1efdb90f9bad8b06a329"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f32a7cd424cf33304a54daee39d32cccf1d0265e652c920adeaeedff6d576457"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f8c30181c084173d662aaf0531867667be2ff1bee103b84feb64f149f792dbd2"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de2b97413913d52ad6342dece2d653e77f78620013b7705fad291d4e4266ccb"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3420f88289c593ba2bca33619023059c476674c160733bd7d858564787c83d3"}, + {file = "statsmodels-0.14.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c008e16096f24f0514e53907890ccac6589a16ad6c81c218f2ee6752fdada555"}, + {file = "statsmodels-0.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:bc0351d279c4e080f0ce638a3d886d312aa29eade96042e3ba0a73771b1abdfb"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf293ada63b2859d95210165ad1dfcd97bd7b994a5266d6fbeb23659d8f0bf68"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44ca8cb88fa3d3a4ffaff1fb8eb0e98bbf83fc936fcd9b9eedee258ecc76696a"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5373d176239993c095b00d06036690a50309a4e00c2da553b65b840f956ae6"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a532dfe899f8b6632cd8caa0b089b403415618f51e840d1817a1e4b97e200c73"}, + {file = "statsmodels-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:4fe0a60695952b82139ae8750952786a700292f9e0551d572d7685070944487b"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04293890f153ffe577e60a227bd43babd5f6c1fc50ea56a3ab1862ae85247a95"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e70a2e93d54d40b2cb6426072acbc04f35501b1ea2569f6786964adde6ca572"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab3a73d16c0569adbba181ebb967e5baaa74935f6d2efe86ac6fc5857449b07d"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eefa5bcff335440ee93e28745eab63559a20cd34eea0375c66d96b016de909b3"}, + {file = "statsmodels-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:bc43765710099ca6a942b5ffa1bac7668965052542ba793dd072d26c83453572"}, + {file = "statsmodels-0.14.1.tar.gz", hash = "sha256:2260efdc1ef89f39c670a0bd8151b1d0843567781bcafec6cda0534eb47a94f6"}, +] + +[package.dependencies] +numpy = ">=1.18,<2" +packaging = ">=21.3" +pandas = ">=1.0,<2.1.0 || >2.1.0" +patsy = ">=0.5.4" +scipy = ">=1.4,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.33)"] +develop = ["colorama", "cython (>=0.29.33)", "cython (>=0.29.33,<4.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.3.0)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "sympy" version = "1.12" @@ -3768,13 +3896,13 @@ pytest = ">=7.0.0,<9.0.0" [[package]] name = "terminado" -version = "0.18.0" +version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" files = [ - {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, - {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, ] [package.dependencies] @@ -3789,24 +3917,24 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.4.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, + {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, + {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, ] [[package]] name = "tifffile" -version = "2023.12.9" +version = "2024.2.12" description = "Read and write TIFF files" optional = false python-versions = ">=3.9" files = [ - {file = "tifffile-2023.12.9-py3-none-any.whl", hash = "sha256:9b066e4b1a900891ea42ffd33dab8ba34c537935618b9893ddef42d7d422692f"}, - {file = "tifffile-2023.12.9.tar.gz", hash = "sha256:9dd1da91180a6453018a241ff219e1905f169384355cd89c9ef4034c1b46cdb8"}, + {file = "tifffile-2024.2.12-py3-none-any.whl", hash = "sha256:870998f82fbc94ff7c3528884c1b0ae54863504ff51dbebea431ac3fa8fb7c21"}, + {file = "tifffile-2024.2.12.tar.gz", hash = "sha256:4920a3ec8e8e003e673d3c6531863c99eedd570d1b8b7e141c072ed78ff8030d"}, ] [package.dependencies] @@ -3846,21 +3974,21 @@ files = [ [[package]] name = "torch" -version = "2.2.0+cu121" +version = "2.2.2+cu121" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.2.0+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:c441021672ebe2e5afbdb34817aa85e6d32130f94df2da9ad4cb78a9d4b81370"}, - {file = "torch-2.2.0+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:8f54c647ee19c8b4c0aad158c73b83b2c06cb62351e9cfa981540ce7295a9015"}, - {file = "torch-2.2.0+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:0bc59ae71528f0a6013f1b01670f039cc6d01b2ced7a7219ca16ee194c305116"}, - {file = "torch-2.2.0+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:d79324159c622243429ec214a86b8613c1d7d46fc4821374d324800f1df6ade1"}, - {file = "torch-2.2.0+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:330293cdae296bdb7b925412c561ec3d53cdc82c38104e43385fdbc4eb8f0e72"}, - {file = "torch-2.2.0+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:26ddc071aec9ac36beaded4036bf0c1ca04a8c82cbdf8615376948761b5f304a"}, - {file = "torch-2.2.0+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:a27daf0405b924359795c39a5a73ff31151880d63f65e3f0051c22f9bb3b231e"}, - {file = "torch-2.2.0+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:e28673afadfb189bc3ef24683674db908af1f823d8bf60315745d8428668edf5"}, - {file = "torch-2.2.0+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:71c631faed5358961d2fa582a370e1d29f8bec64fc02eb6ff6f4eb2c56acfd85"}, - {file = "torch-2.2.0+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:ea5b283a8f3ae2b7919ed5d83827664883476560f1161b3e17129827511d8568"}, + {file = "torch-2.2.2+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:cade4fd6c8ce7d826dbcfabd65f1d53b0ee0a058db8c1809d65bfd6051b55530"}, + {file = "torch-2.2.2+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:d300055aac0e2063f9a2659924e9766605db06d5683532c6eabbdef6bec865dd"}, + {file = "torch-2.2.2+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:4c94e4d1a22d70abbdff716dec99ba5eff94b4340ffa73b4fb629f940dbb8a75"}, + {file = "torch-2.2.2+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:efbcfdd4399197d06b32f7c0e1711c615188cdd65427b933648c7478fb880b3f"}, + {file = "torch-2.2.2+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:badc14d413ff1847d15021a1ec0affa479d24dfc83e6d51b9b4b9fbfaad1b14c"}, + {file = "torch-2.2.2+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:5b5b91c7fcda5f02e5e5644a32f593c6c17f301a1180213e353e34b51cc63b9f"}, + {file = "torch-2.2.2+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:c178beb2bb01f773601777bc481c7651be5b1f189cf180f0c0aceac0789aa9a5"}, + {file = "torch-2.2.2+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:aa67db6ad36d42305eac8236d8412d9fecea81f965cc0b374581cbd2b846ad0d"}, + {file = "torch-2.2.2+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:114e9395867ee860166562d8cc1f2809225f9e29783dd5e72175d9a9a7a8505c"}, + {file = "torch-2.2.2+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:2de773282a7855dd39139aabc37ffc4ba1b4b28b4594e5f56dd30010b064e8b0"}, ] [package.dependencies] @@ -3880,7 +4008,7 @@ nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \" nvidia-nccl-cu12 = {version = "2.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} typing-extensions = ">=4.8.0" [package.extras] @@ -3894,28 +4022,27 @@ reference = "torch_cuda121" [[package]] name = "torchvision" -version = "0.17.0+cu121" +version = "0.17.2+cu121" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.8" files = [ - {file = "torchvision-0.17.0+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:e1273e9862fc821febc4c716f13849b1ffa87c0d69f6ab824356c5532c490f08"}, - {file = "torchvision-0.17.0+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:b5ba1adc6f9f1a40af9608ebc447ceed6c8816dcb926d59675c81111b8676966"}, - {file = "torchvision-0.17.0+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:fd66c9554fc1448633c232eeddcbd90a9bcd135ae94e682f4cb721984974ca9b"}, - {file = "torchvision-0.17.0+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:307e52c2887c1d2b50cc3581cf5f4c169130b8352462e361e71eeda19e0dd263"}, - {file = "torchvision-0.17.0+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:c39ee5b3e832b88137e10b0f99e9d0b7c13fa73fc00e1469e8b88d8f657eb80e"}, - {file = "torchvision-0.17.0+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:ad2c7f7c317ed9ebe0ebe9dcf805393320a0fec81c7fdec95f971cdd8884518f"}, - {file = "torchvision-0.17.0+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:de5dbc480fcc100792e3aacf90edffe5bcee4ced3abc4fc1d210d2347fc36e05"}, - {file = "torchvision-0.17.0+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:1c58b331dc8a46bd378b6776a841d067f739c1699085d1387159e4aed4d0f088"}, - {file = "torchvision-0.17.0+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:bf50506b5870848e5cf0a57e6526b9d00cf4e7c69929491ba91fb9fc384abc38"}, - {file = "torchvision-0.17.0+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:8036fc7815025dab85bccef3ead1102afc3236e9b16c42c132402cbb06bc6afe"}, + {file = "torchvision-0.17.2+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:c0f325635f8834fa55e69ab61075fb2bbcbb45395a985bba1db378b15627104b"}, + {file = "torchvision-0.17.2+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:c780783d4113cf3f86297f1b51a0f3a5c1f9487c5ec690b9a470d7d6e4f67e62"}, + {file = "torchvision-0.17.2+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:059f86a1c8d2b276b266c84a8f5a92cc8426d43c2a2c248dc73c140ab3a822f3"}, + {file = "torchvision-0.17.2+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:10ad542aab6b47dbe73c441381986d50a7ed5021cbe01d593a14477ec1f067a0"}, + {file = "torchvision-0.17.2+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:958d5438a56e83f22dedbb78a3b4301688d5ac433845650d2ccba3285fd27213"}, + {file = "torchvision-0.17.2+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:ecd9d4eb4f68a144da9936d2760ca3f4cbbfa092fc8d744ca746afff9f4053be"}, + {file = "torchvision-0.17.2+cu121-cp38-cp38-linux_x86_64.whl", hash = "sha256:df8e74cbbb4de0a60f11cd7c28d820116027cd3949893f97c55b6f12326bd7af"}, + {file = "torchvision-0.17.2+cu121-cp38-cp38-win_amd64.whl", hash = "sha256:8bbd04880ed39e0f12f78dbb52dcd88b00ffc65fe834059fc0482cb5999f5711"}, + {file = "torchvision-0.17.2+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:f37f592e3128bf3d99968ada5a128f118f9aed1dab609e272ac7231146fc6843"}, + {file = "torchvision-0.17.2+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:f37a529e82a633db0b7e9a8d37503d14d8f1033c454f80c844c1595637519b98"}, ] [package.dependencies] numpy = "*" pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" -requests = "*" -torch = "2.2.0" +torch = "2.2.2" [package.extras] scipy = ["scipy"] @@ -3947,18 +4074,18 @@ files = [ [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, + {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "triton" @@ -3985,35 +4112,35 @@ tutorials = ["matplotlib", "pandas", "tabulate", "torch"] [[package]] name = "types-python-dateutil" -version = "2.8.19.20240106" +version = "2.9.0.20240316" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, - {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, ] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -4032,54 +4159,57 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, ] [package.extras] @@ -4140,13 +4270,13 @@ test = ["websockets"] [[package]] name = "widgetsnbextension" -version = "4.0.9" +version = "4.0.10" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, - {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, + {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, + {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, ] [[package]] @@ -4269,4 +4399,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11,<3.13" -content-hash = "4d8b63883afaa59e69b29f664f74a14bdcac7edb56e83975a45abf92586a3a73" +content-hash = "234bdb751d737d5fe454908cc083833ae668716e9a990813c1c23265954a55b2" From 06822e519809ee94275a4b40e107218d6596d425 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Tue, 2 Apr 2024 19:57:54 +0000 Subject: [PATCH 56/60] style: apply automated linter fixes --- .../data/tabular/containers/_time_series.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 347472653..16e3699df 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1234,21 +1234,22 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: """ - Plot the given time series targets along the time on the x-axis. + Plot the given time series targets along the time on the x-axis. Parameters ---------- - time_series: - A list of time series to be plotted. + time_series: + A list of time series to be plotted. Returns ------- - plot: - A plot with all the time series targets plotted by the time on the x-axis. + plot: + A plot with all the time series targets plotted by the time on the x-axis. + Raises - ----- - NonNumericColumnError - if the target column contains non numerical values + ------ + NonNumericColumnError + if the target column contains non numerical values """ if not self._target.type.is_numeric(): From 2dc79ff88620f1ef3b28612af3b1f13cd124707b Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:34:26 +0200 Subject: [PATCH 57/60] Apply suggestions from code review added doc changes Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- .../data/tabular/containers/_time_series.py | 17 ++++++++--------- src/safeds/ml/classical/regression/_arima.py | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 16e3699df..b33acb12b 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -49,16 +49,15 @@ def timeseries_from_csv_file( target_name: The name of the target column - time_name : + time_name: The name of the time column feature_names: The name(s) of the column(s) - Returns ------- - table : + table: The time series created from the CSV file. Raises @@ -1182,17 +1181,17 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries """ Split the table into two new tables. - The original table is not modified. + The original time series is not modified. Parameters ---------- percentage_in_first: - The desired size of the first table in percentage to the given table; must be between 0 and 1. + The desired size of the first time series in percentage to the given time series; must be between 0 and 1. Returns ------- result : (TimeSeries, TimeSeries) - A tuple containing the two resulting tables. The first table has the specified size, the second table + A tuple containing the two resulting time series. The first time series has the specified size, the second time series contains the rest of the data. Raises @@ -1202,9 +1201,9 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries Examples -------- - >>> from safeds.data.tabular.containers import Table - >>> table = TimeSeries({"time":[0, 1, 2, 3, 4], "temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}, time_name="time", target_name="sales") - >>> slices = table.split_rows(0.4) + >>> from safeds.data.tabular.containers import TimeSeries + >>> time_series = TimeSeries({"time":[0, 1, 2, 3, 4], "temperature": [10, 15, 20, 25, 30], "sales": [54, 74, 90, 206, 210]}, time_name="time", target_name="sales") + >>> slices = time_series.split_rows(0.4) >>> slices[0] time temperature sales 0 0 10 54 diff --git a/src/safeds/ml/classical/regression/_arima.py b/src/safeds/ml/classical/regression/_arima.py index 43f624661..a9a2705da 100644 --- a/src/safeds/ml/classical/regression/_arima.py +++ b/src/safeds/ml/classical/regression/_arima.py @@ -27,7 +27,7 @@ def __hash__(self) -> int: Returns ------- - hash : int + hash: The hash value. """ return xxhash.xxh3_64( @@ -121,7 +121,7 @@ def predict(self, time_series: TimeSeries) -> TimeSeries: Returns ------- - table: + time_series: A timeseries containing the predicted target vector and a time dummy as time column. Raises From 210a2a35de7ea84fcf6133b7ae67a8d72163c7ab Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:39:04 +0200 Subject: [PATCH 58/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/data/tabular/containers/_time_series.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index b33acb12b..85503b5d3 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1233,12 +1233,12 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: """ - Plot the given time series targets along the time on the x-axis. + Plot the given time series targets along the time on the x-axis. Parameters ---------- - time_series: - A list of time series to be plotted. + time_series: + A list of time series to be plotted. Returns ------- @@ -1247,8 +1247,8 @@ def plot_compare_time_series(self, time_series: list[TimeSeries]) -> Image: Raises ------ - NonNumericColumnError - if the target column contains non numerical values + NonNumericColumnError + if the target column contains non numerical values """ if not self._target.type.is_numeric(): From 3ea40e370edbf6d5f0bd209a0c071dd26c461c44 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:39:09 +0200 Subject: [PATCH 59/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 85503b5d3..0df1928fa 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -43,7 +43,7 @@ def timeseries_from_csv_file( Parameters ---------- - path : + path: The path to the CSV file. target_name: From af1104b0d877c6db17b6ad7aef448eae0fb1b2bf Mon Sep 17 00:00:00 2001 From: Gerhardsa0 <113539440+Gerhardsa0@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:50:00 +0200 Subject: [PATCH 60/60] Update src/safeds/data/tabular/containers/_time_series.py Co-authored-by: Alexander <47296670+Marsmaennchen221@users.noreply.github.com> --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 0df1928fa..a26836b61 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1190,7 +1190,7 @@ def split_rows(self, percentage_in_first: float) -> tuple[TimeSeries, TimeSeries Returns ------- - result : (TimeSeries, TimeSeries) + result: A tuple containing the two resulting time series. The first time series has the specified size, the second time series contains the rest of the data.