From e6d245e1b6202d3ae3fe458daaf5bf6a704770c3 Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 19 Nov 2024 17:23:57 +0000 Subject: [PATCH 01/11] Started tests for parameters and small reconfigure --- dfttoolkit/utils/run_utils.py | 14 ++++++++++---- tests/conftest.py | 25 +++++++++++++++++++++++++ tests/test_output.py | 19 ++----------------- tests/test_parameters.py | 18 ++++++++++++++++++ 4 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 tests/test_parameters.py diff --git a/dfttoolkit/utils/run_utils.py b/dfttoolkit/utils/run_utils.py index 9400aca..ef1be1f 100644 --- a/dfttoolkit/utils/run_utils.py +++ b/dfttoolkit/utils/run_utils.py @@ -31,14 +31,20 @@ def no_repeat( def _no_repeat(func): @wraps(func) def wrapper(*args, **kwargs): - if not os.path.isdir(calc_dir): - raise ValueError(f"{calc_dir} is not a directory.") + # Override calc_dir in decorator call if given in func + if "calc_dir" in kwargs: + check_dir = kwargs["calc_dir"] + else: + check_dir = calc_dir + + if not os.path.isdir(check_dir): + raise ValueError(f"{check_dir} is not a directory.") if force: return func(*args, **kwargs) - if not os.path.isfile(f"{calc_dir}/{output_file}"): + if not os.path.isfile(f"{check_dir}/{output_file}"): return func(*args, **kwargs) else: - print(f"aims.out already exists in {calc_dir}. Skipping calculation.") + print(f"aims.out already exists in {check_dir}. Skipping calculation.") return wrapper diff --git a/tests/conftest.py b/tests/conftest.py index 8e85d8a..61840ff 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,7 @@ import pytest +import os +import subprocess +from dfttoolkit.utils.file_utils import aims_bin_path_prompt def pytest_addoption(parser): @@ -21,3 +24,25 @@ def pytest_addoption(parser): @pytest.fixture(scope="session") def run_aims(request): return request.config.getoption("--run-aims") + + +@pytest.fixture(scope="session") +def aims_calc_dir(run_aims): + """ + Run FHI-aims calculations using a custom binary if specified by --run-aims. + + If the calculation has already been run (ie. if the directory + `custom_bin_aims_calcs` exists), the calculations will not be run again, unless the + user specifies `change_bin` as an option to --run-aims. + """ + + # Check if the directory already exists + if os.path.isdir("custom_bin_aims_calcs") and run_aims != "change_bin": + return "custom_bin_aims_calcs" + elif run_aims is not False: + cwd = os.path.dirname(os.path.realpath(__file__)) + binary = aims_bin_path_prompt(run_aims, cwd) + subprocess.run(["bash", f"{cwd}/run_aims.sh", binary, str(run_aims)]) + return "custom_bin_aims_calcs" + else: + return "default_aims_calcs" diff --git a/tests/test_output.py b/tests/test_output.py index 0f5c9f6..792313e 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -1,35 +1,20 @@ import os -import subprocess import numpy as np import pytest import yaml from dfttoolkit.output import AimsOutput -from dfttoolkit.utils.file_utils import aims_bin_path_prompt class TestAimsOutput: @pytest.fixture(params=range(1, 11), autouse=True) - def aims_out(self, request, run_aims): + def aims_out(self, request, aims_calc_dir): 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" + aims_out=f"{cwd}/fixtures/{aims_calc_dir}/{str(request.param)}/aims.out" ) with open(f"{cwd}/test_references.yaml", "r") as references: diff --git a/tests/test_parameters.py b/tests/test_parameters.py new file mode 100644 index 0000000..48c8d05 --- /dev/null +++ b/tests/test_parameters.py @@ -0,0 +1,18 @@ +import os +import pytest +from dfttoolkit.parameters import AimsControl + + +# TODO Create generic test class with functions for all tests to inherit + + +class TestAimsControl: + + @pytest.fixture(params=range(1, 11), autouse=True) + def aims_control(self, request, aims_calc_dir): + + cwd = os.path.dirname(os.path.realpath(__file__)) + + self.ac = AimsControl( + control_in=f"{cwd}/fixtures/{aims_calc_dir}/{str(request.param)}/control.in" + ) From 2d876f405c61afd92a569bc21e4cc0ebf04bdf10 Mon Sep 17 00:00:00 2001 From: Dylan Morgan Date: Thu, 21 Nov 2024 01:37:28 +0000 Subject: [PATCH 02/11] Continued adding parameter tests --- dfttoolkit/parameters.py | 22 ++- dfttoolkit/utils/__init__.py | 0 tests/__init__.py | 0 tests/conftest.py | 8 + .../manipulated_aims_files/1/control.in | 145 +++++++++++++++++ .../manipulated_aims_files/10/control.in | 88 +++++++++++ .../manipulated_aims_files/2/control.in | 147 +++++++++++++++++ .../manipulated_aims_files/3/control.in | 148 ++++++++++++++++++ .../manipulated_aims_files/4/control.in | 87 ++++++++++ .../manipulated_aims_files/5/control.in | 144 +++++++++++++++++ .../manipulated_aims_files/6/control.in | 88 +++++++++++ .../manipulated_aims_files/7/control.in | 148 ++++++++++++++++++ .../manipulated_aims_files/8/control.in | 92 +++++++++++ .../manipulated_aims_files/9/control.in | 145 +++++++++++++++++ tests/test_parameters.py | 41 ++++- 15 files changed, 1293 insertions(+), 10 deletions(-) delete mode 100644 dfttoolkit/utils/__init__.py delete mode 100644 tests/__init__.py create mode 100644 tests/fixtures/manipulated_aims_files/1/control.in create mode 100644 tests/fixtures/manipulated_aims_files/10/control.in create mode 100644 tests/fixtures/manipulated_aims_files/2/control.in create mode 100644 tests/fixtures/manipulated_aims_files/3/control.in create mode 100644 tests/fixtures/manipulated_aims_files/4/control.in create mode 100644 tests/fixtures/manipulated_aims_files/5/control.in create mode 100644 tests/fixtures/manipulated_aims_files/6/control.in create mode 100644 tests/fixtures/manipulated_aims_files/7/control.in create mode 100644 tests/fixtures/manipulated_aims_files/8/control.in create mode 100644 tests/fixtures/manipulated_aims_files/9/control.in diff --git a/dfttoolkit/parameters.py b/dfttoolkit/parameters.py index 7e73993..d919dd5 100644 --- a/dfttoolkit/parameters.py +++ b/dfttoolkit/parameters.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Literal, Union import dfttoolkit.utils.file_utils as fu from dfttoolkit.base_parser import BaseParser @@ -75,7 +75,9 @@ def add_keywords(self, **kwargs: dict) -> None: # TODO finish this raise NotImplementedError - def remove_keywords(self, *args: str) -> None: + def remove_keywords( + self, *args: str, output: Literal["overwrite", "print", "return"] = "return" + ) -> Union[None, List[str]]: """ Remove keywords from the control.in file. @@ -83,6 +85,10 @@ def remove_keywords(self, *args: str) -> None: ---------- *args : str Keywords to be removed from the control.in file. + output : Literal['overwrite', 'print', 'return'], default='overwrite' + Overwrite the original file, print the modified file to STDOUT, or return + the modified file as a list of '\\n' separated strings. + """ for keyword in args: @@ -90,8 +96,16 @@ def remove_keywords(self, *args: str) -> None: if keyword in line: self.lines.pop(i) - with open(self.path, "w") as f: - f.writelines(self.lines) + match output: + case "overwrite": + with open(self.path, "w") as f: + f.writelines(self.lines) + + case "print": + print(*self.lines, sep="") + + case "return": + return self.lines def get_keywords(self) -> dict: """ diff --git a/dfttoolkit/utils/__init__.py b/dfttoolkit/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/conftest.py b/tests/conftest.py index 61840ff..cbe9132 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -46,3 +46,11 @@ def aims_calc_dir(run_aims): return "custom_bin_aims_calcs" else: return "default_aims_calcs" + + +@pytest.fixture(scope="session") +def tmp_dir(tmp_path_factory): + """Temporary directory for all tests to write files to""" + + d = tmp_path_factory.mktemp("tmp") + return d diff --git a/tests/fixtures/manipulated_aims_files/1/control.in b/tests/fixtures/manipulated_aims_files/1/control.in new file mode 100644 index 0000000..e6e1181 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/1/control.in @@ -0,0 +1,145 @@ +output_level full +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for H atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species H +# global species definitions + nucleus 1 + mass 1.00794 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 24 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2421 50 + division 0.3822 110 + division 0.4799 194 + division 0.5341 302 +# division 0.5626 434 +# division 0.5922 590 +# division 0.6542 770 +# division 0.6868 1202 +# outer_grid 770 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 1 s 1. +# ion occupancy + ion_occ 1 s 0.5 +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Basis constructed for dimers: 0.5 A, 0.7 A, 1.0 A, 1.5 A, 2.5 A +# +################################################################################ +# "First tier" - improvements: -1014.90 meV to -62.69 meV + hydro 2 s 2.1 + hydro 2 p 3.5 +# "Second tier" - improvements: -12.89 meV to -1.83 meV +# hydro 1 s 0.85 +# hydro 2 p 3.7 +# hydro 2 s 1.2 +# hydro 3 d 7 +# "Third tier" - improvements: -0.25 meV to -0.12 meV +# hydro 4 f 11.2 +# hydro 3 p 4.8 +# hydro 4 d 9 +# hydro 3 s 3.2 diff --git a/tests/fixtures/manipulated_aims_files/10/control.in b/tests/fixtures/manipulated_aims_files/10/control.in new file mode 100644 index 0000000..1c60dd8 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/10/control.in @@ -0,0 +1,88 @@ +hse_unit b +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for Si atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +# 2020/09/08 Added f function to "light" after reinspection of Delta test outcomes. +# This was done for all of Al-Cl and is a tricky decision since it makes +# "light" calculations measurably more expensive for these elements. +# Nevertheless, outcomes for P, S, Cl (and to some extent, Si) appear +# to justify this choice. +# +################################################################################ + species Si +# global species definitions + nucleus 14 + mass 28.0855 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 42 5.0 + radial_multiplier 1 + angular_grids specified + division 0.5866 50 + division 0.9616 110 + division 1.2249 194 + division 1.3795 302 +# division 1.4810 434 +# division 1.5529 590 +# division 1.6284 770 +# division 1.7077 974 +# division 2.4068 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 3 s 2. + valence 3 p 2. +# ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 1. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.75 A, 2.0 A, 2.25 A, 2.75 A, 3.75 A +# +################################################################################ +# "First tier" - improvements: -571.96 meV to -37.03 meV + hydro 3 d 4.2 + hydro 2 p 1.4 + hydro 4 f 6.2 + ionic 3 s auto +# "Second tier" - improvements: -16.76 meV to -3.03 meV +# hydro 3 d 9 +# hydro 5 g 9.4 +# hydro 4 p 4 +# hydro 1 s 0.65 +# "Third tier" - improvements: -3.89 meV to -0.60 meV +# ionic 3 d auto +# hydro 3 s 2.6 +# hydro 4 f 8.4 +# hydro 3 d 3.4 +# hydro 3 p 7.8 +# "Fourth tier" - improvements: -0.33 meV to -0.11 meV +# hydro 2 p 1.6 +# hydro 5 g 10.8 +# hydro 5 f 11.2 +# hydro 3 d 1 +# hydro 4 s 4.5 +# Further basis functions that fell out of the optimization - noise +# level... < -0.08 meV +# hydro 4 d 6.6 +# hydro 5 g 16.4 +# hydro 4 d 9 diff --git a/tests/fixtures/manipulated_aims_files/2/control.in b/tests/fixtures/manipulated_aims_files/2/control.in new file mode 100644 index 0000000..12bd563 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/2/control.in @@ -0,0 +1,147 @@ +spin collinear +default_initial_moment 1 +output_level full +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for H atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species H +# global species definitions + nucleus 1 + mass 1.00794 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 24 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2421 50 + division 0.3822 110 + division 0.4799 194 + division 0.5341 302 +# division 0.5626 434 +# division 0.5922 590 +# division 0.6542 770 +# division 0.6868 1202 +# outer_grid 770 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 1 s 1. +# ion occupancy + ion_occ 1 s 0.5 +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Basis constructed for dimers: 0.5 A, 0.7 A, 1.0 A, 1.5 A, 2.5 A +# +################################################################################ +# "First tier" - improvements: -1014.90 meV to -62.69 meV + hydro 2 s 2.1 + hydro 2 p 3.5 +# "Second tier" - improvements: -12.89 meV to -1.83 meV +# hydro 1 s 0.85 +# hydro 2 p 3.7 +# hydro 2 s 1.2 +# hydro 3 d 7 +# "Third tier" - improvements: -0.25 meV to -0.12 meV +# hydro 4 f 11.2 +# hydro 3 p 4.8 +# hydro 4 d 9 +# hydro 3 s 3.2 diff --git a/tests/fixtures/manipulated_aims_files/3/control.in b/tests/fixtures/manipulated_aims_files/3/control.in new file mode 100644 index 0000000..7d015f1 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/3/control.in @@ -0,0 +1,148 @@ +spin collinear +default_initial_moment 1 +include_spin_orbit non_self_consistent +output_level full +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for H atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species H +# global species definitions + nucleus 1 + mass 1.00794 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 24 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2421 50 + division 0.3822 110 + division 0.4799 194 + division 0.5341 302 +# division 0.5626 434 +# division 0.5922 590 +# division 0.6542 770 +# division 0.6868 1202 +# outer_grid 770 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 1 s 1. +# ion occupancy + ion_occ 1 s 0.5 +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Basis constructed for dimers: 0.5 A, 0.7 A, 1.0 A, 1.5 A, 2.5 A +# +################################################################################ +# "First tier" - improvements: -1014.90 meV to -62.69 meV + hydro 2 s 2.1 + hydro 2 p 3.5 +# "Second tier" - improvements: -12.89 meV to -1.83 meV +# hydro 1 s 0.85 +# hydro 2 p 3.7 +# hydro 2 s 1.2 +# hydro 3 d 7 +# "Third tier" - improvements: -0.25 meV to -0.12 meV +# hydro 4 f 11.2 +# hydro 3 p 4.8 +# hydro 4 d 9 +# hydro 3 s 3.2 diff --git a/tests/fixtures/manipulated_aims_files/4/control.in b/tests/fixtures/manipulated_aims_files/4/control.in new file mode 100644 index 0000000..d00339a --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/4/control.in @@ -0,0 +1,87 @@ +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for Si atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +# 2020/09/08 Added f function to "light" after reinspection of Delta test outcomes. +# This was done for all of Al-Cl and is a tricky decision since it makes +# "light" calculations measurably more expensive for these elements. +# Nevertheless, outcomes for P, S, Cl (and to some extent, Si) appear +# to justify this choice. +# +################################################################################ + species Si +# global species definitions + nucleus 14 + mass 28.0855 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 42 5.0 + radial_multiplier 1 + angular_grids specified + division 0.5866 50 + division 0.9616 110 + division 1.2249 194 + division 1.3795 302 +# division 1.4810 434 +# division 1.5529 590 +# division 1.6284 770 +# division 1.7077 974 +# division 2.4068 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 3 s 2. + valence 3 p 2. +# ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 1. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.75 A, 2.0 A, 2.25 A, 2.75 A, 3.75 A +# +################################################################################ +# "First tier" - improvements: -571.96 meV to -37.03 meV + hydro 3 d 4.2 + hydro 2 p 1.4 + hydro 4 f 6.2 + ionic 3 s auto +# "Second tier" - improvements: -16.76 meV to -3.03 meV +# hydro 3 d 9 +# hydro 5 g 9.4 +# hydro 4 p 4 +# hydro 1 s 0.65 +# "Third tier" - improvements: -3.89 meV to -0.60 meV +# ionic 3 d auto +# hydro 3 s 2.6 +# hydro 4 f 8.4 +# hydro 3 d 3.4 +# hydro 3 p 7.8 +# "Fourth tier" - improvements: -0.33 meV to -0.11 meV +# hydro 2 p 1.6 +# hydro 5 g 10.8 +# hydro 5 f 11.2 +# hydro 3 d 1 +# hydro 4 s 4.5 +# Further basis functions that fell out of the optimization - noise +# level... < -0.08 meV +# hydro 4 d 6.6 +# hydro 5 g 16.4 +# hydro 4 d 9 diff --git a/tests/fixtures/manipulated_aims_files/5/control.in b/tests/fixtures/manipulated_aims_files/5/control.in new file mode 100644 index 0000000..286b7b1 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/5/control.in @@ -0,0 +1,144 @@ +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for H atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species H +# global species definitions + nucleus 1 + mass 1.00794 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 24 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2421 50 + division 0.3822 110 + division 0.4799 194 + division 0.5341 302 +# division 0.5626 434 +# division 0.5922 590 +# division 0.6542 770 +# division 0.6868 1202 +# outer_grid 770 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 1 s 1. +# ion occupancy + ion_occ 1 s 0.5 +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Basis constructed for dimers: 0.5 A, 0.7 A, 1.0 A, 1.5 A, 2.5 A +# +################################################################################ +# "First tier" - improvements: -1014.90 meV to -62.69 meV + hydro 2 s 2.1 + hydro 2 p 3.5 +# "Second tier" - improvements: -12.89 meV to -1.83 meV +# hydro 1 s 0.85 +# hydro 2 p 3.7 +# hydro 2 s 1.2 +# hydro 3 d 7 +# "Third tier" - improvements: -0.25 meV to -0.12 meV +# hydro 4 f 11.2 +# hydro 3 p 4.8 +# hydro 4 d 9 +# hydro 3 s 3.2 diff --git a/tests/fixtures/manipulated_aims_files/6/control.in b/tests/fixtures/manipulated_aims_files/6/control.in new file mode 100644 index 0000000..330436c --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/6/control.in @@ -0,0 +1,88 @@ +relax_unit_cell full +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for Si atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +# 2020/09/08 Added f function to "light" after reinspection of Delta test outcomes. +# This was done for all of Al-Cl and is a tricky decision since it makes +# "light" calculations measurably more expensive for these elements. +# Nevertheless, outcomes for P, S, Cl (and to some extent, Si) appear +# to justify this choice. +# +################################################################################ + species Si +# global species definitions + nucleus 14 + mass 28.0855 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 42 5.0 + radial_multiplier 1 + angular_grids specified + division 0.5866 50 + division 0.9616 110 + division 1.2249 194 + division 1.3795 302 +# division 1.4810 434 +# division 1.5529 590 +# division 1.6284 770 +# division 1.7077 974 +# division 2.4068 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 3 s 2. + valence 3 p 2. +# ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 1. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.75 A, 2.0 A, 2.25 A, 2.75 A, 3.75 A +# +################################################################################ +# "First tier" - improvements: -571.96 meV to -37.03 meV + hydro 3 d 4.2 + hydro 2 p 1.4 + hydro 4 f 6.2 + ionic 3 s auto +# "Second tier" - improvements: -16.76 meV to -3.03 meV +# hydro 3 d 9 +# hydro 5 g 9.4 +# hydro 4 p 4 +# hydro 1 s 0.65 +# "Third tier" - improvements: -3.89 meV to -0.60 meV +# ionic 3 d auto +# hydro 3 s 2.6 +# hydro 4 f 8.4 +# hydro 3 d 3.4 +# hydro 3 p 7.8 +# "Fourth tier" - improvements: -0.33 meV to -0.11 meV +# hydro 2 p 1.6 +# hydro 5 g 10.8 +# hydro 5 f 11.2 +# hydro 3 d 1 +# hydro 4 s 4.5 +# Further basis functions that fell out of the optimization - noise +# level... < -0.08 meV +# hydro 4 d 6.6 +# hydro 5 g 16.4 +# hydro 4 d 9 diff --git a/tests/fixtures/manipulated_aims_files/7/control.in b/tests/fixtures/manipulated_aims_files/7/control.in new file mode 100644 index 0000000..fe0b9f0 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/7/control.in @@ -0,0 +1,148 @@ +sc_accuracy_rho 1e-10 +sc_accuracy_eev 1e-6 +sc_accuracy_etot 1e-12 +sc_accuracy_forces 1e-8 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for H atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species H +# global species definitions + nucleus 1 + mass 1.00794 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 24 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2421 50 + division 0.3822 110 + division 0.4799 194 + division 0.5341 302 +# division 0.5626 434 +# division 0.5922 590 +# division 0.6542 770 +# division 0.6868 1202 +# outer_grid 770 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 1 s 1. +# ion occupancy + ion_occ 1 s 0.5 +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Basis constructed for dimers: 0.5 A, 0.7 A, 1.0 A, 1.5 A, 2.5 A +# +################################################################################ +# "First tier" - improvements: -1014.90 meV to -62.69 meV + hydro 2 s 2.1 + hydro 2 p 3.5 +# "Second tier" - improvements: -12.89 meV to -1.83 meV +# hydro 1 s 0.85 +# hydro 2 p 3.7 +# hydro 2 s 1.2 +# hydro 3 d 7 +# "Third tier" - improvements: -0.25 meV to -0.12 meV +# hydro 4 f 11.2 +# hydro 3 p 4.8 +# hydro 4 d 9 +# hydro 3 s 3.2 diff --git a/tests/fixtures/manipulated_aims_files/8/control.in b/tests/fixtures/manipulated_aims_files/8/control.in new file mode 100644 index 0000000..287e2e9 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/8/control.in @@ -0,0 +1,92 @@ +sc_iter_limit 10 +sc_accuracy_rho 1e-10 +sc_accuracy_eev 1e-6 +sc_accuracy_etot 1e-12 +sc_accuracy_forces 1e-8 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for Si atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +# 2020/09/08 Added f function to "light" after reinspection of Delta test outcomes. +# This was done for all of Al-Cl and is a tricky decision since it makes +# "light" calculations measurably more expensive for these elements. +# Nevertheless, outcomes for P, S, Cl (and to some extent, Si) appear +# to justify this choice. +# +################################################################################ + species Si +# global species definitions + nucleus 14 + mass 28.0855 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 42 5.0 + radial_multiplier 1 + angular_grids specified + division 0.5866 50 + division 0.9616 110 + division 1.2249 194 + division 1.3795 302 +# division 1.4810 434 +# division 1.5529 590 +# division 1.6284 770 +# division 1.7077 974 +# division 2.4068 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 3 s 2. + valence 3 p 2. +# ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 1. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.75 A, 2.0 A, 2.25 A, 2.75 A, 3.75 A +# +################################################################################ +# "First tier" - improvements: -571.96 meV to -37.03 meV + hydro 3 d 4.2 + hydro 2 p 1.4 + hydro 4 f 6.2 + ionic 3 s auto +# "Second tier" - improvements: -16.76 meV to -3.03 meV +# hydro 3 d 9 +# hydro 5 g 9.4 +# hydro 4 p 4 +# hydro 1 s 0.65 +# "Third tier" - improvements: -3.89 meV to -0.60 meV +# ionic 3 d auto +# hydro 3 s 2.6 +# hydro 4 f 8.4 +# hydro 3 d 3.4 +# hydro 3 p 7.8 +# "Fourth tier" - improvements: -0.33 meV to -0.11 meV +# hydro 2 p 1.6 +# hydro 5 g 10.8 +# hydro 5 f 11.2 +# hydro 3 d 1 +# hydro 4 s 4.5 +# Further basis functions that fell out of the optimization - noise +# level... < -0.08 meV +# hydro 4 d 6.6 +# hydro 5 g 16.4 +# hydro 4 d 9 diff --git a/tests/fixtures/manipulated_aims_files/9/control.in b/tests/fixtures/manipulated_aims_files/9/control.in new file mode 100644 index 0000000..3dd43b6 --- /dev/null +++ b/tests/fixtures/manipulated_aims_files/9/control.in @@ -0,0 +1,145 @@ +hse_unit b +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for H atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species H +# global species definitions + nucleus 1 + mass 1.00794 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 24 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2421 50 + division 0.3822 110 + division 0.4799 194 + division 0.5341 302 +# division 0.5626 434 +# division 0.5922 590 +# division 0.6542 770 +# division 0.6868 1202 +# outer_grid 770 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 1 s 1. +# ion occupancy + ion_occ 1 s 0.5 +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Basis constructed for dimers: 0.5 A, 0.7 A, 1.0 A, 1.5 A, 2.5 A +# +################################################################################ +# "First tier" - improvements: -1014.90 meV to -62.69 meV + hydro 2 s 2.1 + hydro 2 p 3.5 +# "Second tier" - improvements: -12.89 meV to -1.83 meV +# hydro 1 s 0.85 +# hydro 2 p 3.7 +# hydro 2 s 1.2 +# hydro 3 d 7 +# "Third tier" - improvements: -0.25 meV to -0.12 meV +# hydro 4 f 11.2 +# hydro 3 p 4.8 +# hydro 4 d 9 +# hydro 3 s 3.2 diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 48c8d05..5f85a89 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,18 +1,47 @@ import os +import shutil import pytest from dfttoolkit.parameters import AimsControl -# TODO Create generic test class with functions for all tests to inherit - - class TestAimsControl: @pytest.fixture(params=range(1, 11), autouse=True) def aims_control(self, request, aims_calc_dir): - - cwd = os.path.dirname(os.path.realpath(__file__)) + self.cwd = os.path.dirname(os.path.realpath(__file__)) self.ac = AimsControl( - control_in=f"{cwd}/fixtures/{aims_calc_dir}/{str(request.param)}/control.in" + control_in=f"{self.cwd}/fixtures/{aims_calc_dir}/{str(request.param)}" + "/control.in" ) + + # Read reference + with open( + f"{self.cwd}/fixtures/manipulated_aims_files/{str(request.param)}" + "/control.in", + "r", + ) as f: + self.removed_keywords_control_ref = f.readlines() + + @property + def _aims_fixture_no(self) -> int: + return int(self.ac.path.split("/")[-2]) + + def test_remove_keywords_overwrite(self, tmp_dir): + control_path = tmp_dir / "control.in" + shutil.copy(self.ac.path, control_path) + ac = AimsControl(control_in=str(control_path)) + ac.remove_keywords("xc", "relax_geometry", "k_grid", output="overwrite") + + assert "".join(self.removed_keywords_control_ref) == control_path.read_text() + + def test_remove_keywords_print(self, capfd): + self.ac.remove_keywords("xc", "relax_geometry", "k_grid", output="print") + + out, err = capfd.readouterr() + + # print(out) + # print("".join(self.removed_keywords_control_ref)) + + assert out == print("".join(self.removed_keywords_control_ref)) + assert err == "" From 9c852e4e3a9873564b114336aa578d6c6811aacc Mon Sep 17 00:00:00 2001 From: Dylan Morgan Date: Thu, 21 Nov 2024 01:40:36 +0000 Subject: [PATCH 03/11] Type hint fixes --- dfttoolkit/utils/math_utils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dfttoolkit/utils/math_utils.py b/dfttoolkit/utils/math_utils.py index c8af90b..04a3061 100644 --- a/dfttoolkit/utils/math_utils.py +++ b/dfttoolkit/utils/math_utils.py @@ -1,5 +1,6 @@ -from typing import Union from copy import deepcopy +from typing import Union + import numpy as np import numpy.typing as npt import scipy @@ -405,7 +406,7 @@ def apply_hann_window(data): return windowed_data -def norm_matrix_by_dagonal(matrix: np.array) -> np.array: +def norm_matrix_by_dagonal(matrix: npt.NDArray) -> npt.NDArray: """ Norms a matrix such that the diagonal becomes 1. @@ -437,7 +438,7 @@ def norm_matrix_by_dagonal(matrix: np.array) -> np.array: return new_matrix -def mae(delta: np.ndarray) -> float: +def mae(delta: np.ndarray) -> np.floating: """ Calculated the mean absolute error from a list of value differnces. @@ -455,7 +456,7 @@ def mae(delta: np.ndarray) -> float: return np.mean(np.abs(delta)) -def rel_mae(delta: np.ndarray, target_val: np.ndarray) -> float: +def rel_mae(delta: np.ndarray, target_val: np.ndarray) -> np.floating: """ Calculated the relative mean absolute error from a list of value differnces, given the target values. From 092075a2af953be4ac43abd158075a60750dfd2c Mon Sep 17 00:00:00 2001 From: Dylan Morgan Date: Thu, 21 Nov 2024 01:41:02 +0000 Subject: [PATCH 04/11] Added default imports --- dfttoolkit/__init__.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dfttoolkit/__init__.py b/dfttoolkit/__init__.py index e69de29..c4f5b04 100644 --- a/dfttoolkit/__init__.py +++ b/dfttoolkit/__init__.py @@ -0,0 +1,38 @@ +from .benchmarking import BenchmarkAims +from .custom_ase import CustomAims +from .friction import FrictionTensor +from .geometry import AimsGeometry, VaspGeometry, XSFGeometry, XYZGeometry +from .output import AimsOutput, ELSIOutput +from .parameters import AimsControl +from .trajectory import MDTrajectory +from .utils import math_utils, units +from .utils.file_utils import aims_bin_path_prompt, check_required_files +from .utils.geometry_utils import read_xyz_animation +from .utils.periodic_table import PeriodicTable +from .utils.run_utils import no_repeat +from .vibrations import AimsVibrations, VaspVibrations +from .visualise import VisualiseAims + +__all__ = [ + "BenchmarkAims", + "CustomAims", + "FrictionTensor", + "AimsGeometry", + "VaspGeometry", + "XSFGeometry", + "XYZGeometry", + "AimsOutput", + "ELSIOutput", + "AimsControl", + "MDTrajectory", + "math_utils", + "units", + "aims_bin_path_prompt", + "check_required_files", + "read_xyz_animation", + "PeriodicTable", + "no_repeat", + "AimsVibrations", + "VaspVibrations", + "VisualiseAims", +] From 4f31086223162ef3df6e9ddcb3d3d18f84f57c80 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 21 Nov 2024 16:24:12 +0000 Subject: [PATCH 05/11] Added BaseParser tests --- dfttoolkit/base_parser.py | 2 +- .../elsi_files/D_spin_01_kpt_000001.csc | Bin 0 -> 8024 bytes tests/test_base.py | 97 ++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/elsi_files/D_spin_01_kpt_000001.csc create mode 100644 tests/test_base.py diff --git a/dfttoolkit/base_parser.py b/dfttoolkit/base_parser.py index 38332f6..336a3e4 100644 --- a/dfttoolkit/base_parser.py +++ b/dfttoolkit/base_parser.py @@ -27,7 +27,7 @@ def __init__(self, supported_files, **kwargs): # Check if the file path exists if not os.path.isfile(kwargs[kwarg]): - raise ValueError(f"{kwargs[kwarg]} does not exist.") + raise FileNotFoundError(f"{kwargs[kwarg]} does not exist.") # Store the file paths self.file_paths[kwarg] = kwargs[kwarg] diff --git a/tests/fixtures/elsi_files/D_spin_01_kpt_000001.csc b/tests/fixtures/elsi_files/D_spin_01_kpt_000001.csc new file mode 100644 index 0000000000000000000000000000000000000000..dc191f216f7b84b9beed8c24b93ea1bf6fad7c44 GIT binary patch literal 8024 zcmd5=30RI<8;+=~p#_apb`hHXEO|L8lF2ZZP)KP}QDmL6Wwa25WJ?rDB77)CFQ@#* zjGdw=ZI-et%Ws|h@B5u|cXf4Pnt!gjuHSVX&-cCGIp=-OeV*sOpQrfk^;P75XWG8} zEdNt}k^VF0A9T63VbiMTVgBE>_4xiRx$VMje{M%`JDFQ=ZWnMH!fgb%k=$i4gbE2+ca*ka(kcKcicAMc(>)Y zV=dd0e;>^4aBk)0@<&x^G?j*?G+IbQ##c)k@_p(_Lth&0rC}fqBWZM!MmK5HT;D+Y zUVD#L(ldDAUPxTWJ_d1AcUr zKFhvzl}1BpXh@?bE;aY4>zUM~J!BsmNkjGnn81hD(zEZRVJHpx46+ZMrO{m)vj12w zzgxyqUI)K1|L^(>{N;Dae#-BGU-CO@`y>BuD2*o4ko~IZlkC6jPd#bi9%{$Nx9$MXq75>TlA*ST` zK+YOUpTBe`*i*i9dC%JTVc);%BjQ!w6EQE}rOYexp70a#1wW0X-w@BW<4ry{Vh!t& z1OL?7WM6Qv$ct~qq>N`xKmRNz{!ZN1#h<#wVqNmEF8d%>{w$_zV){?*TQgs3#-hx< zU&@=W)1m zn6!ARIXU#eyr|toXO&A(=A;zTV62HhBC2n!S7W`S6Cj=;ujn{UpBL>o8mYhxSdIIb*Yhmux*fF)e<_!>*O$3bvk{ z=l%Y@W)Qu&F2*56$DiI2_9M}uWp}JL;^QBtkZgRM<{Al z9@y9Cx#-dHxuN5{U3BxH7K6bsX*9g3Z?}yZYPDzIo!W`KDEo3AaQO zK0jAAX=Q$1i7<%GCuVx#2`Mf&$gbq{w4*-fXrQY`x9vHb>58&Xi~77=P1mZWEs07@ zqvl%C!#nP)5KmjZt7q+)N3Bnub@HpaC;0g+vRjdJgt){x3<|!pm4vt`*OTkz%Jsy! zp>jP@Q9ZTM-v7Cf!`Bz@yzMpcRgP%J*SoRxw36fCQKT8K7gjDVjb(VOU;Aiox3@Wh z6D_eHE#VTwak;r|`>)xVc|wuGE_vjxXP_f1AvluCtQz;Ws8;bvi?Su9-U z^DH^^KM&4#knwcyiiY%vDLq7VGx%~Hk z3;oh}Tip>)d9mNU*zXj$=1-1&^Z7wK@zjfZ7GD`mer^&Pk(RNBq(n~W{h@FhNxHmn zn%lVBVn@+b{bc)#B+tQS!9M5PLZ`XycQ!Z@Pc6p%cuqfi4GnLnTu<9HQm&_^o0RKm z11-aaUhLGyiabU zx!d-Zka^;GU(xEeaJ7x;^K`8+V!XKPS%s=d?wX8B&#~)AJI$WsIV#zc8nWlqqp$Kg z*~_1Ur@#})LvK@)Z5KDqBdWoPFTywb((=_GR@yaQM*1DQk!pKk4^0n_C3{jg(w6l# zU9vjQA}Z6mT?*;uLM#H<{2pO!e&ta%zl_Z%o9ij()3;7+{$%cVMF8`ApeghFcVFgr zF?&ue%$VPMxZmJa@EUjn`Gb3g|1Em$n>bZN#WMY|g~6HFg+xCyQmg!eH(Al!N8Nk; zUZOZYZfevef7-cEmL&m_ZcDboC!2T{wmfyP74N77{m zPSJ_h<7wuq&i2Cxx2fiL@GJNWd5m}ij_~8B;m6MAYEtsFS)|A*<-MqdJ<)mQE&5ql0r=X#Z5LJK%lrD)h0`G$Nzyrur#5wSSU)hc4%;dNl4r`R#CbmeRX$;@4X$)WJDf9$9 z4<5t);k~6QQQI9ZPbaF{Q+r3hav{_Ce(&Z6J~|OUo%HhjIOTbyGev!cdIt3abQ}5! z{Q}>E*T4(NL&Q1a2=}$K{XGAH=265zM=>KLDUhV}Q1SygcTky!ba;v~&dIy(Gh4-a z z9_Qye484RNApU`06U%iM471#c(<$YB(DE5d{KyNn*vG2I|7K0x%?R}B$=NJ^)~8T)RU;Ap!d)<=mK~cJcm5Rz2iJhx$an%Fx|Ovjp>d} zAEoZlz9~xGA%o4B?x5~Ro&A#6wW#M%cR*jEPtXJKEqD#QfxJXK0%!Qu)0XMbg62$z ztQ9*V>PMCd=1hm^i&TBnk4H*H1=AyvzLMz?`V;g6sJ~HnqCP?$03C&HK^MTk;5YCG z@&@q${NU$eu1f-V?&(mAXUW!;@6ZYGA@~D%iFil+;9h`(HP@;7Os6RNF!UR!v!Tz>6YwVD5qMtUIy8sr z5Jg{${tJBu>L}zbQSsmz6Fng z9}vI5Cz$IK`c(8|=tEGyKyRTdh%?}#%k|YLWa*w)t?vp`KF9Aos0bii{5q#4htHu= z$49+y=eC@b1`N>DnV=xsf3bVKX>SOL9`^ohX=w^6y>j@eR+kbXeCF++W<5)!mQAOg ze}8N~)$`nc%-`FAsvNOXv@|d$>Cg6U@OrV4E^p`gro&5>Q#ljM_3n2_qK~?2=&yfL zZ%}yR>>0n@T}P&QFBoc*>PhVFv%D7@1(N$6vUZBEH<0%gZ|`p~4x*pKD)owUKMTdH zk6$slaF*UkkJ&eQ+$(XwgBZ0=9b-wSj9$;wEP`pbh8}1BaNk4Kdug{5dj^rg)80Fj z`z;_BV~pN@%9>0ZvyFWFcsUa1iZKZ@MmUh|oBZ13w96Kb8TIhHt(#6qRxuoUavZ8! zO*#8iJ%;S}dm26X#A3SdakH}ITkbS>sLL9cw#&$gO65Lu+(Q%Ry!!T3-QUN3(%v5VX3 Date: Thu, 21 Nov 2024 16:25:23 +0000 Subject: [PATCH 06/11] Minor formatting changes --- dfttoolkit/output.py | 18 ++++++++-------- tests/test_output.py | 51 +++++++++++++++++--------------------------- 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/dfttoolkit/output.py b/dfttoolkit/output.py index 1b49606..923a76e 100644 --- a/dfttoolkit/output.py +++ b/dfttoolkit/output.py @@ -1323,33 +1323,33 @@ def read_elsi_as_csc( # Get the column pointer end = 128 + self.n_basis * 8 - col_ptr = np.frombuffer(self.lines[128:end], dtype=np.int64) - col_ptr = np.append(col_ptr, self.n_non_zero + 1) - col_ptr -= 1 + col_i = np.frombuffer(self.lines[128:end], dtype=np.int64) + col_i = np.append(col_i, self.n_non_zero + 1) + col_i -= 1 # Get the row index start = end + self.n_non_zero * 4 - row_idx = np.array(np.frombuffer(self.lines[end:start], dtype=np.int32)) - row_idx -= 1 + row_i = np.array(np.frombuffer(self.lines[end:start], dtype=np.int32)) + row_i -= 1 if header[2] == 0: # real - nnz_val = np.frombuffer( + nnz = np.frombuffer( self.lines[start : start + self.n_non_zero * 8], dtype=np.float64, ) else: # complex - nnz_val = np.frombuffer( + nnz = np.frombuffer( self.lines[start : start + self.n_non_zero * 16], dtype=np.complex128, ) if csc_format: return sp.csc_matrix( - (nnz_val, row_idx, col_ptr), shape=(self.n_basis, self.n_basis) + (nnz, row_i, col_i), shape=(self.n_basis, self.n_basis) ) else: return sp.csc_matrix( - (nnz_val, row_idx, col_ptr), shape=(self.n_basis, self.n_basis) + (nnz, row_i, col_i), shape=(self.n_basis, self.n_basis) ).toarray() diff --git a/tests/test_output.py b/tests/test_output.py index 792313e..d08505a 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -2,28 +2,21 @@ import numpy as np import pytest -import yaml from dfttoolkit.output import AimsOutput class TestAimsOutput: + @property + def _aims_fixture_no(self) -> int: + return int(self.ao.path.split("/")[-2]) @pytest.fixture(params=range(1, 11), autouse=True) - def aims_out(self, request, aims_calc_dir): - - cwd = os.path.dirname(os.path.realpath(__file__)) + def aims_out(self, cwd, request, aims_calc_dir): self.ao = AimsOutput( aims_out=f"{cwd}/fixtures/{aims_calc_dir}/{str(request.param)}/aims.out" ) - with open(f"{cwd}/test_references.yaml", "r") as references: - self.ref_data = yaml.safe_load(references) - - @property - def _aims_fixture_no(self) -> int: - return int(self.ao.path.split("/")[-2]) - 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 @@ -49,12 +42,12 @@ def test_check_exit_normal(self): else: assert self.ao.check_exit_normal() is True - def test_get_time_per_scf(self): + def test_get_time_per_scf(self, ref_data): # 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(), - self.ref_data["timings"][self._aims_fixture_no - 1], + ref_data["timings"][self._aims_fixture_no - 1], atol=2e-3, ) @@ -84,14 +77,14 @@ def test_get_change_of_total_energy_1(self): < 1e-8 ) - def test_get_change_of_total_energy_2(self): + def test_get_change_of_total_energy_2(self, ref_data): """Get every energy change""" # 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), - self.ref_data["energy_diffs"][self._aims_fixture_no - 1], + ref_data["energy_diffs"][self._aims_fixture_no - 1], atol=1e-8, ) @@ -127,7 +120,7 @@ def test_get_change_of_total_energy_3(self): # assert np.allclose( # self.ao.get_change_of_total_energy(n_occurrence=1), - # self.ref_data['all_energies'][self.aims_fixture_no(self.ao) - 1], + # ref_data['all_energies'][self.aims_fixture_no(self.ao) - 1], # atol=1e-10, # ) @@ -157,15 +150,11 @@ def test_check_spin_polarised(self): else: assert self.ao.check_spin_polarised() is False - def test_get_convergence_parameters(self): + def test_get_convergence_parameters(self, ref_data): if self._aims_fixture_no in [7, 8]: - assert ( - self.ao.get_convergence_parameters() == self.ref_data["conv_params"][1] - ) + assert self.ao.get_convergence_parameters() == ref_data["conv_params"][1] else: - assert ( - self.ao.get_convergence_parameters() == self.ref_data["conv_params"][0] - ) + assert self.ao.get_convergence_parameters() == ref_data["conv_params"][0] def test_get_final_energy(self): final_energies = [ @@ -221,25 +210,25 @@ def compare_n_initial_ks_states(): # TODO # def test_get_all_ks_eigenvalues(self): # if self._aims_fixture_no == 1: - # for key in self.ref_data["eigenvalues"].keys(): + # for key in ref_data["eigenvalues"].keys(): # # Check the values are within tolerance and that keys match # assert np.allclose( # self.ao.get_all_ks_eigenvalues()[key], - # self.ref_data["eigenvalues"][key], + # ref_data["eigenvalues"][key], # atol=1e-8, # ) # elif self._aims_fixture_no in [2, 3]: # spin_up, spin_down = self.ao.get_all_ks_eigenvalues() - # for key in self.ref_data["su_eigenvalues"].keys(): + # for key in ref_data["su_eigenvalues"].keys(): # # Check the values are within tolerance and that keys match # assert np.allclose( - # spin_up[key], self.ref_data["su_eigenvalues"][key], atol=1e-8 + # spin_up[key], ref_data["su_eigenvalues"][key], atol=1e-8 # ) # # Repeat for spin_down # assert np.allclose( - # spin_down[key], self.ref_data["sd_eigenvalues"][key], atol=1e-8 + # spin_down[key], ref_data["sd_eigenvalues"][key], atol=1e-8 # ) # else: @@ -249,13 +238,13 @@ def compare_n_initial_ks_states(): # TODO # def get_final_ks_eigenvalues_test(self): - def test_get_pert_soc_ks_eigenvalues(self): + def test_get_pert_soc_ks_eigenvalues(self, ref_data): if self._aims_fixture_no == 3: - for key in self.ref_data["pert_soc_eigenvalues"].keys(): + for key in ref_data["pert_soc_eigenvalues"].keys(): # Check the values are within tolerance and that keys match assert np.allclose( self.ao.get_pert_soc_ks_eigenvalues()[key], - self.ref_data["pert_soc_eigenvalues"][key], + ref_data["pert_soc_eigenvalues"][key], atol=1e-8, ) From 9e5ec6194c87dbe8d174c1875b1c087c8a9b7898 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 21 Nov 2024 16:25:34 +0000 Subject: [PATCH 07/11] Dependency updates --- poetry.lock | 379 +++++++++++++++++++++++++--------------------------- 1 file changed, 185 insertions(+), 194 deletions(-) diff --git a/poetry.lock b/poetry.lock index f2b8838..55596ac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "alabaster" @@ -249,76 +249,65 @@ files = [ [[package]] name = "contourpy" -version = "1.3.0" +version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {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"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, ] [package.dependencies] @@ -333,73 +322,73 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.6.4" +version = "7.6.7" 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"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"}, + {file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"}, + {file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, + {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, + {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"}, + {file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"}, + {file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"}, + {file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"}, + {file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"}, + {file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"}, + {file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"}, + {file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"}, + {file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"}, + {file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"}, + {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, ] [package.dependencies] @@ -513,59 +502,61 @@ test = ["pytest (>=6)"] [[package]] name = "fonttools" -version = "4.54.1" +version = "4.55.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81"}, + {file = "fonttools-4.55.0-cp310-cp310-win32.whl", hash = "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880"}, + {file = "fonttools-4.55.0-cp310-cp310-win_amd64.whl", hash = "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c"}, + {file = "fonttools-4.55.0-cp311-cp311-win32.whl", hash = "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05"}, + {file = "fonttools-4.55.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c"}, + {file = "fonttools-4.55.0-cp312-cp312-win32.whl", hash = "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6"}, + {file = "fonttools-4.55.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18"}, + {file = "fonttools-4.55.0-cp313-cp313-win32.whl", hash = "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b"}, + {file = "fonttools-4.55.0-cp313-cp313-win_amd64.whl", hash = "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c"}, + {file = "fonttools-4.55.0-cp38-cp38-win32.whl", hash = "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a"}, + {file = "fonttools-4.55.0-cp38-cp38-win_amd64.whl", hash = "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf"}, + {file = "fonttools-4.55.0-cp39-cp39-win32.whl", hash = "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03"}, + {file = "fonttools-4.55.0-cp39-cp39-win_amd64.whl", hash = "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2"}, + {file = "fonttools-4.55.0-py3-none-any.whl", hash = "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f"}, + {file = "fonttools-4.55.0.tar.gz", hash = "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71"}, ] [package.extras] @@ -662,22 +653,22 @@ tests = ["coverage[toml]", "pytest", "pytest-cov", "pytest-mock"] [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -1197,13 +1188,13 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -1404,13 +1395,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.387" +version = "1.1.389" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.387-py3-none-any.whl", hash = "sha256:6a1f495a261a72e12ad17e20d1ae3df4511223c773b19407cfa006229b1b08a5"}, - {file = "pyright-1.1.387.tar.gz", hash = "sha256:577de60224f7fe36505d5b181231e3a395d427b7873be0bbcaa962a29ea93a60"}, + {file = "pyright-1.1.389-py3-none-any.whl", hash = "sha256:41e9620bba9254406dc1f621a88ceab5a88af4c826feb4f614d95691ed243a60"}, + {file = "pyright-1.1.389.tar.gz", hash = "sha256:716bf8cc174ab8b4dcf6828c3298cac05c5ed775dda9910106a5dcfe4c7fe220"}, ] [package.dependencies] @@ -1887,13 +1878,13 @@ widechars = ["wcwidth"] [[package]] name = "tomli" -version = "2.0.2" +version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] From a7ebfa9ef5d3323594b88b889fe0a226e6546512 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 21 Nov 2024 16:26:37 +0000 Subject: [PATCH 08/11] Added parameter tests and small restructure --- dfttoolkit/parameters.py | 7 +++- tests/conftest.py | 29 +++++++++++--- tests/test_parameters.py | 53 ++++++++++++++++---------- tests/test_references.yaml | 42 +++++++++++++++++++++ tests/test_utils.py | 77 ++++++++++++++++++-------------------- 5 files changed, 142 insertions(+), 66 deletions(-) diff --git a/dfttoolkit/parameters.py b/dfttoolkit/parameters.py index d919dd5..f8d5a25 100644 --- a/dfttoolkit/parameters.py +++ b/dfttoolkit/parameters.py @@ -85,10 +85,15 @@ def remove_keywords( ---------- *args : str Keywords to be removed from the control.in file. - output : Literal['overwrite', 'print', 'return'], default='overwrite' + output : Literal["overwrite", "print", "return"], default="overwrite" Overwrite the original file, print the modified file to STDOUT, or return the modified file as a list of '\\n' separated strings. + Returns + ------- + Union[None, List[str]] + If output is "return", the modified file is returned as a list of '\\n' + separated strings. """ for keyword in args: diff --git a/tests/conftest.py b/tests/conftest.py index cbe9132..27fad60 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,8 @@ -import pytest import os import subprocess + +import pytest +import yaml from dfttoolkit.utils.file_utils import aims_bin_path_prompt @@ -23,7 +25,7 @@ def pytest_addoption(parser): @pytest.fixture(scope="session") def run_aims(request): - return request.config.getoption("--run-aims") + yield request.config.getoption("--run-aims") @pytest.fixture(scope="session") @@ -43,9 +45,9 @@ def aims_calc_dir(run_aims): cwd = os.path.dirname(os.path.realpath(__file__)) binary = aims_bin_path_prompt(run_aims, cwd) subprocess.run(["bash", f"{cwd}/run_aims.sh", binary, str(run_aims)]) - return "custom_bin_aims_calcs" + yield "custom_bin_aims_calcs" else: - return "default_aims_calcs" + yield "default_aims_calcs" @pytest.fixture(scope="session") @@ -53,4 +55,21 @@ def tmp_dir(tmp_path_factory): """Temporary directory for all tests to write files to""" d = tmp_path_factory.mktemp("tmp") - return d + yield d + + +@pytest.fixture(scope="session") +def ref_data(): + cwd = os.path.dirname(os.path.realpath(__file__)) + with open(f"{cwd}/test_references.yaml", "r") as references: + yield yaml.safe_load(references) + + +@pytest.fixture(scope="session") +def cwd(): + yield os.path.dirname(os.path.realpath(__file__)) + + +@pytest.fixture(scope="session") +def default_calc_dir(cwd): + yield f"{cwd}/fixtures/default_aims_calcs/1/" diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 5f85a89..e6dd4f3 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,47 +1,62 @@ import os import shutil + import pytest +import yaml from dfttoolkit.parameters import AimsControl class TestAimsControl: + @property + def aims_fixture_no(self) -> int: + return int(self.ac.path.split("/")[-2]) @pytest.fixture(params=range(1, 11), autouse=True) - def aims_control(self, request, aims_calc_dir): - self.cwd = os.path.dirname(os.path.realpath(__file__)) - + def aims_control(self, cwd, request, aims_calc_dir): self.ac = AimsControl( - control_in=f"{self.cwd}/fixtures/{aims_calc_dir}/{str(request.param)}" + control_in=f"{cwd}/fixtures/{aims_calc_dir}/{str(request.param)}" "/control.in" ) - # Read reference + @pytest.fixture + def ref_files(self, cwd): with open( - f"{self.cwd}/fixtures/manipulated_aims_files/{str(request.param)}" - "/control.in", + f"{cwd}/fixtures/manipulated_aims_files/{self.aims_fixture_no}/control.in", "r", ) as f: - self.removed_keywords_control_ref = f.readlines() + yield f.readlines() - @property - def _aims_fixture_no(self) -> int: - return int(self.ac.path.split("/")[-2]) + def test_initialise_parameters(self, cwd): + with open( + f"{cwd}/fixtures/default_aims_calcs/{self.aims_fixture_no}/control.in", + "r", + ) as f: + assert self.ac.lines == f.readlines() - def test_remove_keywords_overwrite(self, tmp_dir): + assert self.ac.lines == self.ac.file_contents["control_in"] + assert self.ac.supported_files == ["control_in"] + assert self.ac.supported_files == self.ac._supported_files + assert self.ac.path.endswith("control.in") + + def test_remove_keywords_overwrite(self, tmp_dir, ref_files): control_path = tmp_dir / "control.in" shutil.copy(self.ac.path, control_path) ac = AimsControl(control_in=str(control_path)) ac.remove_keywords("xc", "relax_geometry", "k_grid", output="overwrite") - assert "".join(self.removed_keywords_control_ref) == control_path.read_text() + assert "".join(ref_files) == control_path.read_text() - def test_remove_keywords_print(self, capfd): + def test_remove_keywords_print(self, capsys, ref_files): self.ac.remove_keywords("xc", "relax_geometry", "k_grid", output="print") + out, err = capsys.readouterr() - out, err = capfd.readouterr() + assert out == "".join(ref_files) + "\n" + assert err == "" - # print(out) - # print("".join(self.removed_keywords_control_ref)) + def test_remove_keywords_return(self, ref_files): + control = self.ac.remove_keywords("xc", "relax_geometry", "k_grid") + assert control == ref_files - assert out == print("".join(self.removed_keywords_control_ref)) - assert err == "" + def test_get_keywords(self, ref_data): + keywords = self.ac.get_keywords() + assert keywords == ref_data["keywords"][self.aims_fixture_no - 1] diff --git a/tests/test_references.yaml b/tests/test_references.yaml index 6bc4c34..c76687a 100644 --- a/tests/test_references.yaml +++ b/tests/test_references.yaml @@ -122,6 +122,48 @@ 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] +keywords: +- { "xc": "pbe", "output_level": "full" } +- { + "xc": "pbe", + "spin": "collinear", + "default_initial_moment": "1", + "output_level": "full", + } +- { + "xc": "pbe", + "spin": "collinear", + "default_initial_moment": "1", + "include_spin_orbit": "non_self_consistent", + "output_level": "full", + } +- { "xc": "pbe", "k_grid": "1 1 1" } +- { "xc": "pbe", "relax_geometry": "bfgs 5e-3" } +- { + "xc": "pbe", + "k_grid": "8 8 8", + "relax_geometry": "bfgs 5e-3", + "relax_unit_cell": "full", + } +- { + "xc": "pbe", + "relax_geometry": "bfgs 5e-3", + "sc_accuracy_rho": "1e-10", + "sc_accuracy_eev": "1e-6", + "sc_accuracy_etot": "1e-12", + "sc_accuracy_forces": "1e-8", + } +- { + "xc": "pbe", + "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", + } +- { "xc": "hse06 0.11", "hse_unit": "b" } +- { "xc": "hse06 0.11", "hse_unit": "b", "k_grid": "8 8 8" } 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, diff --git a/tests/test_utils.py b/tests/test_utils.py index 8d57230..54d2f62 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -3,50 +3,45 @@ from dfttoolkit.utils.run_utils import no_repeat -class TestNoRepeat: +def test_specified_dir_not_found(): + @no_repeat(calc_dir="bogus") + def to_be_decorated(): + return True - calc_dir = ( - f"{os.path.dirname(os.path.realpath(__file__))}/fixtures/default_aims_calcs/1" - ) + with pytest.raises(ValueError) as excinfo: + to_be_decorated() - def test_specified_dir_not_found(self): - @no_repeat(calc_dir="bogus") - def to_be_decorated(): - return True - - with pytest.raises(ValueError) as excinfo: - to_be_decorated() - - assert "bogus is not a directory." == str(excinfo.value) - - @pytest.mark.parametrize( - ("calc_dir", "force", "expected"), - [ - ("./", False, True), - ( - f"{os.path.dirname(os.path.realpath(__file__))}/fixtures/default_aims_calcs/1", - True, - True, - ), - ], - ) - def test_default_dir_no_args(self, calc_dir, force, expected): - @no_repeat(calc_dir=calc_dir, force=force) - def to_be_decorated(): - return True + assert "bogus is not a directory." == str(excinfo.value) - assert to_be_decorated() == expected - def test_no_repeat(self, capfd): - @no_repeat(calc_dir=self.calc_dir) - def to_be_decorated(): - return True +@pytest.mark.parametrize( + ("default_calc_dir", "force", "expected"), + [ + ("./", False, True), + ( + f"{os.path.dirname(os.path.realpath(__file__))}/fixtures/default_aims_calcs/1", + True, + True, + ), + ], +) +def test_default_dir_no_args(default_calc_dir, force, expected): + @no_repeat(calc_dir=default_calc_dir, force=force) + def to_be_decorated(): + return True - to_be_decorated() + assert to_be_decorated() == expected - out, err = capfd.readouterr() - assert ( - out - == f"aims.out already exists in {self.calc_dir}. Skipping calculation.\n" - ) - assert err == "" + +def test_no_repeat(capfd, default_calc_dir): + @no_repeat(calc_dir=default_calc_dir) + def to_be_decorated(): + return True + + to_be_decorated() + + out, err = capfd.readouterr() + assert ( + out == f"aims.out already exists in {default_calc_dir}. Skipping calculation.\n" + ) + assert err == "" From 3ed39bedc999a384ba6d5a65bee11de7df48ffd2 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 22 Nov 2024 12:29:32 +0000 Subject: [PATCH 09/11] Commented __init__ import and __all__ --- dfttoolkit/__init__.py | 74 +++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/dfttoolkit/__init__.py b/dfttoolkit/__init__.py index c4f5b04..833fa3c 100644 --- a/dfttoolkit/__init__.py +++ b/dfttoolkit/__init__.py @@ -1,38 +1,38 @@ -from .benchmarking import BenchmarkAims -from .custom_ase import CustomAims -from .friction import FrictionTensor -from .geometry import AimsGeometry, VaspGeometry, XSFGeometry, XYZGeometry -from .output import AimsOutput, ELSIOutput -from .parameters import AimsControl -from .trajectory import MDTrajectory -from .utils import math_utils, units -from .utils.file_utils import aims_bin_path_prompt, check_required_files -from .utils.geometry_utils import read_xyz_animation -from .utils.periodic_table import PeriodicTable -from .utils.run_utils import no_repeat -from .vibrations import AimsVibrations, VaspVibrations -from .visualise import VisualiseAims +# from .benchmarking import BenchmarkAims +# from .custom_ase import CustomAims +# from .friction import FrictionTensor +# from .geometry import AimsGeometry, VaspGeometry, XSFGeometry, XYZGeometry +# from .output import AimsOutput, ELSIOutput +# from .parameters import AimsControl +# from .trajectory import MDTrajectory +# from .utils import math_utils, units +# from .utils.file_utils import aims_bin_path_prompt, check_required_files +# from .utils.geometry_utils import read_xyz_animation +# from .utils.periodic_table import PeriodicTable +# from .utils.run_utils import no_repeat +# from .vibrations import AimsVibrations, VaspVibrations +# from .visualise import VisualiseAims -__all__ = [ - "BenchmarkAims", - "CustomAims", - "FrictionTensor", - "AimsGeometry", - "VaspGeometry", - "XSFGeometry", - "XYZGeometry", - "AimsOutput", - "ELSIOutput", - "AimsControl", - "MDTrajectory", - "math_utils", - "units", - "aims_bin_path_prompt", - "check_required_files", - "read_xyz_animation", - "PeriodicTable", - "no_repeat", - "AimsVibrations", - "VaspVibrations", - "VisualiseAims", -] +# __all__ = [ +# "BenchmarkAims", +# "CustomAims", +# "FrictionTensor", +# "AimsGeometry", +# "VaspGeometry", +# "XSFGeometry", +# "XYZGeometry", +# "AimsOutput", +# "ELSIOutput", +# "AimsControl", +# "MDTrajectory", +# "math_utils", +# "units", +# "aims_bin_path_prompt", +# "check_required_files", +# "read_xyz_animation", +# "PeriodicTable", +# "no_repeat", +# "AimsVibrations", +# "VaspVibrations", +# "VisualiseAims", +# ] From d3e59152b86c3946fea0cf2dc7e6d5b365d8c4a4 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 22 Nov 2024 12:30:22 +0000 Subject: [PATCH 10/11] Removed unnecessary imports --- tests/test_parameters.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_parameters.py b/tests/test_parameters.py index e6dd4f3..05a6d53 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,8 +1,6 @@ -import os import shutil import pytest -import yaml from dfttoolkit.parameters import AimsControl From 48cd901c2e5f9878ed8c4c70102de17d9f587d2b Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 22 Nov 2024 12:51:39 +0000 Subject: [PATCH 11/11] Added pypi repository for publishing --- .github/workflows/pypi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pypi.yaml b/.github/workflows/pypi.yaml index 844f1c0..8ec2de1 100644 --- a/.github/workflows/pypi.yaml +++ b/.github/workflows/pypi.yaml @@ -52,7 +52,7 @@ jobs: environment: name: pypi # OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status: - # url: https://pypi.org/p/YOURPROJECT + url: https://pypi.org/project/dfttoolkit/ steps: - name: Retrieve release distributions