From 5c59afd021752ede5378c35b5dcd2a0095c17ff8 Mon Sep 17 00:00:00 2001 From: Derek Wan Date: Sat, 21 Sep 2024 00:44:17 +0900 Subject: [PATCH] save --- pyproject.toml | 1 + requirements.txt | 4 ++-- requirements/altair.txt | 2 +- requirements/jupyter.txt | 4 ++-- requirements/streamlit.txt | 4 ++-- requirements/zlib.txt | 39 ++++++++++++++++++++++++++++++++++++++ scripts/packages.txt | 1 + src/tests/test_zlib.py | 37 ++++++++++++++++++++++++++++++++++++ src/utilities/__init__.py | 2 +- src/utilities/hashlib.py | 4 ++-- src/utilities/zlib.py | 14 ++++++++++++++ 11 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 requirements/zlib.txt create mode 100644 src/tests/test_zlib.py create mode 100644 src/utilities/zlib.py diff --git a/pyproject.toml b/pyproject.toml index d91286f72..30037d1b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -254,6 +254,7 @@ zzz-test-typing = [] zzz-test-warnings = [] zzz-test-whenever = ["whenever >= 0.6.9, < 0.7"] zzz-test-zipfile = [] +zzz-test-zlib = ["orjson >= 3.10.7, < 3.11"] zzz-test-zoneinfo = ["tzdata >= 2024.1, < 2024.2"] [project.scripts] diff --git a/requirements.txt b/requirements.txt index f8086c2ec..0944386cb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -186,7 +186,7 @@ multidict==6.1.0 # via # aiohttp # yarl -narwhals==1.8.1 +narwhals==1.8.2 # via altair nest-asyncio==1.6.0 # via dycw-utilities (pyproject.toml) @@ -234,7 +234,7 @@ packaging==24.1 # pytest # pytest-rerunfailures # streamlit -pandas==2.2.2 +pandas==2.2.3 # via # streamlit # vegafusion diff --git a/requirements/altair.txt b/requirements/altair.txt index e194c61b4..9a8f1487f 100644 --- a/requirements/altair.txt +++ b/requirements/altair.txt @@ -29,7 +29,7 @@ lxml==5.3.0 # via pikepdf markupsafe==2.1.5 # via jinja2 -narwhals==1.8.1 +narwhals==1.8.2 # via altair packaging==24.1 # via diff --git a/requirements/jupyter.txt b/requirements/jupyter.txt index 52a73a915..ff3d15159 100644 --- a/requirements/jupyter.txt +++ b/requirements/jupyter.txt @@ -161,7 +161,7 @@ packaging==24.1 # nbconvert # pytest # pytest-rerunfailures -pandas==2.2.2 +pandas==2.2.3 # via dycw-utilities (pyproject.toml) pandocfilters==1.5.1 # via nbconvert @@ -175,7 +175,7 @@ pluggy==1.5.0 # via pytest polars-lts-cpu==1.7.1 # via dycw-utilities (pyproject.toml) -prometheus-client==0.20.0 +prometheus-client==0.21.0 # via jupyter-server prompt-toolkit==3.0.47 # via ipython diff --git a/requirements/streamlit.txt b/requirements/streamlit.txt index fd7b6a61e..cef3d9dfe 100644 --- a/requirements/streamlit.txt +++ b/requirements/streamlit.txt @@ -43,7 +43,7 @@ markupsafe==2.1.5 # via jinja2 mdurl==0.1.2 # via markdown-it-py -narwhals==1.8.1 +narwhals==1.8.2 # via altair numpy==2.1.1 # via @@ -57,7 +57,7 @@ packaging==24.1 # pytest # pytest-rerunfailures # streamlit -pandas==2.2.2 +pandas==2.2.3 # via streamlit pillow==10.4.0 # via streamlit diff --git a/requirements/zlib.txt b/requirements/zlib.txt new file mode 100644 index 000000000..1be3cb194 --- /dev/null +++ b/requirements/zlib.txt @@ -0,0 +1,39 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile --extra=zzz-test-defaults --extra=zzz-test-zlib --prerelease=disallow --output-file=requirements/zlib.txt --python-version=3.11 pyproject.toml +attrs==24.2.0 + # via hypothesis +coverage==7.6.1 + # via pytest-cov +hypothesis==6.112.1 + # via dycw-utilities (pyproject.toml) +iniconfig==2.0.0 + # via pytest +orjson==3.10.7 + # via dycw-utilities (pyproject.toml) +packaging==24.1 + # via + # pytest + # pytest-rerunfailures +pluggy==1.5.0 + # via pytest +pytest==8.3.3 + # via + # dycw-utilities (pyproject.toml) + # pytest-asyncio + # pytest-cov + # pytest-randomly + # pytest-rerunfailures +pytest-asyncio==0.23.8 + # via dycw-utilities (pyproject.toml) +pytest-cov==5.0.0 + # via dycw-utilities (pyproject.toml) +pytest-randomly==3.15.0 + # via dycw-utilities (pyproject.toml) +pytest-rerunfailures==14.0 + # via dycw-utilities (pyproject.toml) +sortedcontainers==2.4.0 + # via hypothesis +tomli==2.0.1 + # via coverage +typing-extensions==4.12.2 + # via dycw-utilities (pyproject.toml) diff --git a/scripts/packages.txt b/scripts/packages.txt index 7d89f4af6..3b4cc2a65 100644 --- a/scripts/packages.txt +++ b/scripts/packages.txt @@ -69,4 +69,5 @@ typing warnings whenever zipfile +zlib zoneinfo diff --git a/src/tests/test_zlib.py b/src/tests/test_zlib.py new file mode 100644 index 000000000..94ee4eaa0 --- /dev/null +++ b/src/tests/test_zlib.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import Any + +from hypothesis import given +from hypothesis.strategies import ( + DataObject, + SearchStrategy, + data, + dictionaries, + frozensets, + lists, + sets, + tuples, +) +from pytest import mark, param + +from utilities.hypothesis import int64s, text_ascii +from utilities.zlib import crc32_hash + + +class TestCRC32Hash: + @given(data=data()) + @mark.parametrize( + "strategy", + [ + param(dictionaries(text_ascii(), int64s(), max_size=3)), + param(frozensets(int64s(), max_size=3)), + param(lists(int64s(), max_size=3)), + param(sets(int64s(), max_size=3)), + ], + ) + def test_main(self, *, data: DataObject, strategy: SearchStrategy[Any]) -> None: + x, y = data.draw(tuples(strategy, strategy)) + res = crc32_hash(x) == crc32_hash(y) + expected = x == y + assert res is expected diff --git a/src/utilities/__init__.py b/src/utilities/__init__.py index 5a652112a..585c8e92b 100644 --- a/src/utilities/__init__.py +++ b/src/utilities/__init__.py @@ -1,3 +1,3 @@ from __future__ import annotations -__version__ = "0.57.11" +__version__ = "0.57.12" diff --git a/src/utilities/hashlib.py b/src/utilities/hashlib.py index ad3b0d147..4428cc0fc 100644 --- a/src/utilities/hashlib.py +++ b/src/utilities/hashlib.py @@ -3,11 +3,11 @@ from hashlib import md5 from typing import Any -from utilities.orjson import serialize - def md5_hash(obj: Any, /) -> str: """Compute the MD5 hash of an arbitrary object.""" + from utilities.orjson import serialize + return md5(serialize(obj), usedforsecurity=False).hexdigest() diff --git a/src/utilities/zlib.py b/src/utilities/zlib.py new file mode 100644 index 000000000..add56e725 --- /dev/null +++ b/src/utilities/zlib.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +from typing import Any +from zlib import crc32 + + +def crc32_hash(obj: Any, /) -> int: + """Compute the CRC32 hash of an arbitrary object.""" + from utilities.orjson import serialize + + return crc32(serialize(obj)) + + +__all__ = ["crc32_hash"]