dycw-utilities 0.126.11__tar.gz → 0.127.0__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.11 → dycw_utilities-0.127.0}/PKG-INFO +1 -1
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/pyproject.toml +3 -2
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_asyncio.py +7 -6
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_redis.py +33 -0
- dycw_utilities-0.127.0/src/tests/test_reprlib.py +87 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_sqlalchemy.py +1 -1
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/asyncio.py +4 -15
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/redis.py +1 -15
- dycw_utilities-0.127.0/src/utilities/reprlib.py +158 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/slack_sdk.py +1 -10
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/sqlalchemy.py +1 -10
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/traceback.py +3 -5
- dycw_utilities-0.126.11/src/tests/test_reprlib.py +0 -38
- dycw_utilities-0.126.11/src/tests/test_rich.py +0 -24
- dycw_utilities-0.126.11/src/utilities/reprlib.py +0 -74
- dycw_utilities-0.126.11/src/utilities/rich.py +0 -74
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/.gitignore +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/LICENSE +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/README.md +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_asyncio_classes/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_asyncio_classes/loopers.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_asyncio_classes/redis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/git.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/period.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/string.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.127.0}/src/utilities/zoneinfo.py +0 -0
@@ -94,7 +94,7 @@ dependencies = [
|
|
94
94
|
name = "dycw-utilities"
|
95
95
|
readme = "README.md"
|
96
96
|
requires-python = ">= 3.12"
|
97
|
-
version = "0.
|
97
|
+
version = "0.127.0"
|
98
98
|
|
99
99
|
[project.optional-dependencies]
|
100
100
|
test = [
|
@@ -334,7 +334,7 @@ zzz-test-zoneinfo = [
|
|
334
334
|
# bump-my-version
|
335
335
|
[tool.bumpversion]
|
336
336
|
allow_dirty = true
|
337
|
-
current_version = "0.
|
337
|
+
current_version = "0.127.0"
|
338
338
|
|
339
339
|
[[tool.bumpversion.files]]
|
340
340
|
filename = "src/utilities/__init__.py"
|
@@ -375,6 +375,7 @@ data_file = ".coverage/data"
|
|
375
375
|
omit = ["src/utilities/streamlit.py"]
|
376
376
|
parallel = true
|
377
377
|
plugins = ["coverage_conditional_plugin"]
|
378
|
+
source = ["src/utilities"]
|
378
379
|
|
379
380
|
# hatch
|
380
381
|
[tool.hatch]
|
@@ -21,7 +21,7 @@ from hypothesis.strategies import (
|
|
21
21
|
permutations,
|
22
22
|
sampled_from,
|
23
23
|
)
|
24
|
-
from pytest import LogCaptureFixture, mark, param, raises
|
24
|
+
from pytest import LogCaptureFixture, approx, mark, param, raises
|
25
25
|
|
26
26
|
from tests.test_asyncio_classes.loopers import (
|
27
27
|
_REL,
|
@@ -42,7 +42,6 @@ from utilities.asyncio import (
|
|
42
42
|
InfiniteLooper,
|
43
43
|
InfiniteQueueLooper,
|
44
44
|
Looper,
|
45
|
-
LooperTimeoutError,
|
46
45
|
UniquePriorityQueue,
|
47
46
|
UniqueQueue,
|
48
47
|
_InfiniteLooperDefaultEventError,
|
@@ -199,6 +198,7 @@ class TestEnhancedTaskGroup:
|
|
199
198
|
assert looper.running
|
200
199
|
assert not looper.running
|
201
200
|
|
201
|
+
@mark.flaky
|
202
202
|
async def test_max_tasks_disabled(self) -> None:
|
203
203
|
with Timer() as timer:
|
204
204
|
async with EnhancedTaskGroup() as tg:
|
@@ -611,8 +611,8 @@ class TestInfiniteLooper:
|
|
611
611
|
|
612
612
|
async with timeout(1.0), Parent(sleep_core=0.05) as parent:
|
613
613
|
...
|
614
|
-
assert
|
615
|
-
assert
|
614
|
+
assert 12 <= parent.counter <= 25
|
615
|
+
assert 12 <= parent.child.counter <= 25
|
616
616
|
|
617
617
|
async def test_error_default_event(self) -> None:
|
618
618
|
@dataclass(kw_only=True)
|
@@ -1360,9 +1360,10 @@ class TestLooper:
|
|
1360
1360
|
|
1361
1361
|
async def test_timeout(self) -> None:
|
1362
1362
|
looper = CountingLooper(timeout=1.0)
|
1363
|
-
|
1364
|
-
with
|
1363
|
+
with Timer() as timer:
|
1364
|
+
async with looper:
|
1365
1365
|
await looper
|
1366
|
+
assert float(timer) == approx(1.0, rel=_REL)
|
1366
1367
|
self._assert_stats_full(looper, stops=1)
|
1367
1368
|
|
1368
1369
|
def test_with_auto_start(self) -> None:
|
@@ -118,6 +118,7 @@ class TestIsMessage:
|
|
118
118
|
|
119
119
|
class TestPublish:
|
120
120
|
@given(data=lists(binary(min_size=1), min_size=1, max_size=5))
|
121
|
+
@mark.flaky
|
121
122
|
@settings(max_examples=1, phases={Phase.generate})
|
122
123
|
@SKIPIF_CI_AND_NOT_LINUX
|
123
124
|
async def test_bytes(self, *, data: Sequence[bytes]) -> None:
|
@@ -138,6 +139,7 @@ class TestPublish:
|
|
138
139
|
assert result == datum
|
139
140
|
|
140
141
|
@given(objects=lists(make_objects(), min_size=1, max_size=5))
|
142
|
+
@mark.flaky
|
141
143
|
@settings(max_examples=1, phases={Phase.generate})
|
142
144
|
@SKIPIF_CI_AND_NOT_LINUX
|
143
145
|
async def test_serializer(self, *, objects: Sequence[Any]) -> None:
|
@@ -157,6 +159,7 @@ class TestPublish:
|
|
157
159
|
assert is_equal(result, obj)
|
158
160
|
|
159
161
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
162
|
+
@mark.flaky
|
160
163
|
@settings(max_examples=1, phases={Phase.generate})
|
161
164
|
@SKIPIF_CI_AND_NOT_LINUX
|
162
165
|
async def test_text(self, *, messages: Sequence[str]) -> None:
|
@@ -183,6 +186,7 @@ class TestPublish:
|
|
183
186
|
|
184
187
|
class TestPublisher:
|
185
188
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
189
|
+
@mark.flaky
|
186
190
|
@settings(max_examples=1, phases={Phase.generate})
|
187
191
|
@SKIPIF_CI_AND_NOT_LINUX
|
188
192
|
async def test_main(self, *, messages: Sequence[str]) -> None:
|
@@ -210,6 +214,7 @@ class TestPublisher:
|
|
210
214
|
raise PublisherError(publisher=publisher)
|
211
215
|
|
212
216
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
217
|
+
@mark.flaky
|
213
218
|
@settings(max_examples=1, phases={Phase.generate})
|
214
219
|
@SKIPIF_CI_AND_NOT_LINUX
|
215
220
|
async def test_main_service(self, *, messages: Sequence[str]) -> None:
|
@@ -299,6 +304,7 @@ class TestPublishServiceMixin:
|
|
299
304
|
|
300
305
|
class TestRedisHashMapKey:
|
301
306
|
@given(key=int64s(), value=booleans())
|
307
|
+
@mark.flaky
|
302
308
|
@settings(max_examples=1, phases={Phase.generate})
|
303
309
|
@SKIPIF_CI_AND_NOT_LINUX
|
304
310
|
async def test_get_and_set_bool(self, *, key: int, value: bool) -> None:
|
@@ -308,6 +314,7 @@ class TestRedisHashMapKey:
|
|
308
314
|
assert await hm_key.get(redis, key) is value
|
309
315
|
|
310
316
|
@given(key=booleans() | int64s(), value=booleans())
|
317
|
+
@mark.flaky
|
311
318
|
@settings(max_examples=1, phases={Phase.generate})
|
312
319
|
@SKIPIF_CI_AND_NOT_LINUX
|
313
320
|
async def test_get_and_set_union_key(self, *, key: bool | int, value: bool) -> None:
|
@@ -317,6 +324,7 @@ class TestRedisHashMapKey:
|
|
317
324
|
assert await hm_key.get(redis, key) is value
|
318
325
|
|
319
326
|
@given(value=booleans())
|
327
|
+
@mark.flaky
|
320
328
|
@settings(max_examples=1, phases={Phase.generate})
|
321
329
|
@SKIPIF_CI_AND_NOT_LINUX
|
322
330
|
async def test_get_and_set_sentinel_key(self, *, value: bool) -> None:
|
@@ -331,6 +339,7 @@ class TestRedisHashMapKey:
|
|
331
339
|
assert await hm_key.get(redis, sentinel) is value
|
332
340
|
|
333
341
|
@given(key=int64s(), value=int64s() | booleans())
|
342
|
+
@mark.flaky
|
334
343
|
@settings(max_examples=1, phases={Phase.generate})
|
335
344
|
@SKIPIF_CI_AND_NOT_LINUX
|
336
345
|
async def test_get_and_set_union_value(
|
@@ -342,6 +351,7 @@ class TestRedisHashMapKey:
|
|
342
351
|
assert await hm_key.get(redis, key) == value
|
343
352
|
|
344
353
|
@given(key=int64s())
|
354
|
+
@mark.flaky
|
345
355
|
@settings(max_examples=1, phases={Phase.generate})
|
346
356
|
@SKIPIF_CI_AND_NOT_LINUX
|
347
357
|
async def test_get_and_set_sentinel_value(self, *, key: int) -> None:
|
@@ -364,6 +374,7 @@ class TestRedisHashMapKey:
|
|
364
374
|
assert await hm_key.get(redis, key) is sentinel
|
365
375
|
|
366
376
|
@given(data=data(), mapping=dictionaries(int64s(), booleans()))
|
377
|
+
@mark.flaky
|
367
378
|
@settings(max_examples=1, phases={Phase.generate})
|
368
379
|
@SKIPIF_CI_AND_NOT_LINUX
|
369
380
|
async def test_get_and_set_many(
|
@@ -380,6 +391,7 @@ class TestRedisHashMapKey:
|
|
380
391
|
assert await hm_key.get_many(redis, keys) == expected
|
381
392
|
|
382
393
|
@given(key=int64s(), value=booleans())
|
394
|
+
@mark.flaky
|
383
395
|
@settings(max_examples=1, phases={Phase.generate})
|
384
396
|
@SKIPIF_CI_AND_NOT_LINUX
|
385
397
|
async def test_delete(self, *, key: int, value: bool) -> None:
|
@@ -392,6 +404,7 @@ class TestRedisHashMapKey:
|
|
392
404
|
_ = await hm_key.get(redis, key)
|
393
405
|
|
394
406
|
@given(key=pairs(int64s()), value=booleans())
|
407
|
+
@mark.flaky
|
395
408
|
@settings(max_examples=1, phases={Phase.generate})
|
396
409
|
@SKIPIF_CI_AND_NOT_LINUX
|
397
410
|
async def test_delete_compound(self, *, key: tuple[int, int], value: bool) -> None:
|
@@ -404,6 +417,7 @@ class TestRedisHashMapKey:
|
|
404
417
|
_ = await hm_key.get(redis, key)
|
405
418
|
|
406
419
|
@given(key=int64s(), value=booleans())
|
420
|
+
@mark.flaky
|
407
421
|
@settings(max_examples=1, phases={Phase.generate})
|
408
422
|
@SKIPIF_CI_AND_NOT_LINUX
|
409
423
|
async def test_exists(self, *, key: int, value: bool) -> None:
|
@@ -414,6 +428,7 @@ class TestRedisHashMapKey:
|
|
414
428
|
assert await hm_key.exists(redis, key)
|
415
429
|
|
416
430
|
@given(key=pairs(int64s()), value=booleans())
|
431
|
+
@mark.flaky
|
417
432
|
@settings(max_examples=1, phases={Phase.generate})
|
418
433
|
@SKIPIF_CI_AND_NOT_LINUX
|
419
434
|
async def test_exists_compound(self, *, key: tuple[int, int], value: bool) -> None:
|
@@ -424,6 +439,7 @@ class TestRedisHashMapKey:
|
|
424
439
|
assert await hm_key.exists(redis, key)
|
425
440
|
|
426
441
|
@given(mapping=dictionaries(int64s(), booleans()))
|
442
|
+
@mark.flaky
|
427
443
|
@settings(max_examples=1, phases={Phase.generate})
|
428
444
|
@SKIPIF_CI_AND_NOT_LINUX
|
429
445
|
async def test_get_all(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -433,6 +449,7 @@ class TestRedisHashMapKey:
|
|
433
449
|
assert await hm_key.get_all(redis) == mapping
|
434
450
|
|
435
451
|
@given(mapping=dictionaries(int64s(), booleans()))
|
452
|
+
@mark.flaky
|
436
453
|
@settings(max_examples=1, phases={Phase.generate})
|
437
454
|
@SKIPIF_CI_AND_NOT_LINUX
|
438
455
|
async def test_keys(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -442,6 +459,7 @@ class TestRedisHashMapKey:
|
|
442
459
|
assert await hm_key.keys(redis) == list(mapping)
|
443
460
|
|
444
461
|
@given(mapping=dictionaries(int64s(), booleans()))
|
462
|
+
@mark.flaky
|
445
463
|
@settings(max_examples=1, phases={Phase.generate})
|
446
464
|
@SKIPIF_CI_AND_NOT_LINUX
|
447
465
|
async def test_length(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -451,6 +469,7 @@ class TestRedisHashMapKey:
|
|
451
469
|
assert await hm_key.length(redis) == len(mapping)
|
452
470
|
|
453
471
|
@given(key=int64s(), value=booleans())
|
472
|
+
@mark.flaky
|
454
473
|
@settings(max_examples=1, phases={Phase.generate})
|
455
474
|
@SKIPIF_CI_AND_NOT_LINUX
|
456
475
|
async def test_ttl(self, *, key: int, value: bool) -> None:
|
@@ -463,6 +482,7 @@ class TestRedisHashMapKey:
|
|
463
482
|
assert not await redis.exists(hm_key.name)
|
464
483
|
|
465
484
|
@given(mapping=dictionaries(int64s(), booleans()))
|
485
|
+
@mark.flaky
|
466
486
|
@settings(max_examples=1, phases={Phase.generate})
|
467
487
|
@SKIPIF_CI_AND_NOT_LINUX
|
468
488
|
async def test_values(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -474,6 +494,7 @@ class TestRedisHashMapKey:
|
|
474
494
|
|
475
495
|
class TestRedisKey:
|
476
496
|
@given(value=booleans())
|
497
|
+
@mark.flaky
|
477
498
|
@settings(max_examples=1, phases={Phase.generate})
|
478
499
|
@SKIPIF_CI_AND_NOT_LINUX
|
479
500
|
async def test_get_and_set_bool(self, *, value: bool) -> None:
|
@@ -483,6 +504,7 @@ class TestRedisKey:
|
|
483
504
|
assert await key.get(redis) is value
|
484
505
|
|
485
506
|
@given(value=booleans() | int64s())
|
507
|
+
@mark.flaky
|
486
508
|
@settings(max_examples=1, phases={Phase.generate})
|
487
509
|
@SKIPIF_CI_AND_NOT_LINUX
|
488
510
|
async def test_get_and_set_union(self, *, value: bool | int) -> None:
|
@@ -491,6 +513,7 @@ class TestRedisKey:
|
|
491
513
|
_ = await key.set(redis, value)
|
492
514
|
assert await key.get(redis) == value
|
493
515
|
|
516
|
+
@mark.flaky
|
494
517
|
@SKIPIF_CI_AND_NOT_LINUX
|
495
518
|
async def test_get_and_set_sentinel_with_serialize(self) -> None:
|
496
519
|
def serializer(sentinel: Sentinel, /) -> bytes:
|
@@ -508,6 +531,7 @@ class TestRedisKey:
|
|
508
531
|
assert await red_key.get(redis) is sentinel
|
509
532
|
|
510
533
|
@given(value=booleans())
|
534
|
+
@mark.flaky
|
511
535
|
@settings(max_examples=1, phases={Phase.generate})
|
512
536
|
@SKIPIF_CI_AND_NOT_LINUX
|
513
537
|
async def test_delete(self, *, value: bool) -> None:
|
@@ -520,6 +544,7 @@ class TestRedisKey:
|
|
520
544
|
_ = await key.get(redis)
|
521
545
|
|
522
546
|
@given(value=booleans())
|
547
|
+
@mark.flaky
|
523
548
|
@settings(max_examples=1, phases={Phase.generate})
|
524
549
|
@SKIPIF_CI_AND_NOT_LINUX
|
525
550
|
async def test_exists(self, *, value: bool) -> None:
|
@@ -530,6 +555,7 @@ class TestRedisKey:
|
|
530
555
|
assert await key.exists(redis)
|
531
556
|
|
532
557
|
@given(value=booleans())
|
558
|
+
@mark.flaky
|
533
559
|
@settings(max_examples=1, phases={Phase.generate})
|
534
560
|
@SKIPIF_CI_AND_NOT_LINUX
|
535
561
|
async def test_ttl(self, *, value: bool) -> None:
|
@@ -544,6 +570,7 @@ class TestRedisKey:
|
|
544
570
|
|
545
571
|
class TestSubscribe:
|
546
572
|
@given(messages=lists(binary(min_size=1), min_size=1, max_size=5))
|
573
|
+
@mark.flaky
|
547
574
|
@settings(max_examples=1, phases={Phase.generate})
|
548
575
|
@SKIPIF_CI_AND_NOT_LINUX
|
549
576
|
async def test_bytes(self, *, messages: Sequence[bytes]) -> None:
|
@@ -564,6 +591,7 @@ class TestSubscribe:
|
|
564
591
|
assert result == message
|
565
592
|
|
566
593
|
@given(objs=lists(make_objects(), min_size=1, max_size=5))
|
594
|
+
@mark.flaky
|
567
595
|
@settings(max_examples=1, phases={Phase.generate})
|
568
596
|
@SKIPIF_CI_AND_NOT_LINUX
|
569
597
|
async def test_deserialize(self, *, objs: Sequence[Any]) -> None:
|
@@ -587,6 +615,7 @@ class TestSubscribe:
|
|
587
615
|
short_messages=lists(text_ascii(max_size=4), min_size=1, max_size=5),
|
588
616
|
long_messages=lists(text_ascii(min_size=6), min_size=1, max_size=5),
|
589
617
|
)
|
618
|
+
@mark.flaky
|
590
619
|
@settings(max_examples=1, phases={Phase.generate})
|
591
620
|
@SKIPIF_CI_AND_NOT_LINUX
|
592
621
|
async def test_filter(
|
@@ -614,6 +643,7 @@ class TestSubscribe:
|
|
614
643
|
assert len(result) >= 3
|
615
644
|
|
616
645
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
646
|
+
@mark.flaky
|
617
647
|
@settings(max_examples=1, phases={Phase.generate})
|
618
648
|
@SKIPIF_CI_AND_NOT_LINUX
|
619
649
|
async def test_raw(self, *, messages: Sequence[str]) -> None:
|
@@ -637,6 +667,7 @@ class TestSubscribe:
|
|
637
667
|
assert result["data"] == message.encode()
|
638
668
|
|
639
669
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
670
|
+
@mark.flaky
|
640
671
|
@settings(max_examples=1, phases={Phase.generate})
|
641
672
|
@SKIPIF_CI_AND_NOT_LINUX
|
642
673
|
async def test_text(self, *, messages: Sequence[str]) -> None:
|
@@ -662,6 +693,7 @@ class TestSubscribe:
|
|
662
693
|
|
663
694
|
class TestSubscribeService:
|
664
695
|
@given(objects=lists(make_objects(), min_size=1, max_size=5))
|
696
|
+
@mark.flaky
|
665
697
|
@settings(max_examples=1, phases={Phase.generate})
|
666
698
|
@SKIPIF_CI_AND_NOT_LINUX
|
667
699
|
async def test_main(self, *, objects: list[str]) -> None:
|
@@ -679,6 +711,7 @@ class TestSubscribeService:
|
|
679
711
|
for result, obj in zip(results, objects, strict=True):
|
680
712
|
assert is_equal(result, obj)
|
681
713
|
|
714
|
+
@mark.flaky
|
682
715
|
@SKIPIF_CI_AND_NOT_LINUX
|
683
716
|
async def test_context_manager_already_subscribing(
|
684
717
|
self, *, caplog: LogCaptureFixture
|
@@ -0,0 +1,87 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from hypothesis import given
|
6
|
+
from hypothesis.strategies import sampled_from
|
7
|
+
|
8
|
+
from utilities.reprlib import (
|
9
|
+
get_call_args_mapping,
|
10
|
+
get_repr,
|
11
|
+
get_repr_and_class,
|
12
|
+
yield_call_args_repr,
|
13
|
+
yield_mapping_repr,
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
class TestGetCallArgsMapping:
|
18
|
+
def test_main(self) -> None:
|
19
|
+
mapping = get_call_args_mapping(1, 2, 3, x=4, y=5, z=6)
|
20
|
+
expected = {
|
21
|
+
"args[0]": 1,
|
22
|
+
"args[1]": 2,
|
23
|
+
"args[2]": 3,
|
24
|
+
"kwargs[x]": 4,
|
25
|
+
"kwargs[y]": 5,
|
26
|
+
"kwargs[z]": 6,
|
27
|
+
}
|
28
|
+
assert mapping == expected
|
29
|
+
|
30
|
+
|
31
|
+
class TestGetRepr:
|
32
|
+
@given(
|
33
|
+
case=sampled_from([
|
34
|
+
(None, "None"),
|
35
|
+
(0, "0"),
|
36
|
+
(
|
37
|
+
list(range(21)),
|
38
|
+
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +1]",
|
39
|
+
),
|
40
|
+
])
|
41
|
+
)
|
42
|
+
def test_main(self, *, case: tuple[Any, str]) -> None:
|
43
|
+
obj, expected = case
|
44
|
+
result = get_repr(obj)
|
45
|
+
assert result == expected
|
46
|
+
|
47
|
+
|
48
|
+
class TestGetReprAndClass:
|
49
|
+
@given(
|
50
|
+
case=sampled_from([
|
51
|
+
(None, "Object 'None' of type 'NoneType'"),
|
52
|
+
(0, "Object '0' of type 'int'"),
|
53
|
+
])
|
54
|
+
)
|
55
|
+
def test_main(self, *, case: tuple[Any, str]) -> None:
|
56
|
+
obj, expected = case
|
57
|
+
result = get_repr_and_class(obj)
|
58
|
+
assert result == expected
|
59
|
+
|
60
|
+
|
61
|
+
class TestYieldCallArgsRepr:
|
62
|
+
def test_main(self) -> None:
|
63
|
+
lines = list(
|
64
|
+
yield_call_args_repr(1, 2, list(range(100)), d=4, e=5, f=list(range(100)))
|
65
|
+
)
|
66
|
+
expected = [
|
67
|
+
"args[0] = 1",
|
68
|
+
"args[1] = 2",
|
69
|
+
"args[2] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
|
70
|
+
"kwargs[d] = 4",
|
71
|
+
"kwargs[e] = 5",
|
72
|
+
"kwargs[f] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
|
73
|
+
]
|
74
|
+
assert lines == expected
|
75
|
+
|
76
|
+
|
77
|
+
class TestYieldMappingRepr:
|
78
|
+
def test_main(self) -> None:
|
79
|
+
mapping = {"a": 1, "b": 2, "c": 3, "d": list(range(100))}
|
80
|
+
lines = list(yield_mapping_repr(mapping))
|
81
|
+
expected = [
|
82
|
+
"a = 1",
|
83
|
+
"b = 2",
|
84
|
+
"c = 3",
|
85
|
+
"d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
|
86
|
+
]
|
87
|
+
assert lines == expected
|
@@ -170,7 +170,7 @@ class TestCheckEngine:
|
|
170
170
|
|
171
171
|
class TestColumnwiseMinMax:
|
172
172
|
@given(data=data(), values=sets(pairs(integers(0, 10) | none()), min_size=1))
|
173
|
-
@
|
173
|
+
@settings(max_examples=1, phases={Phase.generate})
|
174
174
|
async def test_main(
|
175
175
|
self, *, data: DataObject, values: set[tuple[int | None, int | None]]
|
176
176
|
) -> None:
|
@@ -663,15 +663,6 @@ class InfiniteQueueLooper(InfiniteLooper[THashable], Generic[THashable, _T]):
|
|
663
663
|
class LooperError(Exception): ...
|
664
664
|
|
665
665
|
|
666
|
-
@dataclass(kw_only=True, slots=True)
|
667
|
-
class LooperTimeoutError(LooperError):
|
668
|
-
duration: Duration | None = None
|
669
|
-
|
670
|
-
@override
|
671
|
-
def __str__(self) -> str:
|
672
|
-
return "Timeout" if self.duration is None else f"Timeout after {self.duration}"
|
673
|
-
|
674
|
-
|
675
666
|
@dataclass(kw_only=True, slots=True)
|
676
667
|
class _LooperNoTaskError(LooperError):
|
677
668
|
looper: Looper
|
@@ -691,7 +682,6 @@ class Looper(Generic[_T]):
|
|
691
682
|
empty_upon_exit: bool = field(default=False, repr=False)
|
692
683
|
logger: str | None = field(default=None, repr=False)
|
693
684
|
timeout: Duration | None = field(default=None, repr=False)
|
694
|
-
timeout_error: type[Exception] = field(default=LooperTimeoutError, repr=False)
|
695
685
|
# settings
|
696
686
|
_backoff: float = field(init=False, repr=False)
|
697
687
|
_debug: bool = field(default=False, repr=False)
|
@@ -757,7 +747,7 @@ class Looper(Generic[_T]):
|
|
757
747
|
_ = await self._stack.enter_async_context(looper)
|
758
748
|
if self.auto_start:
|
759
749
|
_ = self._debug and self._logger.debug("%s: auto-starting...", self)
|
760
|
-
with suppress(
|
750
|
+
with suppress(TimeoutError):
|
761
751
|
await self._task
|
762
752
|
case _ as never:
|
763
753
|
assert_never(never)
|
@@ -893,7 +883,6 @@ class Looper(Generic[_T]):
|
|
893
883
|
backoff: Duration | Sentinel = sentinel,
|
894
884
|
logger: str | None | Sentinel = sentinel,
|
895
885
|
timeout: Duration | None | Sentinel = sentinel,
|
896
|
-
timeout_error: type[Exception] | Sentinel = sentinel,
|
897
886
|
_debug: bool | Sentinel = sentinel,
|
898
887
|
**kwargs: Any,
|
899
888
|
) -> Self:
|
@@ -906,7 +895,6 @@ class Looper(Generic[_T]):
|
|
906
895
|
backoff=backoff,
|
907
896
|
logger=logger,
|
908
897
|
timeout=timeout,
|
909
|
-
timeout_error=timeout_error,
|
910
898
|
_debug=_debug,
|
911
899
|
**kwargs,
|
912
900
|
)
|
@@ -1029,7 +1017,7 @@ class Looper(Generic[_T]):
|
|
1029
1017
|
async def run_looper(self) -> None:
|
1030
1018
|
"""Run the looper."""
|
1031
1019
|
try:
|
1032
|
-
async with timeout_dur(duration=self.timeout
|
1020
|
+
async with timeout_dur(duration=self.timeout):
|
1033
1021
|
while True:
|
1034
1022
|
if self._is_stopped.is_set():
|
1035
1023
|
_ = self._debug and self._logger.debug("%s: stopped", self)
|
@@ -1068,6 +1056,8 @@ class Looper(Generic[_T]):
|
|
1068
1056
|
if error.args[0] == "generator didn't stop after athrow()":
|
1069
1057
|
return
|
1070
1058
|
raise
|
1059
|
+
except TimeoutError:
|
1060
|
+
pass
|
1071
1061
|
|
1072
1062
|
async def run_until_empty(self) -> None:
|
1073
1063
|
"""Run until the queue is empty."""
|
@@ -1430,7 +1420,6 @@ __all__ = [
|
|
1430
1420
|
"InfiniteQueueLooper",
|
1431
1421
|
"Looper",
|
1432
1422
|
"LooperError",
|
1433
|
-
"LooperTimeoutError",
|
1434
1423
|
"StreamCommandOutput",
|
1435
1424
|
"UniquePriorityQueue",
|
1436
1425
|
"UniqueQueue",
|
@@ -25,13 +25,7 @@ from typing import (
|
|
25
25
|
from redis.asyncio import Redis
|
26
26
|
from redis.typing import EncodableT
|
27
27
|
|
28
|
-
from utilities.asyncio import
|
29
|
-
EnhancedQueue,
|
30
|
-
InfiniteQueueLooper,
|
31
|
-
Looper,
|
32
|
-
LooperTimeoutError,
|
33
|
-
timeout_dur,
|
34
|
-
)
|
28
|
+
from utilities.asyncio import EnhancedQueue, InfiniteQueueLooper, Looper, timeout_dur
|
35
29
|
from utilities.contextlib import suppress_super_object_attribute_error
|
36
30
|
from utilities.datetime import (
|
37
31
|
MILLISECOND,
|
@@ -702,9 +696,6 @@ class PublishServiceMixin(Generic[_T]):
|
|
702
696
|
publish_service_empty_upon_exit: bool = field(default=False, repr=False)
|
703
697
|
publish_service_logger: str | None = field(default=None, repr=False)
|
704
698
|
publish_service_timeout: Duration | None = field(default=None, repr=False)
|
705
|
-
publish_service_timeout_error: type[Exception] = field(
|
706
|
-
default=LooperTimeoutError, repr=False
|
707
|
-
)
|
708
699
|
publish_service_debug: bool = field(default=False, repr=False)
|
709
700
|
_is_pending_restart: Event = field(default_factory=Event, init=False, repr=False)
|
710
701
|
# base - publish service
|
@@ -724,7 +715,6 @@ class PublishServiceMixin(Generic[_T]):
|
|
724
715
|
empty_upon_exit=self.publish_service_empty_upon_exit,
|
725
716
|
logger=self.publish_service_logger,
|
726
717
|
timeout=self.publish_service_timeout,
|
727
|
-
timeout_error=self.publish_service_timeout_error,
|
728
718
|
_debug=self.publish_service_debug,
|
729
719
|
# publish service
|
730
720
|
redis=self.publish_service_redis,
|
@@ -986,9 +976,6 @@ class SubscribeServiceMixin(Generic[_T]):
|
|
986
976
|
subscribe_service_empty_upon_exit: bool = field(default=False, repr=False)
|
987
977
|
subscribe_service_logger: str | None = field(default=None, repr=False)
|
988
978
|
subscribe_service_timeout: Duration | None = field(default=None, repr=False)
|
989
|
-
subscribe_service_timeout_error: type[Exception] = field(
|
990
|
-
default=LooperTimeoutError, repr=False
|
991
|
-
)
|
992
979
|
subscribe_service_debug: bool = field(default=False, repr=False)
|
993
980
|
# base - looper
|
994
981
|
subscribe_service_redis: Redis
|
@@ -1009,7 +996,6 @@ class SubscribeServiceMixin(Generic[_T]):
|
|
1009
996
|
empty_upon_exit=self.subscribe_service_empty_upon_exit,
|
1010
997
|
logger=self.subscribe_service_logger,
|
1011
998
|
timeout=self.subscribe_service_timeout,
|
1012
|
-
timeout_error=self.subscribe_service_timeout_error,
|
1013
999
|
_debug=self.subscribe_service_debug,
|
1014
1000
|
# subscribe service
|
1015
1001
|
redis=self.subscribe_service_redis,
|