dycw-utilities 0.113.5__tar.gz → 0.114.1__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.113.5 → dycw_utilities-0.114.1}/PKG-INFO +1 -1
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/pyproject.toml +2 -2
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_asyncio.py +208 -102
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/asyncio.py +140 -48
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/slack_sdk.py +1 -1
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/sqlalchemy.py +1 -1
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/.gitignore +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/LICENSE +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/README.md +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/click.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/git.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/http.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/math.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/os.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/period.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/random.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/re.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/text.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/types.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/version.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.113.5 → dycw_utilities-0.114.1}/src/utilities/zoneinfo.py +0 -0
@@ -92,7 +92,7 @@ dependencies = [
|
|
92
92
|
name = "dycw-utilities"
|
93
93
|
readme = "README.md"
|
94
94
|
requires-python = ">= 3.12"
|
95
|
-
version = "0.
|
95
|
+
version = "0.114.1"
|
96
96
|
|
97
97
|
[project.optional-dependencies]
|
98
98
|
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.114.1"
|
338
338
|
|
339
339
|
[[tool.bumpversion.files]]
|
340
340
|
filename = "src/utilities/__init__.py"
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
3
3
|
from asyncio import (
|
4
4
|
CancelledError,
|
5
5
|
Event,
|
6
|
-
Lock,
|
7
6
|
PriorityQueue,
|
8
7
|
Queue,
|
9
8
|
TaskGroup,
|
@@ -13,7 +12,7 @@ from asyncio import (
|
|
13
12
|
)
|
14
13
|
from collections import Counter
|
15
14
|
from dataclasses import dataclass, field
|
16
|
-
from itertools import chain
|
15
|
+
from itertools import chain, count
|
17
16
|
from re import search
|
18
17
|
from typing import TYPE_CHECKING, Self, override
|
19
18
|
|
@@ -22,7 +21,6 @@ from hypothesis.strategies import (
|
|
22
21
|
DataObject,
|
23
22
|
data,
|
24
23
|
integers,
|
25
|
-
just,
|
26
24
|
lists,
|
27
25
|
none,
|
28
26
|
permutations,
|
@@ -36,12 +34,16 @@ from utilities.asyncio import (
|
|
36
34
|
EnhancedTaskGroup,
|
37
35
|
ExceptionProcessor,
|
38
36
|
InfiniteLooper,
|
37
|
+
InfiniteLooperError,
|
38
|
+
InfiniteQueueLooper,
|
39
39
|
QueueProcessor,
|
40
40
|
UniquePriorityQueue,
|
41
41
|
UniqueQueue,
|
42
42
|
get_event,
|
43
43
|
get_items,
|
44
44
|
get_items_nowait,
|
45
|
+
put_items,
|
46
|
+
put_items_nowait,
|
45
47
|
sleep_dur,
|
46
48
|
stream_command,
|
47
49
|
timeout_dur,
|
@@ -55,7 +57,7 @@ from utilities.sentinel import Sentinel, sentinel
|
|
55
57
|
from utilities.timer import Timer
|
56
58
|
|
57
59
|
if TYPE_CHECKING:
|
58
|
-
from collections.abc import
|
60
|
+
from collections.abc import Iterator
|
59
61
|
|
60
62
|
from utilities.types import Duration, MaybeCallableEvent, MaybeType
|
61
63
|
|
@@ -335,130 +337,116 @@ class TestGetEvent:
|
|
335
337
|
assert get_event(event=lambda: event) is event
|
336
338
|
|
337
339
|
|
338
|
-
class TestGetItems:
|
339
|
-
@given(
|
340
|
-
xs=lists(integers(), min_size=1),
|
341
|
-
max_size=integers(1, 10) | none(),
|
342
|
-
lock=just(Lock()) | none(),
|
343
|
-
)
|
344
|
-
async def test_put_then_get(
|
345
|
-
self, *, xs: list[int], max_size: int | None, lock: Lock | None
|
346
|
-
) -> None:
|
347
|
-
queue: Queue[int] = Queue()
|
348
|
-
for x in xs:
|
349
|
-
await queue.put(x)
|
350
|
-
result = await get_items(queue, max_size=max_size, lock=lock)
|
351
|
-
if max_size is None:
|
352
|
-
assert result == xs
|
353
|
-
else:
|
354
|
-
assert result == xs[:max_size]
|
355
|
-
|
356
|
-
@given(
|
357
|
-
xs=lists(integers(), min_size=1),
|
358
|
-
max_size=integers(1, 10) | none(),
|
359
|
-
lock=just(Lock()) | none(),
|
360
|
-
)
|
361
|
-
async def test_get_then_put(
|
362
|
-
self, *, xs: list[int], max_size: int | None, lock: Lock | None
|
363
|
-
) -> None:
|
364
|
-
queue: Queue[int] = Queue()
|
365
|
-
|
366
|
-
async def put() -> None:
|
367
|
-
await sleep(0.01)
|
368
|
-
for x in xs:
|
369
|
-
await queue.put(x)
|
370
|
-
|
371
|
-
async with TaskGroup() as tg:
|
372
|
-
task = tg.create_task(get_items(queue, max_size=max_size, lock=lock))
|
373
|
-
_ = tg.create_task(put())
|
374
|
-
result = task.result()
|
375
|
-
if max_size is None:
|
376
|
-
assert result == xs
|
377
|
-
else:
|
378
|
-
assert result == xs[:max_size]
|
379
|
-
|
380
|
-
async def test_empty(self) -> None:
|
381
|
-
queue: Queue[int] = Queue()
|
382
|
-
with raises(TimeoutError): # noqa: PT012
|
383
|
-
async with timeout(0.01), TaskGroup() as tg:
|
384
|
-
_ = tg.create_task(get_items(queue))
|
385
|
-
_ = tg.create_task(sleep(0.02))
|
386
|
-
|
387
|
-
|
388
|
-
class TestGetItemsNoWait:
|
389
|
-
@given(
|
390
|
-
xs=lists(integers(), min_size=1),
|
391
|
-
max_size=integers(1, 10) | none(),
|
392
|
-
lock=just(Lock()) | none(),
|
393
|
-
)
|
394
|
-
async def test_main(
|
395
|
-
self, *, xs: list[int], max_size: int | None, lock: Lock | None
|
396
|
-
) -> None:
|
397
|
-
queue: Queue[int] = Queue()
|
398
|
-
for x in xs:
|
399
|
-
await queue.put(x)
|
400
|
-
result = await get_items_nowait(queue, max_size=max_size, lock=lock)
|
401
|
-
if max_size is None:
|
402
|
-
assert result == xs
|
403
|
-
else:
|
404
|
-
assert result == xs[:max_size]
|
405
|
-
|
406
|
-
|
407
340
|
class TestInfiniteLooper:
|
408
341
|
@given(n=integers(10, 11))
|
409
342
|
async def test_main(self, *, n: int) -> None:
|
410
|
-
class
|
343
|
+
class TrueError(BaseException): ...
|
411
344
|
|
412
|
-
class
|
345
|
+
class FalseError(BaseException): ...
|
413
346
|
|
414
347
|
@dataclass(kw_only=True)
|
415
348
|
class Example(InfiniteLooper[bool]):
|
416
|
-
counter: int =
|
349
|
+
counter: int = 0
|
417
350
|
|
418
351
|
@override
|
419
|
-
async def
|
352
|
+
async def _initialize(self) -> None:
|
420
353
|
self.counter = 0
|
421
354
|
|
422
355
|
@override
|
423
|
-
async def
|
356
|
+
async def _core(self) -> None:
|
424
357
|
self.counter += 1
|
425
358
|
if self.counter >= n:
|
426
|
-
self.
|
359
|
+
self._set_event(n % 2 == 0)
|
427
360
|
|
428
|
-
@property
|
429
361
|
@override
|
430
|
-
def
|
431
|
-
|
362
|
+
def _yield_events_and_exceptions(
|
363
|
+
self,
|
364
|
+
) -> Iterator[tuple[bool, MaybeType[BaseException]]]:
|
365
|
+
yield (True, TrueError)
|
366
|
+
yield (False, FalseError)
|
432
367
|
|
433
368
|
looper = Example(sleep_core=0.1)
|
434
369
|
match n % 2 == 0:
|
435
370
|
case True:
|
436
|
-
with raises(
|
371
|
+
with raises(TrueError):
|
437
372
|
_ = await looper()
|
438
373
|
case False:
|
439
|
-
with raises(
|
374
|
+
with raises(FalseError):
|
440
375
|
_ = await looper()
|
441
376
|
|
377
|
+
async def test_multiple(self) -> None:
|
378
|
+
class ChildError(BaseException): ...
|
379
|
+
|
380
|
+
@dataclass(kw_only=True)
|
381
|
+
class Child(InfiniteLooper[None]):
|
382
|
+
counter: int = 0
|
383
|
+
|
384
|
+
@override
|
385
|
+
async def _initialize(self) -> None:
|
386
|
+
self.counter = 0
|
387
|
+
|
388
|
+
@override
|
389
|
+
async def _core(self) -> None:
|
390
|
+
self.counter += 1
|
391
|
+
if self.counter >= 10:
|
392
|
+
self._set_event(None)
|
393
|
+
|
394
|
+
@override
|
395
|
+
def _yield_events_and_exceptions(
|
396
|
+
self,
|
397
|
+
) -> Iterator[tuple[None, MaybeType[BaseException]]]:
|
398
|
+
yield (None, ChildError)
|
399
|
+
|
400
|
+
class ParentError(BaseException): ...
|
401
|
+
|
402
|
+
@dataclass(kw_only=True)
|
403
|
+
class Parent(InfiniteLooper[None]):
|
404
|
+
counter: int = 0
|
405
|
+
child: Child
|
406
|
+
|
407
|
+
@override
|
408
|
+
async def _initialize(self) -> None:
|
409
|
+
self.counter = 0
|
410
|
+
|
411
|
+
@override
|
412
|
+
async def _core(self) -> None:
|
413
|
+
self.counter += 1
|
414
|
+
self.child.counter += 1
|
415
|
+
if self.counter >= 10:
|
416
|
+
self._set_event(None)
|
417
|
+
|
418
|
+
@override
|
419
|
+
def _yield_events_and_exceptions(
|
420
|
+
self,
|
421
|
+
) -> Iterator[tuple[None, MaybeType[BaseException]]]:
|
422
|
+
yield (None, ParentError)
|
423
|
+
|
424
|
+
@override
|
425
|
+
def _yield_loopers(self) -> Iterator[InfiniteLooper]:
|
426
|
+
yield self.child
|
427
|
+
|
428
|
+
parent = Parent(sleep_core=0.1, child=Child(sleep_core=0.1))
|
429
|
+
with raises(BaseExceptionGroup) as error:
|
430
|
+
async with timeout_dur(duration=1.5):
|
431
|
+
await parent()
|
432
|
+
inner = one(error.value.exceptions)
|
433
|
+
assert isinstance(inner, ChildError)
|
434
|
+
assert 10 <= parent.child.counter <= 15
|
435
|
+
assert 3 <= parent.counter <= 7
|
436
|
+
|
442
437
|
async def test_error_upon_initialize(self) -> None:
|
443
438
|
class CustomError(Exception): ...
|
444
439
|
|
445
440
|
@dataclass(kw_only=True)
|
446
441
|
class Example(InfiniteLooper[None]):
|
447
|
-
counter: int = field(init=False, repr=False)
|
448
|
-
|
449
442
|
@override
|
450
|
-
async def
|
443
|
+
async def _initialize(self) -> None:
|
451
444
|
raise CustomError
|
452
445
|
|
453
446
|
@override
|
454
|
-
async def
|
447
|
+
async def _core(self) -> None:
|
455
448
|
raise NotImplementedError
|
456
449
|
|
457
|
-
@property
|
458
|
-
@override
|
459
|
-
def events_and_exceptions(self) -> Mapping[None, MaybeType[BaseException]]:
|
460
|
-
return {None: CustomError}
|
461
|
-
|
462
450
|
with raises(TimeoutError):
|
463
451
|
async with timeout_dur(duration=0.5):
|
464
452
|
_ = await Example(sleep_core=0.1)()
|
@@ -468,23 +456,141 @@ class TestInfiniteLooper:
|
|
468
456
|
|
469
457
|
@dataclass(kw_only=True)
|
470
458
|
class Example(InfiniteLooper[None]):
|
471
|
-
|
459
|
+
@override
|
460
|
+
async def _core(self) -> None:
|
461
|
+
raise CustomError
|
472
462
|
|
473
463
|
@override
|
474
|
-
|
464
|
+
def _yield_events_and_exceptions(
|
465
|
+
self,
|
466
|
+
) -> Iterator[tuple[None, MaybeType[BaseException]]]:
|
467
|
+
yield (None, CustomError)
|
468
|
+
|
469
|
+
with raises(TimeoutError):
|
470
|
+
async with timeout_dur(duration=0.5):
|
471
|
+
_ = await Example(sleep_core=0.1)()
|
472
|
+
|
473
|
+
async def test_error_no_event_found(self) -> None:
|
474
|
+
@dataclass(kw_only=True)
|
475
|
+
class Example(InfiniteLooper[None]):
|
476
|
+
counter: int = 0
|
475
477
|
|
476
478
|
@override
|
477
|
-
async def
|
478
|
-
|
479
|
+
async def _initialize(self) -> None:
|
480
|
+
self.counter = 0
|
481
|
+
|
482
|
+
@override
|
483
|
+
async def _core(self) -> None:
|
484
|
+
self.counter += 1
|
485
|
+
if self.counter >= 10:
|
486
|
+
self._set_event(None)
|
487
|
+
|
488
|
+
looper = Example(sleep_core=0.1)
|
489
|
+
with raises(InfiniteLooperError, match="No event None found"):
|
490
|
+
_ = await looper()
|
491
|
+
|
492
|
+
|
493
|
+
class TestInfiniteQueueLooper:
|
494
|
+
async def test_main(self) -> None:
|
495
|
+
@dataclass(kw_only=True)
|
496
|
+
class Example(InfiniteQueueLooper[None, int]):
|
497
|
+
output: set[int] = field(default_factory=set)
|
498
|
+
|
499
|
+
@override
|
500
|
+
async def _process_items(self, *items: int) -> None:
|
501
|
+
self.output.update(items)
|
502
|
+
|
503
|
+
processor = Example(sleep_core=0.1)
|
504
|
+
|
505
|
+
async def add_items() -> None:
|
506
|
+
for i in count():
|
507
|
+
processor.put_items_nowait(i)
|
508
|
+
await sleep(0.1)
|
509
|
+
|
510
|
+
with raises(ExceptionGroup): # noqa: PT012
|
511
|
+
async with EnhancedTaskGroup(timeout=1.0) as tg:
|
512
|
+
_ = tg.create_task(processor())
|
513
|
+
_ = tg.create_task(add_items())
|
514
|
+
assert 5 <= len(processor.output) <= 15
|
515
|
+
|
516
|
+
async def test_no_items(self) -> None:
|
517
|
+
@dataclass(kw_only=True)
|
518
|
+
class Example(InfiniteQueueLooper[None, int]):
|
519
|
+
output: set[int] = field(default_factory=set)
|
479
520
|
|
480
|
-
@property
|
481
521
|
@override
|
482
|
-
def
|
483
|
-
|
522
|
+
async def _process_items(self, *items: int) -> None:
|
523
|
+
self.output.update(items)
|
484
524
|
|
525
|
+
processor = Example(sleep_core=0.1)
|
485
526
|
with raises(TimeoutError):
|
486
527
|
async with timeout_dur(duration=0.5):
|
487
|
-
_ = await
|
528
|
+
_ = await processor()
|
529
|
+
|
530
|
+
async def test_error_process_items(self) -> None:
|
531
|
+
class CustomError(Exception): ...
|
532
|
+
|
533
|
+
@dataclass(kw_only=True)
|
534
|
+
class Example(InfiniteQueueLooper[None, int]):
|
535
|
+
output: set[int] = field(default_factory=set)
|
536
|
+
|
537
|
+
@override
|
538
|
+
async def _process_items(self, *items: int) -> None:
|
539
|
+
raise CustomError
|
540
|
+
|
541
|
+
processor = Example(sleep_core=0.1)
|
542
|
+
processor.put_items_nowait(1)
|
543
|
+
with raises(TimeoutError):
|
544
|
+
async with timeout_dur(duration=0.5):
|
545
|
+
_ = await processor()
|
546
|
+
|
547
|
+
|
548
|
+
class TestPutAndGetItems:
|
549
|
+
@given(xs=lists(integers(), min_size=1), max_size=integers(1, 10) | none())
|
550
|
+
async def test_put_then_get(self, *, xs: list[int], max_size: int | None) -> None:
|
551
|
+
queue: Queue[int] = Queue()
|
552
|
+
await put_items(xs, queue)
|
553
|
+
result = await get_items(queue, max_size=max_size)
|
554
|
+
if max_size is None:
|
555
|
+
assert result == xs
|
556
|
+
else:
|
557
|
+
assert result == xs[:max_size]
|
558
|
+
|
559
|
+
@given(xs=lists(integers(), min_size=1), max_size=integers(1, 10) | none())
|
560
|
+
async def test_get_then_put(self, *, xs: list[int], max_size: int | None) -> None:
|
561
|
+
queue: Queue[int] = Queue()
|
562
|
+
|
563
|
+
async def put() -> None:
|
564
|
+
await sleep(0.01)
|
565
|
+
await put_items(xs, queue)
|
566
|
+
|
567
|
+
async with TaskGroup() as tg:
|
568
|
+
task = tg.create_task(get_items(queue, max_size=max_size))
|
569
|
+
_ = tg.create_task(put())
|
570
|
+
result = task.result()
|
571
|
+
if max_size is None:
|
572
|
+
assert result == xs
|
573
|
+
else:
|
574
|
+
assert result == xs[:max_size]
|
575
|
+
|
576
|
+
async def test_empty(self) -> None:
|
577
|
+
queue: Queue[int] = Queue()
|
578
|
+
with raises(TimeoutError): # noqa: PT012
|
579
|
+
async with timeout(0.01), TaskGroup() as tg:
|
580
|
+
_ = tg.create_task(get_items(queue))
|
581
|
+
_ = tg.create_task(sleep(0.02))
|
582
|
+
|
583
|
+
|
584
|
+
class TestPutAndGetItemsNoWait:
|
585
|
+
@given(xs=lists(integers(), min_size=1), max_size=integers(1, 10) | none())
|
586
|
+
def test_main(self, *, xs: list[int], max_size: int | None) -> None:
|
587
|
+
queue: Queue[int] = Queue()
|
588
|
+
put_items_nowait(xs, queue)
|
589
|
+
result = get_items_nowait(queue, max_size=max_size)
|
590
|
+
if max_size is None:
|
591
|
+
assert result == xs
|
592
|
+
else:
|
593
|
+
assert result == xs[:max_size]
|
488
594
|
|
489
595
|
|
490
596
|
class TestQueueProcessor:
|
@@ -610,7 +716,7 @@ class TestQueueProcessor:
|
|
610
716
|
|
611
717
|
@override
|
612
718
|
async def _process_item(self, _: int, /) -> None:
|
613
|
-
items =
|
719
|
+
items = self._get_items_nowait()
|
614
720
|
self.output.add(len(items))
|
615
721
|
|
616
722
|
processor = Example()
|