dycw-utilities 0.125.13__tar.gz → 0.125.15__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.125.13 → dycw_utilities-0.125.15}/PKG-INFO +1 -1
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/pyproject.toml +2 -2
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_asyncio.py +48 -20
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/asyncio.py +83 -32
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/.gitignore +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/LICENSE +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/README.md +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/click.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/git.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/http.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/math.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/os.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/period.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/random.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/re.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/text.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/types.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/version.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/utilities/zoneinfo.py +0 -0
@@ -93,7 +93,7 @@ dependencies = [
|
|
93
93
|
name = "dycw-utilities"
|
94
94
|
readme = "README.md"
|
95
95
|
requires-python = ">= 3.12"
|
96
|
-
version = "0.125.
|
96
|
+
version = "0.125.15"
|
97
97
|
|
98
98
|
[project.optional-dependencies]
|
99
99
|
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.125.
|
337
|
+
current_version = "0.125.15"
|
338
338
|
|
339
339
|
[[tool.bumpversion.files]]
|
340
340
|
filename = "src/utilities/__init__.py"
|
@@ -988,14 +988,20 @@ class TestLooper:
|
|
988
988
|
@override
|
989
989
|
async def _initialize_core(self) -> None:
|
990
990
|
if self._initialization_attempts == 1:
|
991
|
-
_ = await super().initialize()
|
991
|
+
_ = await super().initialize(sleep_if_failure=False)
|
992
992
|
await super()._initialize_core()
|
993
993
|
|
994
994
|
looper = Example()
|
995
|
-
_ = await looper.initialize()
|
995
|
+
_ = await looper.initialize(sleep_if_failure=False)
|
996
996
|
_ = one(m for m in caplog.messages if search(": already initializing$", m))
|
997
997
|
|
998
|
-
|
998
|
+
@given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
|
999
|
+
@settings(suppress_health_check={HealthCheck.function_scoped_fixture})
|
1000
|
+
async def test_initialize_failure(
|
1001
|
+
self, *, case: tuple[bool, str], caplog: LogCaptureFixture
|
1002
|
+
) -> None:
|
1003
|
+
sleep_if_failure, extra = case
|
1004
|
+
|
999
1005
|
class Example(_ExampleLooper):
|
1000
1006
|
@override
|
1001
1007
|
async def _initialize_core(self) -> None:
|
@@ -1004,11 +1010,13 @@ class TestLooper:
|
|
1004
1010
|
await super()._initialize_core()
|
1005
1011
|
|
1006
1012
|
looper = Example()
|
1007
|
-
_ = await looper.initialize()
|
1013
|
+
_ = await looper.initialize(sleep_if_failure=sleep_if_failure)
|
1008
1014
|
_ = one(
|
1009
1015
|
m
|
1010
1016
|
for m in caplog.messages
|
1011
|
-
if search(
|
1017
|
+
if search(
|
1018
|
+
rf": encountered _ExampleLooperError\(\) whilst initializing{extra}$", m
|
1019
|
+
)
|
1012
1020
|
)
|
1013
1021
|
|
1014
1022
|
def test_len_and_qsize(self) -> None:
|
@@ -1128,9 +1136,13 @@ class TestLooper:
|
|
1128
1136
|
if search(r": already requested stop when empty$", m)
|
1129
1137
|
)
|
1130
1138
|
|
1139
|
+
@given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
|
1140
|
+
@settings(suppress_health_check={HealthCheck.function_scoped_fixture})
|
1131
1141
|
async def test_restart_failure_during_initialization(
|
1132
|
-
self, *, caplog: LogCaptureFixture
|
1142
|
+
self, *, case: tuple[bool, str], caplog: LogCaptureFixture
|
1133
1143
|
) -> None:
|
1144
|
+
sleep_if_failure, extra = case
|
1145
|
+
|
1134
1146
|
class Example(_ExampleLooper):
|
1135
1147
|
@override
|
1136
1148
|
async def _initialize_core(self) -> None:
|
@@ -1139,19 +1151,23 @@ class TestLooper:
|
|
1139
1151
|
await super()._initialize_core()
|
1140
1152
|
|
1141
1153
|
looper = Example()
|
1142
|
-
await looper.restart()
|
1154
|
+
await looper.restart(sleep_if_failure=sleep_if_failure)
|
1143
1155
|
_ = one(
|
1144
1156
|
m
|
1145
1157
|
for m in caplog.messages
|
1146
1158
|
if search(
|
1147
|
-
|
1159
|
+
rf": encountered _ExampleLooperError\(\) whilst restarting \(initialize\){extra}$",
|
1148
1160
|
m,
|
1149
1161
|
)
|
1150
1162
|
)
|
1151
1163
|
|
1164
|
+
@given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
|
1165
|
+
@settings(suppress_health_check={HealthCheck.function_scoped_fixture})
|
1152
1166
|
async def test_restart_failure_during_tear_down(
|
1153
|
-
self, *, caplog: LogCaptureFixture
|
1167
|
+
self, *, case: tuple[bool, str], caplog: LogCaptureFixture
|
1154
1168
|
) -> None:
|
1169
|
+
sleep_if_failure, extra = case
|
1170
|
+
|
1155
1171
|
class Example(_ExampleLooper):
|
1156
1172
|
@override
|
1157
1173
|
async def _tear_down_core(self) -> None:
|
@@ -1160,19 +1176,23 @@ class TestLooper:
|
|
1160
1176
|
await super()._tear_down_core()
|
1161
1177
|
|
1162
1178
|
looper = Example()
|
1163
|
-
await looper.restart()
|
1179
|
+
await looper.restart(sleep_if_failure=sleep_if_failure)
|
1164
1180
|
_ = one(
|
1165
1181
|
m
|
1166
1182
|
for m in caplog.messages
|
1167
1183
|
if search(
|
1168
|
-
|
1184
|
+
rf": encountered _ExampleLooperError\(\) whilst restarting \(tear down\){extra}$",
|
1169
1185
|
m,
|
1170
1186
|
)
|
1171
1187
|
)
|
1172
1188
|
|
1189
|
+
@given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
|
1190
|
+
@settings(suppress_health_check={HealthCheck.function_scoped_fixture})
|
1173
1191
|
async def test_restart_failure_during_tear_down_and_initialization(
|
1174
|
-
self, *, caplog: LogCaptureFixture
|
1192
|
+
self, *, case: tuple[bool, str], caplog: LogCaptureFixture
|
1175
1193
|
) -> None:
|
1194
|
+
sleep_if_failure, extra = case
|
1195
|
+
|
1176
1196
|
class Example(_ExampleLooper):
|
1177
1197
|
@override
|
1178
1198
|
async def _initialize_core(self) -> None:
|
@@ -1187,12 +1207,12 @@ class TestLooper:
|
|
1187
1207
|
await super()._tear_down_core()
|
1188
1208
|
|
1189
1209
|
looper = Example()
|
1190
|
-
await looper.restart()
|
1210
|
+
await looper.restart(sleep_if_failure=sleep_if_failure)
|
1191
1211
|
_ = one(
|
1192
1212
|
m
|
1193
1213
|
for m in caplog.messages
|
1194
1214
|
if search(
|
1195
|
-
|
1215
|
+
rf": encountered _ExampleLooperError\(\) \(tear down\) and then _ExampleLooperError\(\) \(initialization\) whilst restarting{extra}$",
|
1196
1216
|
m,
|
1197
1217
|
)
|
1198
1218
|
)
|
@@ -1227,21 +1247,27 @@ class TestLooper:
|
|
1227
1247
|
)
|
1228
1248
|
)
|
1229
1249
|
|
1230
|
-
async def
|
1250
|
+
async def test_tear_down_already_tearing_down(
|
1231
1251
|
self, *, caplog: LogCaptureFixture
|
1232
1252
|
) -> None:
|
1233
1253
|
class Example(_ExampleLooper):
|
1234
1254
|
@override
|
1235
1255
|
async def _tear_down_core(self) -> None:
|
1236
1256
|
if self._tear_down_attempts == 1:
|
1237
|
-
_ = await super().tear_down()
|
1257
|
+
_ = await super().tear_down(sleep_if_failure=False)
|
1238
1258
|
await super()._tear_down_core()
|
1239
1259
|
|
1240
1260
|
looper = Example()
|
1241
|
-
_ = await looper.tear_down()
|
1261
|
+
_ = await looper.tear_down(sleep_if_failure=False)
|
1242
1262
|
_ = one(m for m in caplog.messages if search(": already tearing down$", m))
|
1243
1263
|
|
1244
|
-
|
1264
|
+
@given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
|
1265
|
+
@settings(suppress_health_check={HealthCheck.function_scoped_fixture})
|
1266
|
+
async def test_tear_down_failure(
|
1267
|
+
self, *, case: tuple[bool, str], caplog: LogCaptureFixture
|
1268
|
+
) -> None:
|
1269
|
+
sleep_if_failure, extra = case
|
1270
|
+
|
1245
1271
|
class Example(_ExampleLooper):
|
1246
1272
|
@override
|
1247
1273
|
async def _tear_down_core(self) -> None:
|
@@ -1250,11 +1276,13 @@ class TestLooper:
|
|
1250
1276
|
await super()._tear_down_core()
|
1251
1277
|
|
1252
1278
|
looper = Example()
|
1253
|
-
_ = await looper.tear_down()
|
1279
|
+
_ = await looper.tear_down(sleep_if_failure=sleep_if_failure)
|
1254
1280
|
_ = one(
|
1255
1281
|
m
|
1256
1282
|
for m in caplog.messages
|
1257
|
-
if search(
|
1283
|
+
if search(
|
1284
|
+
rf": encountered _ExampleLooperError\(\) whilst tearing down{extra}$", m
|
1285
|
+
)
|
1258
1286
|
)
|
1259
1287
|
|
1260
1288
|
def _assert_stats(
|
@@ -795,13 +795,9 @@ class Looper(Generic[_T]):
|
|
795
795
|
assert_never(never)
|
796
796
|
|
797
797
|
def __await__(self) -> Any:
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
case Task() as task:
|
802
|
-
return task.__await__()
|
803
|
-
case _ as never:
|
804
|
-
assert_never(never)
|
798
|
+
if (task := self._task) is None: # cannot use match
|
799
|
+
raise _LooperNoTaskError(looper=self)
|
800
|
+
return task.__await__()
|
805
801
|
|
806
802
|
def __len__(self) -> int:
|
807
803
|
return self._queue.qsize()
|
@@ -825,7 +821,7 @@ class Looper(Generic[_T]):
|
|
825
821
|
"""Remove and return an item from the end of the queue without blocking."""
|
826
822
|
return self._queue.get_right_nowait()
|
827
823
|
|
828
|
-
async def initialize(self) -> Exception | None:
|
824
|
+
async def initialize(self, *, sleep_if_failure: bool) -> Exception | None:
|
829
825
|
"""Initialize the looper."""
|
830
826
|
match self._is_initializing.is_set():
|
831
827
|
case True:
|
@@ -840,14 +836,26 @@ class Looper(Generic[_T]):
|
|
840
836
|
try:
|
841
837
|
await self._initialize_core()
|
842
838
|
except Exception as error: # noqa: BLE001
|
843
|
-
_ = self._logger.warning(
|
844
|
-
"%s: encountered %s whilst initializing",
|
845
|
-
self,
|
846
|
-
repr_error(error),
|
847
|
-
)
|
848
839
|
async with self._lock:
|
849
840
|
self._initialization_failures += 1
|
850
841
|
ret = error
|
842
|
+
match sleep_if_failure:
|
843
|
+
case True:
|
844
|
+
_ = self._logger.warning(
|
845
|
+
"%s: encountered %s whilst initializing; sleeping for %s...",
|
846
|
+
self,
|
847
|
+
repr_error(error),
|
848
|
+
self.backoff,
|
849
|
+
)
|
850
|
+
await sleep(self._backoff)
|
851
|
+
case False:
|
852
|
+
_ = self._logger.warning(
|
853
|
+
"%s: encountered %s whilst initializing",
|
854
|
+
self,
|
855
|
+
repr_error(error),
|
856
|
+
)
|
857
|
+
case _ as never:
|
858
|
+
assert_never(never)
|
851
859
|
else:
|
852
860
|
_ = self._debug and self._logger.debug(
|
853
861
|
"%s: finished initializing", self
|
@@ -939,44 +947,75 @@ class Looper(Generic[_T]):
|
|
939
947
|
case _ as never:
|
940
948
|
assert_never(never)
|
941
949
|
|
942
|
-
async def restart(self) -> None:
|
950
|
+
async def restart(self, *, sleep_if_failure: bool) -> None:
|
943
951
|
"""Restart the looper."""
|
944
952
|
_ = self._debug and self._logger.debug("%s: restarting...", self)
|
945
953
|
self._is_pending_restart.clear()
|
946
954
|
async with self._lock:
|
947
955
|
self._restart_attempts += 1
|
948
|
-
tear_down = await self.tear_down()
|
949
|
-
initialization = await self.initialize()
|
950
|
-
match tear_down, initialization:
|
951
|
-
case None, None:
|
956
|
+
tear_down = await self.tear_down(sleep_if_failure=False)
|
957
|
+
initialization = await self.initialize(sleep_if_failure=False)
|
958
|
+
match tear_down, initialization, sleep_if_failure:
|
959
|
+
case None, None, bool():
|
952
960
|
_ = self._debug and self._logger.debug("%s: finished restarting", self)
|
953
961
|
async with self._lock:
|
954
962
|
self._restart_successes += 1
|
955
|
-
case Exception(), None:
|
963
|
+
case Exception(), None, True:
|
964
|
+
async with self._lock:
|
965
|
+
self._restart_failures += 1
|
966
|
+
_ = self._logger.warning(
|
967
|
+
"%s: encountered %s whilst restarting (tear down); sleeping for %s...",
|
968
|
+
self,
|
969
|
+
repr_error(tear_down),
|
970
|
+
self.backoff,
|
971
|
+
)
|
972
|
+
await sleep(self._backoff)
|
973
|
+
case Exception(), None, False:
|
974
|
+
async with self._lock:
|
975
|
+
self._restart_failures += 1
|
956
976
|
_ = self._logger.warning(
|
957
|
-
"%s: encountered %s whilst restarting
|
977
|
+
"%s: encountered %s whilst restarting (tear down)",
|
958
978
|
self,
|
959
979
|
repr_error(tear_down),
|
960
980
|
)
|
981
|
+
case None, Exception(), True:
|
961
982
|
async with self._lock:
|
962
983
|
self._restart_failures += 1
|
963
|
-
case None, Exception():
|
964
984
|
_ = self._logger.warning(
|
965
|
-
"%s: encountered %s whilst restarting
|
985
|
+
"%s: encountered %s whilst restarting (initialize); sleeping for %s...",
|
966
986
|
self,
|
967
987
|
repr_error(initialization),
|
988
|
+
self.backoff,
|
968
989
|
)
|
990
|
+
await sleep(self._backoff)
|
991
|
+
case None, Exception(), False:
|
969
992
|
async with self._lock:
|
970
993
|
self._restart_failures += 1
|
971
|
-
case Exception(), Exception():
|
972
994
|
_ = self._logger.warning(
|
973
|
-
"%s: encountered %s
|
995
|
+
"%s: encountered %s whilst restarting (initialize)",
|
996
|
+
self,
|
997
|
+
repr_error(initialization),
|
998
|
+
)
|
999
|
+
case Exception(), Exception(), True:
|
1000
|
+
async with self._lock:
|
1001
|
+
self._restart_failures += 1
|
1002
|
+
_ = self._logger.warning(
|
1003
|
+
"%s: encountered %s (tear down) and then %s (initialization) whilst restarting; sleeping for %s...",
|
974
1004
|
self,
|
975
1005
|
repr_error(tear_down),
|
976
1006
|
repr_error(initialization),
|
1007
|
+
self.backoff,
|
977
1008
|
)
|
1009
|
+
await sleep(self._backoff)
|
1010
|
+
case Exception(), Exception(), False:
|
978
1011
|
async with self._lock:
|
979
1012
|
self._restart_failures += 1
|
1013
|
+
_ = self._logger.warning(
|
1014
|
+
"%s: encountered %s (tear down) and then %s (initialization) whilst restarting",
|
1015
|
+
self,
|
1016
|
+
repr_error(tear_down),
|
1017
|
+
repr_error(initialization),
|
1018
|
+
)
|
980
1019
|
case _ as never:
|
981
1020
|
assert_never(never)
|
982
1021
|
|
@@ -992,9 +1031,9 @@ class Looper(Generic[_T]):
|
|
992
1031
|
):
|
993
1032
|
await self.stop()
|
994
1033
|
elif self._is_pending_restart.is_set():
|
995
|
-
await self.restart()
|
1034
|
+
await self.restart(sleep_if_failure=True)
|
996
1035
|
elif not self._is_initialized.is_set():
|
997
|
-
_ = await self.initialize()
|
1036
|
+
_ = await self.initialize(sleep_if_failure=True)
|
998
1037
|
else:
|
999
1038
|
_ = self._debug and self._logger.debug("%s: running core...", self)
|
1000
1039
|
async with self._lock:
|
@@ -1051,7 +1090,7 @@ class Looper(Generic[_T]):
|
|
1051
1090
|
case _ as never:
|
1052
1091
|
assert_never(never)
|
1053
1092
|
|
1054
|
-
async def tear_down(self) -> Exception | None:
|
1093
|
+
async def tear_down(self, *, sleep_if_failure: bool) -> Exception | None:
|
1055
1094
|
"""Tear down the looper."""
|
1056
1095
|
match self._is_tearing_down.is_set():
|
1057
1096
|
case True:
|
@@ -1065,14 +1104,26 @@ class Looper(Generic[_T]):
|
|
1065
1104
|
try:
|
1066
1105
|
await self._tear_down_core()
|
1067
1106
|
except Exception as error: # noqa: BLE001
|
1068
|
-
_ = self._logger.warning(
|
1069
|
-
"%s: encountered %s whilst tearing down",
|
1070
|
-
self,
|
1071
|
-
repr_error(error),
|
1072
|
-
)
|
1073
1107
|
async with self._lock:
|
1074
1108
|
self._tear_down_failures += 1
|
1075
1109
|
ret = error
|
1110
|
+
match sleep_if_failure:
|
1111
|
+
case True:
|
1112
|
+
_ = self._logger.warning(
|
1113
|
+
"%s: encountered %s whilst tearing down; sleeping for %s...",
|
1114
|
+
self,
|
1115
|
+
repr_error(error),
|
1116
|
+
self.backoff,
|
1117
|
+
)
|
1118
|
+
await sleep(self._backoff)
|
1119
|
+
case False:
|
1120
|
+
_ = self._logger.warning(
|
1121
|
+
"%s: encountered %s whilst tearing down",
|
1122
|
+
self,
|
1123
|
+
repr_error(error),
|
1124
|
+
)
|
1125
|
+
case _ as never:
|
1126
|
+
assert_never(never)
|
1076
1127
|
else:
|
1077
1128
|
_ = self._debug and self._logger.debug(
|
1078
1129
|
"%s: finished tearing down", self
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/outer_1.py
RENAMED
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_with/outer_2.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.125.13 → dycw_utilities-0.125.15}/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
|