From 53810a542e2a79209819fbb9ce1c496739da0193 Mon Sep 17 00:00:00 2001 From: dalthecow Date: Mon, 28 Jul 2025 08:45:56 -0400 Subject: [PATCH 1/3] add custom dict camelize logic Signed-off-by: dalthecow --- pyproject.toml | 1 - src/guidellm/benchmark/output.py | 12 ++-- src/guidellm/utils/__init__.py | 4 ++ src/guidellm/utils/dict.py | 21 ++++++ src/guidellm/utils/text.py | 7 +- src/ui/app/layout.tsx | 2 +- src/ui/lib/store/runInfoWindowData.ts | 2 +- .../lib/store/slices/runInfo/runInfo.api.ts | 2 +- .../workloadDetails/workloadDetails.api.ts | 2 +- src/ui/lib/store/workloadDetailsWindowData.ts | 2 +- src/ui/types/declaration.d.ts | 4 +- tests/unit/presentation/test_injector.py | 18 ++--- tests/unit/utils/dict.py | 69 +++++++++++++++++++ tests/unit/utils/text.py | 7 ++ 14 files changed, 130 insertions(+), 23 deletions(-) create mode 100644 src/guidellm/utils/dict.py create mode 100644 tests/unit/utils/dict.py create mode 100644 tests/unit/utils/text.py diff --git a/pyproject.toml b/pyproject.toml index 0b1014cb..8115b1fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,6 @@ dependencies = [ "protobuf", "pydantic>=2.11.7", "pydantic-settings>=2.0.0", - "pyhumps>=3.8.0", "pyyaml>=6.0.0", "rich", "transformers", diff --git a/src/guidellm/benchmark/output.py b/src/guidellm/benchmark/output.py index 8a113f72..695006be 100644 --- a/src/guidellm/benchmark/output.py +++ b/src/guidellm/benchmark/output.py @@ -1,3 +1,4 @@ +from copy import deepcopy import csv import json import math @@ -6,7 +7,6 @@ from pathlib import Path from typing import Any, Literal, Optional, Union -import humps # type: ignore[import-not-found] import yaml from pydantic import Field from rich.console import Console @@ -30,6 +30,8 @@ from guidellm.presentation.injector import create_report from guidellm.scheduler import strategy_display_str from guidellm.utils import Colors, split_text_list_by_length +from guidellm.utils.dict import recursive_key_update +from guidellm.utils.text import camelize_str __all__ = [ "GenerativeBenchmarksConsole", @@ -236,14 +238,14 @@ def save_html(self, path: Union[str, Path]) -> Path: :param path: The path to create the report at. :return: The path to the report. """ - + data_builder = UIDataBuilder(self.benchmarks) data = data_builder.to_dict() - camel_data = humps.camelize(data) + camel_data = recursive_key_update(deepcopy(data), camelize_str) ui_api_data = {} for k, v in camel_data.items(): - key = f"window.{humps.decamelize(k)} = {{}};" - value = f"window.{humps.decamelize(k)} = {json.dumps(v, indent=2)};\n" + key = f"window.{k} = {{}};" + value = f"window.{k} = {json.dumps(v, indent=2)};\n" ui_api_data[key] = value return create_report(ui_api_data, path) diff --git a/src/guidellm/utils/__init__.py b/src/guidellm/utils/__init__.py index fb9262c3..02f2427f 100644 --- a/src/guidellm/utils/__init__.py +++ b/src/guidellm/utils/__init__.py @@ -1,5 +1,6 @@ from .colors import Colors from .default_group import DefaultGroupHandler +from .dict import recursive_key_update from .hf_datasets import ( SUPPORTED_TYPES, save_dataset_to_file, @@ -10,6 +11,7 @@ from .random import IntegerRangeSampler from .text import ( EndlessTextCreator, + camelize_str, clean_text, filter_text, is_puncutation, @@ -24,11 +26,13 @@ "DefaultGroupHandler", "EndlessTextCreator", "IntegerRangeSampler", + "camelize_str", "check_load_processor", "clean_text", "filter_text", "is_puncutation", "load_text", + "recursive_key_update", "save_dataset_to_file", "split_text", "split_text_list_by_length", diff --git a/src/guidellm/utils/dict.py b/src/guidellm/utils/dict.py new file mode 100644 index 00000000..f708d2e2 --- /dev/null +++ b/src/guidellm/utils/dict.py @@ -0,0 +1,21 @@ +def recursive_key_update(d, key_update_func): + if not isinstance(d, dict) and not isinstance(d, list): + return d + + if isinstance(d, list): + for item in d: + recursive_key_update(item, key_update_func) + return d + + updated_key_pairs = [] + for key, _ in d.items(): + updated_key = key_update_func(key) + if key != updated_key: + updated_key_pairs.append((key, updated_key )) + for key_pair in updated_key_pairs: + old_key, updated_key = key_pair + d[updated_key] = d[old_key] + del d[old_key] + for key, value in d.items(): + recursive_key_update(value, key_update_func) + return d \ No newline at end of file diff --git a/src/guidellm/utils/text.py b/src/guidellm/utils/text.py index cdefaa14..65a36150 100644 --- a/src/guidellm/utils/text.py +++ b/src/guidellm/utils/text.py @@ -14,6 +14,7 @@ __all__ = [ "EndlessTextCreator", + "camelize_str", "clean_text", "filter_text", "is_puncutation", @@ -189,6 +190,10 @@ def is_puncutation(text: str) -> bool: return len(text) == 1 and not text.isalnum() and not text.isspace() +def camelize_str(snake_case_string: str) -> str: + return (words := snake_case_string.split('_'))[0].lower() + ''.join(word.capitalize() for word in words[1:]) + + class EndlessTextCreator: def __init__( self, @@ -213,4 +218,4 @@ def create_text(self, start: int, length: int) -> str: text += add_word - return text + return text \ No newline at end of file diff --git a/src/ui/app/layout.tsx b/src/ui/app/layout.tsx index 99696f12..ab3e3f54 100644 --- a/src/ui/app/layout.tsx +++ b/src/ui/app/layout.tsx @@ -35,7 +35,7 @@ export default function RootLayout({ " + html = "" expected_html = ( "" ) js_data = { - "window.run_info = {};": "window.run_info =" + "window.runInfo = {};": "window.runInfo =" '{ "model": { "name": "neuralmagic/Qwen2.5-7B-quantized.w8a8" } };' } result = inject_data( @@ -35,13 +35,13 @@ def test_inject_data(): @pytest.mark.smoke def test_create_report_to_file(tmpdir): js_data = { - "window.run_info = {};": "window.run_info =" + "window.runInfo = {};": "window.runInfo =" '{ "model": { "name": "neuralmagic/Qwen2.5-7B-quantized.w8a8" } };' } - html_content = "" + html_content = "" expected_html_content = ( "" ) @@ -61,13 +61,13 @@ def test_create_report_to_file(tmpdir): @pytest.mark.smoke def test_create_report_with_file_nested_in_dir(tmpdir): js_data = { - "window.run_info = {};": "window.run_info =" + "window.runInfo = {};": "window.runInfo =" '{ "model": { "name": "neuralmagic/Qwen2.5-7B-quantized.w8a8" } };' } - html_content = "" + html_content = "" expected_html_content = ( "" ) diff --git a/tests/unit/utils/dict.py b/tests/unit/utils/dict.py new file mode 100644 index 00000000..a33f28f5 --- /dev/null +++ b/tests/unit/utils/dict.py @@ -0,0 +1,69 @@ +import pytest + +from guidellm.utils.dict import recursive_key_update + +def update_str(str): + return str + "_updated" + +@pytest.mark.smoke +def test_recursive_key_update_updates_keys(): + my_dict = { + "my_key": { + "my_nested_key": { + "my_double_nested_key": "someValue" + }, + "my_other_nested_key": "someValue" + }, + "my_other_key": "value" + } + my_updated_dict = { + "my_key_updated": { + "my_nested_key_updated": { + "my_double_nested_key_updated": "someValue" + }, + "my_other_nested_key_updated": "someValue" + }, + "my_other_key_updated": "value" + } + recursive_key_update(my_dict, update_str) + assert my_dict == my_updated_dict + + +def truncate_str_to_ten(str): + return str[:10] + + +@pytest.mark.smoke +def test_recursive_key_update_leaves_unchanged_keys(): + my_dict = { + "my_key": { + "my_nested_key": { + "my_double_nested_key": "someValue" + }, + "my_other_nested_key": "someValue" + }, + "my_other_key": "value" + } + my_updated_dict = { + "my_key": { + "my_nested_": { + "my_double_": "someValue" + }, + "my_other_n": "someValue" + }, + "my_other_k": "value" + } + recursive_key_update(my_dict, truncate_str_to_ten) + assert my_dict == my_updated_dict + + +@pytest.mark.smoke +def test_recursive_key_update_updates_dicts_in_list(): + my_dict = { + "my_key": [{ "my_list_item_key_1": "someValue" }, { "my_list_item_key_2": "someValue" }, { "my_list_item_key_3": "someValue" }] + } + my_updated_dict = { + "my_key_updated": [{ "my_list_item_key_1_updated": "someValue" }, { "my_list_item_key_2_updated": "someValue" }, { "my_list_item_key_3_updated": "someValue" }] + } + recursive_key_update(my_dict, update_str) + assert my_dict == my_updated_dict \ No newline at end of file diff --git a/tests/unit/utils/text.py b/tests/unit/utils/text.py new file mode 100644 index 00000000..6dba95ce --- /dev/null +++ b/tests/unit/utils/text.py @@ -0,0 +1,7 @@ +import pytest + +from guidellm.utils.text import camelize_str + +@pytest.mark.smoke +def test_camelize_str(): + assert camelize_str("no_longer_snake_case") == "noLongerSnakeCase" \ No newline at end of file From cd0d4450e5b6a539c9190478248dd0b049cebc76 Mon Sep 17 00:00:00 2001 From: dalthecow Date: Mon, 28 Jul 2025 08:59:26 -0400 Subject: [PATCH 2/3] fix quality checks Signed-off-by: dalthecow --- src/guidellm/benchmark/output.py | 4 ++-- src/guidellm/utils/dict.py | 6 ++++-- src/guidellm/utils/text.py | 8 ++++++-- tests/unit/utils/dict.py | 21 ++++++++++++++------- tests/unit/utils/text.py | 9 +++++++-- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/guidellm/benchmark/output.py b/src/guidellm/benchmark/output.py index 695006be..da868106 100644 --- a/src/guidellm/benchmark/output.py +++ b/src/guidellm/benchmark/output.py @@ -1,8 +1,8 @@ -from copy import deepcopy import csv import json import math from collections import OrderedDict +from copy import deepcopy from datetime import datetime from pathlib import Path from typing import Any, Literal, Optional, Union @@ -238,7 +238,7 @@ def save_html(self, path: Union[str, Path]) -> Path: :param path: The path to create the report at. :return: The path to the report. """ - + data_builder = UIDataBuilder(self.benchmarks) data = data_builder.to_dict() camel_data = recursive_key_update(deepcopy(data), camelize_str) diff --git a/src/guidellm/utils/dict.py b/src/guidellm/utils/dict.py index f708d2e2..9432bacc 100644 --- a/src/guidellm/utils/dict.py +++ b/src/guidellm/utils/dict.py @@ -12,10 +12,12 @@ def recursive_key_update(d, key_update_func): updated_key = key_update_func(key) if key != updated_key: updated_key_pairs.append((key, updated_key )) + for key_pair in updated_key_pairs: old_key, updated_key = key_pair d[updated_key] = d[old_key] del d[old_key] - for key, value in d.items(): + + for _, value in d.items(): recursive_key_update(value, key_update_func) - return d \ No newline at end of file + return d diff --git a/src/guidellm/utils/text.py b/src/guidellm/utils/text.py index 65a36150..e11598de 100644 --- a/src/guidellm/utils/text.py +++ b/src/guidellm/utils/text.py @@ -191,7 +191,11 @@ def is_puncutation(text: str) -> bool: def camelize_str(snake_case_string: str) -> str: - return (words := snake_case_string.split('_'))[0].lower() + ''.join(word.capitalize() for word in words[1:]) + return ( + words := + snake_case_string.split("_"))[0].lower() + "".join(word.capitalize() + for word in words[1:] + ) class EndlessTextCreator: @@ -218,4 +222,4 @@ def create_text(self, start: int, length: int) -> str: text += add_word - return text \ No newline at end of file + return text diff --git a/tests/unit/utils/dict.py b/tests/unit/utils/dict.py index a33f28f5..82ec22a2 100644 --- a/tests/unit/utils/dict.py +++ b/tests/unit/utils/dict.py @@ -2,8 +2,9 @@ from guidellm.utils.dict import recursive_key_update -def update_str(str): - return str + "_updated" + +def update_str(string): + return string + "_updated" @pytest.mark.smoke def test_recursive_key_update_updates_keys(): @@ -29,8 +30,8 @@ def test_recursive_key_update_updates_keys(): assert my_dict == my_updated_dict -def truncate_str_to_ten(str): - return str[:10] +def truncate_str_to_ten(string): + return string[:10] @pytest.mark.smoke @@ -60,10 +61,16 @@ def test_recursive_key_update_leaves_unchanged_keys(): @pytest.mark.smoke def test_recursive_key_update_updates_dicts_in_list(): my_dict = { - "my_key": [{ "my_list_item_key_1": "someValue" }, { "my_list_item_key_2": "someValue" }, { "my_list_item_key_3": "someValue" }] + "my_key": + [{ "my_list_item_key_1": "someValue" }, + { "my_list_item_key_2": "someValue" }, + { "my_list_item_key_3": "someValue" }] } my_updated_dict = { - "my_key_updated": [{ "my_list_item_key_1_updated": "someValue" }, { "my_list_item_key_2_updated": "someValue" }, { "my_list_item_key_3_updated": "someValue" }] + "my_key_updated": + [{ "my_list_item_key_1_updated": "someValue" }, + { "my_list_item_key_2_updated": "someValue" }, + { "my_list_item_key_3_updated": "someValue" }] } recursive_key_update(my_dict, update_str) - assert my_dict == my_updated_dict \ No newline at end of file + assert my_dict == my_updated_dict diff --git a/tests/unit/utils/text.py b/tests/unit/utils/text.py index 6dba95ce..b37ea950 100644 --- a/tests/unit/utils/text.py +++ b/tests/unit/utils/text.py @@ -2,6 +2,11 @@ from guidellm.utils.text import camelize_str + +@pytest.mark.smoke +def test_camelize_str_camelizes_string(): + assert camelize_str("no_longer_snake_case") == "noLongerSnakeCase" + @pytest.mark.smoke -def test_camelize_str(): - assert camelize_str("no_longer_snake_case") == "noLongerSnakeCase" \ No newline at end of file +def test_camelize_str_leaves_non_snake_case_text_untouched(): + assert camelize_str("notsnakecase") == "notsnakecase" From 3c090cd63899a72e41c9c22b5fd40a826ee28856 Mon Sep 17 00:00:00 2001 From: Samuel Monson Date: Thu, 21 Aug 2025 09:53:49 -0400 Subject: [PATCH 3/3] Fix formatting + update lock Signed-off-by: Samuel Monson --- pylock.toml | 163 ++++++++++++++++++------------------- src/guidellm/utils/dict.py | 36 ++++---- src/guidellm/utils/text.py | 6 +- tests/unit/utils/dict.py | 107 ++++++++++++------------ tests/unit/utils/text.py | 5 +- 5 files changed, 155 insertions(+), 162 deletions(-) diff --git a/pylock.toml b/pylock.toml index b636a1fa..1b9f662f 100644 --- a/pylock.toml +++ b/pylock.toml @@ -331,18 +331,6 @@ dependencies = [ "typing-inspection>=0.4.0", ] -[[packages]] -name = "pyhumps" -version = "3.8.0" -sdist = {name = "pyhumps-3.8.0.tar.gz", url = "https://files.pythonhosted.org/packages/c4/83/fa6f8fb7accb21f39e8f2b6a18f76f6d90626bdb0a5e5448e5cc9b8ab014/pyhumps-3.8.0.tar.gz", hashes = {sha256 = "498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3"}} -wheels = [ - {name = "pyhumps-3.8.0-py3-none-any.whl",url = "https://files.pythonhosted.org/packages/9e/11/a1938340ecb32d71e47ad4914843775011e6e9da59ba1229f181fef3119e/pyhumps-3.8.0-py3-none-any.whl",hashes = {sha256 = "060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6"}}, -] -marker = "\"default\" in dependency_groups" - -[packages.tool.pdm] -dependencies = [] - [[packages]] name = "pytest" version = "8.2.2" @@ -2291,76 +2279,87 @@ dependencies = [] [[packages]] name = "coverage" -version = "7.9.2" +version = "7.10.4" requires-python = ">=3.9" -sdist = {name = "coverage-7.9.2.tar.gz", url = "https://files.pythonhosted.org/packages/04/b7/c0465ca253df10a9e8dae0692a4ae6e9726d245390aaef92360e1d6d3832/coverage-7.9.2.tar.gz", hashes = {sha256 = "997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b"}} -wheels = [ - {name = "coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/94/9d/7a8edf7acbcaa5e5c489a646226bed9591ee1c5e6a84733c0140e9ce1ae1/coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl",hashes = {sha256 = "985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038"}}, - {name = "coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/e8/9e/5cd6f130150712301f7e40fb5865c1bc27b97689ec57297e568d972eec3c/coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl",hashes = {sha256 = "82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d"}}, - {name = "coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",url = "https://files.pythonhosted.org/packages/a8/de/6287a2c2036f9fd991c61cefa8c64e57390e30c894ad3aa52fac4c1e14a8/coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",hashes = {sha256 = "ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3"}}, - {name = "coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",url = "https://files.pythonhosted.org/packages/06/cc/9b5a9961d8160e3cb0b558c71f8051fe08aa2dd4b502ee937225da564ed1/coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",hashes = {sha256 = "bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14"}}, - {name = "coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",url = "https://files.pythonhosted.org/packages/49/d9/4616b787d9f597d6443f5588619c1c9f659e1f5fc9eebf63699eb6d34b78/coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",hashes = {sha256 = "256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6"}}, - {name = "coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/48/83/801cdc10f137b2d02b005a761661649ffa60eb173dcdaeb77f571e4dc192/coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl",hashes = {sha256 = "f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b"}}, - {name = "coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/c8/a4/41911ed7e9d3ceb0ffb019e7635468df7499f5cc3edca5f7dfc078e9c5ec/coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl",hashes = {sha256 = "82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d"}}, - {name = "coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/10/41/344543b71d31ac9cb00a664d5d0c9ef134a0fe87cb7d8430003b20fa0b7d/coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl",hashes = {sha256 = "619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868"}}, - {name = "coverage-7.9.2-cp313-cp313-win32.whl",url = "https://files.pythonhosted.org/packages/d5/81/3b68c77e4812105e2a060f6946ba9e6f898ddcdc0d2bfc8b4b152a9ae522/coverage-7.9.2-cp313-cp313-win32.whl",hashes = {sha256 = "0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a"}}, - {name = "coverage-7.9.2-cp313-cp313-win_amd64.whl",url = "https://files.pythonhosted.org/packages/06/a2/7fac400f6a346bb1a4004eb2a76fbff0e242cd48926a2ce37a22a6a1d917/coverage-7.9.2-cp313-cp313-win_amd64.whl",hashes = {sha256 = "115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b"}}, - {name = "coverage-7.9.2-cp313-cp313-win_arm64.whl",url = "https://files.pythonhosted.org/packages/08/47/2c6c215452b4f90d87017e61ea0fd9e0486bb734cb515e3de56e2c32075f/coverage-7.9.2-cp313-cp313-win_arm64.whl",hashes = {sha256 = "48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694"}}, - {name = "coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/a3/46/e211e942b22d6af5e0f323faa8a9bc7c447a1cf1923b64c47523f36ed488/coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl",hashes = {sha256 = "55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5"}}, - {name = "coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/d2/2f/762551f97e124442eccd907bf8b0de54348635b8866a73567eb4e6417acf/coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl",hashes = {sha256 = "cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b"}}, - {name = "coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",url = "https://files.pythonhosted.org/packages/7a/b7/76d2d132b7baf7360ed69be0bcab968f151fa31abe6d067f0384439d9edb/coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",hashes = {sha256 = "bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3"}}, - {name = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",url = "https://files.pythonhosted.org/packages/a0/17/392b219837d7ad47d8e5974ce5f8dc3deb9f99a53b3bd4d123602f960c81/coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",hashes = {sha256 = "9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8"}}, - {name = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",url = "https://files.pythonhosted.org/packages/d5/77/4256d3577fe1b0daa8d3836a1ebe68eaa07dd2cbaf20cf5ab1115d6949d4/coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",hashes = {sha256 = "bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46"}}, - {name = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/53/99/fc1a008eef1805e1ddb123cf17af864743354479ea5129a8f838c433cc2c/coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl",hashes = {sha256 = "6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584"}}, - {name = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/92/c0/f63bf667e18b7f88c2bdb3160870e277c4874ced87e21426128d70aa741f/coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl",hashes = {sha256 = "2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e"}}, - {name = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/8c/32/37dd1c42ce3016ff8ec9e4b607650d2e34845c0585d3518b2a93b4830c1a/coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl",hashes = {sha256 = "c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac"}}, - {name = "coverage-7.9.2-cp313-cp313t-win32.whl",url = "https://files.pythonhosted.org/packages/da/2e/af6b86f7c95441ce82f035b3affe1cd147f727bbd92f563be35e2d585683/coverage-7.9.2-cp313-cp313t-win32.whl",hashes = {sha256 = "1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926"}}, - {name = "coverage-7.9.2-cp313-cp313t-win_amd64.whl",url = "https://files.pythonhosted.org/packages/4d/bb/8a785d91b308867f6b2e36e41c569b367c00b70c17f54b13ac29bcd2d8c8/coverage-7.9.2-cp313-cp313t-win_amd64.whl",hashes = {sha256 = "f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd"}}, - {name = "coverage-7.9.2-cp313-cp313t-win_arm64.whl",url = "https://files.pythonhosted.org/packages/1d/a0/a6bffb5e0f41a47279fd45a8f3155bf193f77990ae1c30f9c224b61cacb0/coverage-7.9.2-cp313-cp313t-win_arm64.whl",hashes = {sha256 = "c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb"}}, - {name = "coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/53/d7/7deefc6fd4f0f1d4c58051f4004e366afc9e7ab60217ac393f247a1de70a/coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl",hashes = {sha256 = "ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0"}}, - {name = "coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/95/0c/ee03c95d32be4d519e6a02e601267769ce2e9a91fc8faa1b540e3626c680/coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl",hashes = {sha256 = "9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3"}}, - {name = "coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",url = "https://files.pythonhosted.org/packages/8b/9f/826fa4b544b27620086211b87a52ca67592622e1f3af9e0a62c87aea153a/coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",hashes = {sha256 = "f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1"}}, - {name = "coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",url = "https://files.pythonhosted.org/packages/7f/b3/4477aafe2a546427b58b9c540665feff874f4db651f4d3cb21b308b3a6d2/coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",hashes = {sha256 = "ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615"}}, - {name = "coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",url = "https://files.pythonhosted.org/packages/f8/c2/efffa43778490c226d9d434827702f2dfbc8041d79101a795f11cbb2cf1e/coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",hashes = {sha256 = "fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b"}}, - {name = "coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/c6/e7/a59888e882c9a5f0192d8627a30ae57910d5d449c80229b55e7643c078c4/coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl",hashes = {sha256 = "31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9"}}, - {name = "coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/92/a5/72fcd653ae3d214927edc100ce67440ed8a0a1e3576b8d5e6d066ed239db/coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl",hashes = {sha256 = "d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f"}}, - {name = "coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/5c/f5/84e70e4df28f4a131d580d7d510aa1ffd95037293da66fd20d446090a13b/coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl",hashes = {sha256 = "49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d"}}, - {name = "coverage-7.9.2-cp312-cp312-win32.whl",url = "https://files.pythonhosted.org/packages/39/e7/d73d7cbdbd09fdcf4642655ae843ad403d9cbda55d725721965f3580a314/coverage-7.9.2-cp312-cp312-win32.whl",hashes = {sha256 = "88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355"}}, - {name = "coverage-7.9.2-cp312-cp312-win_amd64.whl",url = "https://files.pythonhosted.org/packages/9f/d6/7486dcc3474e2e6ad26a2af2db7e7c162ccd889c4c68fa14ea8ec189c9e9/coverage-7.9.2-cp312-cp312-win_amd64.whl",hashes = {sha256 = "9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0"}}, - {name = "coverage-7.9.2-cp312-cp312-win_arm64.whl",url = "https://files.pythonhosted.org/packages/b7/34/0439f1ae2593b0346164d907cdf96a529b40b7721a45fdcf8b03c95fcd90/coverage-7.9.2-cp312-cp312-win_arm64.whl",hashes = {sha256 = "4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b"}}, - {name = "coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl",url = "https://files.pythonhosted.org/packages/39/40/916786453bcfafa4c788abee4ccd6f592b5b5eca0cd61a32a4e5a7ef6e02/coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl",hashes = {sha256 = "a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba"}}, - {name = "coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/9f/66/cc13bae303284b546a030762957322bbbff1ee6b6cb8dc70a40f8a78512f/coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl",hashes = {sha256 = "123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa"}}, - {name = "coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",url = "https://files.pythonhosted.org/packages/0f/3c/d56a764b2e5a3d43257c36af4a62c379df44636817bb5f89265de4bf8bd7/coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",hashes = {sha256 = "333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a"}}, - {name = "coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",url = "https://files.pythonhosted.org/packages/b1/46/bd064ea8b3c94eb4ca5d90e34d15b806cba091ffb2b8e89a0d7066c45791/coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",hashes = {sha256 = "326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc"}}, - {name = "coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",url = "https://files.pythonhosted.org/packages/43/02/d91992c2b29bc7afb729463bc918ebe5f361be7f1daae93375a5759d1e28/coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",hashes = {sha256 = "19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2"}}, - {name = "coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/b7/4f/8fadff6bf56595a16d2d6e33415841b0163ac660873ed9a4e9046194f779/coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl",hashes = {sha256 = "0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c"}}, - {name = "coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/9b/d2/e0be7446a2bba11739edb9f9ba4eff30b30d8257370e237418eb44a14d11/coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl",hashes = {sha256 = "2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd"}}, - {name = "coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/9d/7d/dcbac9345000121b8b57a3094c2dfcf1ccc52d8a14a40c1d4bc89f936f80/coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl",hashes = {sha256 = "42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74"}}, - {name = "coverage-7.9.2-cp311-cp311-win32.whl",url = "https://files.pythonhosted.org/packages/41/58/11e8db0a0c0510cf31bbbdc8caf5d74a358b696302a45948d7c768dfd1cf/coverage-7.9.2-cp311-cp311-win32.whl",hashes = {sha256 = "14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6"}}, - {name = "coverage-7.9.2-cp311-cp311-win_amd64.whl",url = "https://files.pythonhosted.org/packages/3a/7d/751794ec8907a15e257136e48dc1021b1f671220ecccfd6c4eaf30802714/coverage-7.9.2-cp311-cp311-win_amd64.whl",hashes = {sha256 = "549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7"}}, - {name = "coverage-7.9.2-cp311-cp311-win_arm64.whl",url = "https://files.pythonhosted.org/packages/62/5b/34abcedf7b946c1c9e15b44f326cb5b0da852885312b30e916f674913428/coverage-7.9.2-cp311-cp311-win_arm64.whl",hashes = {sha256 = "c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62"}}, - {name = "coverage-7.9.2-pp39.pp310.pp311-none-any.whl",url = "https://files.pythonhosted.org/packages/d7/85/f8bbefac27d286386961c25515431482a425967e23d3698b75a250872924/coverage-7.9.2-pp39.pp310.pp311-none-any.whl",hashes = {sha256 = "8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050"}}, - {name = "coverage-7.9.2-cp310-cp310-macosx_10_9_x86_64.whl",url = "https://files.pythonhosted.org/packages/a1/0d/5c2114fd776c207bd55068ae8dc1bef63ecd1b767b3389984a8e58f2b926/coverage-7.9.2-cp310-cp310-macosx_10_9_x86_64.whl",hashes = {sha256 = "66283a192a14a3854b2e7f3418d7db05cdf411012ab7ff5db98ff3b181e1f912"}}, - {name = "coverage-7.9.2-cp310-cp310-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/cf/ad/dc51f40492dc2d5fcd31bb44577bc0cc8920757d6bc5d3e4293146524ef9/coverage-7.9.2-cp310-cp310-macosx_11_0_arm64.whl",hashes = {sha256 = "4e01d138540ef34fcf35c1aa24d06c3de2a4cffa349e29a10056544f35cca15f"}}, - {name = "coverage-7.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",url = "https://files.pythonhosted.org/packages/a2/a3/55cb3ff1b36f00df04439c3993d8529193cdf165a2467bf1402539070f16/coverage-7.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",hashes = {sha256 = "f22627c1fe2745ee98d3ab87679ca73a97e75ca75eb5faee48660d060875465f"}}, - {name = "coverage-7.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",url = "https://files.pythonhosted.org/packages/eb/c9/a8410b91b6be4f6e9c2e9f0dce93749b6b40b751d7065b4410bf89cb654b/coverage-7.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",hashes = {sha256 = "4b1c2d8363247b46bd51f393f86c94096e64a1cf6906803fa8d5a9d03784bdbf"}}, - {name = "coverage-7.9.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",url = "https://files.pythonhosted.org/packages/ff/c4/6f3e56d467c612b9070ae71d5d3b114c0b899b5788e1ca3c93068ccb7018/coverage-7.9.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",hashes = {sha256 = "c10c882b114faf82dbd33e876d0cbd5e1d1ebc0d2a74ceef642c6152f3f4d547"}}, - {name = "coverage-7.9.2-cp310-cp310-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/fd/20/04eda789d15af1ce79bce5cc5fd64057c3a0ac08fd0576377a3096c24663/coverage-7.9.2-cp310-cp310-musllinux_1_2_aarch64.whl",hashes = {sha256 = "de3c0378bdf7066c3988d66cd5232d161e933b87103b014ab1b0b4676098fa45"}}, - {name = "coverage-7.9.2-cp310-cp310-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/a9/5a/217b32c94cc1a0b90f253514815332d08ec0812194a1ce9cca97dda1cd20/coverage-7.9.2-cp310-cp310-musllinux_1_2_i686.whl",hashes = {sha256 = "1e2f097eae0e5991e7623958a24ced3282676c93c013dde41399ff63e230fcf2"}}, - {name = "coverage-7.9.2-cp310-cp310-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/34/73/1d019c48f413465eb5d3b6898b6279e87141c80049f7dbf73fd020138549/coverage-7.9.2-cp310-cp310-musllinux_1_2_x86_64.whl",hashes = {sha256 = "28dc1f67e83a14e7079b6cea4d314bc8b24d1aed42d3582ff89c0295f09b181e"}}, - {name = "coverage-7.9.2-cp310-cp310-win32.whl",url = "https://files.pythonhosted.org/packages/49/6c/a2beca7aa2595dad0c0d3f350382c381c92400efe5261e2631f734a0e3fe/coverage-7.9.2-cp310-cp310-win32.whl",hashes = {sha256 = "bf7d773da6af9e10dbddacbf4e5cab13d06d0ed93561d44dae0188a42c65be7e"}}, - {name = "coverage-7.9.2-cp310-cp310-win_amd64.whl",url = "https://files.pythonhosted.org/packages/fc/c8/91e5e4a21f9a51e2c7cdd86e587ae01a4fcff06fc3fa8cde4d6f7cf68df4/coverage-7.9.2-cp310-cp310-win_amd64.whl",hashes = {sha256 = "0c0378ba787681ab1897f7c89b415bd56b0b2d9a47e5a3d8dc0ea55aac118d6c"}}, - {name = "coverage-7.9.2-py3-none-any.whl",url = "https://files.pythonhosted.org/packages/3c/38/bbe2e63902847cf79036ecc75550d0698af31c91c7575352eb25190d0fb3/coverage-7.9.2-py3-none-any.whl",hashes = {sha256 = "e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4"}}, - {name = "coverage-7.9.2-cp39-cp39-macosx_10_9_x86_64.whl",url = "https://files.pythonhosted.org/packages/62/ab/b4b06662ccaa00ca7bbee967b7035a33a58b41efb92d8c89a6c523a2ccd5/coverage-7.9.2-cp39-cp39-macosx_10_9_x86_64.whl",hashes = {sha256 = "ddc39510ac922a5c4c27849b739f875d3e1d9e590d1e7b64c98dadf037a16cce"}}, - {name = "coverage-7.9.2-cp39-cp39-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/bb/5e/04619995657acc898d15bfad42b510344b3a74d4d5bc34f2e279d46c781c/coverage-7.9.2-cp39-cp39-macosx_11_0_arm64.whl",hashes = {sha256 = "a535c0c7364acd55229749c2b3e5eebf141865de3a8f697076a3291985f02d30"}}, - {name = "coverage-7.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",url = "https://files.pythonhosted.org/packages/14/e7/1465710224dc6d31c534e7714cbd907210622a044adc81c810e72eea873f/coverage-7.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",hashes = {sha256 = "df0f9ef28e0f20c767ccdccfc5ae5f83a6f4a2fbdfbcbcc8487a8a78771168c8"}}, - {name = "coverage-7.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",url = "https://files.pythonhosted.org/packages/ab/f2/44c6fbd2794afeb9ab6c0a14d3c088ab1dae3dff3df2624609981237bbb4/coverage-7.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",hashes = {sha256 = "2f3da12e0ccbcb348969221d29441ac714bbddc4d74e13923d3d5a7a0bebef7a"}}, - {name = "coverage-7.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",url = "https://files.pythonhosted.org/packages/6a/d2/7a79845429c0aa2e6788bc45c26a2e3052fa91082c9ea1dea56fb531952c/coverage-7.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",hashes = {sha256 = "0a17eaf46f56ae0f870f14a3cbc2e4632fe3771eab7f687eda1ee59b73d09fe4"}}, - {name = "coverage-7.9.2-cp39-cp39-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/9c/7d/2731d1b4c9c672d82d30d218224dfc62939cf3800bc8aba0258fefb191f5/coverage-7.9.2-cp39-cp39-musllinux_1_2_aarch64.whl",hashes = {sha256 = "669135a9d25df55d1ed56a11bf555f37c922cf08d80799d4f65d77d7d6123fcf"}}, - {name = "coverage-7.9.2-cp39-cp39-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/1b/83/685958715429a9da09cf172c15750ca5c795dd7259466f2645403696557b/coverage-7.9.2-cp39-cp39-musllinux_1_2_i686.whl",hashes = {sha256 = "9d3a700304d01a627df9db4322dc082a0ce1e8fc74ac238e2af39ced4c083193"}}, - {name = "coverage-7.9.2-cp39-cp39-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/34/ff/161a4313308b3783126790adfae1970adbe4886fda8788792e435249910a/coverage-7.9.2-cp39-cp39-musllinux_1_2_x86_64.whl",hashes = {sha256 = "71ae8b53855644a0b1579d4041304ddc9995c7b21c8a1f16753c4d8903b4dfed"}}, - {name = "coverage-7.9.2-cp39-cp39-win32.whl",url = "https://files.pythonhosted.org/packages/17/14/fe33f41b2e80811021de059621f44c01ebe4d6b08bdb82d54a514488e933/coverage-7.9.2-cp39-cp39-win32.whl",hashes = {sha256 = "dd7a57b33b5cf27acb491e890720af45db05589a80c1ffc798462a765be6d4d7"}}, - {name = "coverage-7.9.2-cp39-cp39-win_amd64.whl",url = "https://files.pythonhosted.org/packages/6e/30/63d850ec31b5c6f6a7b4e853016375b846258300320eda29376e2786ceeb/coverage-7.9.2-cp39-cp39-win_amd64.whl",hashes = {sha256 = "f65bb452e579d5540c8b37ec105dd54d8b9307b07bcaa186818c104ffda22441"}}, +sdist = {name = "coverage-7.10.4.tar.gz", url = "https://files.pythonhosted.org/packages/d6/4e/08b493f1f1d8a5182df0044acc970799b58a8d289608e0d891a03e9d269a/coverage-7.10.4.tar.gz", hashes = {sha256 = "25f5130af6c8e7297fd14634955ba9e1697f47143f289e2a23284177c0061d27"}} +wheels = [ + {name = "coverage-7.10.4-cp314-cp314-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/b5/22/525f84b4cbcff66024d29f6909d7ecde97223f998116d3677cfba0d115b5/coverage-7.10.4-cp314-cp314-macosx_10_13_x86_64.whl",hashes = {sha256 = "a59fe0af7dd7211ba595cf7e2867458381f7e5d7b4cffe46274e0b2f5b9f4eb4"}}, + {name = "coverage-7.10.4-cp314-cp314-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/a6/58/213577f77efe44333a416d4bcb251471e7f64b19b5886bb515561b5ce389/coverage-7.10.4-cp314-cp314-macosx_11_0_arm64.whl",hashes = {sha256 = "3a6c35c5b70f569ee38dc3350cd14fdd0347a8b389a18bb37538cc43e6f730e6"}}, + {name = "coverage-7.10.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/17/85/34ac02d0985a09472f41b609a1d7babc32df87c726c7612dc93d30679b5a/coverage-7.10.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "acb7baf49f513554c4af6ef8e2bd6e8ac74e6ea0c7386df8b3eb586d82ccccc4"}}, + {name = "coverage-7.10.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/47/4f/2140305ec93642fdaf988f139813629cbb6d8efa661b30a04b6f7c67c31e/coverage-7.10.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "a89afecec1ed12ac13ed203238b560cbfad3522bae37d91c102e690b8b1dc46c"}}, + {name = "coverage-7.10.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/f2/b5/41b5784180b82a083c76aeba8f2c72ea1cb789e5382157b7dc852832aea2/coverage-7.10.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "480442727f464407d8ade6e677b7f21f3b96a9838ab541b9a28ce9e44123c14e"}}, + {name = "coverage-7.10.4-cp314-cp314-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/78/ca/c1dd063e50b71f5aea2ebb27a1c404e7b5ecf5714c8b5301f20e4e8831ac/coverage-7.10.4-cp314-cp314-musllinux_1_2_aarch64.whl",hashes = {sha256 = "a89bf193707f4a17f1ed461504031074d87f035153239f16ce86dfb8f8c7ac76"}}, + {name = "coverage-7.10.4-cp314-cp314-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/8d/66/d8907408612ffee100d731798e6090aedb3ba766ecf929df296c1a7ee4fb/coverage-7.10.4-cp314-cp314-musllinux_1_2_i686.whl",hashes = {sha256 = "3ddd912c2fc440f0fb3229e764feec85669d5d80a988ff1b336a27d73f63c818"}}, + {name = "coverage-7.10.4-cp314-cp314-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/29/db/53cd8ec8b1c9c52d8e22a25434785bfc2d1e70c0cfb4d278a1326c87f741/coverage-7.10.4-cp314-cp314-musllinux_1_2_x86_64.whl",hashes = {sha256 = "8a538944ee3a42265e61c7298aeba9ea43f31c01271cf028f437a7b4075592cf"}}, + {name = "coverage-7.10.4-cp314-cp314-win32.whl",url = "https://files.pythonhosted.org/packages/4f/75/5ec0a28ae4a0804124ea5a5becd2b0fa3adf30967ac656711fb5cdf67c60/coverage-7.10.4-cp314-cp314-win32.whl",hashes = {sha256 = "fd2e6002be1c62476eb862b8514b1ba7e7684c50165f2a8d389e77da6c9a2ebd"}}, + {name = "coverage-7.10.4-cp314-cp314-win_amd64.whl",url = "https://files.pythonhosted.org/packages/9d/ab/66e2ee085ec60672bf5250f11101ad8143b81f24989e8c0e575d16bb1e53/coverage-7.10.4-cp314-cp314-win_amd64.whl",hashes = {sha256 = "ec113277f2b5cf188d95fb66a65c7431f2b9192ee7e6ec9b72b30bbfb53c244a"}}, + {name = "coverage-7.10.4-cp314-cp314-win_arm64.whl",url = "https://files.pythonhosted.org/packages/37/3b/00b448d385f149143190846217797d730b973c3c0ec2045a7e0f5db3a7d0/coverage-7.10.4-cp314-cp314-win_arm64.whl",hashes = {sha256 = "9744954bfd387796c6a091b50d55ca7cac3d08767795b5eec69ad0f7dbf12d38"}}, + {name = "coverage-7.10.4-cp314-cp314t-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/ee/2e/55e20d3d1ce00b513efb6fd35f13899e1c6d4f76c6cbcc9851c7227cd469/coverage-7.10.4-cp314-cp314t-macosx_10_13_x86_64.whl",hashes = {sha256 = "5af4829904dda6aabb54a23879f0f4412094ba9ef153aaa464e3c1b1c9bc98e6"}}, + {name = "coverage-7.10.4-cp314-cp314t-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/47/b3/aab1260df5876f5921e2c57519e73a6f6eeacc0ae451e109d44ee747563e/coverage-7.10.4-cp314-cp314t-macosx_11_0_arm64.whl",hashes = {sha256 = "7bba5ed85e034831fac761ae506c0644d24fd5594727e174b5a73aff343a7508"}}, + {name = "coverage-7.10.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/67/23/1cfe2aa50c7026180989f0bfc242168ac7c8399ccc66eb816b171e0ab05e/coverage-7.10.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "d57d555b0719834b55ad35045de6cc80fc2b28e05adb6b03c98479f9553b387f"}}, + {name = "coverage-7.10.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/9d/72/5882b6aeed3f9de7fc4049874fd7d24213bf1d06882f5c754c8a682606ec/coverage-7.10.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "ba62c51a72048bb1ea72db265e6bd8beaabf9809cd2125bbb5306c6ce105f214"}}, + {name = "coverage-7.10.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/1b/70/a0c76e3087596ae155f8e71a49c2c534c58b92aeacaf4d9d0cbbf2dde53b/coverage-7.10.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "0acf0c62a6095f07e9db4ec365cc58c0ef5babb757e54745a1aa2ea2a2564af1"}}, + {name = "coverage-7.10.4-cp314-cp314t-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/cb/5f/27e4cd4505b9a3c05257fb7fc509acbc778c830c450cb4ace00bf2b7bda7/coverage-7.10.4-cp314-cp314t-musllinux_1_2_aarch64.whl",hashes = {sha256 = "e1033bf0f763f5cf49ffe6594314b11027dcc1073ac590b415ea93463466deec"}}, + {name = "coverage-7.10.4-cp314-cp314t-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/02/d6/cf2ae3a7f90ab226ea765a104c4e76c5126f73c93a92eaea41e1dc6a1892/coverage-7.10.4-cp314-cp314t-musllinux_1_2_i686.whl",hashes = {sha256 = "92c29eff894832b6a40da1789b1f252305af921750b03ee4535919db9179453d"}}, + {name = "coverage-7.10.4-cp314-cp314t-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/9e/b1/39f222eab0d78aa2001cdb7852aa1140bba632db23a5cfd832218b496d6c/coverage-7.10.4-cp314-cp314t-musllinux_1_2_x86_64.whl",hashes = {sha256 = "822c4c830989c2093527e92acd97be4638a44eb042b1bdc0e7a278d84a070bd3"}}, + {name = "coverage-7.10.4-cp314-cp314t-win32.whl",url = "https://files.pythonhosted.org/packages/74/b2/49d82acefe2fe7c777436a3097f928c7242a842538b190f66aac01f29321/coverage-7.10.4-cp314-cp314t-win32.whl",hashes = {sha256 = "e694d855dac2e7cf194ba33653e4ba7aad7267a802a7b3fc4347d0517d5d65cd"}}, + {name = "coverage-7.10.4-cp314-cp314t-win_amd64.whl",url = "https://files.pythonhosted.org/packages/06/b0/afb942b6b2fc30bdbc7b05b087beae11c2b0daaa08e160586cf012b6ad70/coverage-7.10.4-cp314-cp314t-win_amd64.whl",hashes = {sha256 = "efcc54b38ef7d5bfa98050f220b415bc5bb3d432bd6350a861cf6da0ede2cdcd"}}, + {name = "coverage-7.10.4-cp314-cp314t-win_arm64.whl",url = "https://files.pythonhosted.org/packages/d8/66/e0531c9d1525cb6eac5b5733c76f27f3053ee92665f83f8899516fea6e76/coverage-7.10.4-cp314-cp314t-win_arm64.whl",hashes = {sha256 = "6f3a3496c0fa26bfac4ebc458747b778cff201c8ae94fa05e1391bab0dbc473c"}}, + {name = "coverage-7.10.4-cp313-cp313-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/46/b0/4a3662de81f2ed792a4e425d59c4ae50d8dd1d844de252838c200beed65a/coverage-7.10.4-cp313-cp313-macosx_10_13_x86_64.whl",hashes = {sha256 = "2b8e1d2015d5dfdbf964ecef12944c0c8c55b885bb5c0467ae8ef55e0e151233"}}, + {name = "coverage-7.10.4-cp313-cp313-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/c5/e8/e2dcffea01921bfffc6170fb4406cffb763a3b43a047bbd7923566708193/coverage-7.10.4-cp313-cp313-macosx_11_0_arm64.whl",hashes = {sha256 = "25735c299439018d66eb2dccf54f625aceb78645687a05f9f848f6e6c751e169"}}, + {name = "coverage-7.10.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/9d/59/cc89bb6ac869704d2781c2f5f7957d07097c77da0e8fdd4fd50dbf2ac9c0/coverage-7.10.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "715c06cb5eceac4d9b7cdf783ce04aa495f6aff657543fea75c30215b28ddb74"}}, + {name = "coverage-7.10.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/aa/23/3da089aa177ceaf0d3f96754ebc1318597822e6387560914cc480086e730/coverage-7.10.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "e017ac69fac9aacd7df6dc464c05833e834dc5b00c914d7af9a5249fcccf07ef"}}, + {name = "coverage-7.10.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/ad/82/e8693c368535b4e5fad05252a366a1794d481c79ae0333ed943472fd778d/coverage-7.10.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "bad180cc40b3fccb0f0e8c702d781492654ac2580d468e3ffc8065e38c6c2408"}}, + {name = "coverage-7.10.4-cp313-cp313-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/56/19/8b9cb13292e602fa4135b10a26ac4ce169a7fc7c285ff08bedd42ff6acca/coverage-7.10.4-cp313-cp313-musllinux_1_2_aarch64.whl",hashes = {sha256 = "becbdcd14f685fada010a5f792bf0895675ecf7481304fe159f0cd3f289550bd"}}, + {name = "coverage-7.10.4-cp313-cp313-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/10/e7/e5903990ce089527cf1c4f88b702985bd65c61ac245923f1ff1257dbcc02/coverage-7.10.4-cp313-cp313-musllinux_1_2_i686.whl",hashes = {sha256 = "0b485ca21e16a76f68060911f97ebbe3e0d891da1dbbce6af7ca1ab3f98b9097"}}, + {name = "coverage-7.10.4-cp313-cp313-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/dd/c9/7d464f116df1df7fe340669af1ddbe1a371fc60f3082ff3dc837c4f1f2ab/coverage-7.10.4-cp313-cp313-musllinux_1_2_x86_64.whl",hashes = {sha256 = "6c1d098ccfe8e1e0a1ed9a0249138899948afd2978cbf48eb1cc3fcd38469690"}}, + {name = "coverage-7.10.4-cp313-cp313-win32.whl",url = "https://files.pythonhosted.org/packages/ce/42/722e0cdbf6c19e7235c2020837d4e00f3b07820fd012201a983238cc3a30/coverage-7.10.4-cp313-cp313-win32.whl",hashes = {sha256 = "8630f8af2ca84b5c367c3df907b1706621abe06d6929f5045fd628968d421e6e"}}, + {name = "coverage-7.10.4-cp313-cp313-win_amd64.whl",url = "https://files.pythonhosted.org/packages/97/7e/aa70366f8275955cd51fa1ed52a521c7fcebcc0fc279f53c8c1ee6006dfe/coverage-7.10.4-cp313-cp313-win_amd64.whl",hashes = {sha256 = "f68835d31c421736be367d32f179e14ca932978293fe1b4c7a6a49b555dff5b2"}}, + {name = "coverage-7.10.4-cp313-cp313-win_arm64.whl",url = "https://files.pythonhosted.org/packages/ac/96/c39d92d5aad8fec28d4606556bfc92b6fee0ab51e4a548d9b49fb15a777c/coverage-7.10.4-cp313-cp313-win_arm64.whl",hashes = {sha256 = "6eaa61ff6724ca7ebc5326d1fae062d85e19b38dd922d50903702e6078370ae7"}}, + {name = "coverage-7.10.4-cp313-cp313t-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/79/13/34d549a6177bd80fa5db758cb6fd3057b7ad9296d8707d4ab7f480b0135f/coverage-7.10.4-cp313-cp313t-macosx_10_13_x86_64.whl",hashes = {sha256 = "702978108876bfb3d997604930b05fe769462cc3000150b0e607b7b444f2fd84"}}, + {name = "coverage-7.10.4-cp313-cp313t-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/6a/c0/433da866359bf39bf595f46d134ff2d6b4293aeea7f3328b6898733b0633/coverage-7.10.4-cp313-cp313t-macosx_11_0_arm64.whl",hashes = {sha256 = "e8f978e8c5521d9c8f2086ac60d931d583fab0a16f382f6eb89453fe998e2484"}}, + {name = "coverage-7.10.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/7e/d7/2b99aa8737f7801fd95222c79a4ebc8c5dd4460d4bed7ef26b17a60c8d74/coverage-7.10.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "df0ac2ccfd19351411c45e43ab60932b74472e4648b0a9edf6a3b58846e246a9"}}, + {name = "coverage-7.10.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/08/cf/86432b69d57debaef5abf19aae661ba8f4fcd2882fa762e14added4bd334/coverage-7.10.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "73a0d1aaaa3796179f336448e1576a3de6fc95ff4f07c2d7251d4caf5d18cf8d"}}, + {name = "coverage-7.10.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/23/78/85176593f4aa6e869cbed7a8098da3448a50e3fac5cb2ecba57729a5220d/coverage-7.10.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "873da6d0ed6b3ffc0bc01f2c7e3ad7e2023751c0d8d86c26fe7322c314b031dc"}}, + {name = "coverage-7.10.4-cp313-cp313t-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/88/1d/57a27b6789b79abcac0cc5805b31320d7a97fa20f728a6a7c562db9a3733/coverage-7.10.4-cp313-cp313t-musllinux_1_2_aarch64.whl",hashes = {sha256 = "c6446c75b0e7dda5daa876a1c87b480b2b52affb972fedd6c22edf1aaf2e00ec"}}, + {name = "coverage-7.10.4-cp313-cp313t-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/fa/e5/3e5ddfd42835c6def6cd5b2bdb3348da2e34c08d9c1211e91a49e9fd709d/coverage-7.10.4-cp313-cp313t-musllinux_1_2_i686.whl",hashes = {sha256 = "6e73933e296634e520390c44758d553d3b573b321608118363e52113790633b9"}}, + {name = "coverage-7.10.4-cp313-cp313t-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/1a/0b/d364f0f7ef111615dc4e05a6ed02cac7b6f2ac169884aa57faeae9eb5fa0/coverage-7.10.4-cp313-cp313t-musllinux_1_2_x86_64.whl",hashes = {sha256 = "52073d4b08d2cb571234c8a71eb32af3c6923149cf644a51d5957ac128cf6aa4"}}, + {name = "coverage-7.10.4-cp313-cp313t-win32.whl",url = "https://files.pythonhosted.org/packages/10/c6/bbea60a3b309621162e53faf7fac740daaf083048ea22077418e1ecaba3f/coverage-7.10.4-cp313-cp313t-win32.whl",hashes = {sha256 = "e24afb178f21f9ceb1aefbc73eb524769aa9b504a42b26857243f881af56880c"}}, + {name = "coverage-7.10.4-cp313-cp313t-win_amd64.whl",url = "https://files.pythonhosted.org/packages/44/a5/f9f080d49cfb117ddffe672f21eab41bd23a46179a907820743afac7c021/coverage-7.10.4-cp313-cp313t-win_amd64.whl",hashes = {sha256 = "be04507ff1ad206f4be3d156a674e3fb84bbb751ea1b23b142979ac9eebaa15f"}}, + {name = "coverage-7.10.4-cp313-cp313t-win_arm64.whl",url = "https://files.pythonhosted.org/packages/46/89/49a3fc784fa73d707f603e586d84a18c2e7796707044e9d73d13260930b7/coverage-7.10.4-cp313-cp313t-win_arm64.whl",hashes = {sha256 = "f3e3ff3f69d02b5dad67a6eac68cc9c71ae343b6328aae96e914f9f2f23a22e2"}}, + {name = "coverage-7.10.4-cp312-cp312-macosx_10_13_x86_64.whl",url = "https://files.pythonhosted.org/packages/9e/4a/781c9e4dd57cabda2a28e2ce5b00b6be416015265851060945a5ed4bd85e/coverage-7.10.4-cp312-cp312-macosx_10_13_x86_64.whl",hashes = {sha256 = "a1f0264abcabd4853d4cb9b3d164adbf1565da7dab1da1669e93f3ea60162d79"}}, + {name = "coverage-7.10.4-cp312-cp312-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/6a/8c/51255202ca03d2e7b664770289f80db6f47b05138e06cce112b3957d5dfd/coverage-7.10.4-cp312-cp312-macosx_11_0_arm64.whl",hashes = {sha256 = "536cbe6b118a4df231b11af3e0f974a72a095182ff8ec5f4868c931e8043ef3e"}}, + {name = "coverage-7.10.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/06/7f/df11131483698660f94d3c847dc76461369782d7a7644fcd72ac90da8fd0/coverage-7.10.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "9a4c0d84134797b7bf3f080599d0cd501471f6c98b715405166860d79cfaa97e"}}, + {name = "coverage-7.10.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/eb/fa/13ac5eda7300e160bf98f082e75f5c5b4189bf3a883dd1ee42dbedfdc617/coverage-7.10.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "7c155fc0f9cee8c9803ea0ad153ab6a3b956baa5d4cd993405dc0b45b2a0b9e0"}}, + {name = "coverage-7.10.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/9a/bc/f63b56a58ad0bec68a840e7be6b7ed9d6f6288d790760647bb88f5fea41e/coverage-7.10.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "0a5f2ab6e451d4b07855d8bcf063adf11e199bff421a4ba57f5bb95b7444ca62"}}, + {name = "coverage-7.10.4-cp312-cp312-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/2b/b6/79338f1ea27b01266f845afb4485976211264ab92407d1c307babe3592a7/coverage-7.10.4-cp312-cp312-musllinux_1_2_aarch64.whl",hashes = {sha256 = "685b67d99b945b0c221be0780c336b303a7753b3e0ec0d618c795aada25d5e7a"}}, + {name = "coverage-7.10.4-cp312-cp312-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/bc/93/3b24f1da3e0286a4dc5832427e1d448d5296f8287464b1ff4a222abeeeb5/coverage-7.10.4-cp312-cp312-musllinux_1_2_i686.whl",hashes = {sha256 = "0c079027e50c2ae44da51c2e294596cbc9dbb58f7ca45b30651c7e411060fc23"}}, + {name = "coverage-7.10.4-cp312-cp312-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/de/5f/d59412f869e49dcc5b89398ef3146c8bfaec870b179cc344d27932e0554b/coverage-7.10.4-cp312-cp312-musllinux_1_2_x86_64.whl",hashes = {sha256 = "3749aa72b93ce516f77cf5034d8e3c0dfd45c6e8a163a602ede2dc5f9a0bb927"}}, + {name = "coverage-7.10.4-cp312-cp312-win32.whl",url = "https://files.pythonhosted.org/packages/cc/52/04a3b733f40a0cc7c4a5b9b010844111dbf906df3e868b13e1ce7b39ac31/coverage-7.10.4-cp312-cp312-win32.whl",hashes = {sha256 = "fecb97b3a52fa9bcd5a7375e72fae209088faf671d39fae67261f37772d5559a"}}, + {name = "coverage-7.10.4-cp312-cp312-win_amd64.whl",url = "https://files.pythonhosted.org/packages/83/dd/12909fc0b83888197b3ec43a4ac7753589591c08d00d9deda4158df2734e/coverage-7.10.4-cp312-cp312-win_amd64.whl",hashes = {sha256 = "26de58f355626628a21fe6a70e1e1fad95702dafebfb0685280962ae1449f17b"}}, + {name = "coverage-7.10.4-cp312-cp312-win_arm64.whl",url = "https://files.pythonhosted.org/packages/83/c7/058bb3220fdd6821bada9685eadac2940429ab3c97025ce53549ff423cc1/coverage-7.10.4-cp312-cp312-win_arm64.whl",hashes = {sha256 = "67e8885408f8325198862bc487038a4980c9277d753cb8812510927f2176437a"}}, + {name = "coverage-7.10.4-cp311-cp311-macosx_10_9_x86_64.whl",url = "https://files.pythonhosted.org/packages/ec/ba/2c9817e62018e7d480d14f684c160b3038df9ff69c5af7d80e97d143e4d1/coverage-7.10.4-cp311-cp311-macosx_10_9_x86_64.whl",hashes = {sha256 = "05d5f98ec893d4a2abc8bc5f046f2f4367404e7e5d5d18b83de8fde1093ebc4f"}}, + {name = "coverage-7.10.4-cp311-cp311-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/e3/5a/093412a959a6b6261446221ba9fb23bb63f661a5de70b5d130763c87f916/coverage-7.10.4-cp311-cp311-macosx_11_0_arm64.whl",hashes = {sha256 = "9267efd28f8994b750d171e58e481e3bbd69e44baed540e4c789f8e368b24b88"}}, + {name = "coverage-7.10.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/2c/1f/2fdf4a71cfe93b07eae845ebf763267539a7d8b7e16b062f959d56d7e433/coverage-7.10.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "4456a039fdc1a89ea60823d0330f1ac6f97b0dbe9e2b6fb4873e889584b085fb"}}, + {name = "coverage-7.10.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/ba/16/33f6cded458e84f008b9f6bc379609a6a1eda7bffe349153b9960803fc11/coverage-7.10.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "c2bfbd2a9f7e68a21c5bd191be94bfdb2691ac40d325bac9ef3ae45ff5c753d9"}}, + {name = "coverage-7.10.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/84/98/9c18e47c889be58339ff2157c63b91a219272503ee32b49d926eea2337f2/coverage-7.10.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "0ab7765f10ae1df7e7fe37de9e64b5a269b812ee22e2da3f84f97b1c7732a0d8"}}, + {name = "coverage-7.10.4-cp311-cp311-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/6d/07/00a6c0d53e9a22d36d8e95ddd049b860eef8f4b9fd299f7ce34d8e323356/coverage-7.10.4-cp311-cp311-musllinux_1_2_aarch64.whl",hashes = {sha256 = "0a09b13695166236e171ec1627ff8434b9a9bae47528d0ba9d944c912d33b3d2"}}, + {name = "coverage-7.10.4-cp311-cp311-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/3e/0e/1e1b944d6a6483d07bab5ef6ce063fcf3d0cc555a16a8c05ebaab11f5607/coverage-7.10.4-cp311-cp311-musllinux_1_2_i686.whl",hashes = {sha256 = "5c9e75dfdc0167d5675e9804f04a56b2cf47fb83a524654297000b578b8adcb7"}}, + {name = "coverage-7.10.4-cp311-cp311-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/62/43/2ce5ab8a728b8e25ced077111581290ffaef9efaf860a28e25435ab925cf/coverage-7.10.4-cp311-cp311-musllinux_1_2_x86_64.whl",hashes = {sha256 = "c751261bfe6481caba15ec005a194cb60aad06f29235a74c24f18546d8377df0"}}, + {name = "coverage-7.10.4-cp311-cp311-win32.whl",url = "https://files.pythonhosted.org/packages/a4/f3/706c4a24f42c1c5f3a2ca56637ab1270f84d9e75355160dc34d5e39bb5b7/coverage-7.10.4-cp311-cp311-win32.whl",hashes = {sha256 = "051c7c9e765f003c2ff6e8c81ccea28a70fb5b0142671e4e3ede7cebd45c80af"}}, + {name = "coverage-7.10.4-cp311-cp311-win_amd64.whl",url = "https://files.pythonhosted.org/packages/e8/aa/6b9ea06e0290bf1cf2a2765bba89d561c5c563b4e9db8298bf83699c8b67/coverage-7.10.4-cp311-cp311-win_amd64.whl",hashes = {sha256 = "1a647b152f10be08fb771ae4a1421dbff66141e3d8ab27d543b5eb9ea5af8e52"}}, + {name = "coverage-7.10.4-cp311-cp311-win_arm64.whl",url = "https://files.pythonhosted.org/packages/8b/be/f0dc9ad50ee183369e643cd7ed8f2ef5c491bc20b4c3387cbed97dd6e0d1/coverage-7.10.4-cp311-cp311-win_arm64.whl",hashes = {sha256 = "b09b9e4e1de0d406ca9f19a371c2beefe3193b542f64a6dd40cfcf435b7d6aa0"}}, + {name = "coverage-7.10.4-cp310-cp310-macosx_10_9_x86_64.whl",url = "https://files.pythonhosted.org/packages/9c/f4/350759710db50362685f922259c140592dba15eb4e2325656a98413864d9/coverage-7.10.4-cp310-cp310-macosx_10_9_x86_64.whl",hashes = {sha256 = "d92d6edb0ccafd20c6fbf9891ca720b39c2a6a4b4a6f9cf323ca2c986f33e475"}}, + {name = "coverage-7.10.4-cp310-cp310-macosx_11_0_arm64.whl",url = "https://files.pythonhosted.org/packages/29/7e/e467c2bb4d5ecfd166bfd22c405cce4c50de2763ba1d78e2729c59539a42/coverage-7.10.4-cp310-cp310-macosx_11_0_arm64.whl",hashes = {sha256 = "7202da14dc0236884fcc45665ffb2d79d4991a53fbdf152ab22f69f70923cc22"}}, + {name = "coverage-7.10.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",url = "https://files.pythonhosted.org/packages/62/ab/2accdd1ccfe63b890e5eb39118f63c155202df287798364868a2884a50af/coverage-7.10.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl",hashes = {sha256 = "ada418633ae24ec8d0fcad5efe6fc7aa3c62497c6ed86589e57844ad04365674"}}, + {name = "coverage-7.10.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",url = "https://files.pythonhosted.org/packages/43/04/c14c33d0cfc0f4db6b3504d01a47f4c798563d932a836fd5f2dbc0521d3d/coverage-7.10.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",hashes = {sha256 = "b828e33eca6c3322adda3b5884456f98c435182a44917ded05005adfa1415500"}}, + {name = "coverage-7.10.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",url = "https://files.pythonhosted.org/packages/99/71/147053061f1f51c1d3b3d040c3cb26876964a3a0dca0765d2441411ca568/coverage-7.10.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",hashes = {sha256 = "802793ba397afcfdbe9f91f89d65ae88b958d95edc8caf948e1f47d8b6b2b606"}}, + {name = "coverage-7.10.4-cp310-cp310-musllinux_1_2_aarch64.whl",url = "https://files.pythonhosted.org/packages/cc/92/7ef882205d4d4eb502e6154ee7122c1a1b1ce3f29d0166921e0fb550a5d3/coverage-7.10.4-cp310-cp310-musllinux_1_2_aarch64.whl",hashes = {sha256 = "d0b23512338c54101d3bf7a1ab107d9d75abda1d5f69bc0887fd079253e4c27e"}}, + {name = "coverage-7.10.4-cp310-cp310-musllinux_1_2_i686.whl",url = "https://files.pythonhosted.org/packages/ab/3d/297a20603abcc6c7d89d801286eb477b0b861f3c5a4222730f1c9837be3e/coverage-7.10.4-cp310-cp310-musllinux_1_2_i686.whl",hashes = {sha256 = "f36b7dcf72d06a8c5e2dd3aca02be2b1b5db5f86404627dff834396efce958f2"}}, + {name = "coverage-7.10.4-cp310-cp310-musllinux_1_2_x86_64.whl",url = "https://files.pythonhosted.org/packages/65/f9/b04111438f41f1ddd5dc88706d5f8064ae5bb962203c49fe417fa23a362d/coverage-7.10.4-cp310-cp310-musllinux_1_2_x86_64.whl",hashes = {sha256 = "fce316c367a1dc2c411821365592eeb335ff1781956d87a0410eae248188ba51"}}, + {name = "coverage-7.10.4-cp310-cp310-win32.whl",url = "https://files.pythonhosted.org/packages/1e/e5/c7d9eb7a9ea66cf92d069077719fb2b07782dcd7050b01a9b88766b52154/coverage-7.10.4-cp310-cp310-win32.whl",hashes = {sha256 = "8c5dab29fc8070b3766b5fc85f8d89b19634584429a2da6d42da5edfadaf32ae"}}, + {name = "coverage-7.10.4-cp310-cp310-win_amd64.whl",url = "https://files.pythonhosted.org/packages/66/30/4d9d3b81f5a836b31a7428b8a25e6d490d4dca5ff2952492af130153c35c/coverage-7.10.4-cp310-cp310-win_amd64.whl",hashes = {sha256 = "4b0d114616f0fccb529a1817457d5fb52a10e106f86c5fb3b0bd0d45d0d69b93"}}, + {name = "coverage-7.10.4-py3-none-any.whl",url = "https://files.pythonhosted.org/packages/bb/78/983efd23200921d9edb6bd40512e1aa04af553d7d5a171e50f9b2b45d109/coverage-7.10.4-py3-none-any.whl",hashes = {sha256 = "065d75447228d05121e5c938ca8f0e91eed60a1eb2d1258d42d5084fecfc3302"}}, ] marker = "\"dev\" in extras" @@ -3356,7 +3355,7 @@ marker = "python_version < \"3.10\" and python_version >= \"3.9\" and \"default\ dependencies = [] [tool.pdm] -hashes = {sha256 = "577e67bfb0ed2a6720563c8b33b620589112d551032680c8b793b659b9535019"} +hashes = {sha256 = "c39a615c508530a93ca31286816c5df4cd3c5c70bd67fdc976c2a976c4179944"} strategy = ["inherit_metadata", "static_urls"] [[tool.pdm.targets]] diff --git a/src/guidellm/utils/dict.py b/src/guidellm/utils/dict.py index 9432bacc..5b4579c9 100644 --- a/src/guidellm/utils/dict.py +++ b/src/guidellm/utils/dict.py @@ -1,23 +1,23 @@ def recursive_key_update(d, key_update_func): - if not isinstance(d, dict) and not isinstance(d, list): - return d + if not isinstance(d, dict) and not isinstance(d, list): + return d - if isinstance(d, list): - for item in d: - recursive_key_update(item, key_update_func) - return d + if isinstance(d, list): + for item in d: + recursive_key_update(item, key_update_func) + return d - updated_key_pairs = [] - for key, _ in d.items(): - updated_key = key_update_func(key) - if key != updated_key: - updated_key_pairs.append((key, updated_key )) + updated_key_pairs = [] + for key, _ in d.items(): + updated_key = key_update_func(key) + if key != updated_key: + updated_key_pairs.append((key, updated_key)) - for key_pair in updated_key_pairs: - old_key, updated_key = key_pair - d[updated_key] = d[old_key] - del d[old_key] + for key_pair in updated_key_pairs: + old_key, updated_key = key_pair + d[updated_key] = d[old_key] + del d[old_key] - for _, value in d.items(): - recursive_key_update(value, key_update_func) - return d + for _, value in d.items(): + recursive_key_update(value, key_update_func) + return d diff --git a/src/guidellm/utils/text.py b/src/guidellm/utils/text.py index e11598de..539ea8a0 100644 --- a/src/guidellm/utils/text.py +++ b/src/guidellm/utils/text.py @@ -191,10 +191,8 @@ def is_puncutation(text: str) -> bool: def camelize_str(snake_case_string: str) -> str: - return ( - words := - snake_case_string.split("_"))[0].lower() + "".join(word.capitalize() - for word in words[1:] + return (words := snake_case_string.split("_"))[0].lower() + "".join( + word.capitalize() for word in words[1:] ) diff --git a/tests/unit/utils/dict.py b/tests/unit/utils/dict.py index 82ec22a2..09d93df6 100644 --- a/tests/unit/utils/dict.py +++ b/tests/unit/utils/dict.py @@ -4,73 +4,68 @@ def update_str(string): - return string + "_updated" + return string + "_updated" + @pytest.mark.smoke def test_recursive_key_update_updates_keys(): - my_dict = { - "my_key": { - "my_nested_key": { - "my_double_nested_key": "someValue" - }, - "my_other_nested_key": "someValue" - }, - "my_other_key": "value" - } - my_updated_dict = { - "my_key_updated": { - "my_nested_key_updated": { - "my_double_nested_key_updated": "someValue" - }, - "my_other_nested_key_updated": "someValue" - }, - "my_other_key_updated": "value" - } - recursive_key_update(my_dict, update_str) - assert my_dict == my_updated_dict + my_dict = { + "my_key": { + "my_nested_key": {"my_double_nested_key": "someValue"}, + "my_other_nested_key": "someValue", + }, + "my_other_key": "value", + } + my_updated_dict = { + "my_key_updated": { + "my_nested_key_updated": {"my_double_nested_key_updated": "someValue"}, + "my_other_nested_key_updated": "someValue", + }, + "my_other_key_updated": "value", + } + recursive_key_update(my_dict, update_str) + assert my_dict == my_updated_dict def truncate_str_to_ten(string): - return string[:10] + return string[:10] @pytest.mark.smoke def test_recursive_key_update_leaves_unchanged_keys(): - my_dict = { - "my_key": { - "my_nested_key": { - "my_double_nested_key": "someValue" - }, - "my_other_nested_key": "someValue" - }, - "my_other_key": "value" - } - my_updated_dict = { - "my_key": { - "my_nested_": { - "my_double_": "someValue" - }, - "my_other_n": "someValue" - }, - "my_other_k": "value" - } - recursive_key_update(my_dict, truncate_str_to_ten) - assert my_dict == my_updated_dict + my_dict = { + "my_key": { + "my_nested_key": {"my_double_nested_key": "someValue"}, + "my_other_nested_key": "someValue", + }, + "my_other_key": "value", + } + my_updated_dict = { + "my_key": { + "my_nested_": {"my_double_": "someValue"}, + "my_other_n": "someValue", + }, + "my_other_k": "value", + } + recursive_key_update(my_dict, truncate_str_to_ten) + assert my_dict == my_updated_dict @pytest.mark.smoke def test_recursive_key_update_updates_dicts_in_list(): - my_dict = { - "my_key": - [{ "my_list_item_key_1": "someValue" }, - { "my_list_item_key_2": "someValue" }, - { "my_list_item_key_3": "someValue" }] - } - my_updated_dict = { - "my_key_updated": - [{ "my_list_item_key_1_updated": "someValue" }, - { "my_list_item_key_2_updated": "someValue" }, - { "my_list_item_key_3_updated": "someValue" }] - } - recursive_key_update(my_dict, update_str) - assert my_dict == my_updated_dict + my_dict = { + "my_key": [ + {"my_list_item_key_1": "someValue"}, + {"my_list_item_key_2": "someValue"}, + {"my_list_item_key_3": "someValue"}, + ] + } + my_updated_dict = { + "my_key_updated": [ + {"my_list_item_key_1_updated": "someValue"}, + {"my_list_item_key_2_updated": "someValue"}, + {"my_list_item_key_3_updated": "someValue"}, + ] + } + recursive_key_update(my_dict, update_str) + assert my_dict == my_updated_dict diff --git a/tests/unit/utils/text.py b/tests/unit/utils/text.py index b37ea950..ae0fa52f 100644 --- a/tests/unit/utils/text.py +++ b/tests/unit/utils/text.py @@ -5,8 +5,9 @@ @pytest.mark.smoke def test_camelize_str_camelizes_string(): - assert camelize_str("no_longer_snake_case") == "noLongerSnakeCase" + assert camelize_str("no_longer_snake_case") == "noLongerSnakeCase" + @pytest.mark.smoke def test_camelize_str_leaves_non_snake_case_text_untouched(): - assert camelize_str("notsnakecase") == "notsnakecase" + assert camelize_str("notsnakecase") == "notsnakecase"