dycw-utilities 0.122.0__tar.gz → 0.123.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.122.0 → dycw_utilities-0.123.0}/PKG-INFO +1 -1
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/pyproject.toml +3 -2
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_asyncio.py +45 -3
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/asyncio.py +31 -16
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/.gitignore +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/LICENSE +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/README.md +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/git.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/period.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/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.123.0"
|
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.123.0"
|
338
338
|
|
339
339
|
[[tool.bumpversion.files]]
|
340
340
|
filename = "src/utilities/__init__.py"
|
@@ -433,6 +433,7 @@ addopts = [
|
|
433
433
|
"--durations=10",
|
434
434
|
"--durations-min=10",
|
435
435
|
"--strict-markers",
|
436
|
+
"--timeout=300",
|
436
437
|
]
|
437
438
|
asyncio_default_fixture_loop_scope = "function"
|
438
439
|
asyncio_mode = "auto"
|
@@ -1,6 +1,7 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from asyncio import CancelledError, Event, Queue, TaskGroup, run, sleep, timeout
|
4
|
+
from contextlib import asynccontextmanager
|
4
5
|
from dataclasses import dataclass, field
|
5
6
|
from functools import partial
|
6
7
|
from itertools import chain, count
|
@@ -53,7 +54,7 @@ from utilities.sentinel import Sentinel, sentinel
|
|
53
54
|
from utilities.timer import Timer
|
54
55
|
|
55
56
|
if TYPE_CHECKING:
|
56
|
-
from collections.abc import Callable, Iterator
|
57
|
+
from collections.abc import AsyncIterator, Callable, Iterator
|
57
58
|
|
58
59
|
from utilities.types import (
|
59
60
|
Coroutine1,
|
@@ -65,6 +66,47 @@ if TYPE_CHECKING:
|
|
65
66
|
|
66
67
|
|
67
68
|
class TestEnhancedTaskGroup:
|
69
|
+
async def test_create_task_context_coroutine(self) -> None:
|
70
|
+
flag: bool = False
|
71
|
+
|
72
|
+
@asynccontextmanager
|
73
|
+
async def yield_true() -> AsyncIterator[None]:
|
74
|
+
nonlocal flag
|
75
|
+
try:
|
76
|
+
flag = True
|
77
|
+
yield
|
78
|
+
finally:
|
79
|
+
flag = False
|
80
|
+
|
81
|
+
assert not flag
|
82
|
+
async with EnhancedTaskGroup(timeout=0.1) as tg:
|
83
|
+
_ = tg.create_task_context(yield_true())
|
84
|
+
await sleep(0.05)
|
85
|
+
assert flag
|
86
|
+
assert not flag
|
87
|
+
|
88
|
+
async def test_create_task_context_looper(self) -> None:
|
89
|
+
@dataclass(kw_only=True)
|
90
|
+
class Example(InfiniteLooper[None]):
|
91
|
+
running: bool = False
|
92
|
+
|
93
|
+
@override
|
94
|
+
async def _initialize(self) -> None:
|
95
|
+
self.running = True
|
96
|
+
|
97
|
+
@override
|
98
|
+
async def _teardown(self) -> None:
|
99
|
+
self.running = False
|
100
|
+
|
101
|
+
looper = Example(duration=0.1)
|
102
|
+
assert not looper.running
|
103
|
+
async with EnhancedTaskGroup(timeout=0.1) as tg:
|
104
|
+
assert not looper.running
|
105
|
+
_ = tg.create_task_context(looper)
|
106
|
+
await sleep(0.05)
|
107
|
+
assert looper.running
|
108
|
+
assert not looper.running
|
109
|
+
|
68
110
|
async def test_max_tasks_disabled(self) -> None:
|
69
111
|
with Timer() as timer:
|
70
112
|
async with EnhancedTaskGroup() as tg:
|
@@ -314,7 +356,7 @@ class TestInfiniteLooper:
|
|
314
356
|
|
315
357
|
async def inc_external(obj: Example, /) -> None:
|
316
358
|
nonlocal external
|
317
|
-
|
359
|
+
for _ in range(100): # infinite doesn't work on CI
|
318
360
|
external += 1
|
319
361
|
obj.counter += 1
|
320
362
|
await sleep(0.05)
|
@@ -346,7 +388,7 @@ class TestInfiniteLooper:
|
|
346
388
|
...
|
347
389
|
assert 4 <= looper.initializations <= 6
|
348
390
|
assert 0 <= looper.counter <= 7
|
349
|
-
assert
|
391
|
+
assert 14 <= external <= 21
|
350
392
|
|
351
393
|
async def test_with_coroutine_self_error(self) -> None:
|
352
394
|
class CustomError(Exception): ...
|
@@ -19,6 +19,7 @@ from asyncio import (
|
|
19
19
|
)
|
20
20
|
from collections.abc import Callable, Hashable, Iterable, Iterator, Mapping
|
21
21
|
from contextlib import (
|
22
|
+
AbstractAsyncContextManager,
|
22
23
|
AsyncExitStack,
|
23
24
|
_AsyncGeneratorContextManager,
|
24
25
|
asynccontextmanager,
|
@@ -85,6 +86,7 @@ class EnhancedTaskGroup(TaskGroup):
|
|
85
86
|
_semaphore: Semaphore | None
|
86
87
|
_timeout: Duration | None
|
87
88
|
_error: type[Exception]
|
89
|
+
_stack: AsyncExitStack
|
88
90
|
_timeout_cm: _AsyncGeneratorContextManager[None] | None
|
89
91
|
|
90
92
|
@override
|
@@ -99,8 +101,24 @@ class EnhancedTaskGroup(TaskGroup):
|
|
99
101
|
self._semaphore = None if max_tasks is None else Semaphore(max_tasks)
|
100
102
|
self._timeout = timeout
|
101
103
|
self._error = error
|
104
|
+
self._stack = AsyncExitStack()
|
102
105
|
self._timeout_cm = None
|
103
106
|
|
107
|
+
@override
|
108
|
+
async def __aenter__(self) -> Self:
|
109
|
+
_ = await self._stack.__aenter__()
|
110
|
+
return await super().__aenter__()
|
111
|
+
|
112
|
+
@override
|
113
|
+
async def __aexit__(
|
114
|
+
self,
|
115
|
+
et: type[BaseException] | None,
|
116
|
+
exc: BaseException | None,
|
117
|
+
tb: TracebackType | None,
|
118
|
+
) -> None:
|
119
|
+
_ = await self._stack.__aexit__(et, exc, tb)
|
120
|
+
_ = await super().__aexit__(et, exc, tb)
|
121
|
+
|
104
122
|
@override
|
105
123
|
def create_task(
|
106
124
|
self,
|
@@ -116,6 +134,11 @@ class EnhancedTaskGroup(TaskGroup):
|
|
116
134
|
coroutine = self._wrap_with_timeout(coroutine)
|
117
135
|
return super().create_task(coroutine, name=name, context=context)
|
118
136
|
|
137
|
+
def create_task_context(self, cm: AbstractAsyncContextManager[_T], /) -> Task[_T]:
|
138
|
+
"""Have the TaskGroup start an asynchronous context manager."""
|
139
|
+
_ = self._stack.push_async_callback(cm.__aexit__, None, None, None)
|
140
|
+
return self.create_task(cm.__aenter__())
|
141
|
+
|
119
142
|
async def _wrap_with_semaphore(
|
120
143
|
self, semaphore: Semaphore, coroutine: _CoroutineLike[_T], /
|
121
144
|
) -> _T:
|
@@ -155,18 +178,12 @@ class InfiniteLooper(ABC, Generic[THashable]):
|
|
155
178
|
|
156
179
|
async def __aenter__(self) -> Self:
|
157
180
|
"""Context manager entry."""
|
158
|
-
if
|
159
|
-
_ = await self._stack.__aenter__()
|
181
|
+
if self._depth == 0:
|
160
182
|
self._task = create_task(self._run_looper())
|
161
183
|
if self._await_upon_aenter:
|
162
184
|
with suppress(CancelledError):
|
163
185
|
await self._task
|
164
|
-
|
165
|
-
...
|
166
|
-
else:
|
167
|
-
raise ImpossibleCaseError( # pragma: no cover
|
168
|
-
case=[f"{self._task=}", f"{self._depth=}"]
|
169
|
-
)
|
186
|
+
_ = await self._stack.__aenter__()
|
170
187
|
self._depth += 1
|
171
188
|
return self
|
172
189
|
|
@@ -178,18 +195,16 @@ class InfiniteLooper(ABC, Generic[THashable]):
|
|
178
195
|
) -> None:
|
179
196
|
"""Context manager exit."""
|
180
197
|
_ = (exc_type, exc_value, traceback)
|
181
|
-
|
182
|
-
|
183
|
-
case=[f"{self._task=}", f"{self._depth=}"]
|
184
|
-
)
|
185
|
-
self._depth -= 1
|
186
|
-
if self._depth == 0:
|
187
|
-
_ = await self._stack.__aexit__(exc_type, exc_value, traceback)
|
198
|
+
self._depth = max(self._depth - 1, 0)
|
199
|
+
if (self._depth == 0) and (self._task is not None):
|
188
200
|
with suppress(CancelledError):
|
189
201
|
await self._task
|
190
202
|
self._task = None
|
191
|
-
|
203
|
+
try:
|
192
204
|
await self._teardown()
|
205
|
+
except Exception as error: # noqa: BLE001
|
206
|
+
self._error_upon_teardown(error)
|
207
|
+
_ = await self._stack.__aexit__(exc_type, exc_value, traceback)
|
193
208
|
|
194
209
|
async def stop(self) -> None:
|
195
210
|
"""Stop the service."""
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/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.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/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
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/__init__.py
RENAMED
File without changes
|
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/decorated_async.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/decorated_sync.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/error_bind.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/recursive.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/task_group_one.py
RENAMED
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/task_group_two.py
RENAMED
File without changes
|
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/untraced.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/with_future.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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|