dycw-utilities 0.126.5__tar.gz → 0.126.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/PKG-INFO +1 -1
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/pyproject.toml +2 -2
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_click.py +11 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_redis.py +41 -11
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/click.py +15 -1
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/hypothesis.py +5 -3
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/redis.py +42 -25
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/.gitignore +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/LICENSE +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/README.md +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/git.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/http.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/math.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/os.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/period.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/random.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/re.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/string.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/text.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/types.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/version.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/utilities/zoneinfo.py +0 -0
@@ -95,7 +95,7 @@ dependencies = [
|
|
95
95
|
name = "dycw-utilities"
|
96
96
|
readme = "README.md"
|
97
97
|
requires-python = ">= 3.12"
|
98
|
-
version = "0.126.
|
98
|
+
version = "0.126.7"
|
99
99
|
|
100
100
|
[project.optional-dependencies]
|
101
101
|
test = [
|
@@ -336,7 +336,7 @@ zzz-test-zoneinfo = [
|
|
336
336
|
# bump-my-version
|
337
337
|
[tool.bumpversion]
|
338
338
|
allow_dirty = true
|
339
|
-
current_version = "0.126.
|
339
|
+
current_version = "0.126.7"
|
340
340
|
|
341
341
|
[[tool.bumpversion.files]]
|
342
342
|
filename = "src/utilities/__init__.py"
|
@@ -31,6 +31,7 @@ import utilities.click
|
|
31
31
|
import utilities.datetime
|
32
32
|
import utilities.types
|
33
33
|
from utilities.click import (
|
34
|
+
CONTEXT_SETTINGS_HELP_OPTION_NAMES,
|
34
35
|
Date,
|
35
36
|
DirPath,
|
36
37
|
Enum,
|
@@ -86,6 +87,16 @@ if TYPE_CHECKING:
|
|
86
87
|
_T = TypeVar("_T")
|
87
88
|
|
88
89
|
|
90
|
+
class TestContextSettingsHelpOptionNames:
|
91
|
+
@given(help_=sampled_from(["-h", "--help"]))
|
92
|
+
def test_main(self, *, help_: str) -> None:
|
93
|
+
@command(**CONTEXT_SETTINGS_HELP_OPTION_NAMES)
|
94
|
+
def cli() -> None: ...
|
95
|
+
|
96
|
+
result = CliRunner().invoke(cli, [help_])
|
97
|
+
assert result.exit_code == 0
|
98
|
+
|
99
|
+
|
89
100
|
class TestFileAndDirPaths:
|
90
101
|
def test_existing_dir_path(self, *, tmp_path: Path) -> None:
|
91
102
|
@command()
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
from asyncio import Queue, sleep
|
4
4
|
from contextlib import asynccontextmanager
|
5
|
+
from itertools import chain
|
5
6
|
from re import search
|
6
7
|
from typing import TYPE_CHECKING, Any
|
7
8
|
|
@@ -13,6 +14,7 @@ from hypothesis.strategies import (
|
|
13
14
|
data,
|
14
15
|
dictionaries,
|
15
16
|
lists,
|
17
|
+
permutations,
|
16
18
|
sampled_from,
|
17
19
|
)
|
18
20
|
from pytest import LogCaptureFixture, mark, param, raises
|
@@ -525,6 +527,38 @@ class TestSubscribe:
|
|
525
527
|
for result, obj in zip(results, objs, strict=True):
|
526
528
|
assert is_equal(result, obj)
|
527
529
|
|
530
|
+
@given(
|
531
|
+
channel=unique_strs(),
|
532
|
+
data=data(),
|
533
|
+
short_messages=lists(text_ascii(max_size=4), min_size=1, max_size=5),
|
534
|
+
long_messages=lists(text_ascii(min_size=6), min_size=1, max_size=5),
|
535
|
+
)
|
536
|
+
@settings_with_reduced_examples(phases={Phase.generate})
|
537
|
+
@SKIPIF_CI_AND_NOT_LINUX
|
538
|
+
async def test_filter(
|
539
|
+
self,
|
540
|
+
*,
|
541
|
+
channel: str,
|
542
|
+
data: DataObject,
|
543
|
+
short_messages: Sequence[str],
|
544
|
+
long_messages: Sequence[str],
|
545
|
+
) -> None:
|
546
|
+
messages = data.draw(permutations(list(chain(short_messages, long_messages))))
|
547
|
+
queue: Queue[str] = Queue()
|
548
|
+
async with (
|
549
|
+
yield_redis() as redis,
|
550
|
+
subscribe(redis, channel, queue, filter_=lambda text: len(text) >= 6),
|
551
|
+
):
|
552
|
+
await sleep(_PUB_SUB_SLEEP)
|
553
|
+
for message in messages:
|
554
|
+
await redis.publish(channel, message)
|
555
|
+
await sleep(_PUB_SUB_SLEEP) # keep in context
|
556
|
+
assert queue.qsize() == len(long_messages)
|
557
|
+
results = get_items_nowait(queue)
|
558
|
+
for result in results:
|
559
|
+
assert isinstance(result, str)
|
560
|
+
assert len(result) >= 3
|
561
|
+
|
528
562
|
@given(
|
529
563
|
channel=unique_strs(),
|
530
564
|
messages=lists(text_ascii(min_size=1), min_size=1, max_size=5),
|
@@ -577,26 +611,22 @@ class TestSubscribe:
|
|
577
611
|
|
578
612
|
|
579
613
|
class TestSubscribeService:
|
580
|
-
@given(
|
581
|
-
channel=unique_strs(),
|
582
|
-
messages=lists(text_ascii(min_size=1), min_size=1, max_size=5),
|
583
|
-
)
|
614
|
+
@given(channel=unique_strs(), objects=lists(make_objects(), min_size=1, max_size=5))
|
584
615
|
@settings_with_reduced_examples(phases={Phase.generate})
|
585
616
|
@SKIPIF_CI_AND_NOT_LINUX
|
586
|
-
async def test_main(self, *, channel: str,
|
617
|
+
async def test_main(self, *, channel: str, objects: list[str]) -> None:
|
587
618
|
async with (
|
588
619
|
yield_redis() as redis,
|
589
620
|
SubscribeService(timeout=1.0, redis=redis, channel=channel) as service,
|
590
621
|
):
|
591
622
|
await sleep(_PUB_SUB_SLEEP)
|
592
|
-
for
|
593
|
-
await redis.publish(channel,
|
623
|
+
for obj in objects:
|
624
|
+
await redis.publish(channel, serialize(obj))
|
594
625
|
await sleep(_PUB_SUB_SLEEP) # keep in context
|
595
|
-
assert service.qsize() == len(
|
626
|
+
assert service.qsize() == len(objects)
|
596
627
|
results = service.get_all_nowait()
|
597
|
-
for result,
|
598
|
-
assert
|
599
|
-
assert result == message
|
628
|
+
for result, obj in zip(results, objects, strict=True):
|
629
|
+
assert is_equal(result, obj)
|
600
630
|
|
601
631
|
@given(channel=unique_strs())
|
602
632
|
@settings(
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import datetime as dt
|
4
4
|
import pathlib
|
5
|
-
from typing import TYPE_CHECKING, Generic, TypeVar, override
|
5
|
+
from typing import TYPE_CHECKING, Generic, TypedDict, TypeVar, override
|
6
6
|
from uuid import UUID
|
7
7
|
|
8
8
|
import click
|
@@ -49,6 +49,19 @@ ExistingDirPath = click.Path(
|
|
49
49
|
)
|
50
50
|
|
51
51
|
|
52
|
+
class _HelpOptionNames(TypedDict):
|
53
|
+
help_option_names: Sequence[str]
|
54
|
+
|
55
|
+
|
56
|
+
class _ContextSettings(TypedDict):
|
57
|
+
context_settings: _HelpOptionNames
|
58
|
+
|
59
|
+
|
60
|
+
CONTEXT_SETTINGS_HELP_OPTION_NAMES = _ContextSettings(
|
61
|
+
context_settings=_HelpOptionNames(help_option_names=["-h", "--help"])
|
62
|
+
)
|
63
|
+
|
64
|
+
|
52
65
|
# parameters
|
53
66
|
|
54
67
|
|
@@ -480,6 +493,7 @@ def _make_metavar(param: Parameter, desc: str, /) -> str:
|
|
480
493
|
|
481
494
|
|
482
495
|
__all__ = [
|
496
|
+
"CONTEXT_SETTINGS_HELP_OPTION_NAMES",
|
483
497
|
"Date",
|
484
498
|
"DirPath",
|
485
499
|
"Duration",
|
@@ -24,6 +24,7 @@ from typing import (
|
|
24
24
|
overload,
|
25
25
|
override,
|
26
26
|
)
|
27
|
+
from uuid import uuid4
|
27
28
|
|
28
29
|
from hypothesis import HealthCheck, Phase, Verbosity, assume, settings
|
29
30
|
from hypothesis.errors import InvalidArgument
|
@@ -1415,9 +1416,10 @@ def unique_strs(draw: DrawFn, /) -> str:
|
|
1415
1416
|
"""Strategy for generating unique strings."""
|
1416
1417
|
now = get_now_local()
|
1417
1418
|
pid = getpid()
|
1418
|
-
ident = get_ident()
|
1419
|
-
key = str(
|
1420
|
-
|
1419
|
+
ident = just(get_ident())
|
1420
|
+
key = str(uuid4()).replace("-", "")
|
1421
|
+
full = f"{now:%Y%m%d%H%M%S%f}_{pid}_{ident}_{key}"
|
1422
|
+
return draw(just(full))
|
1421
1423
|
|
1422
1424
|
|
1423
1425
|
##
|
@@ -35,6 +35,7 @@ from utilities.datetime import (
|
|
35
35
|
from utilities.errors import ImpossibleCaseError
|
36
36
|
from utilities.functions import ensure_int, get_class_name, identity
|
37
37
|
from utilities.iterables import always_iterable, one
|
38
|
+
from utilities.orjson import deserialize, serialize
|
38
39
|
|
39
40
|
if TYPE_CHECKING:
|
40
41
|
from collections.abc import (
|
@@ -557,7 +558,7 @@ async def publish(
|
|
557
558
|
data: _T,
|
558
559
|
/,
|
559
560
|
*,
|
560
|
-
serializer: Callable[[
|
561
|
+
serializer: Callable[[_T], EncodableT],
|
561
562
|
timeout: Duration = _PUBLISH_TIMEOUT,
|
562
563
|
) -> ResponseT: ...
|
563
564
|
@overload
|
@@ -577,7 +578,7 @@ async def publish(
|
|
577
578
|
data: bytes | str | _T,
|
578
579
|
/,
|
579
580
|
*,
|
580
|
-
serializer: Callable[[
|
581
|
+
serializer: Callable[[_T], EncodableT] | None = None,
|
581
582
|
timeout: Duration = _PUBLISH_TIMEOUT,
|
582
583
|
) -> ResponseT: ...
|
583
584
|
async def publish(
|
@@ -586,18 +587,19 @@ async def publish(
|
|
586
587
|
data: bytes | str | _T,
|
587
588
|
/,
|
588
589
|
*,
|
589
|
-
serializer: Callable[[
|
590
|
+
serializer: Callable[[_T], EncodableT] | None = None,
|
590
591
|
timeout: Duration = _PUBLISH_TIMEOUT,
|
591
592
|
) -> ResponseT:
|
592
593
|
"""Publish an object to a channel."""
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
594
|
+
match data, serializer: # skipif-ci-and-not-linux
|
595
|
+
case bytes() | str() as data_use, _:
|
596
|
+
...
|
597
|
+
case _, None:
|
598
|
+
raise PublishError(data=data, serializer=serializer)
|
599
|
+
case _, Callable():
|
600
|
+
data_use = serializer(data)
|
601
|
+
case _ as never:
|
602
|
+
assert_never(never)
|
601
603
|
async with timeout_dur(duration=timeout): # skipif-ci-and-not-linux
|
602
604
|
return await redis.publish(channel, data_use) # skipif-ci-and-not-linux
|
603
605
|
|
@@ -654,7 +656,7 @@ class PublisherError(Exception):
|
|
654
656
|
|
655
657
|
|
656
658
|
@dataclass(kw_only=True)
|
657
|
-
class PublishService(Looper[tuple[str,
|
659
|
+
class PublishService(Looper[tuple[str, _T]]):
|
658
660
|
"""Service to publish items to Redis."""
|
659
661
|
|
660
662
|
# base
|
@@ -663,7 +665,7 @@ class PublishService(Looper[tuple[str, bytes | str | _T]]):
|
|
663
665
|
empty_upon_exit: bool = field(default=True, repr=False)
|
664
666
|
# self
|
665
667
|
redis: Redis
|
666
|
-
serializer: Callable[[
|
668
|
+
serializer: Callable[[_T], EncodableT] = serialize
|
667
669
|
publish_timeout: Duration = SECOND
|
668
670
|
|
669
671
|
@override
|
@@ -698,6 +700,7 @@ def subscribe(
|
|
698
700
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
699
701
|
sleep: Duration = _SUBSCRIBE_SLEEP,
|
700
702
|
output: Literal["raw"],
|
703
|
+
filter_: Callable[[_RedisMessage], bool] | None = None,
|
701
704
|
) -> AsyncIterator[Task[None]]: ...
|
702
705
|
@overload
|
703
706
|
@asynccontextmanager
|
@@ -710,6 +713,7 @@ def subscribe(
|
|
710
713
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
711
714
|
sleep: Duration = _SUBSCRIBE_SLEEP,
|
712
715
|
output: Literal["bytes"],
|
716
|
+
filter_: Callable[[bytes], bool] | None = None,
|
713
717
|
) -> AsyncIterator[Task[None]]: ...
|
714
718
|
@overload
|
715
719
|
@asynccontextmanager
|
@@ -722,6 +726,7 @@ def subscribe(
|
|
722
726
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
723
727
|
sleep: Duration = _SUBSCRIBE_SLEEP,
|
724
728
|
output: Literal["text"] = "text",
|
729
|
+
filter_: Callable[[str], bool] | None = None,
|
725
730
|
) -> AsyncIterator[Task[None]]: ...
|
726
731
|
@overload
|
727
732
|
@asynccontextmanager
|
@@ -734,6 +739,7 @@ def subscribe(
|
|
734
739
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
735
740
|
sleep: Duration = _SUBSCRIBE_SLEEP,
|
736
741
|
output: Callable[[bytes], _T],
|
742
|
+
filter_: Callable[[_T], bool] | None = None,
|
737
743
|
) -> AsyncIterator[Task[None]]: ...
|
738
744
|
@asynccontextmanager
|
739
745
|
async def subscribe(
|
@@ -745,6 +751,7 @@ async def subscribe(
|
|
745
751
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
746
752
|
sleep: Duration = _SUBSCRIBE_SLEEP,
|
747
753
|
output: Literal["raw", "bytes", "text"] | Callable[[bytes], _T] = "text",
|
754
|
+
filter_: Callable[[Any], bool] | None = None,
|
748
755
|
) -> AsyncIterator[Task[None]]:
|
749
756
|
"""Subscribe to the data of a given channel(s)."""
|
750
757
|
channels = list(always_iterable(channels)) # skipif-ci-and-not-linux
|
@@ -767,7 +774,15 @@ async def subscribe(
|
|
767
774
|
assert_never(never)
|
768
775
|
|
769
776
|
task = create_task( # skipif-ci-and-not-linux
|
770
|
-
_subscribe_core(
|
777
|
+
_subscribe_core(
|
778
|
+
redis,
|
779
|
+
channels,
|
780
|
+
transform,
|
781
|
+
queue,
|
782
|
+
timeout=timeout,
|
783
|
+
sleep=sleep,
|
784
|
+
filter_=filter_,
|
785
|
+
)
|
771
786
|
)
|
772
787
|
try: # skipif-ci-and-not-linux
|
773
788
|
yield task
|
@@ -786,6 +801,7 @@ async def _subscribe_core(
|
|
786
801
|
*,
|
787
802
|
timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
|
788
803
|
sleep: Duration = _SUBSCRIBE_SLEEP,
|
804
|
+
filter_: Callable[[Any], bool] | None = None,
|
789
805
|
) -> None:
|
790
806
|
timeout_use = ( # skipif-ci-and-not-linux
|
791
807
|
None if timeout is None else datetime_duration_to_float(timeout)
|
@@ -798,10 +814,12 @@ async def _subscribe_core(
|
|
798
814
|
while True:
|
799
815
|
message = await pubsub.get_message(timeout=timeout_use)
|
800
816
|
if is_subscribe_message(message):
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
817
|
+
transformed = transform(message)
|
818
|
+
if (filter_ is None) or filter_(transformed):
|
819
|
+
if isinstance(queue, EnhancedQueue):
|
820
|
+
queue.put_right_nowait(transformed)
|
821
|
+
else:
|
822
|
+
queue.put_nowait(transformed)
|
805
823
|
else:
|
806
824
|
await asyncio.sleep(sleep_use)
|
807
825
|
|
@@ -843,9 +861,10 @@ class SubscribeService(Looper[_T]):
|
|
843
861
|
# self
|
844
862
|
redis: Redis
|
845
863
|
channel: str
|
846
|
-
deserializer: Callable[[bytes], _T]
|
847
|
-
subscribe_sleep: Duration = _SUBSCRIBE_SLEEP
|
864
|
+
deserializer: Callable[[bytes], _T] = deserialize
|
848
865
|
subscribe_timeout: Duration | None = _SUBSCRIBE_TIMEOUT
|
866
|
+
subscribe_sleep: Duration = _SUBSCRIBE_SLEEP
|
867
|
+
filter_: Callable[[_T], bool] | None = None
|
849
868
|
_is_subscribed: Event = field(default_factory=Event, init=False, repr=False)
|
850
869
|
|
851
870
|
@override
|
@@ -864,12 +883,10 @@ class SubscribeService(Looper[_T]):
|
|
864
883
|
self.redis,
|
865
884
|
self.channel,
|
866
885
|
self._queue,
|
867
|
-
sleep=self.subscribe_sleep,
|
868
886
|
timeout=self.subscribe_timeout,
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
),
|
887
|
+
sleep=self.subscribe_sleep,
|
888
|
+
output=self.deserializer,
|
889
|
+
filter_=self.filter_,
|
873
890
|
)
|
874
891
|
)
|
875
892
|
case _ as never:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/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.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.126.5 → dycw_utilities-0.126.7}/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
|