dycw-utilities 0.126.0__tar.gz → 0.126.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/PKG-INFO +2 -2
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/pyproject.toml +4 -4
- dycw_utilities-0.126.2/src/tests/test_errors.py +52 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_redis.py +7 -12
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/errors.py +4 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/redis.py +12 -22
- dycw_utilities-0.126.0/src/tests/test_errors.py +0 -28
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/.gitignore +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/LICENSE +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/README.md +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/click.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/git.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/http.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/math.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/os.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/period.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/random.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/re.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/string.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/text.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/types.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/version.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dycw-utilities
|
3
|
-
Version: 0.126.
|
3
|
+
Version: 0.126.2
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
5
5
|
License-File: LICENSE
|
6
6
|
Requires-Python: >=3.12
|
@@ -174,7 +174,7 @@ Requires-Dist: scipy<1.16,>=1.15.3; extra == 'zzz-test-scipy'
|
|
174
174
|
Provides-Extra: zzz-test-sentinel
|
175
175
|
Provides-Extra: zzz-test-shelve
|
176
176
|
Provides-Extra: zzz-test-slack-sdk
|
177
|
-
Requires-Dist: aiohttp<3.12.
|
177
|
+
Requires-Dist: aiohttp<3.12.7,>=3.12.6; extra == 'zzz-test-slack-sdk'
|
178
178
|
Requires-Dist: slack-sdk<3.36,>=3.35.0; extra == 'zzz-test-slack-sdk'
|
179
179
|
Provides-Extra: zzz-test-socket
|
180
180
|
Provides-Extra: zzz-test-sqlalchemy
|
@@ -8,7 +8,7 @@ requires = ["hatchling"]
|
|
8
8
|
# dependency groups
|
9
9
|
[dependency-groups]
|
10
10
|
dev = [
|
11
|
-
"aiohttp >= 3.12.
|
11
|
+
"aiohttp >= 3.12.6, < 3.12.7", # for slack
|
12
12
|
"aiosqlite >= 0.21.0, < 0.22",
|
13
13
|
"altair >= 5.5.0, < 5.6",
|
14
14
|
"asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
|
@@ -94,7 +94,7 @@ dependencies = [
|
|
94
94
|
name = "dycw-utilities"
|
95
95
|
readme = "README.md"
|
96
96
|
requires-python = ">= 3.12"
|
97
|
-
version = "0.126.
|
97
|
+
version = "0.126.2"
|
98
98
|
|
99
99
|
[project.optional-dependencies]
|
100
100
|
test = [
|
@@ -271,7 +271,7 @@ zzz-test-scipy = ["scipy >= 1.15.3, < 1.16"]
|
|
271
271
|
zzz-test-sentinel = []
|
272
272
|
zzz-test-shelve = []
|
273
273
|
zzz-test-slack-sdk = [
|
274
|
-
"aiohttp >= 3.12.
|
274
|
+
"aiohttp >= 3.12.6, < 3.12.7", # for slack
|
275
275
|
"slack-sdk >= 3.35.0, < 3.36",
|
276
276
|
]
|
277
277
|
zzz-test-socket = []
|
@@ -335,7 +335,7 @@ zzz-test-zoneinfo = [
|
|
335
335
|
# bump-my-version
|
336
336
|
[tool.bumpversion]
|
337
337
|
allow_dirty = true
|
338
|
-
current_version = "0.126.
|
338
|
+
current_version = "0.126.2"
|
339
339
|
|
340
340
|
[[tool.bumpversion.files]]
|
341
341
|
filename = "src/utilities/__init__.py"
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from asyncio import TaskGroup
|
4
|
+
|
5
|
+
from pytest import raises
|
6
|
+
|
7
|
+
from utilities.errors import ImpossibleCaseError, repr_error
|
8
|
+
|
9
|
+
|
10
|
+
class TestImpossibleCaseError:
|
11
|
+
def test_main(self) -> None:
|
12
|
+
x = None
|
13
|
+
with raises(ImpossibleCaseError, match=r"Case must be possible: x=None\."):
|
14
|
+
raise ImpossibleCaseError(case=[f"{x=}"])
|
15
|
+
|
16
|
+
|
17
|
+
class TestReprError:
|
18
|
+
def test_class(self) -> None:
|
19
|
+
class CustomError(Exception): ...
|
20
|
+
|
21
|
+
result = repr_error(CustomError)
|
22
|
+
expected = "CustomError"
|
23
|
+
assert result == expected
|
24
|
+
|
25
|
+
async def test_group(self) -> None:
|
26
|
+
class Custom1Error(Exception): ...
|
27
|
+
|
28
|
+
async def coroutine1() -> None:
|
29
|
+
raise Custom1Error
|
30
|
+
|
31
|
+
class Custom2Error(Exception): ...
|
32
|
+
|
33
|
+
async def coroutine2() -> None:
|
34
|
+
msg = "message2"
|
35
|
+
raise Custom2Error(msg)
|
36
|
+
|
37
|
+
with raises(ExceptionGroup) as exc_info: # noqa: PT012
|
38
|
+
async with TaskGroup() as tg:
|
39
|
+
_ = tg.create_task(coroutine1())
|
40
|
+
_ = tg.create_task(coroutine2())
|
41
|
+
error = exc_info.value
|
42
|
+
assert isinstance(error, ExceptionGroup)
|
43
|
+
result = repr_error(error)
|
44
|
+
expected = "ExceptionGroup(Custom1Error(), Custom2Error(message2))"
|
45
|
+
assert result == expected
|
46
|
+
|
47
|
+
def test_instance(self) -> None:
|
48
|
+
class CustomError(Exception): ...
|
49
|
+
|
50
|
+
result = repr_error(CustomError("message"))
|
51
|
+
expected = "CustomError(message)"
|
52
|
+
assert result == expected
|
@@ -42,9 +42,8 @@ from utilities.redis import (
|
|
42
42
|
PublishError,
|
43
43
|
PublishService,
|
44
44
|
SubscribeService,
|
45
|
-
|
46
|
-
|
47
|
-
_RedisMessageUnsubscribe,
|
45
|
+
_is_message,
|
46
|
+
_RedisMessage,
|
48
47
|
publish,
|
49
48
|
redis_hash_map_key,
|
50
49
|
redis_key,
|
@@ -71,7 +70,7 @@ def channels(draw: DrawFn, /) -> str:
|
|
71
70
|
return f"test_{now}_{key}_{pid}"
|
72
71
|
|
73
72
|
|
74
|
-
class
|
73
|
+
class TestIsMessage:
|
75
74
|
@mark.parametrize(
|
76
75
|
("message", "channels", "expected"),
|
77
76
|
[
|
@@ -113,13 +112,9 @@ class TestIsSubscribeMessage:
|
|
113
112
|
],
|
114
113
|
)
|
115
114
|
def test_main(
|
116
|
-
self,
|
117
|
-
*,
|
118
|
-
message: _RedisMessageSubscribe | _RedisMessageUnsubscribe | None,
|
119
|
-
channels: Sequence[bytes],
|
120
|
-
expected: bool,
|
115
|
+
self, *, message: Any, channels: Sequence[bytes], expected: bool
|
121
116
|
) -> None:
|
122
|
-
result =
|
117
|
+
result = _is_message(message, channels=channels)
|
123
118
|
assert result is expected
|
124
119
|
|
125
120
|
|
@@ -558,7 +553,7 @@ class TestSubscribe:
|
|
558
553
|
@settings_with_reduced_examples(phases={Phase.generate})
|
559
554
|
@SKIPIF_CI_AND_NOT_LINUX
|
560
555
|
async def test_raw(self, *, channel: str, messages: Sequence[str]) -> None:
|
561
|
-
queue: Queue[
|
556
|
+
queue: Queue[_RedisMessage] = Queue()
|
562
557
|
async with (
|
563
558
|
yield_redis() as redis,
|
564
559
|
subscribe(redis, channel, queue, output="raw"),
|
@@ -583,7 +578,7 @@ class TestSubscribe:
|
|
583
578
|
@settings_with_reduced_examples(phases={Phase.generate})
|
584
579
|
@SKIPIF_CI_AND_NOT_LINUX
|
585
580
|
async def test_text(self, *, channel: str, messages: Sequence[str]) -> None:
|
586
|
-
queue: Queue[
|
581
|
+
queue: Queue[_RedisMessage] = Queue()
|
587
582
|
async with (
|
588
583
|
yield_redis() as redis,
|
589
584
|
subscribe(redis, channel, queue, output="raw"),
|
@@ -24,6 +24,10 @@ class ImpossibleCaseError(Exception):
|
|
24
24
|
def repr_error(error: MaybeType[BaseException], /) -> str:
|
25
25
|
"""Get a string representation of an error."""
|
26
26
|
match error:
|
27
|
+
case ExceptionGroup() as group:
|
28
|
+
descs = list(map(repr_error, group.exceptions))
|
29
|
+
joined = ", ".join(descs)
|
30
|
+
return f"{group.__class__.__name__}({joined})"
|
27
31
|
case BaseException() as error_obj:
|
28
32
|
return f"{error_obj.__class__.__name__}({error_obj})"
|
29
33
|
case type() as error_cls:
|
@@ -657,7 +657,7 @@ class PublisherError(Exception):
|
|
657
657
|
|
658
658
|
|
659
659
|
@dataclass(kw_only=True)
|
660
|
-
class PublishService(Looper[tuple[str, _T]]):
|
660
|
+
class PublishService(Looper[tuple[str, bytes | str | _T]]):
|
661
661
|
"""Service to publish items to Redis."""
|
662
662
|
|
663
663
|
# base
|
@@ -677,7 +677,7 @@ class PublishService(Looper[tuple[str, _T]]):
|
|
677
677
|
_ = await publish(
|
678
678
|
self.redis,
|
679
679
|
channel,
|
680
|
-
|
680
|
+
data,
|
681
681
|
serializer=self.serializer,
|
682
682
|
timeout=self.publish_timeout,
|
683
683
|
)
|
@@ -695,7 +695,7 @@ _SUBSCRIBE_SLEEP: Duration = MILLISECOND
|
|
695
695
|
def subscribe(
|
696
696
|
redis: Redis,
|
697
697
|
channels: MaybeIterable[str],
|
698
|
-
queue: Queue[
|
698
|
+
queue: Queue[_RedisMessage],
|
699
699
|
/,
|
700
700
|
*,
|
701
701
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
@@ -742,7 +742,7 @@ def subscribe(
|
|
742
742
|
async def subscribe(
|
743
743
|
redis: Redis,
|
744
744
|
channels: MaybeIterable[str],
|
745
|
-
queue: Queue[
|
745
|
+
queue: Queue[_RedisMessage] | Queue[bytes] | Queue[_T],
|
746
746
|
/,
|
747
747
|
*,
|
748
748
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
@@ -758,12 +758,12 @@ async def subscribe(
|
|
758
758
|
transform = cast("Any", itemgetter("data"))
|
759
759
|
case "text":
|
760
760
|
|
761
|
-
def transform(message:
|
761
|
+
def transform(message: _RedisMessage, /) -> str: # pyright: ignore[reportRedeclaration]
|
762
762
|
return message["data"].decode()
|
763
763
|
|
764
764
|
case Callable() as deserialize:
|
765
765
|
|
766
|
-
def transform(message:
|
766
|
+
def transform(message: _RedisMessage, /) -> _T:
|
767
767
|
return deserialize(message["data"])
|
768
768
|
|
769
769
|
case _ as never:
|
@@ -783,7 +783,7 @@ async def subscribe(
|
|
783
783
|
async def _subscribe_core(
|
784
784
|
redis: Redis,
|
785
785
|
channels: MaybeIterable[str],
|
786
|
-
transform: Callable[[
|
786
|
+
transform: Callable[[_RedisMessage], Any],
|
787
787
|
queue: Queue[Any],
|
788
788
|
/,
|
789
789
|
*,
|
@@ -795,14 +795,11 @@ async def _subscribe_core(
|
|
795
795
|
)
|
796
796
|
sleep_use = datetime_duration_to_float(sleep) # skipif-ci-and-not-linux
|
797
797
|
is_subscribe_message = partial( # skipif-ci-and-not-linux
|
798
|
-
|
798
|
+
_is_message, channels={c.encode() for c in channels}
|
799
799
|
)
|
800
800
|
async with yield_pubsub(redis, channels) as pubsub: # skipif-ci-and-not-linux
|
801
801
|
while True:
|
802
|
-
message =
|
803
|
-
"_RedisMessageSubscribe | _RedisMessageUnsubscribe | None",
|
804
|
-
await pubsub.get_message(timeout=timeout_use),
|
805
|
-
)
|
802
|
+
message = await pubsub.get_message(timeout=timeout_use)
|
806
803
|
if is_subscribe_message(message):
|
807
804
|
if isinstance(queue, EnhancedQueue):
|
808
805
|
queue.put_right_nowait(transform(message))
|
@@ -812,9 +809,9 @@ async def _subscribe_core(
|
|
812
809
|
await asyncio.sleep(sleep_use)
|
813
810
|
|
814
811
|
|
815
|
-
def
|
812
|
+
def _is_message(
|
816
813
|
message: Any, /, *, channels: Collection[bytes]
|
817
|
-
) -> TypeGuard[
|
814
|
+
) -> TypeGuard[_RedisMessage]:
|
818
815
|
return (
|
819
816
|
isinstance(message, Mapping)
|
820
817
|
and ("type" in message)
|
@@ -828,20 +825,13 @@ def _is_subscribe_message(
|
|
828
825
|
)
|
829
826
|
|
830
827
|
|
831
|
-
class
|
828
|
+
class _RedisMessage(TypedDict):
|
832
829
|
type: Literal["subscribe", "psubscribe", "message", "pmessage"]
|
833
830
|
pattern: str | None
|
834
831
|
channel: bytes
|
835
832
|
data: bytes
|
836
833
|
|
837
834
|
|
838
|
-
class _RedisMessageUnsubscribe(TypedDict):
|
839
|
-
type: Literal["unsubscribe", "punsubscribe"]
|
840
|
-
pattern: str | None
|
841
|
-
channel: bytes
|
842
|
-
data: int
|
843
|
-
|
844
|
-
|
845
835
|
##
|
846
836
|
|
847
837
|
|
@@ -1,28 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from pytest import raises
|
4
|
-
|
5
|
-
from utilities.errors import ImpossibleCaseError, repr_error
|
6
|
-
|
7
|
-
|
8
|
-
class TestImpossibleCaseError:
|
9
|
-
def test_main(self) -> None:
|
10
|
-
x = None
|
11
|
-
with raises(ImpossibleCaseError, match=r"Case must be possible: x=None\."):
|
12
|
-
raise ImpossibleCaseError(case=[f"{x=}"])
|
13
|
-
|
14
|
-
|
15
|
-
class TestReprError:
|
16
|
-
def test_class(self) -> None:
|
17
|
-
class CustomError(Exception): ...
|
18
|
-
|
19
|
-
result = repr_error(CustomError)
|
20
|
-
expected = "CustomError"
|
21
|
-
assert result == expected
|
22
|
-
|
23
|
-
def test_instance(self) -> None:
|
24
|
-
class CustomError(Exception): ...
|
25
|
-
|
26
|
-
result = repr_error(CustomError())
|
27
|
-
expected = "CustomError()"
|
28
|
-
assert result == expected
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/module_2.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/__init__.py
RENAMED
File without changes
|
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/decorated_async.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/decorated_sync.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/error_bind.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/recursive.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/task_group_one.py
RENAMED
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/task_group_two.py
RENAMED
File without changes
|
File without changes
|
{dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/untraced.py
RENAMED
File without changes
|
File without changes
|