dycw-utilities 0.166.26__tar.gz → 0.166.28__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.
Potentially problematic release.
This version of dycw-utilities might be problematic. Click here for more details.
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/PKG-INFO +3 -3
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/pyproject.toml +6 -6
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_asyncio.py +64 -5
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_iterables.py +15 -12
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_os.py +4 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/asyncio.py +63 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/iterables.py +1 -1
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/os.py +1 -1
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/.gitignore +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/LICENSE +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/README.md +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_aeventkit.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pydantic_settings.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pydantic_settings_sops.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_testbook.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/aeventkit.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/click.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/git.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/http.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/json.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/math.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pydantic_settings.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pydantic_settings_sops.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/random.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/re.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/string.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/testbook.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/text.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/types.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/version.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/utilities/zoneinfo.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dycw-utilities
|
|
3
|
-
Version: 0.166.
|
|
3
|
+
Version: 0.166.28
|
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -12,8 +12,8 @@ Provides-Extra: logging
|
|
|
12
12
|
Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
|
|
13
13
|
Provides-Extra: test
|
|
14
14
|
Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
|
|
15
|
-
Requires-Dist: hypothesis<6.139,>=6.138.
|
|
16
|
-
Requires-Dist: pytest-asyncio<1.
|
|
15
|
+
Requires-Dist: hypothesis<6.139,>=6.138.16; extra == 'test'
|
|
16
|
+
Requires-Dist: pytest-asyncio<1.3,>=1.2.0; extra == 'test'
|
|
17
17
|
Requires-Dist: pytest-cov<7.1,>=7.0.0; extra == 'test'
|
|
18
18
|
Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
|
|
19
19
|
Requires-Dist: pytest-lazy-fixtures<1.4,>=1.3.4; extra == 'test'
|
|
@@ -71,7 +71,7 @@ http-test = [
|
|
|
71
71
|
"orjson",
|
|
72
72
|
]
|
|
73
73
|
hypothesis = [
|
|
74
|
-
"hypothesis >=6.138.
|
|
74
|
+
"hypothesis >=6.138.16, <6.139",
|
|
75
75
|
]
|
|
76
76
|
hypothesis-test = [
|
|
77
77
|
"libcst",
|
|
@@ -161,7 +161,7 @@ pyinstrument = [
|
|
|
161
161
|
]
|
|
162
162
|
pytest = [
|
|
163
163
|
"pytest >=8.4.2, <8.5",
|
|
164
|
-
"pytest-asyncio >=1.
|
|
164
|
+
"pytest-asyncio >=1.2.0, <1.3",
|
|
165
165
|
"pytest-randomly >=4.0.1, <4.1",
|
|
166
166
|
"pytest-timeout >=2.4.0, <2.5",
|
|
167
167
|
"pytest-xdist >=3.8.0, <3.9",
|
|
@@ -246,7 +246,7 @@ dependencies = [
|
|
|
246
246
|
name = "dycw-utilities"
|
|
247
247
|
readme = "README.md"
|
|
248
248
|
requires-python = ">= 3.12"
|
|
249
|
-
version = "0.166.
|
|
249
|
+
version = "0.166.28"
|
|
250
250
|
|
|
251
251
|
[project.entry-points.pytest11]
|
|
252
252
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
|
@@ -258,9 +258,9 @@ logging = [
|
|
|
258
258
|
]
|
|
259
259
|
test = [
|
|
260
260
|
"dycw-pytest-only >=2.1.1, <2.2",
|
|
261
|
-
"hypothesis >=6.138.
|
|
261
|
+
"hypothesis >=6.138.16, <6.139",
|
|
262
262
|
"pytest >=8.4.2, <8.5",
|
|
263
|
-
"pytest-asyncio >=1.
|
|
263
|
+
"pytest-asyncio >=1.2.0, <1.3",
|
|
264
264
|
"pytest-cov >=7.0.0, <7.1",
|
|
265
265
|
"pytest-instafail >=0.5.0, <0.6",
|
|
266
266
|
"pytest-lazy-fixtures >=1.3.4, <1.4",
|
|
@@ -279,7 +279,7 @@ test = [
|
|
|
279
279
|
# bump-my-version
|
|
280
280
|
[tool.bumpversion]
|
|
281
281
|
allow_dirty = true
|
|
282
|
-
current_version = "0.166.
|
|
282
|
+
current_version = "0.166.28"
|
|
283
283
|
|
|
284
284
|
[[tool.bumpversion.files]]
|
|
285
285
|
filename = "src/utilities/__init__.py"
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from asyncio import Queue, run
|
|
4
|
-
from collections.abc import ItemsView, KeysView, ValuesView
|
|
5
|
+
from collections.abc import AsyncIterable, ItemsView, Iterable, KeysView, ValuesView
|
|
5
6
|
from contextlib import asynccontextmanager
|
|
6
|
-
from re import search
|
|
7
|
-
from typing import TYPE_CHECKING, ClassVar
|
|
7
|
+
from re import DOTALL, search
|
|
8
|
+
from typing import TYPE_CHECKING, Any, ClassVar
|
|
8
9
|
|
|
9
10
|
from hypothesis import HealthCheck, given, settings
|
|
10
|
-
from hypothesis.strategies import booleans, dictionaries, integers, lists, none
|
|
11
|
-
from pytest import RaisesGroup, raises
|
|
11
|
+
from hypothesis.strategies import booleans, dictionaries, integers, lists, none, sets
|
|
12
|
+
from pytest import RaisesGroup, mark, param, raises
|
|
12
13
|
|
|
13
14
|
from utilities.asyncio import (
|
|
14
15
|
AsyncDict,
|
|
15
16
|
EnhancedTaskGroup,
|
|
17
|
+
OneAsyncEmptyError,
|
|
18
|
+
OneAsyncNonUniqueError,
|
|
19
|
+
chain_async,
|
|
16
20
|
get_coroutine_name,
|
|
17
21
|
get_items,
|
|
18
22
|
get_items_nowait,
|
|
23
|
+
one_async,
|
|
19
24
|
put_items,
|
|
20
25
|
put_items_nowait,
|
|
21
26
|
sleep_max,
|
|
@@ -188,6 +193,26 @@ class TestAsyncDict:
|
|
|
188
193
|
assert isinstance(value, int)
|
|
189
194
|
|
|
190
195
|
|
|
196
|
+
class TestChainAsync:
|
|
197
|
+
@given(n=integers(0, 10))
|
|
198
|
+
async def test_sync(self, *, n: int) -> None:
|
|
199
|
+
it = chain_async(range(n))
|
|
200
|
+
result = [x async for x in it]
|
|
201
|
+
expected = list(range(n))
|
|
202
|
+
assert result == expected
|
|
203
|
+
|
|
204
|
+
@given(n=integers(0, 10))
|
|
205
|
+
async def test_async(self, *, n: int) -> None:
|
|
206
|
+
async def range_async(n: int, /) -> AsyncIterator[int]:
|
|
207
|
+
for i in range(n):
|
|
208
|
+
yield i
|
|
209
|
+
|
|
210
|
+
it = chain_async(range_async(n))
|
|
211
|
+
result = [x async for x in it]
|
|
212
|
+
expected = list(range(n))
|
|
213
|
+
assert result == expected
|
|
214
|
+
|
|
215
|
+
|
|
191
216
|
class TestEnhancedTaskGroup:
|
|
192
217
|
delta: ClassVar[TimeDelta] = 0.05 * SECOND
|
|
193
218
|
|
|
@@ -317,6 +342,40 @@ class TestGetItems:
|
|
|
317
342
|
assert result == xs[:max_size]
|
|
318
343
|
|
|
319
344
|
|
|
345
|
+
class TestOneAsync:
|
|
346
|
+
@mark.parametrize(
|
|
347
|
+
"args", [param(([None],)), param(([None], [])), param(([None], [], []))]
|
|
348
|
+
)
|
|
349
|
+
async def test_main(self, *, args: tuple[Iterable[Any], ...]) -> None:
|
|
350
|
+
assert await one_async(*map(self._lift, args)) is None
|
|
351
|
+
|
|
352
|
+
@mark.parametrize("args", [param([]), param(([], [])), param(([], [], []))])
|
|
353
|
+
async def test_error_empty(self, *, args: tuple[Iterable[Any], ...]) -> None:
|
|
354
|
+
with raises(
|
|
355
|
+
OneAsyncEmptyError,
|
|
356
|
+
match=re.compile(r"Iterable\(s\) .* must not be empty", flags=DOTALL),
|
|
357
|
+
):
|
|
358
|
+
_ = await one_async(*map(self._lift, args))
|
|
359
|
+
|
|
360
|
+
@given(iterable=sets(integers(), min_size=2))
|
|
361
|
+
async def test_error_non_unique(self, *, iterable: set[int]) -> None:
|
|
362
|
+
with raises(
|
|
363
|
+
OneAsyncNonUniqueError,
|
|
364
|
+
match=re.compile(
|
|
365
|
+
r"Iterable\(s\) .* must contain exactly one item; got .*, .* and perhaps more",
|
|
366
|
+
flags=DOTALL,
|
|
367
|
+
),
|
|
368
|
+
):
|
|
369
|
+
_ = await one_async(iterable)
|
|
370
|
+
|
|
371
|
+
def _lift[T](self, iterable: Iterable[T], /) -> AsyncIterable[T]:
|
|
372
|
+
async def lifted() -> AsyncIterator[Any]:
|
|
373
|
+
for i in iterable:
|
|
374
|
+
yield i
|
|
375
|
+
|
|
376
|
+
return lifted()
|
|
377
|
+
|
|
378
|
+
|
|
320
379
|
class TestPutItems:
|
|
321
380
|
@given(xs=lists(integers(), min_size=1), wait=booleans())
|
|
322
381
|
async def test_main(self, *, xs: list[int], wait: bool) -> None:
|
|
@@ -885,11 +885,13 @@ class TestMergeStrMappings:
|
|
|
885
885
|
|
|
886
886
|
|
|
887
887
|
class TestOne:
|
|
888
|
-
@
|
|
888
|
+
@mark.parametrize(
|
|
889
|
+
"args", [param(([None],)), param(([None], [])), param(([None], [], []))]
|
|
890
|
+
)
|
|
889
891
|
def test_main(self, *, args: tuple[Iterable[Any], ...]) -> None:
|
|
890
892
|
assert one(*args) is None
|
|
891
893
|
|
|
892
|
-
@
|
|
894
|
+
@mark.parametrize("args", [param([]), param(([], [])), param(([], [], []))])
|
|
893
895
|
def test_error_empty(self, *, args: tuple[Iterable[Any], ...]) -> None:
|
|
894
896
|
with raises(OneEmptyError, match=r"Iterable\(s\) .* must not be empty"):
|
|
895
897
|
_ = one(*args)
|
|
@@ -907,20 +909,21 @@ class TestOne:
|
|
|
907
909
|
|
|
908
910
|
|
|
909
911
|
class TestOneMaybe:
|
|
910
|
-
@
|
|
911
|
-
args
|
|
912
|
-
|
|
913
|
-
(
|
|
914
|
-
(None,
|
|
915
|
-
(
|
|
916
|
-
(None, []),
|
|
917
|
-
(
|
|
918
|
-
|
|
912
|
+
@mark.parametrize(
|
|
913
|
+
"args",
|
|
914
|
+
[
|
|
915
|
+
param((None,)),
|
|
916
|
+
param(([None],)),
|
|
917
|
+
param((None, [])),
|
|
918
|
+
param(([None], [])),
|
|
919
|
+
param((None, [], [])),
|
|
920
|
+
param(([None], [], [])),
|
|
921
|
+
],
|
|
919
922
|
)
|
|
920
923
|
def test_main(self, *, args: tuple[MaybeIterable[Any], ...]) -> None:
|
|
921
924
|
assert one_maybe(*args) is None
|
|
922
925
|
|
|
923
|
-
@
|
|
926
|
+
@mark.parametrize("args", [param([]), param(([], [])), param(([], [], []))])
|
|
924
927
|
def test_error_empty(self, *, args: tuple[MaybeIterable[Any], ...]) -> None:
|
|
925
928
|
with raises(OneMaybeEmptyError, match=r"Object\(s\) must not be empty"):
|
|
926
929
|
_ = one_maybe(*args)
|
|
@@ -134,6 +134,10 @@ class TestIsPytest:
|
|
|
134
134
|
def test_main(self) -> None:
|
|
135
135
|
assert is_pytest()
|
|
136
136
|
|
|
137
|
+
def test_off(self) -> None:
|
|
138
|
+
with temp_environ(PYTEST_VERSION=None):
|
|
139
|
+
assert not is_pytest()
|
|
140
|
+
|
|
137
141
|
|
|
138
142
|
class TestTempEnviron:
|
|
139
143
|
@given(key=text.map(_prefix), value=text)
|
|
@@ -31,6 +31,7 @@ from typing import (
|
|
|
31
31
|
Self,
|
|
32
32
|
TextIO,
|
|
33
33
|
assert_never,
|
|
34
|
+
cast,
|
|
34
35
|
overload,
|
|
35
36
|
override,
|
|
36
37
|
)
|
|
@@ -38,6 +39,7 @@ from typing import (
|
|
|
38
39
|
from utilities.functions import ensure_int, ensure_not_none
|
|
39
40
|
from utilities.os import is_pytest
|
|
40
41
|
from utilities.random import SYSTEM_RANDOM
|
|
42
|
+
from utilities.reprlib import get_repr
|
|
41
43
|
from utilities.sentinel import Sentinel, sentinel
|
|
42
44
|
from utilities.shelve import yield_shelf
|
|
43
45
|
from utilities.text import to_bool
|
|
@@ -48,6 +50,7 @@ if TYPE_CHECKING:
|
|
|
48
50
|
from asyncio import _CoroutineLike
|
|
49
51
|
from asyncio.subprocess import Process
|
|
50
52
|
from collections.abc import (
|
|
53
|
+
AsyncIterable,
|
|
51
54
|
AsyncIterator,
|
|
52
55
|
Callable,
|
|
53
56
|
ItemsView,
|
|
@@ -346,6 +349,24 @@ class EnhancedTaskGroup(TaskGroup):
|
|
|
346
349
|
##
|
|
347
350
|
|
|
348
351
|
|
|
352
|
+
def chain_async[T](*iterables: Iterable[T] | AsyncIterable[T]) -> AsyncIterator[T]:
|
|
353
|
+
"""Asynchronous version of `chain`."""
|
|
354
|
+
|
|
355
|
+
async def iterator() -> AsyncIterator[T]:
|
|
356
|
+
for it in iterables:
|
|
357
|
+
try:
|
|
358
|
+
async for item in cast("AsyncIterable[T]", it):
|
|
359
|
+
yield item
|
|
360
|
+
except TypeError:
|
|
361
|
+
for item in cast("Iterable[T]", it):
|
|
362
|
+
yield item
|
|
363
|
+
|
|
364
|
+
return iterator()
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
##
|
|
368
|
+
|
|
369
|
+
|
|
349
370
|
def get_coroutine_name(func: Callable[[], Coro[Any]], /) -> str:
|
|
350
371
|
"""Get the name of a coroutine, and then dispose of it gracefully."""
|
|
351
372
|
coro = func()
|
|
@@ -394,6 +415,43 @@ def get_items_nowait[T](queue: Queue[T], /, *, max_size: int | None = None) -> l
|
|
|
394
415
|
##
|
|
395
416
|
|
|
396
417
|
|
|
418
|
+
async def one_async[T](*iterables: Iterable[T] | AsyncIterable[T]) -> T:
|
|
419
|
+
"""Asynchronous version of `one`."""
|
|
420
|
+
result: T | Sentinel = sentinel
|
|
421
|
+
async for item in chain_async(*iterables):
|
|
422
|
+
if not isinstance(result, Sentinel):
|
|
423
|
+
raise OneAsyncNonUniqueError(iterables=iterables, first=result, second=item)
|
|
424
|
+
result = item
|
|
425
|
+
if isinstance(result, Sentinel):
|
|
426
|
+
raise OneAsyncEmptyError(iterables=iterables)
|
|
427
|
+
return result
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
@dataclass(kw_only=True, slots=True)
|
|
431
|
+
class OneAsyncError[T](Exception):
|
|
432
|
+
iterables: tuple[Iterable[T] | AsyncIterable[T], ...]
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
@dataclass(kw_only=True, slots=True)
|
|
436
|
+
class OneAsyncEmptyError[T](OneAsyncError[T]):
|
|
437
|
+
@override
|
|
438
|
+
def __str__(self) -> str:
|
|
439
|
+
return f"Iterable(s) {get_repr(self.iterables)} must not be empty"
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
@dataclass(kw_only=True, slots=True)
|
|
443
|
+
class OneAsyncNonUniqueError[T](OneAsyncError):
|
|
444
|
+
first: T
|
|
445
|
+
second: T
|
|
446
|
+
|
|
447
|
+
@override
|
|
448
|
+
def __str__(self) -> str:
|
|
449
|
+
return f"Iterable(s) {get_repr(self.iterables)} must contain exactly one item; got {self.first}, {self.second} and perhaps more"
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
##
|
|
453
|
+
|
|
454
|
+
|
|
397
455
|
async def put_items[T](items: Iterable[T], queue: Queue[T], /) -> None:
|
|
398
456
|
"""Put items into a queue; if full then wait."""
|
|
399
457
|
for item in items:
|
|
@@ -542,10 +600,15 @@ async def yield_locked_shelf(
|
|
|
542
600
|
__all__ = [
|
|
543
601
|
"AsyncDict",
|
|
544
602
|
"EnhancedTaskGroup",
|
|
603
|
+
"OneAsyncEmptyError",
|
|
604
|
+
"OneAsyncError",
|
|
605
|
+
"OneAsyncNonUniqueError",
|
|
545
606
|
"StreamCommandOutput",
|
|
607
|
+
"chain_async",
|
|
546
608
|
"get_coroutine_name",
|
|
547
609
|
"get_items",
|
|
548
610
|
"get_items_nowait",
|
|
611
|
+
"one_async",
|
|
549
612
|
"put_items",
|
|
550
613
|
"put_items_nowait",
|
|
551
614
|
"sleep_max",
|
|
@@ -933,7 +933,7 @@ class MergeStrMappingsError(Exception):
|
|
|
933
933
|
|
|
934
934
|
def one[T](*iterables: Iterable[T]) -> T:
|
|
935
935
|
"""Return the unique value in a set of iterables."""
|
|
936
|
-
it =
|
|
936
|
+
it = chain(*iterables)
|
|
937
937
|
try:
|
|
938
938
|
first = next(it)
|
|
939
939
|
except StopIteration:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_missing/__init__.py
RENAMED
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_missing/module.py
RENAMED
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/__init__.py
RENAMED
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_with/outer_1.py
RENAMED
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/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.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_without/__init__.py
RENAMED
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/modules/package_without/module_1.py
RENAMED
|
File without changes
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/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
|
{dycw_utilities-0.166.26 → dycw_utilities-0.166.28}/src/tests/test_pydantic_settings_sops.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
|