From dcbdb58de75304535282fa93746e87f650d15b2b Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 22 Oct 2024 18:17:12 +0100 Subject: [PATCH 01/11] Setup test framework and started adding tests --- dfttools/output.py | 2 +- tests/fixtures.py | 198 ++++++++++++++++++++++ tests/test_output.py | 386 +++++++++++++++++++------------------------ 3 files changed, 371 insertions(+), 215 deletions(-) create mode 100644 tests/fixtures.py diff --git a/dfttools/output.py b/dfttools/output.py index 82d9ef8..4184377 100644 --- a/dfttools/output.py +++ b/dfttools/output.py @@ -34,7 +34,7 @@ def __init__(self, aims_out: str = "aims.out"): self.lines = self._file_contents["aims_out"] """ - # FHI-aims, ... + # FHI-aims, ELSI, ... _supported_files = ["aims_out", "elsi_out"] def __init__(self, **kwargs: str): diff --git a/tests/fixtures.py b/tests/fixtures.py new file mode 100644 index 0000000..bf46029 --- /dev/null +++ b/tests/fixtures.py @@ -0,0 +1,198 @@ +# @pytest.fixture +# class AimsFixtures: +# FIXTURE_DIR = "tests/fixtures/aims_calculations/" + +# @classmethod +# def aims_out_1(cls): +# """ +# Completed, cluster, w/o spin + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=pbe +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/1/aims.out") + +# @classmethod +# def aims_out_2(cls): +# """ +# Completed, cluster, w/ spin + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=pbe +# spin=collinear +# default_initial_moment=1 +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/2/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_3(cls): +# """ +# Completed, cluster, w/ spin, w/ spin-orbit + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=pbe +# spin=collinear +# default_initial_moment=1 +# include_spin_orbit=non_self_consistent +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/3/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_4(cls): +# """ +# Completed, PBC, gamma point + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=pbe +# k_grid=(1, 1, 1) +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/4/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_5(cls): +# """ +# Completed, cluster, w/ geometry relaxation + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=pbe +# relax_geometry=bfgs 5e-3 +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/5/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_6(cls): +# """ +# Completed, PBC, w/ geometry relaxation, 8x8x8 + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# relax_geometry=bfgs 5e-3 +# relax_unit_cell=full +# k_grid=(8, 8, 8) +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/6/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_7(cls): +# """ +# Failed, cluster + +# Stats +# ----- +# exit_normal=False + +# Parameters +# ---------- +# sc_iter_limit=10 +# sc_accuracy_rho=1e-10 +# sc_accuracy_eev=1e-6 +# sc_accuracy_etot=1e-12 +# sc_accuracy_forces=1e-8 +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/7/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_8(cls): +# """ +# Failed, PBC, gamma point + +# Stats +# ----- +# exit_normal=False + +# Parameters +# ---------- +# k_grid=(1, 1, 1) +# sc_iter_limit=10 +# sc_accuracy_rho=1e-10 +# sc_accuracy_eev=1e-6 +# sc_accuracy_etot=1e-12 +# sc_accuracy_forces=1e-8 +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/8/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_9(cls): +# """ +# Completed, cluster, hybrid functional + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=hse06 +# sc_accuracy_rho=1e-5 +# sc_accuracy_eev=1e-3 +# sc_accuracy_etot=1e-6 +# sc_accuracy_forces=1e-4 +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/9/aims.out") + +# @classmethod +# @pytest.fixture +# def aims_out_10(cls): +# """ +# Completed, PBC, hybrid functional, 8x8x8 + +# Stats +# ----- +# exit_normal=True + +# Parameters +# ---------- +# xc=hse06 0.11 +# k_grid=(8, 8, 8) +# sc_accuracy_rho=1e-5 +# sc_accuracy_eev=1e-3 +# sc_accuracy_etot=1e-6 +# sc_accuracy_forces=1e-4 +# """ + +# return AimsOutput(aims_out=f"{cls.FIXTURE_DIR}/10/aims.out") diff --git a/tests/test_output.py b/tests/test_output.py index e67aef9..0aa5dbd 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -1,266 +1,224 @@ -import pathlib - +import numpy as np import pytest from dfttools.output import AimsOutput -@pytest.fixture -def aims_out_1(): - """ - Completed, cluster, w/o spin - - Stats - ----- - exit_normal=True - - Parameters - ---------- - xc=pbe - """ - - return AimsOutput(aims_out="fixtures/aims_calculations/1/aims.out") +@pytest.fixture(scope="module", params=range(1, 11)) +def aims_out(request): + return AimsOutput( + aims_out=f"tests/fixtures/aims_calculations/{str(request.param)}/aims.out" + ) -@pytest.fixture -def aims_out_2(): +def aims_fixture_no(aims_out: AimsOutput) -> str: """ - Completed, cluster, w/ spin - - Stats - ----- - exit_normal=True + Get the aims fixture number Parameters ---------- - xc=pbe - spin=collinear - default_initial_moment=1 - """ - - return AimsOutput(aims_out="fixtures/aims_calculations/2/aims.out") - - -@pytest.fixture -def aims_out_3(): - """ - Completed, cluster, w/ spin, w/ spin-orbit + aims_out : AimsOutput + AimsOutput object taken from the aims_out fixture - Stats - ----- - exit_normal=True - - Parameters - ---------- - xc=pbe - spin=collinear - default_initial_moment=1 - include_spin_orbit=non_self_consistent + Returns + ------- + str + The aims fixture number """ - return AimsOutput(aims_out="fixtures/aims_calculations/3/aims.out") + return aims_out.aims_out_path.split("/")[3] -@pytest.fixture -def aims_out_4(): - """ - Completed, PBC, gamma point +def test_get_number_of_atoms(aims_out): + if aims_fixture_no(aims_out) in ["4", "6", "8", "10"]: + assert aims_out.get_number_of_atoms() == 2 + else: + assert aims_out.get_number_of_atoms() == 3 - Stats - ----- - exit_normal=True - Parameters - ---------- - xc=pbe - k_grid=(1, 1, 1) - """ +# TODO +# def test_get_geometry(aims_out): - return AimsOutput(aims_out="fixtures/aims_calculations/4/aims.out") +# TODO +# def test_get_parameters(aims_out): -@pytest.fixture -def aims_out_5(): - """ - Completed, cluster, w/ geometry relaxation +def test_check_exit_normal(aims_out): + if aims_fixture_no(aims_out) in ["7", "8"]: + assert aims_out.check_exit_normal() is False + else: + assert aims_out.check_exit_normal() is True - Stats - ----- - exit_normal=True - Parameters - ---------- - xc=pbe - relax_geometry=bfgs 5e-3 - """ - - return AimsOutput(aims_out="fixtures/aims_calculations/5/aims.out") +def test_get_time_per_scf(aims_out): + # fmt: off + timings = [ + np.array([0.042, 0.045, 0.038, 0.037, 0.036, 0.038, 0.033, 0.036, 0.032, 0.032, 0.031, 0.023]), + np.array([0.033, 0.033, 0.033, 0.034, 0.035, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.036, 0.026]), + np.array([0.033, 0.033, 0.034, 0.034, 0.034, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.037, 0.027]), + np.array([0.649, 0.666, 0.667, 0.666, 0.667, 0.667, 0.667, 0.665, 0.666, 0.326]), + np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.072, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.03, 0.073, 0.028, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.073, 0.028, 0.028, 0.029, 0.028, 0.029, 0.029, 0.072, 0.028, 0.028, 0.028, 0.029, 0.028, 0.072]), + np.array([0.785, 0.801, 0.803, 0.808, 0.802, 0.803, 0.802, 0.802, 0.801, 0.803, 2.276, 9.297, 0.797, 0.79, 0.793, 0.792, 0.794, 2.248, 9.114, 0.797, 0.794, 0.793, 0.793, 0.793, 0.793, 2.248, 9.248]), + np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.031, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.0]), + np.array([0.636, 0.653, 0.652, 0.652, 0.657, 0.65, 0.65, 0.0]), + np.array([0.048, 0.046, 0.046, 0.046, 0.049, 0.047, 0.048, 0.047, 0.047, 0.047, 0.047, 0.047, 0.047, 0.039]), + np.array([34.786, 33.136, 33.081, 33.97, 33.873, 33.9, 33.933, 33.921, 33.945, 33.936, 33.575]), + ] + # fmt: on -@pytest.fixture -def aims_out_6(): - """ - Completed, PBC, w/ geometry relaxation, 8x8x8 + # Fail if the absolute tolerance between any values in test vs. reference array is + # greater than 2e-3 + assert np.allclose( + aims_out.get_time_per_scf(), + timings[int(aims_fixture_no(aims_out)) - 1], + atol=2e-3, + ) - Stats - ----- - exit_normal=True - Parameters - ---------- - relax_geometry=bfgs 5e-3 - relax_unit_cell=full - k_grid=(8, 8, 8) +def test_get_change_of_total_energy_1(aims_out): """ - - return AimsOutput(aims_out="fixtures/aims_calculations/6/aims.out") - - -@pytest.fixture -def aims_out_7(): + Using default args (final energy change) """ - Failed, cluster - Stats - ----- - exit_normal=False - - Parameters - ---------- - sc_iter_limit=10 - sc_accuracy_rho=1e-10 - sc_accuracy_eev=1e-6 - sc_accuracy_etot=1e-12 - sc_accuracy_forces=1e-8 - """ + final_energies = np.array( + [ + 1.599e-08, + 1.611e-09, + 1.611e-09, + -1.492e-07, + -5.833e-09, + 3.703e-09, + 1.509e-05, + -0.0001144, + 6.018e-06, + 7.119e-06, + ] + ) - return AimsOutput(aims_out="fixtures/aims_calculations/7/aims.out") + assert ( + abs( + aims_out.get_change_of_total_energy() + - final_energies[int(aims_fixture_no(aims_out)) - 1] + ) + < 1e-10 + ) -@pytest.fixture -def aims_out_8(): +def test_get_change_of_total_energy_2(aims_out): """ - Failed, PBC, gamma point - - Stats - ----- - exit_normal=False - - Parameters - ---------- - k_grid=(1, 1, 1) - sc_iter_limit=10 - sc_accuracy_rho=1e-10 - sc_accuracy_eev=1e-6 - sc_accuracy_etot=1e-12 - sc_accuracy_forces=1e-8 + Get every energy change """ - return AimsOutput(aims_out="fixtures/aims_calculations/8/aims.out") + # fmt: off + energy_diffs = [ + np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), + np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), + np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, -2081.0, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, -2081.0, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, -2081.0, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, -2081.0, 6.632e-07, 2.993e-07, -2.037e-07, 1.171e-08, -5.833e-09]), + np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -15800.0, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -15800.0, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), + np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, -2081.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, -2081.0, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, -2081.0, 0.0001081, 2.93e-05, 1.509e-05]), + np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), + np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), + np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), + ] + # fmt: on + + # Fail if the absolute tolerance between any values in test vs. reference array is + # greater than 1e-10 + assert np.allclose( + aims_out.get_change_of_total_energy(n_occurrence=None), + energy_diffs[int(aims_fixture_no(aims_out)) - 1], + atol=1e-10, + ) -@pytest.fixture -def aims_out_9(): +def test_get_change_of_total_energy_3(aims_out): """ - Completed, cluster, hybrid functional - - Stats - ----- - exit_normal=True - - Parameters - ---------- - xc=hse06 - sc_accuracy_rho=1e-5 - sc_accuracy_eev=1e-3 - sc_accuracy_etot=1e-6 - sc_accuracy_forces=1e-4 + Get the 1st energy change """ - return AimsOutput(aims_out="fixtures/aims_calculations/9/aims.out") - + first_energies = np.array( + [1.408, -0.1508, -0.1508, 0.871, 1.277, 0.1063, 1.19, 0.871, -5.561, -0.07087] + ) -@pytest.fixture -def aims_out_10(): - """ - Completed, PBC, hybrid functional, 8x8x8 + assert ( + abs( + aims_out.get_change_of_total_energy(n_occurrence=1) + - first_energies[int(aims_fixture_no(aims_out)) - 1] + ) + < 1e-3 + ) - Stats - ----- - exit_normal=True - Parameters - ---------- - xc=hse06 0.11 - k_grid=(8, 8, 8) - sc_accuracy_rho=1e-5 - sc_accuracy_eev=1e-3 - sc_accuracy_etot=1e-6 - sc_accuracy_forces=1e-4 +# TODO: Lukas can you check that this is correct +def test_get_change_of_total_energy_4(aims_out): + """ + Use an energy invalid indicator """ - ao = AimsOutput( - f"{pathlib.Path(__file__).parent.resolve()}/fixtures/aims_calculations/10/" - "aims.out" + # fmt: off + all_energies = [ + np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), + np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), + np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, 6.632e-07, 2.993e-07,-2.037e-07, 1.171e-08, -5.833e-09]), + np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), + np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, 0.0001081, 2.93e-05, 1.509e-05]), + np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), + np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), + np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), + ] + # fmt: on + + assert np.allclose( + aims_out.get_change_of_total_energy(n_occurrence=1), + all_energies[int(aims_fixture_no(aims_out)) - 1], + atol=1e-10, ) - return ao.check_exit_normal() - - -def test_check_exit_normal(aims_out_10): - assert aims_out_10 is True - - -def test_get_number_of_atoms(aims_out_9): - aims = aims_out_9 - - n_atoms = aims.get_number_of_atoms() - - assert n_atoms == 3 # TODO: currently a palceholder -def test_all_output_functions(aims_out_9): - aims = aims_out_9 - - aims.get_geometry() - aims.get_parameters() - aims.check_exit_normal() - aims.get_change_of_total_energy() - #aims.get_change_of_forces() - aims.get_change_of_sum_of_eigenvalues() - #aims.get_maximum_force() - aims.get_final_energy() - aims.get_energy_corrected() - aims.get_total_energy_T0() - aims.get_energy_uncorrected() - #aims.get_energy_without_vdw() - aims.get_HOMO_energy() - aims.get_LUMO_energy() - #aims.get_vdw_energy() - aims.get_exchange_correlation_energy() - aims.get_electrostatic_energy() - aims.get_kinetic_energy() - aims.get_sum_of_eigenvalues() - aims.get_cx_potential_correction() - aims.get_free_atom_electrostatic_energy() - aims.get_entropy_correction() - aims.get_hartree_energy_correction() - #aims.get_ionic_embedding_energy() - #aims.get_density_embedding_energy() - #aims.get_nonlocal_embedding_energy() - #aims.get_external_embedding_energy() - #aims.get_forces() - aims.check_spin_polarised() - aims.get_conv_params() - aims.get_n_relaxation_steps() - aims.get_n_scf_iters() - aims.get_i_scf_conv_acc() - aims.get_n_initial_ks_states() - #aims.get_all_ks_eigenvalues()# -> functionality does not work - aims.get_final_ks_eigenvalues() - #aims.get_pert_soc_ks_eigenvalues()# -> not great but may work if that output is there - - - +# def test_all_output_functions(aims_out_9):, # aims = aims_out_9 + +# aims.get_geometry() +# aims.get_parameters() +# aims.check_exit_normal() +# aims.get_change_of_total_energy() +# # aims.get_change_of_forces() +# aims.get_change_of_sum_of_eigenvalues() +# # aims.get_maximum_force() +# aims.get_final_energy() +# aims.get_energy_corrected() +# aims.get_total_energy_T0() +# aims.get_energy_uncorrected() +# # aims.get_energy_without_vdw() +# aims.get_HOMO_energy() +# aims.get_LUMO_energy() +# # aims.get_vdw_energy() +# aims.get_exchange_correlation_energy() +# aims.get_electrostatic_energy() +# aims.get_kinetic_energy() +# aims.get_sum_of_eigenvalues() +# aims.get_cx_potential_correction() +# aims.get_free_atom_electrostatic_energy() +# aims.get_entropy_correction() +# aims.get_hartree_energy_correction() +# # aims.get_ionic_embedding_energy() +# # aims.get_density_embedding_energy() +# # aims.get_nonlocal_embedding_energy() +# # aims.get_external_embedding_energy() +# # aims.get_forces() +# aims.check_spin_polarised() +# aims.get_conv_params() +# aims.get_n_relaxation_steps() +# aims.get_n_scf_iters() +# aims.get_i_scf_conv_acc() +# aims.get_n_initial_ks_states() +# # aims.get_all_ks_eigenvalues()# -> functionality does not work +# aims.get_final_ks_eigenvalues() +# # aims.get_pert_soc_ks_eigenvalues()# -> not great but may work if that output is there # @pytest.mark.parametrize( From 1ca55bf084951acf6f678164b6c5613d77b711a9 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 24 Oct 2024 23:45:01 +0100 Subject: [PATCH 02/11] Added ability to test with user's aims bin --- .../1/aims.out | 0 .../1/control.in | 0 .../1/geometry.in | 0 .../10/aims.out | 0 .../10/control.in | 0 .../10/geometry.in | 0 .../2/aims.out | 0 .../2/control.in | 0 .../2/geometry.in | 0 .../3/aims.out | 0 .../3/control.in | 0 .../3/geometry.in | 0 .../4/aims.out | 0 .../4/control.in | 0 .../4/geometry.in | 0 .../5/aims.out | 0 .../5/control.in | 0 .../5/geometry.in | 0 .../5/geometry.in.next_step | 0 .../5/hessian.aims | 0 .../6/aims.out | 0 .../6/control.in | 0 .../6/geometry.in | 0 .../6/geometry.in.next_step | 0 .../6/hessian.aims | Bin .../7/aims.out | 0 .../7/control.in | 0 .../7/geometry.in | 0 .../7/geometry.in.next_step | 0 .../7/hessian.aims | 0 .../8/aims.out | 0 .../8/control.in | 0 .../8/geometry.in | 0 .../9/aims.out | 0 .../9/control.in | 0 .../9/geometry.in | 0 .../extractor.py | 0 tests/test_output.py | 60 ++++++++++-------- 38 files changed, 33 insertions(+), 27 deletions(-) rename tests/fixtures/{aims_calculations => default_aims_calcs}/1/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/1/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/1/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/10/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/10/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/10/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/2/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/2/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/2/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/3/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/3/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/3/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/4/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/4/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/4/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/5/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/5/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/5/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/5/geometry.in.next_step (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/5/hessian.aims (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/6/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/6/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/6/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/6/geometry.in.next_step (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/6/hessian.aims (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/7/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/7/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/7/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/7/geometry.in.next_step (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/7/hessian.aims (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/8/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/8/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/8/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/9/aims.out (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/9/control.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/9/geometry.in (100%) rename tests/fixtures/{aims_calculations => default_aims_calcs}/extractor.py (100%) diff --git a/tests/fixtures/aims_calculations/1/aims.out b/tests/fixtures/default_aims_calcs/1/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/1/aims.out rename to tests/fixtures/default_aims_calcs/1/aims.out diff --git a/tests/fixtures/aims_calculations/1/control.in b/tests/fixtures/default_aims_calcs/1/control.in similarity index 100% rename from tests/fixtures/aims_calculations/1/control.in rename to tests/fixtures/default_aims_calcs/1/control.in diff --git a/tests/fixtures/aims_calculations/1/geometry.in b/tests/fixtures/default_aims_calcs/1/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/1/geometry.in rename to tests/fixtures/default_aims_calcs/1/geometry.in diff --git a/tests/fixtures/aims_calculations/10/aims.out b/tests/fixtures/default_aims_calcs/10/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/10/aims.out rename to tests/fixtures/default_aims_calcs/10/aims.out diff --git a/tests/fixtures/aims_calculations/10/control.in b/tests/fixtures/default_aims_calcs/10/control.in similarity index 100% rename from tests/fixtures/aims_calculations/10/control.in rename to tests/fixtures/default_aims_calcs/10/control.in diff --git a/tests/fixtures/aims_calculations/10/geometry.in b/tests/fixtures/default_aims_calcs/10/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/10/geometry.in rename to tests/fixtures/default_aims_calcs/10/geometry.in diff --git a/tests/fixtures/aims_calculations/2/aims.out b/tests/fixtures/default_aims_calcs/2/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/2/aims.out rename to tests/fixtures/default_aims_calcs/2/aims.out diff --git a/tests/fixtures/aims_calculations/2/control.in b/tests/fixtures/default_aims_calcs/2/control.in similarity index 100% rename from tests/fixtures/aims_calculations/2/control.in rename to tests/fixtures/default_aims_calcs/2/control.in diff --git a/tests/fixtures/aims_calculations/2/geometry.in b/tests/fixtures/default_aims_calcs/2/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/2/geometry.in rename to tests/fixtures/default_aims_calcs/2/geometry.in diff --git a/tests/fixtures/aims_calculations/3/aims.out b/tests/fixtures/default_aims_calcs/3/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/3/aims.out rename to tests/fixtures/default_aims_calcs/3/aims.out diff --git a/tests/fixtures/aims_calculations/3/control.in b/tests/fixtures/default_aims_calcs/3/control.in similarity index 100% rename from tests/fixtures/aims_calculations/3/control.in rename to tests/fixtures/default_aims_calcs/3/control.in diff --git a/tests/fixtures/aims_calculations/3/geometry.in b/tests/fixtures/default_aims_calcs/3/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/3/geometry.in rename to tests/fixtures/default_aims_calcs/3/geometry.in diff --git a/tests/fixtures/aims_calculations/4/aims.out b/tests/fixtures/default_aims_calcs/4/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/4/aims.out rename to tests/fixtures/default_aims_calcs/4/aims.out diff --git a/tests/fixtures/aims_calculations/4/control.in b/tests/fixtures/default_aims_calcs/4/control.in similarity index 100% rename from tests/fixtures/aims_calculations/4/control.in rename to tests/fixtures/default_aims_calcs/4/control.in diff --git a/tests/fixtures/aims_calculations/4/geometry.in b/tests/fixtures/default_aims_calcs/4/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/4/geometry.in rename to tests/fixtures/default_aims_calcs/4/geometry.in diff --git a/tests/fixtures/aims_calculations/5/aims.out b/tests/fixtures/default_aims_calcs/5/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/5/aims.out rename to tests/fixtures/default_aims_calcs/5/aims.out diff --git a/tests/fixtures/aims_calculations/5/control.in b/tests/fixtures/default_aims_calcs/5/control.in similarity index 100% rename from tests/fixtures/aims_calculations/5/control.in rename to tests/fixtures/default_aims_calcs/5/control.in diff --git a/tests/fixtures/aims_calculations/5/geometry.in b/tests/fixtures/default_aims_calcs/5/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/5/geometry.in rename to tests/fixtures/default_aims_calcs/5/geometry.in diff --git a/tests/fixtures/aims_calculations/5/geometry.in.next_step b/tests/fixtures/default_aims_calcs/5/geometry.in.next_step similarity index 100% rename from tests/fixtures/aims_calculations/5/geometry.in.next_step rename to tests/fixtures/default_aims_calcs/5/geometry.in.next_step diff --git a/tests/fixtures/aims_calculations/5/hessian.aims b/tests/fixtures/default_aims_calcs/5/hessian.aims similarity index 100% rename from tests/fixtures/aims_calculations/5/hessian.aims rename to tests/fixtures/default_aims_calcs/5/hessian.aims diff --git a/tests/fixtures/aims_calculations/6/aims.out b/tests/fixtures/default_aims_calcs/6/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/6/aims.out rename to tests/fixtures/default_aims_calcs/6/aims.out diff --git a/tests/fixtures/aims_calculations/6/control.in b/tests/fixtures/default_aims_calcs/6/control.in similarity index 100% rename from tests/fixtures/aims_calculations/6/control.in rename to tests/fixtures/default_aims_calcs/6/control.in diff --git a/tests/fixtures/aims_calculations/6/geometry.in b/tests/fixtures/default_aims_calcs/6/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/6/geometry.in rename to tests/fixtures/default_aims_calcs/6/geometry.in diff --git a/tests/fixtures/aims_calculations/6/geometry.in.next_step b/tests/fixtures/default_aims_calcs/6/geometry.in.next_step similarity index 100% rename from tests/fixtures/aims_calculations/6/geometry.in.next_step rename to tests/fixtures/default_aims_calcs/6/geometry.in.next_step diff --git a/tests/fixtures/aims_calculations/6/hessian.aims b/tests/fixtures/default_aims_calcs/6/hessian.aims similarity index 100% rename from tests/fixtures/aims_calculations/6/hessian.aims rename to tests/fixtures/default_aims_calcs/6/hessian.aims diff --git a/tests/fixtures/aims_calculations/7/aims.out b/tests/fixtures/default_aims_calcs/7/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/7/aims.out rename to tests/fixtures/default_aims_calcs/7/aims.out diff --git a/tests/fixtures/aims_calculations/7/control.in b/tests/fixtures/default_aims_calcs/7/control.in similarity index 100% rename from tests/fixtures/aims_calculations/7/control.in rename to tests/fixtures/default_aims_calcs/7/control.in diff --git a/tests/fixtures/aims_calculations/7/geometry.in b/tests/fixtures/default_aims_calcs/7/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/7/geometry.in rename to tests/fixtures/default_aims_calcs/7/geometry.in diff --git a/tests/fixtures/aims_calculations/7/geometry.in.next_step b/tests/fixtures/default_aims_calcs/7/geometry.in.next_step similarity index 100% rename from tests/fixtures/aims_calculations/7/geometry.in.next_step rename to tests/fixtures/default_aims_calcs/7/geometry.in.next_step diff --git a/tests/fixtures/aims_calculations/7/hessian.aims b/tests/fixtures/default_aims_calcs/7/hessian.aims similarity index 100% rename from tests/fixtures/aims_calculations/7/hessian.aims rename to tests/fixtures/default_aims_calcs/7/hessian.aims diff --git a/tests/fixtures/aims_calculations/8/aims.out b/tests/fixtures/default_aims_calcs/8/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/8/aims.out rename to tests/fixtures/default_aims_calcs/8/aims.out diff --git a/tests/fixtures/aims_calculations/8/control.in b/tests/fixtures/default_aims_calcs/8/control.in similarity index 100% rename from tests/fixtures/aims_calculations/8/control.in rename to tests/fixtures/default_aims_calcs/8/control.in diff --git a/tests/fixtures/aims_calculations/8/geometry.in b/tests/fixtures/default_aims_calcs/8/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/8/geometry.in rename to tests/fixtures/default_aims_calcs/8/geometry.in diff --git a/tests/fixtures/aims_calculations/9/aims.out b/tests/fixtures/default_aims_calcs/9/aims.out similarity index 100% rename from tests/fixtures/aims_calculations/9/aims.out rename to tests/fixtures/default_aims_calcs/9/aims.out diff --git a/tests/fixtures/aims_calculations/9/control.in b/tests/fixtures/default_aims_calcs/9/control.in similarity index 100% rename from tests/fixtures/aims_calculations/9/control.in rename to tests/fixtures/default_aims_calcs/9/control.in diff --git a/tests/fixtures/aims_calculations/9/geometry.in b/tests/fixtures/default_aims_calcs/9/geometry.in similarity index 100% rename from tests/fixtures/aims_calculations/9/geometry.in rename to tests/fixtures/default_aims_calcs/9/geometry.in diff --git a/tests/fixtures/aims_calculations/extractor.py b/tests/fixtures/default_aims_calcs/extractor.py similarity index 100% rename from tests/fixtures/aims_calculations/extractor.py rename to tests/fixtures/default_aims_calcs/extractor.py diff --git a/tests/test_output.py b/tests/test_output.py index 0aa5dbd..e10860d 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -3,36 +3,42 @@ from dfttools.output import AimsOutput -@pytest.fixture(scope="module", params=range(1, 11)) -def aims_out(request): - return AimsOutput( - aims_out=f"tests/fixtures/aims_calculations/{str(request.param)}/aims.out" - ) - - -def aims_fixture_no(aims_out: AimsOutput) -> str: - """ - Get the aims fixture number - - Parameters - ---------- - aims_out : AimsOutput - AimsOutput object taken from the aims_out fixture - - Returns - ------- - str - The aims fixture number - """ +class TestAimsOutput: + + @pytest.fixture(params=range(1, 11), autouse=True) + def aims_out(self, request, run_aims): + + cwd = os.path.dirname(os.path.realpath(__file__)) + + # Run the FHI-aims calculations if the run_aims option is specified but not if + # they already exist. + # Force it to run if the run_aims option is "change_bin" + # run_aims fixture is defined in conftest.py + if request.param == 1 and run_aims is not False: + binary = aims_bin_path_prompt(run_aims, cwd) + subprocess.run(["bash", f"{cwd}/run_aims.sh", binary, str(run_aims)]) + aims_out_dir = "custom_bin_aims_calcs" + elif run_aims is not False: + aims_out_dir = "custom_bin_aims_calcs" + else: + aims_out_dir = "default_aims_calcs" + + self.ao = AimsOutput( + aims_out=f"{cwd}/fixtures/{aims_out_dir}/{str(request.param)}/aims.out" + ) - return aims_out.aims_out_path.split("/")[3] + # Set class attribute to check in xfail tests + self._run_aims = False if run_aims is False else True + @property + def _aims_fixture_no(self) -> int: + return int(self.ao.aims_out_path.split("/")[-2]) -def test_get_number_of_atoms(aims_out): - if aims_fixture_no(aims_out) in ["4", "6", "8", "10"]: - assert aims_out.get_number_of_atoms() == 2 - else: - assert aims_out.get_number_of_atoms() == 3 + def test_get_number_of_atoms(self): + if self._aims_fixture_no in [4, 6, 8, 10]: + assert self.ao.get_number_of_atoms() == 2 + else: + assert self.ao.get_number_of_atoms() == 3 # TODO From 4826ed92992947d3a0f8622a5cc215f37928763d Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 24 Oct 2024 23:49:24 +0100 Subject: [PATCH 03/11] Added custom aims bin output dir --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 4b069eb..3344462 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,6 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# Others +tests/fixtures/custom_bin_aims_calcs From 3cd790f03319677d10213d6c8dee9a2c61138a04 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 24 Oct 2024 23:50:52 +0100 Subject: [PATCH 04/11] Added ability to run tests with custom aims bin --- dfttools/utils/file_utils.py | 71 +++ poetry.lock | 19 +- pyproject.toml | 3 +- tests/.aims_bin_loc.txt | 1 + tests/conftest.py | 23 + tests/run_aims.sh | 21 + tests/test_output.py | 856 +++++++++++++++++------------------ 7 files changed, 541 insertions(+), 453 deletions(-) create mode 100644 tests/.aims_bin_loc.txt create mode 100644 tests/conftest.py create mode 100755 tests/run_aims.sh diff --git a/dfttools/utils/file_utils.py b/dfttools/utils/file_utils.py index 8c351b9..e066faa 100644 --- a/dfttools/utils/file_utils.py +++ b/dfttools/utils/file_utils.py @@ -1,3 +1,74 @@ +from pathlib import Path +from typing import Union + +from click import edit + + +def aims_bin_path_prompt(change_bin: Union[bool, str], save_dir) -> str: + """ + Prompt the user to enter the path to the FHI-aims binary, if not already found in + .aims_bin_loc.txt + + If it is found in .aims_bin_loc.txt, the path will be read from there, unless + change_bin is True, in which case the user will be prompted to enter the path again. + + Parameters + ---------- + change_bin : Union[bool, str] + whether the user wants to change the binary path. If str == "change_bin", the + user will be prompted to enter the path to the binary again. + save_dir : str + the directory to save or look for the .aims_bin_loc.txt file + + Returns + ------- + binary : str + path to the location of the FHI-aims binary + """ + + marker = ( + "\n# Enter the path to the FHI-aims binary above this line\n" + "# Ensure that the full absolute path is provided" + ) + + def write_bin(): + binary = edit(marker) + binary = str(binary).split()[0] + if binary is not None: + if Path(binary).is_file(): + with open(f"{save_dir}/.aims_bin_loc.txt", "w+") as f: + f.write(binary) + + else: + raise FileNotFoundError( + "the path to the FHI-aims binary does not exist" + ) + + else: + raise FileNotFoundError( + "the path to the FHI-aims binary could not be found" + ) + + return binary + + if ( + not Path(f"{save_dir}/.aims_bin_loc.txt").is_file() + or change_bin == "change_bin" + ): + binary = write_bin() + + else: + # Parse the binary path from .aims_bin_loc.txt + with open(f"{save_dir}/.aims_bin_loc.txt", "r") as f: + binary = f.readlines()[0] + + # Check if the binary path exists and is a file + if not Path(binary).is_file(): + binary = write_bin() + + return binary + + def check_required_files(files: list, *args: str, any=False) -> None: """ Raise an error if a necessary file was not given. diff --git a/poetry.lock b/poetry.lock index a95bf8f..b4d1064 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -188,6 +188,20 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -1170,7 +1184,6 @@ 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"}, @@ -1583,4 +1596,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "65005663615ff5d779e6ab20760d67e1715ca4edf0c82861ffca0fcb84b0fb10" +content-hash = "9fdbe613fb5f3869814dabd0c65aa05d954fd6f5e02879881ee62112b1b74519" diff --git a/pyproject.toml b/pyproject.toml index e831d05..5419d4d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" +pytest = "^8.2.0" numpy = "^1.26.4" scipy = "^1.13.0" ase = "^3.22.1" @@ -24,8 +25,8 @@ optional = true [tool.poetry.group.dev.dependencies] ruff = "^0.3.5" pyright = "^1.1.373" -pytest = "^8.2.0" ptpython = "^3.0.26" +click = "^8.1.7" [tool.poetry.group.docs] optional = true diff --git a/tests/.aims_bin_loc.txt b/tests/.aims_bin_loc.txt new file mode 100644 index 0000000..2e8732f --- /dev/null +++ b/tests/.aims_bin_loc.txt @@ -0,0 +1 @@ +/Users/dylanmorgan/Programming/mac_projects/FHIaims/build/aims.240507.scalapack.mpi.x \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..40d079c --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,23 @@ +import pytest + + +def pytest_addoption(parser): + """Add custom command line options to the pytest command.""" + + parser.addoption( + "--run_aims", + nargs="?", + const=True, + default=False, + choices=[None, "change_bin"], + help="Optionally re-calculate the FHI-aims output files with a binary specified" + " by the user. The first time this is run, the user will be prompted to enter" + " the path to the FHI-aims binary. If the user wants to change the path in" + " subsequent runs, they can use the 'change_bin' option, which will" + " automatically call the binary path prompt again.", + ) + + +@pytest.fixture(scope="session") +def run_aims(request): + return request.config.getoption("--run_aims") diff --git a/tests/run_aims.sh b/tests/run_aims.sh new file mode 100755 index 0000000..041dad5 --- /dev/null +++ b/tests/run_aims.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +# Parse args +binary=$1 +run_aims=$2 + +if [[ -f "tests/fixtures/custom_bin_aims_calcs/1/aims.out" && "$run_aims" == "change_bin" ]]; then + rm -rf fixtures/custom_bin_aims_calcs +elif [[ -f "tests/fixtures/custom_bin_aims_calcs/1/aims.out" && "$run_aims" == "True" ]]; then + exit 1 +fi + +for i in {1..10}; do ( + # Copy the aims input files to a new directory + mkdir -p tests/fixtures/custom_bin_aims_calcs/"$i" + cp tests/fixtures/default_aims_calcs/"$i"/*.in tests/fixtures/custom_bin_aims_calcs/"$i" + + # Run the binary in each of the directories + cd tests/fixtures/custom_bin_aims_calcs/"$i" || exit 1 + mpirun -n 4 "$binary" >aims.out +); done diff --git a/tests/test_output.py b/tests/test_output.py index e10860d..854d3b9 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -1,6 +1,10 @@ +import os +import subprocess + import numpy as np import pytest from dfttools.output import AimsOutput +from dfttools.utils.file_utils import aims_bin_path_prompt class TestAimsOutput: @@ -40,457 +44,411 @@ def test_get_number_of_atoms(self): else: assert self.ao.get_number_of_atoms() == 3 + # TODO + # def test_get_geometry(self): + + # TODO + # def test_get_parameters(self): -# TODO -# def test_get_geometry(aims_out): - -# TODO -# def test_get_parameters(aims_out): - - -def test_check_exit_normal(aims_out): - if aims_fixture_no(aims_out) in ["7", "8"]: - assert aims_out.check_exit_normal() is False - else: - assert aims_out.check_exit_normal() is True - - -def test_get_time_per_scf(aims_out): - - # fmt: off - timings = [ - np.array([0.042, 0.045, 0.038, 0.037, 0.036, 0.038, 0.033, 0.036, 0.032, 0.032, 0.031, 0.023]), - np.array([0.033, 0.033, 0.033, 0.034, 0.035, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.036, 0.026]), - np.array([0.033, 0.033, 0.034, 0.034, 0.034, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.037, 0.027]), - np.array([0.649, 0.666, 0.667, 0.666, 0.667, 0.667, 0.667, 0.665, 0.666, 0.326]), - np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.072, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.03, 0.073, 0.028, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.073, 0.028, 0.028, 0.029, 0.028, 0.029, 0.029, 0.072, 0.028, 0.028, 0.028, 0.029, 0.028, 0.072]), - np.array([0.785, 0.801, 0.803, 0.808, 0.802, 0.803, 0.802, 0.802, 0.801, 0.803, 2.276, 9.297, 0.797, 0.79, 0.793, 0.792, 0.794, 2.248, 9.114, 0.797, 0.794, 0.793, 0.793, 0.793, 0.793, 2.248, 9.248]), - np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.031, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.0]), - np.array([0.636, 0.653, 0.652, 0.652, 0.657, 0.65, 0.65, 0.0]), - np.array([0.048, 0.046, 0.046, 0.046, 0.049, 0.047, 0.048, 0.047, 0.047, 0.047, 0.047, 0.047, 0.047, 0.039]), - np.array([34.786, 33.136, 33.081, 33.97, 33.873, 33.9, 33.933, 33.921, 33.945, 33.936, 33.575]), - ] - # fmt: on - - # Fail if the absolute tolerance between any values in test vs. reference array is - # greater than 2e-3 - assert np.allclose( - aims_out.get_time_per_scf(), - timings[int(aims_fixture_no(aims_out)) - 1], - atol=2e-3, - ) - - -def test_get_change_of_total_energy_1(aims_out): - """ - Using default args (final energy change) - """ - - final_energies = np.array( - [ - 1.599e-08, - 1.611e-09, - 1.611e-09, - -1.492e-07, - -5.833e-09, - 3.703e-09, - 1.509e-05, - -0.0001144, - 6.018e-06, - 7.119e-06, + def test_check_exit_normal(self): + if self._aims_fixture_no in [7, 8]: + assert self.ao.check_exit_normal() is False + else: + assert self.ao.check_exit_normal() is True + + def test_get_time_per_scf(self): + # fmt: off + timings = [ + np.array([0.042, 0.045, 0.038, 0.037, 0.036, 0.038, 0.033, 0.036, 0.032, 0.032, 0.031, 0.023]), + np.array([0.033, 0.033, 0.033, 0.034, 0.035, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.036, 0.026]), + np.array([0.033, 0.033, 0.034, 0.034, 0.034, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.037, 0.027]), + np.array([0.649, 0.666, 0.667, 0.666, 0.667, 0.667, 0.667, 0.665, 0.666, 0.326]), + np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.072, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.03, 0.073, 0.028, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.073, 0.028, 0.028, 0.029, 0.028, 0.029, 0.029, 0.072, 0.028, 0.028, 0.028, 0.029, 0.028, 0.072]), + np.array([0.785, 0.801, 0.803, 0.808, 0.802, 0.803, 0.802, 0.802, 0.801, 0.803, 2.276, 9.297, 0.797, 0.79, 0.793, 0.792, 0.794, 2.248, 9.114, 0.797, 0.794, 0.793, 0.793, 0.793, 0.793, 2.248, 9.248]), + np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.031, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.0]), + np.array([0.636, 0.653, 0.652, 0.652, 0.657, 0.65, 0.65, 0.0]), + np.array([0.048, 0.046, 0.046, 0.046, 0.049, 0.047, 0.048, 0.047, 0.047, 0.047, 0.047, 0.047, 0.047, 0.039]), + np.array([34.786, 33.136, 33.081, 33.97, 33.873, 33.9, 33.933, 33.921, 33.945, 33.936, 33.575]), ] - ) + # fmt: on + + # Fail if the absolute tolerance between any values in test vs. reference array is + # greater than 2e-3 + assert np.allclose( + self.ao.get_time_per_scf(), + timings[self._aims_fixture_no - 1], + atol=2e-3, + ) - assert ( - abs( - aims_out.get_change_of_total_energy() - - final_energies[int(aims_fixture_no(aims_out)) - 1] + def test_get_change_of_total_energy_1(self): + """Using default args (final energy change)""" + + final_energies = np.array( + [ + 1.599e-08, + 1.611e-09, + 1.611e-09, + -1.492e-07, + -5.833e-09, + 3.703e-09, + 1.509e-05, + -0.0001144, + 6.018e-06, + 7.119e-06, + ] ) - < 1e-10 - ) - - -def test_get_change_of_total_energy_2(aims_out): - """ - Get every energy change - """ - - # fmt: off - energy_diffs = [ - np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), - np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), - np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, -2081.0, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, -2081.0, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, -2081.0, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, -2081.0, 6.632e-07, 2.993e-07, -2.037e-07, 1.171e-08, -5.833e-09]), - np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -15800.0, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -15800.0, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), - np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, -2081.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, -2081.0, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, -2081.0, 0.0001081, 2.93e-05, 1.509e-05]), - np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), - np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), - np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), - ] - # fmt: on - - # Fail if the absolute tolerance between any values in test vs. reference array is - # greater than 1e-10 - assert np.allclose( - aims_out.get_change_of_total_energy(n_occurrence=None), - energy_diffs[int(aims_fixture_no(aims_out)) - 1], - atol=1e-10, - ) - - -def test_get_change_of_total_energy_3(aims_out): - """ - Get the 1st energy change - """ - - first_energies = np.array( - [1.408, -0.1508, -0.1508, 0.871, 1.277, 0.1063, 1.19, 0.871, -5.561, -0.07087] - ) - - assert ( - abs( - aims_out.get_change_of_total_energy(n_occurrence=1) - - first_energies[int(aims_fixture_no(aims_out)) - 1] + + assert ( + abs( + self.ao.get_change_of_total_energy() + - final_energies[self._aims_fixture_no - 1] + ) + < 1e-8 ) - < 1e-3 - ) - - -# TODO: Lukas can you check that this is correct -def test_get_change_of_total_energy_4(aims_out): - """ - Use an energy invalid indicator - """ - - # fmt: off - all_energies = [ - np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), - np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), - np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, 6.632e-07, 2.993e-07,-2.037e-07, 1.171e-08, -5.833e-09]), - np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), - np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, 0.0001081, 2.93e-05, 1.509e-05]), - np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), - np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), - np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), - ] - # fmt: on - - assert np.allclose( - aims_out.get_change_of_total_energy(n_occurrence=1), - all_energies[int(aims_fixture_no(aims_out)) - 1], - atol=1e-10, - ) - - -# TODO: currently a palceholder -# def test_all_output_functions(aims_out_9):, # aims = aims_out_9 - -# aims.get_geometry() -# aims.get_parameters() -# aims.check_exit_normal() -# aims.get_change_of_total_energy() -# # aims.get_change_of_forces() -# aims.get_change_of_sum_of_eigenvalues() -# # aims.get_maximum_force() -# aims.get_final_energy() -# aims.get_energy_corrected() -# aims.get_total_energy_T0() -# aims.get_energy_uncorrected() -# # aims.get_energy_without_vdw() -# aims.get_HOMO_energy() -# aims.get_LUMO_energy() -# # aims.get_vdw_energy() -# aims.get_exchange_correlation_energy() -# aims.get_electrostatic_energy() -# aims.get_kinetic_energy() -# aims.get_sum_of_eigenvalues() -# aims.get_cx_potential_correction() -# aims.get_free_atom_electrostatic_energy() -# aims.get_entropy_correction() -# aims.get_hartree_energy_correction() -# # aims.get_ionic_embedding_energy() -# # aims.get_density_embedding_energy() -# # aims.get_nonlocal_embedding_energy() -# # aims.get_external_embedding_energy() -# # aims.get_forces() -# aims.check_spin_polarised() -# aims.get_conv_params() -# aims.get_n_relaxation_steps() -# aims.get_n_scf_iters() -# aims.get_i_scf_conv_acc() -# aims.get_n_initial_ks_states() -# # aims.get_all_ks_eigenvalues()# -> functionality does not work -# aims.get_final_ks_eigenvalues() -# # aims.get_pert_soc_ks_eigenvalues()# -> not great but may work if that output is there - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, True), -# (aims_out_2, True), -# (aims_out_3, True), -# (aims_out_4, True), -# (aims_out_5, True), -# (aims_out_6, True), -# (aims_out_7, False), -# (aims_out_8, False), -# (aims_out_9, True), -# (aims_out_10, True), -# ], -# ) -# def test_check_exit_normal(aims_out, expected): -# assert aims_out is expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, False), -# (aims_out_2, True), -# (aims_out_3, True), -# (aims_out_4, False), -# (aims_out_5, False), -# (aims_out_6, False), -# (aims_out_7, False), -# (aims_out_8, False), -# (aims_out_9, False), -# (aims_out_10, False), -# ], -# ) -# def test_check_spin_polarised(aims_out, expected): -# assert aims_out.check_spin_polarised() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# ( -# aims_out_1, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_2, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_3, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_4, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_5, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_6, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_7, -# { -# "charge_density": 1e-10, -# "sum_eigenvalues": 1e-06, -# "total_energy": 1e-12, -# "total_force": 1e-08, -# }, -# ), -# ( -# aims_out_8, -# { -# "charge_density": 1e-10, -# "sum_eigenvalues": 1e-06, -# "total_energy": 1e-12, -# "total_force": 1e-08, -# }, -# ), -# ( -# aims_out_9, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ( -# aims_out_10, -# { -# "charge_density": 0.0, -# "sum_eigenvalues": 0.0, -# "total_energy": 0.0, -# "total_force": 0.0, -# }, -# ), -# ], -# ) -# def test_get_conv_params(aims_out, expected): -# assert aims_out.get_conv_params() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, -2080.832254505), -# (aims_out_2, -2080.832254498), -# (aims_out_3, -2080.832254498), -# (aims_out_4, -15785.832821011), -# (aims_out_5, -2080.832254506), -# (aims_out_6, -15802.654211961), -# (aims_out_7, None), -# (aims_out_8, None), -# (aims_out_9, -2081.000809207), -# (aims_out_10, -15804.824029071), -# ], -# ) -# def test_get_final_energy(aims_out, expected): -# assert aims_out.get_final_energy() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, 1), -# (aims_out_2, 1), -# (aims_out_3, 1), -# (aims_out_4, 1), -# (aims_out_5, 4), -# (aims_out_6, 2), -# (aims_out_7, 3), -# (aims_out_8, 0), -# (aims_out_9, 1), -# (aims_out_10, 1), -# ], -# ) -# def get_n_relaxation_steps_test(aims_out, expected): -# assert aims_out.get_n_relaxation_steps == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, 12), -# (aims_out_2, 13), -# (aims_out_3, 13), -# (aims_out_4, 10), -# (aims_out_5, 42), -# (aims_out_6, 27), -# (aims_out_7, 56), -# (aims_out_8, 8), -# (aims_out_9, 14), -# (aims_out_10, 11), -# ], -# ) -# def test_get_n_scf_iters(aims_out, expected): -# assert aims_out.get_n_scf_iters() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, None), -# (aims_out_2, None), -# (aims_out_3, None), -# (aims_out_4, None), -# (aims_out_5, None), -# (aims_out_6, None), -# (aims_out_7, None), -# (aims_out_8, None), -# (aims_out_9, None), -# (aims_out_10, None), -# ], -# ) -# def get_i_scf_conv_acc_test(aims_out, expected): -# assert aims_out.get_i_scf_conv_acc() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, None), -# (aims_out_2, None), -# (aims_out_3, None), -# (aims_out_4, None), -# (aims_out_7, None), -# ], -# ) -# def get_n_initial_ks_states_test(aims_out, expected): -# assert aims_out.get_n_initial_ks_states() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, None), -# (aims_out_2, None), -# (aims_out_3, None), -# (aims_out_4, None), -# (aims_out_7, None), -# ], -# ) -# def get_all_ks_eigenvalues_test(aims_out, expected): -# assert aims_out.get_all_ks_eigenvalues() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, None), -# (aims_out_2, None), -# (aims_out_3, None), -# (aims_out_4, None), -# (aims_out_7, None), -# ], -# ) -# def get_final_ks_eigenvalues_test(aims_out, expected): -# assert aims_out.get_final_ks_eigenvalues() == expected - - -# @pytest.mark.parametrize( -# "aims_out, expected", -# [ -# (aims_out_1, None), -# (aims_out_2, None), -# (aims_out_3, None), -# (aims_out_4, None), -# (aims_out_7, None), -# ], -# ) -# def get_pert_soc_ks_eigenvalues_test(aims_out, expected): -# assert aims_out.get_pert_soc_ks_eigenvalues() == expected + + def test_get_change_of_total_energy_2(self): + """Get every energy change""" + + # fmt: off + energy_diffs = [ + np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), + np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), + np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, -2081.0, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, -2081.0, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, -2081.0, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, -2081.0, 6.632e-07, 2.993e-07, -2.037e-07, 1.171e-08, -5.833e-09]), + np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -15800.0, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -15800.0, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), + np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, -2081.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, -2081.0, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, -2081.0, 0.0001081, 2.93e-05, 1.509e-05]), + np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), + np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), + np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), + ] + # fmt: on + + # Fail if the absolute tolerance between any values in test vs. reference array is + # greater than 1e-10 + assert np.allclose( + self.ao.get_change_of_total_energy(n_occurrence=None), + energy_diffs[self._aims_fixture_no - 1], + atol=1e-8, + ) + + def test_get_change_of_total_energy_3(self): + """Get the 1st energy change""" + + first_energies = [ + 1.408, + -0.1508, + -0.1508, + 0.871, + 1.277, + 0.1063, + 1.19, + 0.871, + -5.561, + -0.07087, + ] + + assert ( + abs( + self.ao.get_change_of_total_energy(n_occurrence=1) + - first_energies[self._aims_fixture_no - 1] + ) + < 1e-8 + ) + + # TODO: Lukas can you check that this is correct + # def test_get_change_of_total_energy_4(self): + # """ + # Use an energy invalid indicator + # """ + + # # fmt: off + # all_energies = [ + # np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), + # np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + # np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), + # np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), + # np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, 6.632e-07, 2.993e-07,-2.037e-07, 1.171e-08, -5.833e-09]), + # np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), + # np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, 0.0001081, 2.93e-05, 1.509e-05]), + # np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), + # np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), + # np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), + # ] + # # fmt: on + + # assert np.allclose( + # self.ao.get_change_of_total_energy(n_occurrence=1), + # all_energies[self.aims_fixture_no(self.ao) - 1], + # atol=1e-10, + # ) + + # Not necessary to include every possible function argument in the next tests as all + # of the following functions wrap around _get_energy(), which have all been tested in + # the previous 4 tests + + def test_get_change_of_forces(self): + forces = [0.4728, 8.772e-09, 6.684e-12] + + if self._aims_fixture_no in [5, 6, 7]: + assert ( + abs(self.ao.get_change_of_forces() - forces[self._aims_fixture_no - 5]) + < 1e-8 + ) + + else: + with pytest.raises(ValueError): + self.ao.get_change_of_forces() + + def get_change_of_sum_of_eigenvalues(self): + pass + + # TODO: currently a palceholder + # def test_all_output_functions(self_9):, # aims = aims_out_9 + + # aims.get_geometry() + # aims.get_parameters() + # aims.check_exit_normal() + # aims.get_change_of_total_energy() + # # aims.get_change_of_forces() + # aims.get_change_of_sum_of_eigenvalues() + # # aims.get_maximum_force() + # aims.get_final_energy() + # aims.get_energy_corrected() + # aims.get_total_energy_T0() + # aims.get_energy_uncorrected() + # # aims.get_energy_without_vdw() + # aims.get_HOMO_energy() + # aims.get_LUMO_energy() + # # aims.get_vdw_energy() + # aims.get_exchange_correlation_energy() + # aims.get_electrostatic_energy() + # aims.get_kinetic_energy() + # aims.get_sum_of_eigenvalues() + # aims.get_cx_potential_correction() + # aims.get_free_atom_electrostatic_energy() + # aims.get_entropy_correction() + # aims.get_hartree_energy_correction() + # # aims.get_ionic_embedding_energy() + # # aims.get_density_embedding_energy() + # # aims.get_nonlocal_embedding_energy() + # # aims.get_external_embedding_energy() + # # aims.get_forces() + # aims.check_spin_polarised() + # aims.get_conv_params() + # aims.get_n_relaxation_steps() + # aims.get_n_scf_iters() + # aims.get_i_scf_conv_acc() + # aims.get_n_initial_ks_states() + # # aims.get_all_ks_eigenvalues()# -> functionality does not work + # aims.get_final_ks_eigenvalues() + # # aims.get_pert_soc_ks_eigenvalues()# -> not great but may work if that output is there + + def test_check_spin_polarised(self): + if self._aims_fixture_no in [2, 3]: + assert self.ao.check_spin_polarised() is True + else: + assert self.ao.check_spin_polarised() is False + + # @pytest.mark.parametrize( + # "aims_out, expected", + # [ + # ( + # aims_out_1, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_2, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_3, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_4, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_5, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_6, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_7, + # { + # "charge_density": 1e-10, + # "sum_eigenvalues": 1e-06, + # "total_energy": 1e-12, + # "total_force": 1e-08, + # }, + # ), + # ( + # aims_out_8, + # { + # "charge_density": 1e-10, + # "sum_eigenvalues": 1e-06, + # "total_energy": 1e-12, + # "total_force": 1e-08, + # }, + # ), + # ( + # aims_out_9, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ( + # aims_out_10, + # { + # "charge_density": 0.0, + # "sum_eigenvalues": 0.0, + # "total_energy": 0.0, + # "total_force": 0.0, + # }, + # ), + # ], + # ) + # def test_get_conv_params(aims_out, expected): + # assert self.ao.get_conv_params() == expected + + def test_get_final_energy(self): + final_energies = [ + -2080.832254505, + -2080.832254498, + -2080.832254498, + -15785.832821011, + -2080.832254506, + -15802.654211961, + None, + None, + -2081.000809207, + -15804.824029071, + ] + + final_energy = self.ao.get_final_energy() + + if self._aims_fixture_no in [7, 8]: + assert final_energy is None + + else: + assert abs(final_energy - final_energies[self._aims_fixture_no - 1]) < 1e-8 + + def get_n_relaxation_steps_test(self): + n_relaxation_steps = [1, 1, 1, 1, 4, 2, 3, 0, 1, 1] + assert ( + self.ao.get_n_relaxation_steps() + == n_relaxation_steps[self._aims_fixture_no - 1] + ) + + # @pytest.mark.parametrize( + # "aims_out, expected", + # [ + # (aims_out_1, 12), + # (aims_out_2, 13), + # (aims_out_3, 13), + # (aims_out_4, 10), + # (aims_out_5, 42), + # (aims_out_6, 27), + # (aims_out_7, 56), + # (aims_out_8, 8), + # (aims_out_9, 14), + # (aims_out_10, 11), + # ], + # ) + def test_get_n_scf_iters(self): + n_scf_iters = [12, 13, 13, 10, 42, 27, 56, 8, 14, 11] + assert self.ao.get_n_scf_iters() == n_scf_iters[self._aims_fixture_no - 1] + + # TODO + # def get_i_scf_conv_acc_test(self): + + def test_get_n_initial_ks_states(self): + n_initial_ks_states = [11, 22, 48, 20, 11, 20, 11, 20, 11, 20] + + def compare_n_initial_ks_states(): + assert ( + self.ao.get_n_initial_ks_states() + == n_initial_ks_states[self._aims_fixture_no - 1] + ) + + if self._aims_fixture_no in [2, 3]: + compare_n_initial_ks_states() + else: + with pytest.warns(UserWarning): + compare_n_initial_ks_states() + + # @pytest.mark.parametrize( + # "aims_out, expected", + # [ + # (aims_out_1, None), + # (aims_out_2, None), + # (aims_out_3, None), + # (aims_out_4, None), + # (aims_out_7, None), + # ], + # ) + # def get_all_ks_eigenvalues_test(aims_out, expected): + # assert aims_out.get_all_ks_eigenvalues() == expected + + # @pytest.mark.parametrize( + # "aims_out, expected", + # [ + # (aims_out_1, None), + # (aims_out_2, None), + # (aims_out_3, None), + # (aims_out_4, None), + # (aims_out_7, None), + # ], + # ) + # def get_final_ks_eigenvalues_test(aims_out, expected): + # assert aims_out.get_final_ks_eigenvalues() == expected + + # @pytest.mark.parametrize( + # "aims_out, expected", + # [ + # (aims_out_1, None), + # (aims_out_2, None), + # (aims_out_3, None), + # (aims_out_4, None), + # (aims_out_7, None), + # ], + # ) + # def get_pert_soc_ks_eigenvalues_test(aims_out, expected): + # assert aims_out.get_pert_soc_ks_eigenvalues() == expected From 08ef00df42cfd267f8ffb673d0088b4a8bfca5cf Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 24 Oct 2024 23:53:44 +0100 Subject: [PATCH 05/11] Added aims_bin_loc file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3344462..4292cf3 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,4 @@ cython_debug/ # Others tests/fixtures/custom_bin_aims_calcs +tests/.aims_bin_loc From 760e04d003401d7d25bb71805d1ea89299ba7759 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 24 Oct 2024 23:54:22 +0100 Subject: [PATCH 06/11] Removed aims_bin_loc --- tests/.aims_bin_loc.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/.aims_bin_loc.txt diff --git a/tests/.aims_bin_loc.txt b/tests/.aims_bin_loc.txt deleted file mode 100644 index 2e8732f..0000000 --- a/tests/.aims_bin_loc.txt +++ /dev/null @@ -1 +0,0 @@ -/Users/dylanmorgan/Programming/mac_projects/FHIaims/build/aims.240507.scalapack.mpi.x \ No newline at end of file From 952a5616fc3b594f4680f5e18f37bbc213335ba1 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 25 Oct 2024 01:06:34 +0100 Subject: [PATCH 07/11] Updated dependencies and actions --- .github/workflows/pypi.yml | 65 ++ .github/workflows/pyright.yml | 2 +- .github/workflows/pytest.yml | 35 + .github/workflows/ruff.yml | 10 +- .github/workflows/sphinx-docs.yml | 11 +- poetry.lock | 1353 ++++++++++++++++------------- pyproject.toml | 5 +- tests/test_output.py | 59 +- 8 files changed, 887 insertions(+), 653 deletions(-) create mode 100644 .github/workflows/pypi.yml create mode 100644 .github/workflows/pytest.yml diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..56ba27c --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,65 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Upload Python Package + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + release-build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Build release distributions + run: | + # NOTE: put your own distribution build steps here. + poetry build + + - name: Upload distributions + uses: actions/upload-artifact@v4 + with: + name: release-dists + path: dist/ + + pypi-publish: + runs-on: ubuntu-latest + + needs: + - release-build + + permissions: + # IMPORTANT: this permission is mandatory for trusted publishing + id-token: write + + # Dedicated environments with protections for publishing are strongly recommended. + environment: + name: pypi + # OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status: + # url: https://pypi.org/p/YOURPROJECT + + steps: + - name: Retrieve release distributions + uses: actions/download-artifact@v4 + with: + name: release-dists + path: dist/ + + - name: Publish release distributions to PyPI + uses: pypa/gh-action-pypi-publish@6f7e8d9c0b1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d diff --git a/.github/workflows/pyright.yml b/.github/workflows/pyright.yml index 744aefe..8cc7067 100644 --- a/.github/workflows/pyright.yml +++ b/.github/workflows/pyright.yml @@ -1,4 +1,4 @@ -name: Run the pyright checker +name: pyright on: push: diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml new file mode 100644 index 0000000..0854f0e --- /dev/null +++ b/.github/workflows/pytest.yml @@ -0,0 +1,35 @@ +name: pytest + +on: + push: + branches: + - master + pull_request: + branches: + - master + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + + # Only run after linting has finished + # workflow_run: + # workflows: ['ruff'] + # types: [completed] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - uses: abatilo/actions-poetry@v2 + - name: Install the project dependencies + run: poetry install --with=dev + - name: Run the tests + run: pytest tests diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index 3d7879e..7abf99b 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -1,4 +1,4 @@ -name: Run the ruff linter and formatter +name: ruff on: push: @@ -12,6 +12,10 @@ on: jobs: ruff-lint: runs-on: ubuntu-latest + # strategy: + # matrix: + # python-version: ["3.10", "3.11", "3.12"] + steps: - uses: actions/checkout@v4 - uses: chartboost/ruff-action@v1 @@ -22,6 +26,10 @@ jobs: ruff-format: runs-on: ubuntu-latest needs: ruff-lint + # strategy: + # matrix: + # python-version: ["3.10", "3.11", "3.12"] + steps: - uses: actions/checkout@v4 - uses: chartboost/ruff-action@v1 diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index 1355e68..86628cd 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -1,4 +1,4 @@ -name: Build and deploy Sphinx docs +name: Sphinx on: # Runs on pushes targeting the default branch @@ -32,14 +32,11 @@ jobs: permissions: contents: write steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Python - uses: actions/setup-python@v5 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 with: python-version: "3.12" - - name: Install Poetry - uses: abatilo/actions-poetry@v2 + - uses: abatilo/actions-poetry@v2 - name: Install the project dependencies run: poetry install --only=docs - name: Build HTML diff --git a/poetry.lock b/poetry.lock index b4d1064..9e75089 100644 --- a/poetry.lock +++ b/poetry.lock @@ -45,13 +45,13 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.1.0)"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -80,112 +80,127 @@ lxml = ["lxml"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -215,66 +230,164 @@ files = [ [[package]] name = "contourpy" -version = "1.2.1" +version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, - {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, - {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, - {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, - {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, - {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, - {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, - {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, - {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, - {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, - {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, ] [package.dependencies] -numpy = ">=1.20" +numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "coverage" +version = "7.6.4" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] [[package]] name = "cycler" @@ -352,53 +465,59 @@ test = ["pytest (>=6)"] [[package]] name = "fonttools" -version = "4.53.1" +version = "4.54.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, ] [package.extras] @@ -417,32 +536,35 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "furo" -version = "2024.7.18" +version = "2024.8.6" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.7.18-py3-none-any.whl", hash = "sha256:b192c7c1f59805494c8ed606d9375fdac6e6ba8178e747e72bc116745fb7e13f"}, - {file = "furo-2024.7.18.tar.gz", hash = "sha256:37b08c5fccc95d46d8712c8be97acd46043963895edde05b0f4f135d58325c83"}, + {file = "furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c"}, + {file = "furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" -sphinx = ">=6.0,<8.0" +sphinx = ">=6.0,<9.0" sphinx-basic-ng = ">=1.0.0.beta2" [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -503,115 +625,125 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] @@ -640,109 +772,121 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] name = "matplotlib" -version = "3.9.1" +version = "3.9.2" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ccd6270066feb9a9d8e0705aa027f1ff39f354c72a87efe8fa07632f30fc6bb"}, - {file = "matplotlib-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:591d3a88903a30a6d23b040c1e44d1afdd0d778758d07110eb7596f811f31842"}, - {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2a59ff4b83d33bca3b5ec58203cc65985367812cb8c257f3e101632be86d92"}, - {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc001516ffcf1a221beb51198b194d9230199d6842c540108e4ce109ac05cc0"}, - {file = "matplotlib-3.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83c6a792f1465d174c86d06f3ae85a8fe36e6f5964633ae8106312ec0921fdf5"}, - {file = "matplotlib-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:421851f4f57350bcf0811edd754a708d2275533e84f52f6760b740766c6747a7"}, - {file = "matplotlib-3.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b3fce58971b465e01b5c538f9d44915640c20ec5ff31346e963c9e1cd66fa812"}, - {file = "matplotlib-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a973c53ad0668c53e0ed76b27d2eeeae8799836fd0d0caaa4ecc66bf4e6676c0"}, - {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd5acf8f3ef43f7532c2f230249720f5dc5dd40ecafaf1c60ac8200d46d7eb"}, - {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f"}, - {file = "matplotlib-3.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2315837485ca6188a4b632c5199900e28d33b481eb083663f6a44cfc8987ded3"}, - {file = "matplotlib-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0c977c5c382f6696caf0bd277ef4f936da7e2aa202ff66cad5f0ac1428ee15b"}, - {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, - {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, - {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, - {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, - {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, - {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, - {file = "matplotlib-3.9.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0c584210c755ae921283d21d01f03a49ef46d1afa184134dd0f95b0202ee6f03"}, - {file = "matplotlib-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11fed08f34fa682c2b792942f8902e7aefeed400da71f9e5816bea40a7ce28fe"}, - {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0000354e32efcfd86bda75729716b92f5c2edd5b947200be9881f0a671565c33"}, - {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db17fea0ae3aceb8e9ac69c7e3051bae0b3d083bfec932240f9bf5d0197a049"}, - {file = "matplotlib-3.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:208cbce658b72bf6a8e675058fbbf59f67814057ae78165d8a2f87c45b48d0ff"}, - {file = "matplotlib-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:dc23f48ab630474264276be156d0d7710ac6c5a09648ccdf49fef9200d8cbe80"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, - {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, ] [package.dependencies] @@ -761,13 +905,13 @@ dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setupto [[package]] name = "mdit-py-plugins" -version = "0.4.1" +version = "0.4.2" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, ] [package.dependencies] @@ -832,20 +976,21 @@ icu = ["PyICU (>=1.0.0)"] [[package]] name = "networkx" -version = "3.3" +version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" files = [ - {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, - {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, + {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, + {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, ] [package.extras] -default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] -doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] @@ -932,95 +1077,90 @@ testing = ["docopt", "pytest"] [[package]] name = "pillow" -version = "10.4.0" +version = "11.0.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, - {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, - {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, - {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, - {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, - {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -1044,13 +1184,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -1093,13 +1233,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -1107,31 +1247,33 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.373" +version = "1.1.386" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.373-py3-none-any.whl", hash = "sha256:b805413227f2c209f27b14b55da27fe5e9fb84129c9f1eb27708a5d12f6f000e"}, - {file = "pyright-1.1.373.tar.gz", hash = "sha256:f41bcfc8b9d1802b09921a394d6ae1ce19694957b628bc657629688daf8a83ff"}, + {file = "pyright-1.1.386-py3-none-any.whl", hash = "sha256:7071ac495593b2258ccdbbf495f1a5c0e5f27951f6b429bed4e8b296eb5cd21d"}, + {file = "pyright-1.1.386.tar.gz", hash = "sha256:8e9975e34948ba5f8e07792a9c9d2bdceb2c6c0b61742b068d2229ca2bc4a9d9"}, ] [package.dependencies] nodeenv = ">=1.6.0" +typing-extensions = ">=4.1" [package.extras] -all = ["twine (>=3.4.1)"] +all = ["nodejs-wheel-binaries", "twine (>=3.4.1)"] dev = ["twine (>=3.4.1)"] +nodejs = ["nodejs-wheel-binaries"] [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -1145,6 +1287,24 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-cov" +version = "5.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1161,61 +1321,64 @@ six = ">=1.5" [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1267,36 +1430,44 @@ files = [ [[package]] name = "scipy" -version = "1.14.0" +version = "1.14.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, - {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, - {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, - {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, - {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, - {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, - {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, - {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, - {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, - {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, - {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, - {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69"}, + {file = "scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad"}, + {file = "scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2"}, + {file = "scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2"}, + {file = "scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066"}, + {file = "scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1"}, + {file = "scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e"}, + {file = "scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06"}, + {file = "scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84"}, + {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, ] [package.dependencies] @@ -1304,8 +1475,8 @@ numpy = ">=1.23.5,<2.3" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] -doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<=7.3.7)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" @@ -1331,13 +1502,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] @@ -1545,13 +1716,13 @@ test = ["pytest"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -1567,13 +1738,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1596,4 +1767,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "9fdbe613fb5f3869814dabd0c65aa05d954fd6f5e02879881ee62112b1b74519" +content-hash = "5cd240c054a48392de43eb9235a618df03699b13a8f0b2faa6ad03c50bacbd54" diff --git a/pyproject.toml b/pyproject.toml index 5419d4d..1970534 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,13 +11,13 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" -pytest = "^8.2.0" numpy = "^1.26.4" scipy = "^1.13.0" ase = "^3.22.1" pyyaml = "^6.0.1" spglib = "^2.5.0" networkx = "^3.3" +click = "^8.1.7" [tool.poetry.group.dev] optional = true @@ -26,7 +26,8 @@ optional = true ruff = "^0.3.5" pyright = "^1.1.373" ptpython = "^3.0.26" -click = "^8.1.7" +pytest = "^8.2.0" +pytest-cov = "^5.0.0" [tool.poetry.group.docs] optional = true diff --git a/tests/test_output.py b/tests/test_output.py index 854d3b9..21d831d 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -56,6 +56,7 @@ def test_check_exit_normal(self): else: assert self.ao.check_exit_normal() is True + # TODO Use yaml files for these expected values def test_get_time_per_scf(self): # fmt: off timings = [ @@ -106,6 +107,7 @@ def test_get_change_of_total_energy_1(self): < 1e-8 ) + # TODO Use yaml files for these expected values def test_get_change_of_total_energy_2(self): """Get every energy change""" @@ -157,6 +159,7 @@ def test_get_change_of_total_energy_3(self): ) # TODO: Lukas can you check that this is correct + # TODO Use yaml files for these expected values # def test_get_change_of_total_energy_4(self): # """ # Use an energy invalid indicator @@ -250,6 +253,7 @@ def test_check_spin_polarised(self): else: assert self.ao.check_spin_polarised() is False + # TODO Use yaml files for these expected values # @pytest.mark.parametrize( # "aims_out, expected", # [ @@ -377,21 +381,6 @@ def get_n_relaxation_steps_test(self): == n_relaxation_steps[self._aims_fixture_no - 1] ) - # @pytest.mark.parametrize( - # "aims_out, expected", - # [ - # (aims_out_1, 12), - # (aims_out_2, 13), - # (aims_out_3, 13), - # (aims_out_4, 10), - # (aims_out_5, 42), - # (aims_out_6, 27), - # (aims_out_7, 56), - # (aims_out_8, 8), - # (aims_out_9, 14), - # (aims_out_10, 11), - # ], - # ) def test_get_n_scf_iters(self): n_scf_iters = [12, 13, 13, 10, 42, 27, 56, 8, 14, 11] assert self.ao.get_n_scf_iters() == n_scf_iters[self._aims_fixture_no - 1] @@ -414,41 +403,9 @@ def compare_n_initial_ks_states(): with pytest.warns(UserWarning): compare_n_initial_ks_states() - # @pytest.mark.parametrize( - # "aims_out, expected", - # [ - # (aims_out_1, None), - # (aims_out_2, None), - # (aims_out_3, None), - # (aims_out_4, None), - # (aims_out_7, None), - # ], - # ) - # def get_all_ks_eigenvalues_test(aims_out, expected): - # assert aims_out.get_all_ks_eigenvalues() == expected + # TODO Setup YAML files for storing the expected values for the following tests + # def test_get_all_ks_eigenvalues(self): - # @pytest.mark.parametrize( - # "aims_out, expected", - # [ - # (aims_out_1, None), - # (aims_out_2, None), - # (aims_out_3, None), - # (aims_out_4, None), - # (aims_out_7, None), - # ], - # ) - # def get_final_ks_eigenvalues_test(aims_out, expected): - # assert aims_out.get_final_ks_eigenvalues() == expected + # def get_final_ks_eigenvalues_test(self): - # @pytest.mark.parametrize( - # "aims_out, expected", - # [ - # (aims_out_1, None), - # (aims_out_2, None), - # (aims_out_3, None), - # (aims_out_4, None), - # (aims_out_7, None), - # ], - # ) - # def get_pert_soc_ks_eigenvalues_test(aims_out, expected): - # assert aims_out.get_pert_soc_ks_eigenvalues() == expected + # def get_pert_soc_ks_eigenvalues_test(self): From 433f34fe75870ece90a36db4c035ef400e250b7f Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 28 Oct 2024 20:11:48 +0000 Subject: [PATCH 08/11] Reorganised parsers --- dfttools/base_parser.py | 22 +++++++++++++ dfttools/output.py | 41 ++++++++++-------------- dfttools/parameters.py | 69 ++++++++++++++++++----------------------- 3 files changed, 69 insertions(+), 63 deletions(-) diff --git a/dfttools/base_parser.py b/dfttools/base_parser.py index fd33ed1..d7a044d 100644 --- a/dfttools/base_parser.py +++ b/dfttools/base_parser.py @@ -39,3 +39,25 @@ def __init__(self, supported_files, **kwargs): else: with open(kwargs[kwarg], "r") as f: self.file_contents[kwarg] = f.readlines() + + def __str__(self) -> str: + if self.lines is None or self.lines == "": + raise ValueError("Could not find file contents.") + else: + return "".join(self.lines) + + @property + def lines(self) -> List[str]: + return self._lines + + @lines.setter + def lines(self, value: List[str]): + self._lines = value + + @property + def path(self) -> str: + return self._path + + @path.setter + def path(self, value: str): + self._path = value diff --git a/dfttools/output.py b/dfttools/output.py index 4184377..c1d64cd 100644 --- a/dfttools/output.py +++ b/dfttools/output.py @@ -23,8 +23,8 @@ class Output(BaseParser): Attributes ---------- - supported_files - lines + supported_files : List[str] + List of supported file types. Examples -------- @@ -34,26 +34,19 @@ def __init__(self, aims_out: str = "aims.out"): self.lines = self._file_contents["aims_out"] """ - # FHI-aims, ELSI, ... - _supported_files = ["aims_out", "elsi_out"] - def __init__(self, **kwargs: str): - super().__init__(self._supported_files, **kwargs) + # FHI-aims, ELSI, ... + self._supported_files = ["aims_out", "elsi_out"] + # Check that only supported files were provided for val in kwargs.keys(): fu.check_required_files(self._supported_files, val) - @property - def supported_files(self): - return self._supported_files + super().__init__(self._supported_files, **kwargs) @property - def lines(self): - return self._lines - - @lines.setter - def lines(self, value): - self._lines = value + def supported_files(self) -> List[str]: + return self._supported_files class AimsOutput(Output): @@ -64,24 +57,24 @@ class AimsOutput(Output): Attributes ---------- - lines - aims_out : str - The path to the aims.out file + lines : List[str] + The contents of the aims.out file. + path : str + The path to the aims.out file. + + Examples + -------- + >>> ao = AimsOutput(aims_out="./aims.out") """ def __init__(self, aims_out: str = "aims.out"): super().__init__(aims_out=aims_out) self.lines = self.file_contents["aims_out"] + self.path = self.file_paths["aims_out"] # Check if the aims.out file was provided fu.check_required_files(self._supported_files, "aims_out") - # Enforce the the first file parsed in self.file_paths is the aims.out file - if list(self.file_paths.keys())[0] != "aims_out": - raise ValueError("The aims.out file must be the first file provided.") - - self.aims_out_path = self.file_paths["aims_out"] - def get_number_of_atoms(self) -> int: """ Return number of atoms in unit cell diff --git a/dfttools/parameters.py b/dfttools/parameters.py index a8571d3..f4cec96 100644 --- a/dfttools/parameters.py +++ b/dfttools/parameters.py @@ -8,67 +8,58 @@ class Parameters(BaseParser): """ Handle files that control parameters for electronic structure calculations. - Parameters + If contributing a new parser, please subclass this class, add the new supported file + type to _supported_files, call the super().__init__ method, include the new file + type as a kwarg in the super().__init__ call. Optionally include the self.lines line + in examples. + + ... + + Attributes ---------- _supported_files : list List of supported file types. - file_paths : dict - The paths to the files to be parsed. - file_contents : dict - The contents of the files to be parsed. """ - # FHI-aims, ... - _supported_files = ["control_in"] - - def __init__(self, **kwargs): - super().__init__(self._supported_files, **kwargs) + def __init__(self, **kwargs: str): + # FHI-aims, ... + self._supported_files = ["control_in"] + # Check that only supported files were provided for val in kwargs.keys(): fu.check_required_files(self._supported_files, val) - @property - def supported_files(self): - return self._supported_files - - @property - def lines(self): - return self._lines - - @lines.setter - def lines(self, lines: List[str]): - self._lines = lines + super().__init__(self._supported_files, **kwargs) @property - def path(self): - return self._file_path - - @path.setter - def path(self, file_path: str): - self._file_path = file_path + def supported_files(self) -> List[str]: + return self._supported_files class AimsControl(Parameters): """ FHI-aims control file parser. + ... + Attributes ---------- - lines - _supported_files : list - List of supported file types. - file_paths : dict - The paths to the files to be parsed. - file_contents : dict - The contents of the files to be parsed. + lines : List[str] + The contents of the control.in file. + path : str + The path to the control.in file. """ - def __init__(self, control_in: str = "control.in") -> None: - super().__init__(control_in=control_in) - self.lines = self.file_contents["control_in"] - self.path = self.file_paths["control_in"] + def __init__(self, control_in: str = "control.in", parse_file: bool = True): + if parse_file: + super().__init__(control_in=control_in) + self.lines = self.file_contents["control_in"] + self.path = self.file_paths["control_in"] + + # Check if the control.in file was provided + fu.check_required_files(self._supported_files, "control_in") - def add_control_keywords(self, **kwargs: dict) -> None: + def add_keywords(self, **kwargs: dict) -> None: """ Add keywords to the control.in file. From a36389558442cd07e7cb432cc8b8fc4fb02591e8 Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 28 Oct 2024 20:15:26 +0000 Subject: [PATCH 09/11] Changes to accommodate tests --- dfttools/base_parser.py | 1 + dfttools/output.py | 80 +++++++++-------- dfttools/parameters.py | 28 +++++- dfttools/utils/exceptions.py | 5 ++ tests/test_output.py | 161 +++-------------------------------- tests/test_references.yaml | 87 +++++++++++++++++++ 6 files changed, 178 insertions(+), 184 deletions(-) create mode 100644 dfttools/utils/exceptions.py create mode 100644 tests/test_references.yaml diff --git a/dfttools/base_parser.py b/dfttools/base_parser.py index d7a044d..38332f6 100644 --- a/dfttools/base_parser.py +++ b/dfttools/base_parser.py @@ -1,4 +1,5 @@ import os.path +from typing import List class BaseParser: diff --git a/dfttools/output.py b/dfttools/output.py index c1d64cd..1742750 100644 --- a/dfttools/output.py +++ b/dfttools/output.py @@ -1,5 +1,5 @@ import warnings -from typing import Tuple, Union +from typing import List, Tuple, Union import numpy as np import numpy.typing as npt @@ -8,6 +8,8 @@ import dfttools.utils.file_utils as fu from dfttools.base_parser import BaseParser from dfttools.geometry import AimsGeometry +from dfttools.parameters import AimsControl +from dfttools.utils.exceptions import ItemNotFoundError class Output(BaseParser): @@ -95,44 +97,45 @@ def get_number_of_atoms(self) -> int: return n_atoms - def get_geometry(self): + def get_geometry(self) -> AimsGeometry: """ - Extract the geometry file from the aims output and return it as a - Geometry object + Extract the geometry file from the aims output and return it as a Geometry + object Returns ------- - Geometry + AimsGeometry Geometry object """ + geometry_lines = [] - geometry_file_reached = False for l in self.lines: if ( "Parsing geometry.in (first pass over file, find array dimensions only)." in l ): - geometry_file_reached = True - if geometry_file_reached: geometry_lines.append(l) + if "Completed first pass over input file geometry.in ." in l: break + geometry_text = "\n".join(geometry_lines[6:-3]) geometry = AimsGeometry() geometry.parse(geometry_text) return geometry - def get_parameters(self) -> str: + def get_parameters(self) -> AimsControl: """ - Extract the control file from the aims output and return it as a - parameters object + Extract the control file from the aims output and return it as an AimsControl + object Returns ------- - str - The control file as a string + AimsControl + AimsControl object """ + control_lines = [] control_file_reached = False for l in self.lines: @@ -141,14 +144,18 @@ def get_parameters(self) -> str: in l ): control_file_reached = True + if control_file_reached: control_lines.append(l) + if "Completed first pass over input file control.in ." in l: break - control_text = "\n".join(control_lines[6:-3]) + ac = AimsControl(parse_file=False) + ac.lines = control_lines[6:-3] + ac.path = None - return control_text + return ac def check_exit_normal(self) -> bool: """ @@ -195,31 +202,31 @@ def get_time_per_scf(self) -> npt.NDArray[np.float64]: ############################################################################### def _get_energy( self, - n_occurrence, - search_string, - token_nr=None, - energy_invalid_indicator=None, - energy_valid_indicator=None, + n_occurrence: Union[int, None], + search_string: str, + token_nr: Union[int, None] = None, + energy_invalid_indicator: Union[list, int, str, None] = None, + energy_valid_indicator: Union[list, int, str, None] = None, ) -> Union[float, npt.NDArray[np.float64]]: """ Generalized energy parser Parameters ---------- - n_occurrence : int or None + n_occurrence : Union[int, None] If there are multiple energies in a file (e.g. during a geometry optimization) this parameters allows to select which energy is returned. If set to -1 the last one is returned (e.g. result of a geometry optimization), if set to None, all values will be returned as a numpy array. search_string : str string to be searched in the output file - token_nr : int + token_nr : Union[int, None] take n-th element of found line - energy_invalid_indicator + energy_invalid_indicator : Union[list, int, str, None] = None In some cases an energy value can be found in the output file although it is invalid -> ignore this value example: a line having 'restarting mixer to attempt better convergence' indicates that this scf-cycle leads to invalid energies - param energy_valid_indicator + param energy_valid_indicator : Union[list, int, str, None] = None In some cases the value is only valid after a certain phrase is used -> ignore all values before example: The post-SCF vdW energy correction is 0.00 until the SCF is converged. @@ -238,20 +245,17 @@ def _get_energy( "AIMSOutput._get_energy: usage of skip_next_energy and " "use_next_energy at the same function call is undefined!" ) - # energy (in)valid indicator allows now for multiple values, if a list is provided. Otherwise, verything works out as before. + # energy (in)valid indicator allows now for multiple values, if a list is + # provided. Otherwise, everything works out as before. if energy_valid_indicator is not None and not isinstance( energy_valid_indicator, list ): - energy_valid_indicator = [ - energy_valid_indicator, - ] + energy_valid_indicator = [energy_valid_indicator] if energy_invalid_indicator is not None and not isinstance( energy_invalid_indicator, list ): - energy_invalid_indicator = [ - energy_invalid_indicator, - ] + energy_invalid_indicator = [energy_invalid_indicator] energies = [] @@ -291,7 +295,7 @@ def _get_energy( return energies[n_occurrence] def get_change_of_total_energy( - self, n_occurrence=-1, energy_invalid_indicator=None + self, n_occurrence: Union[int, None] = -1, energy_invalid_indicator=None ) -> Union[float, npt.NDArray[np.float64]]: return self._get_energy( n_occurrence, @@ -659,7 +663,7 @@ def get_forces( all_force_values.append(np.array(force_values)) if len(all_force_values) == 0: - raise ValueError(f"Forces not found in {self.aims_out_path} file") + raise ValueError(f"Forces not found in {self.path} file") if n_occurrence is None: return np.array(all_force_values) @@ -968,7 +972,8 @@ def _get_ks_states(self, ev_start, eigenvalues, scf_iter, n_ks_states): # return eigenvalues def get_all_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: - """Get all Kohn-Sham eigenvalues from a calculation. + """ + Get all Kohn-Sham eigenvalues from a calculation. Returns ------- @@ -990,6 +995,11 @@ def get_all_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: # Check if the calculation was spin polarised spin_polarised = self.check_spin_polarised() + # Check if output_level full was specified in the calculation + required_item = ("output_level", "full") + if required_item not in self.get_parameters().get_keywords().items(): + raise ItemNotFoundError(required_item) + # Get the number of KS states and scf iterations # Add 2 to SCF iters as if output_level full is specified, FHI-aims prints the # KS states once before the SCF starts and once after it finishes @@ -1011,7 +1021,7 @@ def get_all_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: if target_line in line: n += 1 # Get the KS states from this line until the next empty line - self._get_ks_states(i, eigenvalues, n, n_ks_states) + self._get_ks_states(i + 1, eigenvalues, n, n_ks_states) return eigenvalues diff --git a/dfttools/parameters.py b/dfttools/parameters.py index f4cec96..d99d8d4 100644 --- a/dfttools/parameters.py +++ b/dfttools/parameters.py @@ -75,7 +75,7 @@ def add_keywords(self, **kwargs: dict) -> None: # TODO finish this raise NotImplementedError - def remove_control_keywords(self, *args: str) -> None: + def remove_keywords(self, *args: str) -> None: """ Remove keywords from the control.in file. @@ -92,3 +92,29 @@ def remove_control_keywords(self, *args: str) -> None: with open(self.path, "w") as f: f.writelines(self.lines) + + def get_keywords(self) -> dict: + """ + Get the keywords from the control.in file. + + Returns + ------- + dict + A dictionary of the keywords in the control.in file. + """ + + keywords = {} + + for line in self.lines: + spl = line.split() + + if "#" * 80 in line: + break + + if len(spl) > 0 and spl[0] != "#": + if len(spl) == 1: + keywords[spl[0]] = None + else: + keywords[spl[0]] = " ".join(spl[1:]) + + return keywords diff --git a/dfttools/utils/exceptions.py b/dfttools/utils/exceptions.py new file mode 100644 index 0000000..20d8110 --- /dev/null +++ b/dfttools/utils/exceptions.py @@ -0,0 +1,5 @@ +class ItemNotFoundError(Exception): + def __init__(self, item): + self.key = item[0] + self.value = item[1] + super().__init__(f"'{self.key}': '{self.value}' item not found in dictionary") diff --git a/tests/test_output.py b/tests/test_output.py index 21d831d..ffd1b80 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -3,6 +3,7 @@ import numpy as np import pytest +import yaml from dfttools.output import AimsOutput from dfttools.utils.file_utils import aims_bin_path_prompt @@ -31,8 +32,11 @@ def aims_out(self, request, run_aims): aims_out=f"{cwd}/fixtures/{aims_out_dir}/{str(request.param)}/aims.out" ) + with open(f"{cwd}/test_references.yaml", "r") as references: + self.ref_data = yaml.safe_load(references) + # Set class attribute to check in xfail tests - self._run_aims = False if run_aims is False else True + # self._run_aims = False if run_aims is False else True @property def _aims_fixture_no(self) -> int: @@ -56,28 +60,13 @@ def test_check_exit_normal(self): else: assert self.ao.check_exit_normal() is True - # TODO Use yaml files for these expected values def test_get_time_per_scf(self): - # fmt: off - timings = [ - np.array([0.042, 0.045, 0.038, 0.037, 0.036, 0.038, 0.033, 0.036, 0.032, 0.032, 0.031, 0.023]), - np.array([0.033, 0.033, 0.033, 0.034, 0.035, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.036, 0.026]), - np.array([0.033, 0.033, 0.034, 0.034, 0.034, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.037, 0.027]), - np.array([0.649, 0.666, 0.667, 0.666, 0.667, 0.667, 0.667, 0.665, 0.666, 0.326]), - np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.072, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.03, 0.073, 0.028, 0.028, 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.073, 0.028, 0.028, 0.029, 0.028, 0.029, 0.029, 0.072, 0.028, 0.028, 0.028, 0.029, 0.028, 0.072]), - np.array([0.785, 0.801, 0.803, 0.808, 0.802, 0.803, 0.802, 0.802, 0.801, 0.803, 2.276, 9.297, 0.797, 0.79, 0.793, 0.792, 0.794, 2.248, 9.114, 0.797, 0.794, 0.793, 0.793, 0.793, 0.793, 2.248, 9.248]), - np.array([0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.031, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, 0.029, 0.0]), - np.array([0.636, 0.653, 0.652, 0.652, 0.657, 0.65, 0.65, 0.0]), - np.array([0.048, 0.046, 0.046, 0.046, 0.049, 0.047, 0.048, 0.047, 0.047, 0.047, 0.047, 0.047, 0.047, 0.039]), - np.array([34.786, 33.136, 33.081, 33.97, 33.873, 33.9, 33.933, 33.921, 33.945, 33.936, 33.575]), - ] - # fmt: on # Fail if the absolute tolerance between any values in test vs. reference array is # greater than 2e-3 assert np.allclose( self.ao.get_time_per_scf(), - timings[self._aims_fixture_no - 1], + self.ref_data["timings"][self._aims_fixture_no - 1], atol=2e-3, ) @@ -107,30 +96,14 @@ def test_get_change_of_total_energy_1(self): < 1e-8 ) - # TODO Use yaml files for these expected values def test_get_change_of_total_energy_2(self): """Get every energy change""" - # fmt: off - energy_diffs = [ - np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), - np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), - np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, -2081.0, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, -2081.0, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, -2081.0, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, -2081.0, 6.632e-07, 2.993e-07, -2.037e-07, 1.171e-08, -5.833e-09]), - np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -15800.0, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -15800.0, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), - np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, -2081.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, -2081.0, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, -2081.0, 0.0001081, 2.93e-05, 1.509e-05]), - np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), - np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), - np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), - ] - # fmt: on - # Fail if the absolute tolerance between any values in test vs. reference array is # greater than 1e-10 assert np.allclose( self.ao.get_change_of_total_energy(n_occurrence=None), - energy_diffs[self._aims_fixture_no - 1], + self.ref_data["energy_diffs"][self._aims_fixture_no - 1], atol=1e-8, ) @@ -165,24 +138,9 @@ def test_get_change_of_total_energy_3(self): # Use an energy invalid indicator # """ - # # fmt: off - # all_energies = [ - # np.array([0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08]), - # np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - # np.array([0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09]), - # np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, -3.046e-06, -1.492e-07]), - # np.array([0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, -2.988e-08, 1.168e-07, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, -6.659e-09, -3.078e-10, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, 6.632e-07, 2.993e-07,-2.037e-07, 1.171e-08, -5.833e-09]), - # np.array([0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -5.771e-06, -2.262e-05, -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09]), - # np.array([0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, 0.0, 0.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, 0.0001081, 2.93e-05, 1.509e-05]), - # np.array([0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144]), - # np.array([-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06]), - # np.array([-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06]), - # ] - # # fmt: on - # assert np.allclose( # self.ao.get_change_of_total_energy(n_occurrence=1), - # all_energies[self.aims_fixture_no(self.ao) - 1], + # self.ref_data['all_energies'][self.aims_fixture_no(self.ao) - 1], # atol=1e-10, # ) @@ -253,104 +211,11 @@ def test_check_spin_polarised(self): else: assert self.ao.check_spin_polarised() is False - # TODO Use yaml files for these expected values - # @pytest.mark.parametrize( - # "aims_out, expected", - # [ - # ( - # aims_out_1, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_2, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_3, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_4, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_5, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_6, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_7, - # { - # "charge_density": 1e-10, - # "sum_eigenvalues": 1e-06, - # "total_energy": 1e-12, - # "total_force": 1e-08, - # }, - # ), - # ( - # aims_out_8, - # { - # "charge_density": 1e-10, - # "sum_eigenvalues": 1e-06, - # "total_energy": 1e-12, - # "total_force": 1e-08, - # }, - # ), - # ( - # aims_out_9, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ( - # aims_out_10, - # { - # "charge_density": 0.0, - # "sum_eigenvalues": 0.0, - # "total_energy": 0.0, - # "total_force": 0.0, - # }, - # ), - # ], - # ) - # def test_get_conv_params(aims_out, expected): - # assert self.ao.get_conv_params() == expected + def test_get_conv_params(self): + if self._aims_fixture_no in [7, 8]: + assert self.ao.get_conv_params() == self.ref_data["conv_params"][1] + else: + assert self.ao.get_conv_params() == self.ref_data["conv_params"][0] def test_get_final_energy(self): final_energies = [ diff --git a/tests/test_references.yaml b/tests/test_references.yaml new file mode 100644 index 0000000..5e54960 --- /dev/null +++ b/tests/test_references.yaml @@ -0,0 +1,87 @@ +all_energies: +- [0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, + -3.721e-07, 3.822e-07, 1.599e-08] +- [0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, + -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09] +- [0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, + -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09] +- [0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, + -3.046e-06, -1.492e-07] +- [0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, + -2.988e-08, 1.168e-07, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, -1.626e-07, + -6.659e-09, -3.078e-10, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, -7.184e-07, -3.316e-07, + -9.563e-09, 3.674e-11, 3.323e-05, 9.511e-06, -1.416e-06, 1.403e-07, -3.84e-07, -1.012e-09, + 6.632e-07, 2.993e-07, -2.037e-07, 1.171e-08, -5.833e-09] +- [0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, + -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -5.771e-06, -2.262e-05, -6.403e-06, + -1.75e-07, -2.497e-08, -4.832e-09, -9.886e-06, -4.329e-05, -1.378e-05, -1.58e-07, + -1.163e-07, -4.241e-08, 3.703e-09] +- [0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, + -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, + 0.0, 0.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, 1.538e-08, + 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, + 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, -2.514e-11, + -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, -3.867e-13, + 0.0001081, 2.93e-05, 1.509e-05] +- [0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144] +- [-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, + 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06] +- [-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, + 0.001141, 7.119e-06] +conv_params: +- {charge_density: 0.0, sum_eigenvalues: 0.0, total_energy: 0.0, total_force: 0.0} +- {charge_density: 1.0e-10, sum_eigenvalues: 1.0e-06, total_energy: 1.0e-12, total_force: 1.0e-08} +energy_diffs: +- [0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, + -3.721e-07, 3.822e-07, 1.599e-08] +- [0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, + -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09] +- [0.2611, -0.1508, -0.8718, 0.2303, 0.05782, -0.001582, 0.0006921, -0.0002017, 8.818e-05, + -7.301e-06, -1.198e-06, -5.717e-09, 1.611e-09] +- [0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144, 1.971e-05, + -3.046e-06, -1.492e-07] +- [0.4426, 1.277, -0.3396, 0.453, -0.001744, 0.01792, 0.0002052, 8.435e-06, 1.013e-06, + -2.988e-08, 1.168e-07, -2081.0, 0.002236, 0.0004654, 1.558e-05, 5.188e-09, -8.163e-07, + -1.626e-07, -6.659e-09, -3.078e-10, -2081.0, 0.00177, 0.0003977, 2.452e-05, 3.896e-07, + -7.184e-07, -3.316e-07, -9.563e-09, 3.674e-11, -2081.0, 3.323e-05, 9.511e-06, -1.416e-06, + 1.403e-07, -3.84e-07, -1.012e-09, -2081.0, 6.632e-07, 2.993e-07, -2.037e-07, 1.171e-08, + -5.833e-09] +- [0.01644, 0.1063, 0.006359, 0.002794, 0.0001406, 2.873e-05, 5.028e-06, 4.511e-06, + -8.154e-07, -3.882e-08, -2.815e-10, 6.156e-10, -15800.0, -5.771e-06, -2.262e-05, + -6.403e-06, -1.75e-07, -2.497e-08, -4.832e-09, -15800.0, -9.886e-06, -4.329e-05, + -1.378e-05, -1.58e-07, -1.163e-07, -4.241e-08, 3.703e-09] +- [0.4295, 1.19, -0.3077, 0.4194, 0.004835, 0.01161, 0.001319, -2.423e-05, 2.34e-05, + -7.693e-09, 1.223e-07, -8.323e-09, 4.424e-10, 2.738e-10, 1.856e-11, 2.32e-12, 7.734e-13, + 0.0, 0.0, -2081.0, 0.00942, 0.002121, 0.0002073, 1.587e-05, -7.203e-07, -1.062e-06, + 1.538e-08, 1.902e-09, -1.001e-09, -1.868e-10, 8.082e-11, -3.867e-12, 0.0, 0.0, -3.867e-13, + -2081.0, 0.004698, 0.001127, 8.39e-05, 7.677e-06, -7.438e-07, -8.215e-07, 9.776e-09, + -2.514e-11, -2.224e-10, -8.314e-11, 2.243e-11, -3.48e-12, -3.867e-13, 3.867e-13, + -3.867e-13, -2081.0, 0.0001081, 2.93e-05, 1.509e-05] +- [0.1202, 0.871, 0.02343, 0.005611, -0.0003911, 0.0002121, -0.0001144] +- [-0.03058, -5.561, 6.612, 0.601, 0.1137, 0.0394, 0.03515, 0.006006, -0.0006064, + 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06] +- [-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, + 0.001141, 7.119e-06] +timings: +- [0.042, 0.045, 0.038, 0.037, 0.036, 0.038, 0.033, 0.036, 0.032, 0.032, 0.031, 0.023] +- [0.033, 0.033, 0.033, 0.034, 0.035, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.036, + 0.026] +- [0.033, 0.033, 0.034, 0.034, 0.034, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.037, + 0.027] +- [0.649, 0.666, 0.667, 0.666, 0.667, 0.667, 0.667, 0.665, 0.666, 0.326] +- [0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.072, 0.028, + 0.028, 0.028, 0.028, 0.029, 0.029, 0.03, 0.03, 0.073, 0.028, 0.028, 0.028, 0.028, + 0.028, 0.029, 0.029, 0.03, 0.073, 0.028, 0.028, 0.029, 0.028, 0.029, 0.029, 0.072, + 0.028, 0.028, 0.028, 0.029, 0.028, 0.072] +- [0.785, 0.801, 0.803, 0.808, 0.802, 0.803, 0.802, 0.802, 0.801, 0.803, 2.276, 9.297, + 0.797, 0.79, 0.793, 0.792, 0.794, 2.248, 9.114, 0.797, 0.794, 0.793, 0.793, 0.793, + 0.793, 2.248, 9.248] +- [0.028, 0.028, 0.029, 0.029, 0.029, 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, + 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.029, 0.029, 0.029, 0.029, + 0.029, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, 0.028, 0.028, 0.028, + 0.029, 0.029, 0.029, 0.029, 0.029, 0.031, 0.03, 0.03, 0.03, 0.03, 0.03, 0.073, 0.073, + 0.028, 0.028, 0.028, 0.029, 0.0] +- [0.636, 0.653, 0.652, 0.652, 0.657, 0.65, 0.65, 0.0] +- [0.048, 0.046, 0.046, 0.046, 0.049, 0.047, 0.048, 0.047, 0.047, 0.047, 0.047, 0.047, + 0.047, 0.039] +- [34.786, 33.136, 33.081, 33.97, 33.873, 33.9, 33.933, 33.921, 33.945, 33.936, 33.575] From 4b2783e4199774ce63910287b472f270b62fd3fb Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 29 Oct 2024 17:56:32 +0000 Subject: [PATCH 10/11] Added more tests for printing KS eigenvalues --- dfttools/output.py | 25 +- .../fixtures/default_aims_calcs/1/control.in | 1 + .../fixtures/default_aims_calcs/2/control.in | 1 + .../fixtures/default_aims_calcs/3/control.in | 1 + tests/test_output.py | 75 +++--- tests/test_references.yaml | 216 ++++++++++++++++++ 6 files changed, 264 insertions(+), 55 deletions(-) diff --git a/dfttools/output.py b/dfttools/output.py index 1742750..39a3a58 100644 --- a/dfttools/output.py +++ b/dfttools/output.py @@ -969,8 +969,6 @@ def _get_ks_states(self, ev_start, eigenvalues, scf_iter, n_ks_states): eigenvalues["occupation"][scf_iter][i] = float(values[1]) eigenvalues["eigenvalue_eV"][scf_iter][i] = float(values[3]) - # return eigenvalues - def get_all_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: """ Get all Kohn-Sham eigenvalues from a calculation. @@ -988,8 +986,10 @@ def get_all_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: Raises ------ + ItemNotFoundError + the 'output_level full' keyword was not found in the calculation ValueError - the calculation was not spin polarised + could not determine if the calculation was spin polarised """ # Check if the calculation was spin polarised @@ -1019,9 +1019,9 @@ def get_all_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: n = 0 # Count the current SCF iteration for i, line in enumerate(self.lines): if target_line in line: - n += 1 # Get the KS states from this line until the next empty line self._get_ks_states(i + 1, eigenvalues, n, n_ks_states) + n += 1 return eigenvalues @@ -1083,6 +1083,8 @@ def get_final_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: ------ ValueError the calculation was not spin polarised + ValueError + the final KS states were not found in aims.out file """ # Check if the calculation was spin polarised @@ -1095,11 +1097,15 @@ def get_final_ks_eigenvalues(self) -> Union[dict, Tuple[dict, dict]]: target_line = "State Occupation Eigenvalue [Ha] Eigenvalue [eV]" # Iterate backwards from end of aims.out to find the final KS eigenvalues + final_ev_start = None for i, line in enumerate(reversed(self.lines)): if target_line == line.strip(): final_ev_start = -i break + if final_ev_start is None: + raise ValueError("Final KS states not found in aims.out file.") + if not spin_polarised: eigenvalues = { "state": np.zeros((1, n_ks_states), dtype=int), @@ -1143,6 +1149,11 @@ def get_pert_soc_ks_eigenvalues(self) -> dict: ------- dict The perturbative SOC kohn-sham eigenvalues + + Raises + ------ + ValueError + the final KS states were not found in aims.out file """ # Get the number of KS states @@ -1153,15 +1164,17 @@ def get_pert_soc_ks_eigenvalues(self) -> dict: " Eigenvalue [eV] Level Spacing [eV]" ) - print(target_line) - # Iterate backwards from end of aims.out to find the perturbative SOC # eigenvalues + final_ev_start = None for i, line in enumerate(reversed(self.lines)): if target_line == line.strip(): final_ev_start = -i break + if final_ev_start is None: + raise ValueError("Final KS states not found in aims.out file.") + eigenvalues = { "state": np.zeros(n_ks_states, dtype=int), "occupation": np.zeros(n_ks_states, dtype=float), diff --git a/tests/fixtures/default_aims_calcs/1/control.in b/tests/fixtures/default_aims_calcs/1/control.in index b96e17e..1c3266b 100644 --- a/tests/fixtures/default_aims_calcs/1/control.in +++ b/tests/fixtures/default_aims_calcs/1/control.in @@ -1,4 +1,5 @@ xc pbe +output_level full ################################################################################ # # FHI-aims code project diff --git a/tests/fixtures/default_aims_calcs/2/control.in b/tests/fixtures/default_aims_calcs/2/control.in index 2273b45..0695f35 100644 --- a/tests/fixtures/default_aims_calcs/2/control.in +++ b/tests/fixtures/default_aims_calcs/2/control.in @@ -1,6 +1,7 @@ xc pbe spin collinear default_initial_moment 1 +output_level full ################################################################################ # # FHI-aims code project diff --git a/tests/fixtures/default_aims_calcs/3/control.in b/tests/fixtures/default_aims_calcs/3/control.in index c74ad4a..67eeabc 100644 --- a/tests/fixtures/default_aims_calcs/3/control.in +++ b/tests/fixtures/default_aims_calcs/3/control.in @@ -2,6 +2,7 @@ xc pbe spin collinear default_initial_moment 1 include_spin_orbit non_self_consistent +output_level full ################################################################################ # # FHI-aims code project diff --git a/tests/test_output.py b/tests/test_output.py index ffd1b80..3b2e10a 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -35,9 +35,6 @@ def aims_out(self, request, run_aims): with open(f"{cwd}/test_references.yaml", "r") as references: self.ref_data = yaml.safe_load(references) - # Set class attribute to check in xfail tests - # self._run_aims = False if run_aims is False else True - @property def _aims_fixture_no(self) -> int: return int(self.ao.aims_out_path.split("/")[-2]) @@ -161,49 +158,8 @@ def test_get_change_of_forces(self): with pytest.raises(ValueError): self.ao.get_change_of_forces() - def get_change_of_sum_of_eigenvalues(self): - pass - - # TODO: currently a palceholder - # def test_all_output_functions(self_9):, # aims = aims_out_9 - - # aims.get_geometry() - # aims.get_parameters() - # aims.check_exit_normal() - # aims.get_change_of_total_energy() - # # aims.get_change_of_forces() - # aims.get_change_of_sum_of_eigenvalues() - # # aims.get_maximum_force() - # aims.get_final_energy() - # aims.get_energy_corrected() - # aims.get_total_energy_T0() - # aims.get_energy_uncorrected() - # # aims.get_energy_without_vdw() - # aims.get_HOMO_energy() - # aims.get_LUMO_energy() - # # aims.get_vdw_energy() - # aims.get_exchange_correlation_energy() - # aims.get_electrostatic_energy() - # aims.get_kinetic_energy() - # aims.get_sum_of_eigenvalues() - # aims.get_cx_potential_correction() - # aims.get_free_atom_electrostatic_energy() - # aims.get_entropy_correction() - # aims.get_hartree_energy_correction() - # # aims.get_ionic_embedding_energy() - # # aims.get_density_embedding_energy() - # # aims.get_nonlocal_embedding_energy() - # # aims.get_external_embedding_energy() - # # aims.get_forces() - # aims.check_spin_polarised() - # aims.get_conv_params() - # aims.get_n_relaxation_steps() - # aims.get_n_scf_iters() - # aims.get_i_scf_conv_acc() - # aims.get_n_initial_ks_states() - # # aims.get_all_ks_eigenvalues()# -> functionality does not work - # aims.get_final_ks_eigenvalues() - # # aims.get_pert_soc_ks_eigenvalues()# -> not great but may work if that output is there + # TODO + # def get_change_of_sum_of_eigenvalues(self): def test_check_spin_polarised(self): if self._aims_fixture_no in [2, 3]: @@ -268,9 +224,30 @@ def compare_n_initial_ks_states(): with pytest.warns(UserWarning): compare_n_initial_ks_states() - # TODO Setup YAML files for storing the expected values for the following tests - # def test_get_all_ks_eigenvalues(self): + def test_get_all_ks_eigenvalues(self): + if self._aims_fixture_no == 1: + assert self.ao.get_all_ks_eigenvalues() == self.ref_data["eigenvalues"] + elif self._aims_fixture_no == 2: + spin_up, spin_down = self.ao.get_all_ks_eigenvalues() + assert spin_up == self.ref_data["su_eigenvalues"] + assert spin_down == self.ref_data["sd_eigenvalues"] + else: + with pytest.raises(ValueError): + self.ao.get_all_ks_eigenvalues() + # TODO # def get_final_ks_eigenvalues_test(self): - # def get_pert_soc_ks_eigenvalues_test(self): + def test_get_pert_soc_ks_eigenvalues(self): + if self._aims_fixture_no == 3: + assert ( + self.ao.get_pert_soc_ks_eigenvalues() + == self.ref_data["pert_soc_eigenvalues"] + ) + else: + with pytest.raises(ValueError): + self.ao.get_pert_soc_ks_eigenvalues() + + +# TODO +# class TestELSIOutput: diff --git a/tests/test_references.yaml b/tests/test_references.yaml index 5e54960..2f31d67 100644 --- a/tests/test_references.yaml +++ b/tests/test_references.yaml @@ -31,6 +31,66 @@ all_energies: conv_params: - {charge_density: 0.0, sum_eigenvalues: 0.0, total_energy: 0.0, total_force: 0.0} - {charge_density: 1.0e-10, sum_eigenvalues: 1.0e-06, total_energy: 1.0e-12, total_force: 1.0e-08} +eigenvalues: + eigenvalue_eV: + - [-517.86899, -29.76884, -16.97123, -13.81016, -11.83018, -1.35898, 0.86956, 5.87767, + 6.78809, 8.24353, 13.76122] + - [-516.80985, -29.25115, -16.5258, -13.28054, -11.27807, -1.23398, 1.0433, 6.10722, + 7.0287, 8.40693, 13.91174] + - [-510.781, -26.29177, -14.04123, -10.29043, -8.16828, -0.4706, 2.11215, 7.52221, + 8.53643, 9.3769, 14.83419] + - [-514.79495, -27.52028, -15.02285, -11.51816, -9.45562, -0.69193, 1.73433, 6.94484, + 7.86959, 9.13777, 14.63923] + - [-511.97296, -25.69845, -13.46772, -9.69448, -7.57379, -0.12274, 2.49243, 7.8492, + 8.81138, 9.84746, 15.38738] + - [-511.90237, -25.65042, -13.42673, -9.65082, -7.5282, -0.10606, 2.51358, 7.87239, + 8.8366, 9.8654, 15.41017] + - [-511.52712, -25.36531, -13.18178, -9.38784, -7.25574, -0.00172, 2.64489, 8.01435, + 8.98817, 9.98027, 15.55281] + - [-511.28761, -25.19278, -13.03354, -9.22252, -7.08779, 0.06091, 2.72469, 8.10566, + 9.0845, 10.05204, 15.63608] + - [-511.25438, -25.1656, -13.01025, -9.19703, -7.0615, 0.07136, 2.73763, 8.12002, + 9.09975, 10.06376, 15.65003] + - [-511.26147, -25.17353, -13.01731, -9.20432, -7.06878, 0.068, 2.73354, 8.11585, + 9.09547, 10.06007, 15.64531] + - [-511.26286, -25.17444, -13.01808, -9.20523, -7.0697, 0.06768, 2.73313, 8.11534, + 9.09494, 10.05969, 15.64492] + - [-511.26229, -25.17407, -13.01776, -9.20486, -7.06933, 0.06781, 2.7333, 8.11554, + 9.09515, 10.05984, 15.64509] + - [-511.26229, -25.17408, -13.01777, -9.20487, -7.06934, 0.06781, 2.73329, 8.11554, + 9.09515, 10.05984, 15.64508] + - [-511.26229, -25.17408, -13.01777, -9.20487, -7.06934, 0.06781, 2.73329, 8.11554, + 9.09515, 10.05984, 15.64508] + occupation: + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + state: + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] energy_diffs: - [0.4663, 1.408, -0.4107, 0.5095, 0.004077, 0.01574, 0.003194, 2.061e-05, 7.458e-06, -3.721e-07, 3.822e-07, 1.599e-08] @@ -62,6 +122,162 @@ energy_diffs: 0.01499, -0.002865, 0.0002206, 7.186e-05, 6.018e-06] - [-2.158, -0.07087, 0.04834, 0.1184, -0.003943, 0.0103, -0.001032, 0.004801, 0.002519, 0.001141, 7.119e-06] +pert_soc_eigenvalues: + eigenvalue_eV: [-511.262291, -511.262291, -25.174078, -25.174077, -13.017798, -13.017797, + -9.204901, -9.2049, -7.069313, -7.069308, 0.067805, 0.067807, 2.733286, 2.733288, + 8.11545, 8.115453, 9.095212, 9.095215, 10.059874, 10.059877, 15.645085, 15.645085, + 21.072085, 21.072085, 24.079014, 24.079016, 26.219576, 26.219577, 30.403992, 30.403994, + 31.362158, 31.362159, 41.232863, 41.232865, 52.742833, 52.742835, 55.352395, 55.352395, + 62.232037, 62.23204, 65.196308, 65.196311, 65.664698, 65.6647, 78.988497, 78.988497, + 87.540326, 87.540326] + level_spacing_eV: [0.0, 0.0, 486.088213, 1.0e-06, 12.156279, 1.0e-06, 3.812896, + 2.0e-06, 2.135587, 5.0e-06, 7.137113, 2.0e-06, 2.665478, 2.0e-06, 5.382162, 2.0e-06, + 0.979759, 3.0e-06, 0.96466, 3.0e-06, 5.585208, 0.0, 5.427, 0.0, 3.006929, 2.0e-06, + 2.14056, 1.0e-06, 4.184415, 2.0e-06, 0.958164, 1.0e-06, 9.870704, 1.0e-06, 11.509968, + 2.0e-06, 2.609559, 0.0, 6.879642, 2.0e-06, 2.964268, 3.0e-06, 0.468387, 1.0e-06, + 13.323797, 0.0, 8.551829, 0.0] + occupation: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0] + state: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48] + unperturbed_eigenvalue_eV: [-511.262291, -511.262291, -25.174077, -25.174076, -13.017766, + -13.017765, -9.204869, -9.204868, -7.069342, -7.069337, 0.067807, 0.067809, 2.733291, + 2.733293, 8.115536, 8.115538, 9.095146, 9.095149, 10.059839, 10.059842, 15.645084, + 15.645085, 21.072073, 21.072073, 24.079012, 24.079015, 26.219576, 26.219577, 30.403992, + 30.403994, 31.362156, 31.362157, 41.232863, 41.232865, 52.742834, 52.742836, 55.352393, + 55.352393, 62.232042, 62.232045, 65.196308, 65.196311, 65.664693, 65.664694, 78.988493, + 78.988494, 87.54032, 87.54032] +sd_eigenvalues: + eigenvalue_eV: + - [-516.99626, -27.6931, -14.43195, -12.05831, -10.37048, 0.54454, 3.43369, 6.78259, + 7.62782, 9.45321, 17.73824] + - [-515.94456, -27.27757, -14.10768, -11.61468, -9.88909, 0.55882, 3.45285, 6.97129, + 7.83592, 9.55327, 17.62883] + - [-507.94087, -24.15203, -11.8137, -8.30806, -6.32908, 0.75431, 3.78614, 8.58317, + 9.63008, 10.37983, 17.12936] + - [-514.85453, -27.07332, -14.41899, -11.13836, -9.14838, -0.18978, 2.39589, 7.14015, + 8.04582, 9.44033, 15.60993] + - [-512.5688, -26.10328, -13.78916, -10.04339, -7.93146, -0.2342, 2.3602, 7.66115, + 8.61457, 9.71372, 15.31425] + - [-511.26244, -25.38186, -13.19142, -9.38371, -7.24212, -0.01559, 2.64569, 8.00287, + 8.99045, 9.9534, 15.5731] + - [-511.15924, -25.11325, -12.95825, -9.18235, -7.03228, 0.10724, 2.77874, 8.12604, + 9.11702, 10.07496, 15.71941] + - [-511.28912, -25.21204, -13.04425, -9.23609, -7.10317, 0.05965, 2.72535, 8.09718, + 9.07655, 10.04709, 15.64491] + - [-511.22391, -25.14004, -12.98471, -9.17045, -7.03788, 0.0853, 2.75512, 8.13622, + 9.11521, 10.07899, 15.66936] + - [-511.26214, -25.17764, -13.02074, -9.20712, -7.07152, 0.0665, 2.73197, 8.1143, + 9.09395, 10.05859, 15.64405] + - [-511.25631, -25.17128, -13.01534, -9.20186, -7.06621, 0.06892, 2.73477, 8.11731, + 9.09705, 10.06116, 15.64673] + - [-511.26221, -25.17401, -13.01772, -9.20486, -7.06931, 0.06782, 2.73331, 8.11552, + 9.09517, 10.05982, 15.64514] + - [-511.26237, -25.17412, -13.01779, -9.20491, -7.06939, 0.0678, 2.73329, 8.11551, + 9.09512, 10.05983, 15.6451] + - [-511.26229, -25.17408, -13.01777, -9.20487, -7.06934, 0.06781, 2.73329, 8.11554, + 9.09515, 10.05984, 15.64508] + - [-511.26229, -25.17408, -13.01777, -9.20487, -7.06934, 0.06781, 2.73329, 8.11554, + 9.09515, 10.05984, 15.64508] + occupation: + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + state: + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +su_eigenvalues: + eigenvalue_eV: + - [-517.6604, -30.45955, -17.83482, -14.48079, -12.38289, -1.9008, 0.15183, 5.59143, + 6.51097, 7.84369, 12.69308] + - [-516.5708, -29.90038, -17.35373, -13.90306, -11.78314, -1.76025, 0.34759, 5.83883, + 6.76864, 8.02295, 12.85688] + - [-508.25758, -25.61589, -13.76957, -9.5498, -7.29267, -0.56021, 2.02599, 7.94853, + 9.01309, 9.47738, 14.27921] + - [-515.04061, -27.91927, -15.51907, -11.86362, -9.75342, -1.02731, 1.2906, 6.79387, + 7.70765, 8.94455, 13.98558] + - [-512.52721, -26.06166, -13.83143, -10.00905, -7.89826, -0.29415, 2.26263, 7.70537, + 8.63645, 9.71449, 15.03124] + - [-511.2305, -25.34407, -13.20809, -9.35607, -7.2142, -0.04552, 2.59472, 8.03466, + 9.00753, 9.95598, 15.4063] + - [-511.14874, -25.10678, -12.96626, -9.1822, -7.03091, 0.08738, 2.754, 8.12292, + 9.11333, 10.06157, 15.67484] + - [-511.2808, -25.20555, -13.0511, -9.23337, -7.09943, 0.04624, 2.70682, 8.09938, + 9.07681, 10.04104, 15.60326] + - [-511.22209, -25.14092, -12.98752, -9.17311, -7.03957, 0.07852, 2.74795, 8.13157, + 9.11191, 10.07222, 15.66337] + - [-511.26094, -25.17668, -13.02176, -9.20657, -7.07064, 0.06474, 2.72946, 8.11479, + 9.09421, 10.05791, 15.638] + - [-511.25569, -25.17078, -13.01565, -9.20163, -7.06577, 0.06808, 2.7337, 8.1173, + 9.09706, 10.06062, 15.6445] + - [-511.26222, -25.17402, -13.01773, -9.20484, -7.06925, 0.06787, 2.73335, 8.11555, + 9.0952, 10.05986, 15.64517] + - [-511.26235, -25.17411, -13.0178, -9.2049, -7.06937, 0.06779, 2.73327, 8.11552, + 9.09513, 10.05982, 15.64505] + - [-511.26229, -25.17408, -13.01777, -9.20487, -7.06934, 0.06781, 2.73329, 8.11554, + 9.09515, 10.05984, 15.64508] + - [-511.26229, -25.17408, -13.01777, -9.20487, -7.06934, 0.06781, 2.73329, 8.11554, + 9.09515, 10.05984, 15.64508] + occupation: + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + state: + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] timings: - [0.042, 0.045, 0.038, 0.037, 0.036, 0.038, 0.033, 0.036, 0.032, 0.032, 0.031, 0.023] - [0.033, 0.033, 0.033, 0.034, 0.035, 0.035, 0.036, 0.036, 0.036, 0.036, 0.036, 0.036, From 713ec041136a7098f8ef2e6fe5a8f654b1c32c3b Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 29 Oct 2024 18:33:43 +0000 Subject: [PATCH 11/11] Added pytest CI --- .github/workflows/{pypi.yml => pypi.yaml} | 0 .../workflows/{pyright.yml => pyright.yaml} | 0 .github/workflows/{pytest.yml => pytest.yaml} | 15 ++++++--- .github/workflows/{ruff.yml => ruff.yaml} | 0 .../{sphinx-docs.yml => sphinx-docs.yaml} | 0 poetry.lock | 33 +++++++++++++++++-- pyproject.toml | 3 +- 7 files changed, 44 insertions(+), 7 deletions(-) rename .github/workflows/{pypi.yml => pypi.yaml} (100%) rename .github/workflows/{pyright.yml => pyright.yaml} (100%) rename .github/workflows/{pytest.yml => pytest.yaml} (58%) rename .github/workflows/{ruff.yml => ruff.yaml} (100%) rename .github/workflows/{sphinx-docs.yml => sphinx-docs.yaml} (100%) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yaml similarity index 100% rename from .github/workflows/pypi.yml rename to .github/workflows/pypi.yaml diff --git a/.github/workflows/pyright.yml b/.github/workflows/pyright.yaml similarity index 100% rename from .github/workflows/pyright.yml rename to .github/workflows/pyright.yaml diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yaml similarity index 58% rename from .github/workflows/pytest.yml rename to .github/workflows/pytest.yaml index 0854f0e..6baf317 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yaml @@ -19,9 +19,9 @@ on: jobs: test: runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.10", "3.11", "3.12"] + # strategy: + # matrix: + # python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 @@ -32,4 +32,11 @@ jobs: - name: Install the project dependencies run: poetry install --with=dev - name: Run the tests - run: pytest tests + run: pytest tests --cov=dfttools --cov-report xml + + # TODO when approved for the maurergroup organisation + # - name: Coveralls GitHub Action + # uses: coverallsapp/github-action@v2.3.4 + # with: + # github-token: ${{ secrets.GITHUB_TOKEN }} + # parallel: true # Enable parallel support for Coveralls if needed diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yaml similarity index 100% rename from .github/workflows/ruff.yml rename to .github/workflows/ruff.yaml diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yaml similarity index 100% rename from .github/workflows/sphinx-docs.yml rename to .github/workflows/sphinx-docs.yaml diff --git a/poetry.lock b/poetry.lock index 9e75089..66e8a44 100644 --- a/poetry.lock +++ b/poetry.lock @@ -389,6 +389,25 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "coveralls" +version = "4.0.1" +description = "Show coverage stats online via coveralls.io" +optional = false +python-versions = "<3.13,>=3.8" +files = [ + {file = "coveralls-4.0.1-py3-none-any.whl", hash = "sha256:7a6b1fa9848332c7b2221afb20f3df90272ac0167060f41b5fe90429b30b1809"}, + {file = "coveralls-4.0.1.tar.gz", hash = "sha256:7b2a0a2bcef94f295e3cf28dcc55ca40b71c77d1c2446b538e85f0f7bc21aa69"}, +] + +[package.dependencies] +coverage = {version = ">=5.0,<6.0.dev0 || >6.1,<6.1.1 || >6.1.1,<8.0", extras = ["toml"]} +docopt = ">=0.6.1,<0.7.0" +requests = ">=1.0.0,<3.0.0" + +[package.extras] +yaml = ["pyyaml (>=3.10,<7.0)"] + [[package]] name = "cycler" version = "0.12.1" @@ -404,6 +423,16 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + [[package]] name = "docutils" version = "0.21.2" @@ -1766,5 +1795,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "5cd240c054a48392de43eb9235a618df03699b13a8f0b2faa6ad03c50bacbd54" +python-versions = "^3.10, <3.13" +content-hash = "d1e9bd2f2a28120fd6f1943985c293074f2b6d9ae9e4e7fabb4adf8f48e554f6" diff --git a/pyproject.toml b/pyproject.toml index 1970534..1357afe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ license = "GPL-3.0" readme = "README.md" [tool.poetry.dependencies] -python = "^3.10" +python = "<=3.10,<3.13" numpy = "^1.26.4" scipy = "^1.13.0" ase = "^3.22.1" @@ -28,6 +28,7 @@ pyright = "^1.1.373" ptpython = "^3.0.26" pytest = "^8.2.0" pytest-cov = "^5.0.0" +coveralls = "^4.0.1" [tool.poetry.group.docs] optional = true