dycw-utilities 0.163.1__tar.gz → 0.164.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/PKG-INFO +1 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/pyproject.toml +2 -2
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_functions.py +0 -233
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_iterables.py +1 -7
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_logging.py +29 -4
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_orjson.py +1 -2
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing.py +228 -10
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing_funcs/with_future.py +6 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/dataclasses.py +2 -6
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/functions.py +5 -266
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/iterables.py +1 -16
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/logging.py +34 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/operator.py +1 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/orjson.py +2 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/polars.py +4 -6
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/polars_ols.py +1 -1
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/redis.py +2 -11
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/sqlalchemy.py +7 -9
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/typing.py +418 -14
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/.gitignore +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/LICENSE +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/README.md +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_aeventkit.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_testbook.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/aeventkit.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/click.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/http.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/json.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/math.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/os.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/random.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/re.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/string.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/testbook.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/text.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/types.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/version.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/zoneinfo.py +0 -0
@@ -232,7 +232,7 @@ dependencies = [
|
|
232
232
|
name = "dycw-utilities"
|
233
233
|
readme = "README.md"
|
234
234
|
requires-python = ">= 3.12"
|
235
|
-
version = "0.
|
235
|
+
version = "0.164.1"
|
236
236
|
|
237
237
|
[project.entry-points.pytest11]
|
238
238
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -265,7 +265,7 @@ test = [
|
|
265
265
|
# bump-my-version
|
266
266
|
[tool.bumpversion]
|
267
267
|
allow_dirty = true
|
268
|
-
current_version = "0.
|
268
|
+
current_version = "0.164.1"
|
269
269
|
|
270
270
|
[[tool.bumpversion.files]]
|
271
271
|
filename = "src/utilities/__init__.py"
|
@@ -33,15 +33,12 @@ from utilities.functions import (
|
|
33
33
|
EnsureClassError,
|
34
34
|
EnsureDateError,
|
35
35
|
EnsureFloatError,
|
36
|
-
EnsureHashableError,
|
37
36
|
EnsureIntError,
|
38
37
|
EnsureMemberError,
|
39
38
|
EnsureNotNoneError,
|
40
39
|
EnsureNumberError,
|
41
40
|
EnsurePathError,
|
42
41
|
EnsurePlainDateTimeError,
|
43
|
-
EnsureSizedError,
|
44
|
-
EnsureSizedNotStrError,
|
45
42
|
EnsureStrError,
|
46
43
|
EnsureTimeDeltaError,
|
47
44
|
EnsureTimeError,
|
@@ -54,15 +51,12 @@ from utilities.functions import (
|
|
54
51
|
ensure_class,
|
55
52
|
ensure_date,
|
56
53
|
ensure_float,
|
57
|
-
ensure_hashable,
|
58
54
|
ensure_int,
|
59
55
|
ensure_member,
|
60
56
|
ensure_not_none,
|
61
57
|
ensure_number,
|
62
58
|
ensure_path,
|
63
59
|
ensure_plain_date_time,
|
64
|
-
ensure_sized,
|
65
|
-
ensure_sized_not_str,
|
66
60
|
ensure_str,
|
67
61
|
ensure_time,
|
68
62
|
ensure_time_delta,
|
@@ -73,20 +67,8 @@ from utilities.functions import (
|
|
73
67
|
get_func_name,
|
74
68
|
get_func_qualname,
|
75
69
|
identity,
|
76
|
-
is_dataclass_class,
|
77
|
-
is_dataclass_instance,
|
78
|
-
is_hashable,
|
79
|
-
is_iterable_of,
|
80
70
|
is_none,
|
81
71
|
is_not_none,
|
82
|
-
is_sequence_of,
|
83
|
-
is_sequence_of_tuple_or_str_mapping,
|
84
|
-
is_sized,
|
85
|
-
is_sized_not_str,
|
86
|
-
is_string_mapping,
|
87
|
-
is_tuple,
|
88
|
-
is_tuple_or_str_mapping,
|
89
|
-
make_isinstance,
|
90
72
|
map_object,
|
91
73
|
max_nullable,
|
92
74
|
min_nullable,
|
@@ -232,18 +214,6 @@ class TestEnsureFloat:
|
|
232
214
|
_ = ensure_float(sentinel, nullable=nullable)
|
233
215
|
|
234
216
|
|
235
|
-
class TestEnsureHashable:
|
236
|
-
@given(obj=sampled_from([0, (1, 2, 3)]))
|
237
|
-
def test_main(self, *, obj: Any) -> None:
|
238
|
-
assert ensure_hashable(obj) == obj
|
239
|
-
|
240
|
-
def test_error(self) -> None:
|
241
|
-
with raises(
|
242
|
-
EnsureHashableError, match=r"Object '.*' of type '.*' must be hashable"
|
243
|
-
):
|
244
|
-
_ = ensure_hashable([1, 2, 3])
|
245
|
-
|
246
|
-
|
247
217
|
class TestEnsureInt:
|
248
218
|
@given(case=sampled_from([(0, False), (0, True), (None, True)]))
|
249
219
|
def test_main(self, *, case: tuple[int | None, bool]) -> None:
|
@@ -363,30 +333,6 @@ class TestEnsurePlainDateTime:
|
|
363
333
|
_ = ensure_plain_date_time(sentinel, nullable=nullable)
|
364
334
|
|
365
335
|
|
366
|
-
class TestEnsureSized:
|
367
|
-
@given(obj=sampled_from([[], (), ""]))
|
368
|
-
def test_main(self, *, obj: Any) -> None:
|
369
|
-
_ = ensure_sized(obj)
|
370
|
-
|
371
|
-
def test_error(self) -> None:
|
372
|
-
with raises(EnsureSizedError, match=r"Object '.*' of type '.*' must be sized"):
|
373
|
-
_ = ensure_sized(None)
|
374
|
-
|
375
|
-
|
376
|
-
class TestEnsureSizedNotStr:
|
377
|
-
@given(obj=sampled_from([[], ()]))
|
378
|
-
def test_main(self, *, obj: Any) -> None:
|
379
|
-
_ = ensure_sized_not_str(obj)
|
380
|
-
|
381
|
-
@given(obj=sampled_from([None, '""']))
|
382
|
-
def test_error(self, *, obj: Any) -> None:
|
383
|
-
with raises(
|
384
|
-
EnsureSizedNotStrError,
|
385
|
-
match="Object '.*' of type '.*' must be sized and not a string",
|
386
|
-
):
|
387
|
-
_ = ensure_sized_not_str(obj)
|
388
|
-
|
389
|
-
|
390
336
|
class TestEnsureStr:
|
391
337
|
@given(case=sampled_from([("", False), ("", True), (None, True)]))
|
392
338
|
def test_main(self, *, case: tuple[bool | None, bool]) -> None:
|
@@ -610,72 +556,6 @@ class TestIdentity:
|
|
610
556
|
assert identity(x) == x
|
611
557
|
|
612
558
|
|
613
|
-
class TestIsDataClassClass:
|
614
|
-
def test_main(self) -> None:
|
615
|
-
@dataclass(kw_only=True, slots=True)
|
616
|
-
class Example:
|
617
|
-
x: None = None
|
618
|
-
|
619
|
-
assert is_dataclass_class(Example)
|
620
|
-
assert not is_dataclass_class(Example())
|
621
|
-
|
622
|
-
@given(obj=sampled_from([None, type(None)]))
|
623
|
-
def test_others(self, *, obj: Any) -> None:
|
624
|
-
assert not is_dataclass_class(obj)
|
625
|
-
|
626
|
-
|
627
|
-
class TestIsDataClassInstance:
|
628
|
-
def test_main(self) -> None:
|
629
|
-
@dataclass(kw_only=True, slots=True)
|
630
|
-
class Example:
|
631
|
-
x: None = None
|
632
|
-
|
633
|
-
assert not is_dataclass_instance(Example)
|
634
|
-
assert is_dataclass_instance(Example())
|
635
|
-
|
636
|
-
@given(obj=sampled_from([None, type(None)]))
|
637
|
-
def test_others(self, *, obj: Any) -> None:
|
638
|
-
assert not is_dataclass_instance(obj)
|
639
|
-
|
640
|
-
|
641
|
-
class TestIsHashable:
|
642
|
-
@given(case=sampled_from([(0, True), ((1, 2, 3), True), ([1, 2, 3], False)]))
|
643
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
644
|
-
obj, expected = case
|
645
|
-
assert is_hashable(obj) is expected
|
646
|
-
|
647
|
-
|
648
|
-
class TestIsIterableOf:
|
649
|
-
@given(
|
650
|
-
case=sampled_from([
|
651
|
-
([0], True),
|
652
|
-
(["0"], False),
|
653
|
-
({0}, True),
|
654
|
-
({0: 0}, True),
|
655
|
-
(None, False),
|
656
|
-
([None], False),
|
657
|
-
])
|
658
|
-
)
|
659
|
-
def test_single(self, *, case: tuple[Any, bool]) -> None:
|
660
|
-
obj, expected = case
|
661
|
-
result = is_iterable_of(obj, int)
|
662
|
-
assert result is expected
|
663
|
-
|
664
|
-
@given(
|
665
|
-
case=sampled_from([
|
666
|
-
([0], True),
|
667
|
-
(["0"], True),
|
668
|
-
([0, "0"], True),
|
669
|
-
(None, False),
|
670
|
-
([None], False),
|
671
|
-
])
|
672
|
-
)
|
673
|
-
def test_multiple(self, *, case: tuple[Any, bool]) -> None:
|
674
|
-
obj, expected = case
|
675
|
-
result = is_iterable_of(obj, (int, str))
|
676
|
-
assert result is expected
|
677
|
-
|
678
|
-
|
679
559
|
class TestIsNoneAndIsNotNone:
|
680
560
|
@given(
|
681
561
|
case=sampled_from([
|
@@ -691,119 +571,6 @@ class TestIsNoneAndIsNotNone:
|
|
691
571
|
assert result is expected
|
692
572
|
|
693
573
|
|
694
|
-
class TestIsSequenceOf:
|
695
|
-
@given(
|
696
|
-
case=sampled_from([
|
697
|
-
([0], True),
|
698
|
-
(["0"], False),
|
699
|
-
({0}, False),
|
700
|
-
({0: 0}, False),
|
701
|
-
(None, False),
|
702
|
-
([None], False),
|
703
|
-
])
|
704
|
-
)
|
705
|
-
def test_single(self, *, case: tuple[Any, bool]) -> None:
|
706
|
-
obj, expected = case
|
707
|
-
result = is_sequence_of(obj, int)
|
708
|
-
assert result is expected
|
709
|
-
|
710
|
-
@given(
|
711
|
-
case=sampled_from([
|
712
|
-
([0], True),
|
713
|
-
(["0"], True),
|
714
|
-
([0, "0"], True),
|
715
|
-
(None, False),
|
716
|
-
([None], False),
|
717
|
-
])
|
718
|
-
)
|
719
|
-
def test_multiple(self, *, case: tuple[Any, bool]) -> None:
|
720
|
-
obj, expected = case
|
721
|
-
result = is_sequence_of(obj, (int, str))
|
722
|
-
assert result is expected
|
723
|
-
|
724
|
-
|
725
|
-
class TestIsSequenceOfTupleOrStrgMapping:
|
726
|
-
@given(
|
727
|
-
case=sampled_from([
|
728
|
-
(None, False),
|
729
|
-
([(1, 2, 3)], True),
|
730
|
-
([{"a": 1, "b": 2, "c": 3}], True),
|
731
|
-
([(1, 2, 3), {"a": 1, "b": 2, "c": 3}], True),
|
732
|
-
])
|
733
|
-
)
|
734
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
735
|
-
obj, expected = case
|
736
|
-
result = is_sequence_of_tuple_or_str_mapping(obj)
|
737
|
-
assert result is expected
|
738
|
-
|
739
|
-
|
740
|
-
class TestIsSized:
|
741
|
-
@given(case=sampled_from([(None, False), ([], True), ((), True), ("", True)]))
|
742
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
743
|
-
obj, expected = case
|
744
|
-
assert is_sized(obj) is expected
|
745
|
-
|
746
|
-
|
747
|
-
class TestIsSizedNotStr:
|
748
|
-
@given(case=sampled_from([(None, False), ([], True), ((), True), ("", False)]))
|
749
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
750
|
-
obj, expected = case
|
751
|
-
assert is_sized_not_str(obj) is expected
|
752
|
-
|
753
|
-
|
754
|
-
class TestIsStringMapping:
|
755
|
-
@given(
|
756
|
-
case=sampled_from([
|
757
|
-
(None, False),
|
758
|
-
({"a": 1, "b": 2, "c": 3}, True),
|
759
|
-
({1: "a", 2: "b", 3: "c"}, False),
|
760
|
-
])
|
761
|
-
)
|
762
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
763
|
-
obj, expected = case
|
764
|
-
result = is_string_mapping(obj)
|
765
|
-
assert result is expected
|
766
|
-
|
767
|
-
|
768
|
-
class TestIsTuple:
|
769
|
-
@given(case=sampled_from([(None, False), ((1, 2, 3), True), ([1, 2, 3], False)]))
|
770
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
771
|
-
obj, expected = case
|
772
|
-
result = is_tuple(obj)
|
773
|
-
assert result is expected
|
774
|
-
|
775
|
-
|
776
|
-
class TestIsTupleOrStringMapping:
|
777
|
-
@given(
|
778
|
-
case=sampled_from([
|
779
|
-
(None, False),
|
780
|
-
((1, 2, 3), True),
|
781
|
-
({"a": 1, "b": 2, "c": 3}, True),
|
782
|
-
({1: "a", 2: "b", 3: "c"}, False),
|
783
|
-
])
|
784
|
-
)
|
785
|
-
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
786
|
-
obj, expected = case
|
787
|
-
result = is_tuple_or_str_mapping(obj)
|
788
|
-
assert result is expected
|
789
|
-
|
790
|
-
|
791
|
-
class TestMakeIsInstance:
|
792
|
-
@given(case=sampled_from([(True, True), (False, True), (None, False)]))
|
793
|
-
def test_single(self, *, case: tuple[bool | None, bool]) -> None:
|
794
|
-
obj, expected = case
|
795
|
-
func = make_isinstance(bool)
|
796
|
-
result = func(obj)
|
797
|
-
assert result is expected
|
798
|
-
|
799
|
-
@given(case=sampled_from([(0, True), ("0", True), (None, False)]))
|
800
|
-
def test_multiple(self, *, case: tuple[bool | None, bool]) -> None:
|
801
|
-
obj, expected = case
|
802
|
-
func = make_isinstance((int, str))
|
803
|
-
result = func(obj)
|
804
|
-
assert result is expected
|
805
|
-
|
806
|
-
|
807
574
|
class TestMapObject:
|
808
575
|
@given(x=integers())
|
809
576
|
def test_int(self, *, x: int) -> None:
|
@@ -32,7 +32,6 @@ from hypothesis.strategies import (
|
|
32
32
|
from pytest import mark, param, raises
|
33
33
|
|
34
34
|
from tests.test_objects.objects import objects
|
35
|
-
from utilities.functions import is_sequence_of
|
36
35
|
from utilities.hypothesis import pairs, sentinels, sets_fixed_length, text_ascii
|
37
36
|
from utilities.iterables import (
|
38
37
|
CheckBijectionError,
|
@@ -88,7 +87,6 @@ from utilities.iterables import (
|
|
88
87
|
check_unique_modulo_case,
|
89
88
|
chunked,
|
90
89
|
cmp_nullable,
|
91
|
-
ensure_hashables,
|
92
90
|
ensure_iterable,
|
93
91
|
ensure_iterable_not_str,
|
94
92
|
enumerate_with_edge,
|
@@ -119,6 +117,7 @@ from utilities.iterables import (
|
|
119
117
|
unique_everseen,
|
120
118
|
)
|
121
119
|
from utilities.sentinel import Sentinel, sentinel
|
120
|
+
from utilities.typing import is_sequence_of
|
122
121
|
|
123
122
|
if TYPE_CHECKING:
|
124
123
|
from collections.abc import Iterable, Iterator, Mapping, Sequence
|
@@ -609,11 +608,6 @@ class TestCmpNullable:
|
|
609
608
|
assert result == expected
|
610
609
|
|
611
610
|
|
612
|
-
class TestEnsureHashables:
|
613
|
-
def test_main(self) -> None:
|
614
|
-
assert ensure_hashables(1, 2, a=3, b=4) == ([1, 2], {"a": 3, "b": 4})
|
615
|
-
|
616
|
-
|
617
611
|
class TestEnsureIterable:
|
618
612
|
@mark.parametrize("obj", [param([]), param(()), param("")])
|
619
613
|
def test_main(self, *, obj: Any) -> None:
|
@@ -1,14 +1,15 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from asyncio import sleep
|
4
|
+
from dataclasses import dataclass, field
|
4
5
|
from io import StringIO
|
5
|
-
from logging import Formatter, StreamHandler, getLogger
|
6
|
+
from logging import Formatter, LoggerAdapter, StreamHandler, getLogger
|
6
7
|
from pathlib import Path
|
7
8
|
from re import search
|
8
9
|
from typing import TYPE_CHECKING, Any, cast
|
9
10
|
|
10
11
|
from hypothesis import given
|
11
|
-
from hypothesis.strategies import
|
12
|
+
from hypothesis.strategies import integers
|
12
13
|
from pytest import LogCaptureFixture, mark, param, raises
|
13
14
|
|
14
15
|
from tests.conftest import SKIPIF_CI_AND_WINDOWS
|
@@ -20,6 +21,7 @@ from utilities.logging import (
|
|
20
21
|
_compute_rollover_actions,
|
21
22
|
_FieldStyleKeys,
|
22
23
|
_RotatingLogFile,
|
24
|
+
add_adapter,
|
23
25
|
add_filters,
|
24
26
|
basic_config,
|
25
27
|
get_format_str,
|
@@ -41,14 +43,37 @@ if TYPE_CHECKING:
|
|
41
43
|
from whenever import ZonedDateTime
|
42
44
|
|
43
45
|
|
46
|
+
class TestAddAdapter:
|
47
|
+
def test_main(self, *, caplog: LogCaptureFixture) -> None:
|
48
|
+
logger = getLogger(name := unique_str())
|
49
|
+
logger.setLevel("DEBUG")
|
50
|
+
|
51
|
+
def process(msg: str, x: int, /) -> str:
|
52
|
+
return f"x={x}: {msg}"
|
53
|
+
|
54
|
+
@dataclass
|
55
|
+
class Example:
|
56
|
+
x: int = 0
|
57
|
+
logger: LoggerAdapter = field(init=False)
|
58
|
+
|
59
|
+
def __post_init__(self) -> None:
|
60
|
+
self.logger = add_adapter(logger, process, self.x)
|
61
|
+
self.logger.info("Initializing...")
|
62
|
+
|
63
|
+
_ = Example()
|
64
|
+
record = one(r for r in caplog.records if r.name == name)
|
65
|
+
assert record.message == "x=0: Initializing..."
|
66
|
+
|
67
|
+
|
44
68
|
class TestAddFilters:
|
45
|
-
@
|
69
|
+
@mark.parametrize("expected", [param(True), param(False)])
|
46
70
|
def test_main(self, *, expected: bool) -> None:
|
47
71
|
logger = getLogger(unique_str())
|
48
72
|
logger.addHandler(handler := StreamHandler(buffer := StringIO()))
|
73
|
+
logger.setLevel("DEBUG")
|
49
74
|
add_filters(handler, lambda _: expected)
|
50
75
|
assert len(handler.filters) == 1
|
51
|
-
logger.
|
76
|
+
logger.info("message")
|
52
77
|
result = buffer.getvalue() != ""
|
53
78
|
assert result is expected
|
54
79
|
|
@@ -50,7 +50,6 @@ from tests.test_typing_funcs.with_future import (
|
|
50
50
|
DataClassFutureTypeLiteral,
|
51
51
|
DataClassFutureTypeLiteralNullable,
|
52
52
|
)
|
53
|
-
from utilities.functions import is_sequence_of
|
54
53
|
from utilities.hypothesis import (
|
55
54
|
date_periods,
|
56
55
|
dates,
|
@@ -86,7 +85,7 @@ from utilities.orjson import (
|
|
86
85
|
from utilities.polars import check_polars_dataframe, zoned_date_time_dtype
|
87
86
|
from utilities.sentinel import Sentinel, sentinel
|
88
87
|
from utilities.types import LogLevel, MaybeIterable, PathLike
|
89
|
-
from utilities.typing import get_args
|
88
|
+
from utilities.typing import get_args, is_sequence_of
|
90
89
|
from utilities.tzlocal import LOCAL_TIME_ZONE
|
91
90
|
from utilities.whenever import (
|
92
91
|
HOUR,
|