dycw-utilities 0.131.10__tar.gz → 0.131.11__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.131.10 → dycw_utilities-0.131.11}/PKG-INFO +1 -1
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/pyproject.toml +2 -2
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_datetime.py +6 -4
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_math.py +2 -2
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_whenever2.py +77 -2
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/click.py +6 -6
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/datetime.py +12 -12
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/hypothesis.py +8 -11
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/logging.py +1 -18
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/math.py +10 -9
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/re.py +12 -13
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/traceback.py +5 -5
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/types.py +49 -10
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/whenever.py +6 -6
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/whenever2.py +56 -2
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/.gitignore +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/LICENSE +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/README.md +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_aiolimiter.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio_classes/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio_classes/loopers.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio_classes/redis.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/aiolimiter.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/git.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/http.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/os.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/period.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/random.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/string.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/text.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/version.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/zoneinfo.py +0 -0
@@ -94,7 +94,7 @@ dependencies = [
|
|
94
94
|
name = "dycw-utilities"
|
95
95
|
readme = "README.md"
|
96
96
|
requires-python = ">= 3.12"
|
97
|
-
version = "0.131.
|
97
|
+
version = "0.131.11"
|
98
98
|
|
99
99
|
[project.optional-dependencies]
|
100
100
|
logging = [
|
@@ -121,7 +121,7 @@ test = [
|
|
121
121
|
# bump-my-version
|
122
122
|
[tool.bumpversion]
|
123
123
|
allow_dirty = true
|
124
|
-
current_version = "0.131.
|
124
|
+
current_version = "0.131.11"
|
125
125
|
|
126
126
|
[[tool.bumpversion.files]]
|
127
127
|
filename = "src/utilities/__init__.py"
|
@@ -157,8 +157,8 @@ if TYPE_CHECKING:
|
|
157
157
|
from utilities.types import (
|
158
158
|
DateOrDateTime,
|
159
159
|
Duration,
|
160
|
-
|
161
|
-
|
160
|
+
MaybeCallablePyDate,
|
161
|
+
MaybeCallablePyDateTime,
|
162
162
|
Number,
|
163
163
|
)
|
164
164
|
|
@@ -689,7 +689,9 @@ class TestGetDate:
|
|
689
689
|
class Example:
|
690
690
|
date: dt.date = field(default_factory=get_today)
|
691
691
|
|
692
|
-
def replace(
|
692
|
+
def replace(
|
693
|
+
self, *, date: MaybeCallablePyDate | Sentinel = sentinel
|
694
|
+
) -> Self:
|
693
695
|
return replace_non_sentinel(self, date=get_date(date=date))
|
694
696
|
|
695
697
|
obj = Example(date=date1)
|
@@ -721,7 +723,7 @@ class TestGetDateTime:
|
|
721
723
|
datetime: dt.datetime = field(default_factory=get_now)
|
722
724
|
|
723
725
|
def replace(
|
724
|
-
self, *, datetime:
|
726
|
+
self, *, datetime: MaybeCallablePyDateTime | Sentinel = sentinel
|
725
727
|
) -> Self:
|
726
728
|
return replace_non_sentinel(
|
727
729
|
self, datetime=get_datetime(datetime=datetime)
|
@@ -102,7 +102,7 @@ from utilities.math import (
|
|
102
102
|
)
|
103
103
|
|
104
104
|
if TYPE_CHECKING:
|
105
|
-
from utilities.types import
|
105
|
+
from utilities.types import MathRoundMode, Number
|
106
106
|
|
107
107
|
|
108
108
|
class TestCheckInteger:
|
@@ -1068,7 +1068,7 @@ class TestRound:
|
|
1068
1068
|
])
|
1069
1069
|
)
|
1070
1070
|
@settings(max_examples=1000)
|
1071
|
-
def test_main(self, *, case: tuple[
|
1071
|
+
def test_main(self, *, case: tuple[MathRoundMode, float, int]) -> None:
|
1072
1072
|
mode, x, expected = case
|
1073
1073
|
result = round_(x, mode=mode)
|
1074
1074
|
assert isinstance(result, int)
|
@@ -1,15 +1,19 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
from dataclasses import dataclass, field
|
3
4
|
from logging import DEBUG
|
5
|
+
from typing import TYPE_CHECKING, Self
|
4
6
|
from zoneinfo import ZoneInfo
|
5
7
|
|
6
8
|
from hypothesis import given
|
7
|
-
from hypothesis.strategies import just, timezones
|
9
|
+
from hypothesis.strategies import just, none, timezones
|
8
10
|
from pytest import mark, param, raises
|
9
11
|
from whenever import Date, DateDelta, DateTimeDelta, TimeDelta, ZonedDateTime
|
10
12
|
|
11
13
|
from tests.conftest import IS_CI
|
12
|
-
from utilities.
|
14
|
+
from utilities.dataclasses import replace_non_sentinel
|
15
|
+
from utilities.hypothesis import dates_whenever, sentinels, zoned_datetimes_whenever
|
16
|
+
from utilities.sentinel import Sentinel, sentinel
|
13
17
|
from utilities.tzdata import HongKong, Tokyo
|
14
18
|
from utilities.tzlocal import LOCAL_TIME_ZONE
|
15
19
|
from utilities.whenever2 import (
|
@@ -27,6 +31,7 @@ from utilities.whenever2 import (
|
|
27
31
|
NOW_UTC,
|
28
32
|
PLAIN_DATE_TIME_MAX,
|
29
33
|
PLAIN_DATE_TIME_MIN,
|
34
|
+
SECOND,
|
30
35
|
TIME_DELTA_MAX,
|
31
36
|
TIME_DELTA_MIN,
|
32
37
|
TODAY_LOCAL,
|
@@ -41,9 +46,15 @@ from utilities.whenever2 import (
|
|
41
46
|
get_now_local,
|
42
47
|
get_today,
|
43
48
|
get_today_local,
|
49
|
+
to_date,
|
50
|
+
to_zoned_date_time,
|
44
51
|
)
|
45
52
|
from utilities.zoneinfo import UTC
|
46
53
|
|
54
|
+
if TYPE_CHECKING:
|
55
|
+
from utilities.sentinel import Sentinel
|
56
|
+
from utilities.types import MaybeCallableDate, MaybeCallableZonedDateTime
|
57
|
+
|
47
58
|
|
48
59
|
class TestFromTimeStamp:
|
49
60
|
@given(datetime=zoned_datetimes_whenever(time_zone=UTC if IS_CI else timezones()))
|
@@ -246,6 +257,70 @@ class TestMinMax:
|
|
246
257
|
_ = ZONED_DATE_TIME_MAX.add(microseconds=1)
|
247
258
|
|
248
259
|
|
260
|
+
class TestToDate:
|
261
|
+
@given(date=dates_whenever())
|
262
|
+
def test_date(self, *, date: Date) -> None:
|
263
|
+
assert to_date(date=date) == date
|
264
|
+
|
265
|
+
@given(date=none() | sentinels())
|
266
|
+
def test_none_or_sentinel(self, *, date: None | Sentinel) -> None:
|
267
|
+
assert to_date(date=date) is date
|
268
|
+
|
269
|
+
@given(date1=dates_whenever(), date2=dates_whenever())
|
270
|
+
def test_replace_non_sentinel(self, *, date1: Date, date2: Date) -> None:
|
271
|
+
@dataclass(kw_only=True, slots=True)
|
272
|
+
class Example:
|
273
|
+
date: Date = field(default_factory=get_today)
|
274
|
+
|
275
|
+
def replace(self, *, date: MaybeCallableDate | Sentinel = sentinel) -> Self:
|
276
|
+
return replace_non_sentinel(self, date=to_date(date=date))
|
277
|
+
|
278
|
+
obj = Example(date=date1)
|
279
|
+
assert obj.date == date1
|
280
|
+
assert obj.replace().date == date1
|
281
|
+
assert obj.replace(date=date2).date == date2
|
282
|
+
assert obj.replace(date=get_today).date == get_today()
|
283
|
+
|
284
|
+
@given(date=dates_whenever())
|
285
|
+
def test_callable(self, *, date: Date) -> None:
|
286
|
+
assert to_date(date=lambda: date) == date
|
287
|
+
|
288
|
+
|
289
|
+
class TestGetDateTime:
|
290
|
+
@given(date_time=zoned_datetimes_whenever())
|
291
|
+
def test_date_time(self, *, date_time: ZonedDateTime) -> None:
|
292
|
+
assert to_zoned_date_time(date_time=date_time) == date_time
|
293
|
+
|
294
|
+
@given(date_time=none() | sentinels())
|
295
|
+
def test_none_or_sentinel(self, *, date_time: None | Sentinel) -> None:
|
296
|
+
assert to_zoned_date_time(date_time=date_time) is date_time
|
297
|
+
|
298
|
+
@given(date_time1=zoned_datetimes_whenever(), date_time2=zoned_datetimes_whenever())
|
299
|
+
def test_replace_non_sentinel(
|
300
|
+
self, *, date_time1: ZonedDateTime, date_time2: ZonedDateTime
|
301
|
+
) -> None:
|
302
|
+
@dataclass(kw_only=True, slots=True)
|
303
|
+
class Example:
|
304
|
+
date_time: ZonedDateTime = field(default_factory=get_now)
|
305
|
+
|
306
|
+
def replace(
|
307
|
+
self, *, date_time: MaybeCallableZonedDateTime | Sentinel = sentinel
|
308
|
+
) -> Self:
|
309
|
+
return replace_non_sentinel(
|
310
|
+
self, date_time=to_zoned_date_time(date_time=date_time)
|
311
|
+
)
|
312
|
+
|
313
|
+
obj = Example(date_time=date_time1)
|
314
|
+
assert obj.date_time == date_time1
|
315
|
+
assert obj.replace().date_time == date_time1
|
316
|
+
assert obj.replace(date_time=date_time2).date_time == date_time2
|
317
|
+
assert abs(obj.replace(date_time=get_now).date_time - get_now()) <= SECOND
|
318
|
+
|
319
|
+
@given(date_time=zoned_datetimes_whenever())
|
320
|
+
def test_callable(self, *, date_time: ZonedDateTime) -> None:
|
321
|
+
assert to_zoned_date_time(date_time=lambda: date_time) == date_time
|
322
|
+
|
323
|
+
|
249
324
|
class TestWheneverLogRecord:
|
250
325
|
def test_init(self) -> None:
|
251
326
|
_ = WheneverLogRecord("name", DEBUG, "pathname", 0, None, None, None)
|
@@ -23,13 +23,13 @@ from utilities.functions import EnsureStrError, ensure_str, get_class_name
|
|
23
23
|
from utilities.iterables import is_iterable_not_str
|
24
24
|
from utilities.text import split_str
|
25
25
|
from utilities.types import (
|
26
|
-
DateLike,
|
27
26
|
DateTimeLike,
|
28
27
|
EnumLike,
|
29
28
|
MaybeStr,
|
29
|
+
PyDateLike,
|
30
|
+
PyTimeDeltaLike,
|
31
|
+
PyTimeLike,
|
30
32
|
TEnum,
|
31
|
-
TimeDeltaLike,
|
32
|
-
TimeLike,
|
33
33
|
)
|
34
34
|
|
35
35
|
if TYPE_CHECKING:
|
@@ -76,7 +76,7 @@ class Date(ParamType):
|
|
76
76
|
|
77
77
|
@override
|
78
78
|
def convert(
|
79
|
-
self, value:
|
79
|
+
self, value: PyDateLike, param: Parameter | None, ctx: Context | None
|
80
80
|
) -> dt.date:
|
81
81
|
"""Convert a value into the `Date` type."""
|
82
82
|
from utilities.whenever import EnsureDateError, ensure_date
|
@@ -197,7 +197,7 @@ class Time(ParamType):
|
|
197
197
|
|
198
198
|
@override
|
199
199
|
def convert(
|
200
|
-
self, value:
|
200
|
+
self, value: PyTimeLike, param: Parameter | None, ctx: Context | None
|
201
201
|
) -> dt.time:
|
202
202
|
"""Convert a value into the `Time` type."""
|
203
203
|
from utilities.whenever import EnsureTimeError, ensure_time
|
@@ -219,7 +219,7 @@ class Timedelta(ParamType):
|
|
219
219
|
|
220
220
|
@override
|
221
221
|
def convert(
|
222
|
-
self, value:
|
222
|
+
self, value: PyTimeDeltaLike, param: Parameter | None, ctx: Context | None
|
223
223
|
) -> dt.timedelta:
|
224
224
|
"""Convert a value into the `Timedelta` type."""
|
225
225
|
from utilities.whenever import EnsureTimedeltaError, ensure_timedelta
|
@@ -31,9 +31,9 @@ if TYPE_CHECKING:
|
|
31
31
|
from utilities.types import (
|
32
32
|
DateOrDateTime,
|
33
33
|
Duration,
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
MathRoundMode,
|
35
|
+
MaybeCallablePyDate,
|
36
|
+
MaybeCallablePyDateTime,
|
37
37
|
TimeZoneLike,
|
38
38
|
)
|
39
39
|
|
@@ -476,19 +476,19 @@ def format_datetime_local_and_utc(datetime: dt.datetime, /) -> str:
|
|
476
476
|
|
477
477
|
|
478
478
|
@overload
|
479
|
-
def get_date(*, date:
|
479
|
+
def get_date(*, date: MaybeCallablePyDate) -> dt.date: ...
|
480
480
|
@overload
|
481
481
|
def get_date(*, date: None) -> None: ...
|
482
482
|
@overload
|
483
483
|
def get_date(*, date: Sentinel) -> Sentinel: ...
|
484
484
|
@overload
|
485
|
-
def get_date(*, date:
|
485
|
+
def get_date(*, date: MaybeCallablePyDate | Sentinel) -> dt.date | Sentinel: ...
|
486
486
|
@overload
|
487
487
|
def get_date(
|
488
|
-
*, date:
|
488
|
+
*, date: MaybeCallablePyDate | None | Sentinel = sentinel
|
489
489
|
) -> dt.date | None | Sentinel: ...
|
490
490
|
def get_date(
|
491
|
-
*, date:
|
491
|
+
*, date: MaybeCallablePyDate | None | Sentinel = sentinel
|
492
492
|
) -> dt.date | None | Sentinel:
|
493
493
|
"""Get the date."""
|
494
494
|
match date:
|
@@ -504,13 +504,13 @@ def get_date(
|
|
504
504
|
|
505
505
|
|
506
506
|
@overload
|
507
|
-
def get_datetime(*, datetime:
|
507
|
+
def get_datetime(*, datetime: MaybeCallablePyDateTime) -> dt.datetime: ...
|
508
508
|
@overload
|
509
509
|
def get_datetime(*, datetime: None) -> None: ...
|
510
510
|
@overload
|
511
511
|
def get_datetime(*, datetime: Sentinel) -> Sentinel: ...
|
512
512
|
def get_datetime(
|
513
|
-
*, datetime:
|
513
|
+
*, datetime: MaybeCallablePyDateTime | None | Sentinel = sentinel
|
514
514
|
) -> dt.datetime | None | Sentinel:
|
515
515
|
"""Get the datetime."""
|
516
516
|
match datetime:
|
@@ -755,7 +755,7 @@ def mean_datetime(
|
|
755
755
|
/,
|
756
756
|
*,
|
757
757
|
weights: Iterable[SupportsFloat] | None = None,
|
758
|
-
mode:
|
758
|
+
mode: MathRoundMode = "standard",
|
759
759
|
rel_tol: float | None = None,
|
760
760
|
abs_tol: float | None = None,
|
761
761
|
) -> dt.datetime:
|
@@ -790,7 +790,7 @@ def mean_timedelta(
|
|
790
790
|
/,
|
791
791
|
*,
|
792
792
|
weights: Iterable[SupportsFloat] | None = None,
|
793
|
-
mode:
|
793
|
+
mode: MathRoundMode = "standard",
|
794
794
|
rel_tol: float | None = None,
|
795
795
|
abs_tol: float | None = None,
|
796
796
|
) -> dt.timedelta:
|
@@ -1022,7 +1022,7 @@ def round_datetime(
|
|
1022
1022
|
duration: Duration,
|
1023
1023
|
/,
|
1024
1024
|
*,
|
1025
|
-
mode:
|
1025
|
+
mode: MathRoundMode = "standard",
|
1026
1026
|
rel_tol: float | None = None,
|
1027
1027
|
abs_tol: float | None = None,
|
1028
1028
|
) -> dt.datetime:
|
@@ -48,7 +48,7 @@ from hypothesis.strategies import (
|
|
48
48
|
uuids,
|
49
49
|
)
|
50
50
|
from hypothesis.utils.conventions import not_set
|
51
|
-
from whenever import Date, DateDelta, PlainDateTime, Time, TimeDelta
|
51
|
+
from whenever import Date, DateDelta, PlainDateTime, Time, TimeDelta, ZonedDateTime
|
52
52
|
|
53
53
|
from utilities.datetime import (
|
54
54
|
DATETIME_MAX_NAIVE,
|
@@ -112,10 +112,9 @@ if TYPE_CHECKING:
|
|
112
112
|
|
113
113
|
from hypothesis.database import ExampleDatabase
|
114
114
|
from numpy.random import RandomState
|
115
|
-
from whenever import ZonedDateTime
|
116
115
|
|
117
116
|
from utilities.numpy import NDArrayB, NDArrayF, NDArrayI, NDArrayO
|
118
|
-
from utilities.types import Duration,
|
117
|
+
from utilities.types import Duration, MathRoundMode, Number, TimeZoneLike
|
119
118
|
|
120
119
|
|
121
120
|
_T = TypeVar("_T")
|
@@ -725,7 +724,7 @@ def min_and_max_datetimes(
|
|
725
724
|
min_value: MaybeSearchStrategy[dt.datetime | None] = None,
|
726
725
|
max_value: MaybeSearchStrategy[dt.datetime | None] = None,
|
727
726
|
time_zone: MaybeSearchStrategy[ZoneInfo | timezone] = UTC,
|
728
|
-
round_:
|
727
|
+
round_: MathRoundMode | None = None,
|
729
728
|
timedelta: dt.timedelta | None = None,
|
730
729
|
rel_tol: float | None = None,
|
731
730
|
abs_tol: float | None = None,
|
@@ -804,7 +803,7 @@ def min_and_maybe_max_datetimes(
|
|
804
803
|
min_value: MaybeSearchStrategy[dt.datetime | None] = None,
|
805
804
|
max_value: MaybeSearchStrategy[dt.datetime | None | Sentinel] = sentinel,
|
806
805
|
time_zone: MaybeSearchStrategy[ZoneInfo | timezone] = UTC,
|
807
|
-
round_:
|
806
|
+
round_: MathRoundMode | None = None,
|
808
807
|
timedelta: dt.timedelta | None = None,
|
809
808
|
rel_tol: float | None = None,
|
810
809
|
abs_tol: float | None = None,
|
@@ -1036,7 +1035,7 @@ def plain_datetimes(
|
|
1036
1035
|
*,
|
1037
1036
|
min_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MIN_NAIVE,
|
1038
1037
|
max_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MAX_NAIVE,
|
1039
|
-
round_:
|
1038
|
+
round_: MathRoundMode | None = None,
|
1040
1039
|
timedelta: dt.timedelta | None = None,
|
1041
1040
|
rel_tol: float | None = None,
|
1042
1041
|
abs_tol: float | None = None,
|
@@ -1056,7 +1055,7 @@ def plain_datetimes(
|
|
1056
1055
|
|
1057
1056
|
@dataclass(kw_only=True, slots=True)
|
1058
1057
|
class PlainDateTimesError(Exception):
|
1059
|
-
round_:
|
1058
|
+
round_: MathRoundMode
|
1060
1059
|
|
1061
1060
|
@override
|
1062
1061
|
def __str__(self) -> str:
|
@@ -1577,7 +1576,7 @@ def zoned_datetimes(
|
|
1577
1576
|
min_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MIN_UTC + DAY,
|
1578
1577
|
max_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MAX_UTC - DAY,
|
1579
1578
|
time_zone: MaybeSearchStrategy[ZoneInfo | timezone] = UTC,
|
1580
|
-
round_:
|
1579
|
+
round_: MathRoundMode | None = None,
|
1581
1580
|
timedelta: dt.timedelta | None = None,
|
1582
1581
|
rel_tol: float | None = None,
|
1583
1582
|
abs_tol: float | None = None,
|
@@ -1626,7 +1625,7 @@ def zoned_datetimes(
|
|
1626
1625
|
|
1627
1626
|
@dataclass(kw_only=True, slots=True)
|
1628
1627
|
class ZonedDateTimesError(Exception):
|
1629
|
-
round_:
|
1628
|
+
round_: MathRoundMode
|
1630
1629
|
|
1631
1630
|
@override
|
1632
1631
|
def __str__(self) -> str:
|
@@ -1646,8 +1645,6 @@ def zoned_datetimes_whenever(
|
|
1646
1645
|
time_zone: MaybeSearchStrategy[TimeZoneLike] = UTC,
|
1647
1646
|
) -> ZonedDateTime:
|
1648
1647
|
"""Strategy for generating zoned datetimes."""
|
1649
|
-
from whenever import PlainDateTime, ZonedDateTime
|
1650
|
-
|
1651
1648
|
min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
|
1652
1649
|
time_zone_ = ensure_time_zone(draw2(draw, time_zone))
|
1653
1650
|
match min_value_:
|
@@ -34,12 +34,7 @@ from typing import (
|
|
34
34
|
|
35
35
|
from utilities.atomicwrites import move_many
|
36
36
|
from utilities.dataclasses import replace_non_sentinel
|
37
|
-
from utilities.datetime import
|
38
|
-
SECOND,
|
39
|
-
parse_datetime_compact,
|
40
|
-
round_datetime,
|
41
|
-
serialize_compact,
|
42
|
-
)
|
37
|
+
from utilities.datetime import parse_datetime_compact, serialize_compact
|
43
38
|
from utilities.errors import ImpossibleCaseError
|
44
39
|
from utilities.iterables import OneEmptyError, always_iterable, one
|
45
40
|
from utilities.pathlib import ensure_suffix, get_path
|
@@ -484,12 +479,6 @@ class _RotatingLogFile:
|
|
484
479
|
start: dt.datetime | None = None
|
485
480
|
end: dt.datetime | None = None
|
486
481
|
|
487
|
-
def __post_init__(self) -> None:
|
488
|
-
if self.start is not None:
|
489
|
-
self.start = round_datetime(self.start, SECOND)
|
490
|
-
if self.end is not None:
|
491
|
-
self.end = round_datetime(self.end, SECOND)
|
492
|
-
|
493
482
|
@classmethod
|
494
483
|
def from_path(
|
495
484
|
cls,
|
@@ -582,12 +571,6 @@ class _Rotation:
|
|
582
571
|
start: dt.datetime | None | Sentinel = sentinel
|
583
572
|
end: dt.datetime | Sentinel = sentinel
|
584
573
|
|
585
|
-
def __post_init__(self) -> None:
|
586
|
-
if isinstance(self.start, dt.datetime):
|
587
|
-
self.start = round_datetime(self.start, SECOND)
|
588
|
-
if isinstance(self.end, dt.datetime):
|
589
|
-
self.end = round_datetime(self.end, SECOND)
|
590
|
-
|
591
574
|
@cached_property
|
592
575
|
def destination(self) -> Path:
|
593
576
|
return self.file.replace(index=self.index, start=self.start, end=self.end).path
|
@@ -8,9 +8,10 @@ from re import Match, search
|
|
8
8
|
from typing import TYPE_CHECKING, Literal, assert_never, overload, override
|
9
9
|
|
10
10
|
from utilities.errors import ImpossibleCaseError
|
11
|
+
from utilities.re import ExtractGroupsError, extract_groups
|
11
12
|
|
12
13
|
if TYPE_CHECKING:
|
13
|
-
from utilities.types import
|
14
|
+
from utilities.types import MathRoundMode, Number, Sign
|
14
15
|
|
15
16
|
|
16
17
|
MIN_FLOAT32, MAX_FLOAT32 = -3.4028234663852886e38, 3.4028234663852886e38
|
@@ -708,7 +709,7 @@ def round_(
|
|
708
709
|
x: float,
|
709
710
|
/,
|
710
711
|
*,
|
711
|
-
mode:
|
712
|
+
mode: MathRoundMode = "standard",
|
712
713
|
rel_tol: float | None = None,
|
713
714
|
abs_tol: float | None = None,
|
714
715
|
) -> int:
|
@@ -748,7 +749,7 @@ def round_(
|
|
748
749
|
|
749
750
|
def _round_tie_standard(
|
750
751
|
x: float,
|
751
|
-
mode:
|
752
|
+
mode: MathRoundMode,
|
752
753
|
/,
|
753
754
|
*,
|
754
755
|
rel_tol: float | None = None,
|
@@ -757,9 +758,9 @@ def _round_tie_standard(
|
|
757
758
|
"""Round a float to an integer using the standard method."""
|
758
759
|
frac, _ = modf(x)
|
759
760
|
if _is_close(abs(frac), 0.5, rel_tol=rel_tol, abs_tol=abs_tol):
|
760
|
-
mode_use:
|
761
|
+
mode_use: MathRoundMode = mode
|
761
762
|
else:
|
762
|
-
mode_use:
|
763
|
+
mode_use: MathRoundMode = "standard"
|
763
764
|
return round_(x, mode=mode_use)
|
764
765
|
|
765
766
|
|
@@ -775,9 +776,9 @@ def round_float_imprecisions(
|
|
775
776
|
) -> float:
|
776
777
|
"""Round a float, removing binary representation imprecisions."""
|
777
778
|
try:
|
778
|
-
|
779
|
-
except
|
780
|
-
|
779
|
+
head, tail = extract_groups(_ROUND_FLOAT_IMPRECISIONS_PATTERN, str(x))
|
780
|
+
except ExtractGroupsError:
|
781
|
+
head, tail = extract_groups(_ROUND_FLOAT_IMPRECISIONS_PATTERN, f"{x:.20f}")
|
781
782
|
half = ceil(decimals / 2)
|
782
783
|
pattern0 = search(rf"^([0-9]+?)(0{{{half},}})([0-9]+?)$", tail)
|
783
784
|
pattern9 = search(rf"^(0*)([0-9]+?)(9{{{half},}})([0-9]+?)$", tail)
|
@@ -823,7 +824,7 @@ def round_to_float(
|
|
823
824
|
y: float,
|
824
825
|
/,
|
825
826
|
*,
|
826
|
-
mode:
|
827
|
+
mode: MathRoundMode = "standard",
|
827
828
|
rel_tol: float | None = None,
|
828
829
|
abs_tol: float | None = None,
|
829
830
|
) -> float:
|
@@ -5,8 +5,6 @@ from dataclasses import dataclass
|
|
5
5
|
from re import Pattern
|
6
6
|
from typing import TYPE_CHECKING, assert_never, override
|
7
7
|
|
8
|
-
from utilities.iterables import OneEmptyError, OneNonUniqueError, one
|
9
|
-
|
10
8
|
if TYPE_CHECKING:
|
11
9
|
from utilities.types import PatternLike
|
12
10
|
|
@@ -36,16 +34,17 @@ def extract_group(pattern: PatternLike, text: str, /, *, flags: int = 0) -> str:
|
|
36
34
|
raise _ExtractGroupNoCaptureGroupsError(pattern=pattern_use, text=text)
|
37
35
|
case 1:
|
38
36
|
matches: list[str] = pattern_use.findall(text)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
37
|
+
match len(matches):
|
38
|
+
case 0:
|
39
|
+
raise _ExtractGroupNoMatchesError(
|
40
|
+
pattern=pattern_use, text=text
|
41
|
+
) from None
|
42
|
+
case 1:
|
43
|
+
return matches[0]
|
44
|
+
case _:
|
45
|
+
raise _ExtractGroupMultipleMatchesError(
|
46
|
+
pattern=pattern_use, text=text, matches=matches
|
47
|
+
) from None
|
49
48
|
case _:
|
50
49
|
raise _ExtractGroupMultipleCaptureGroupsError(
|
51
50
|
pattern=pattern_use, text=text
|
@@ -109,7 +108,7 @@ def extract_groups(pattern: PatternLike, text: str, /, *, flags: int = 0) -> lis
|
|
109
108
|
case 1, 1:
|
110
109
|
return matches
|
111
110
|
case 1, _:
|
112
|
-
return list(
|
111
|
+
return list(matches[0])
|
113
112
|
case _:
|
114
113
|
raise _ExtractGroupsMultipleMatchesError(
|
115
114
|
pattern=pattern_use, text=text, matches=matches
|
@@ -36,7 +36,7 @@ if TYPE_CHECKING:
|
|
36
36
|
from traceback import FrameSummary
|
37
37
|
from types import TracebackType
|
38
38
|
|
39
|
-
from utilities.types import
|
39
|
+
from utilities.types import MaybeCallablePathLike, MaybeCallablePyDateTime, PathLike
|
40
40
|
from utilities.version import MaybeCallableVersionLike
|
41
41
|
|
42
42
|
|
@@ -51,7 +51,7 @@ def format_exception_stack(
|
|
51
51
|
/,
|
52
52
|
*,
|
53
53
|
header: bool = False,
|
54
|
-
start:
|
54
|
+
start: MaybeCallablePyDateTime | None = _START,
|
55
55
|
version: MaybeCallableVersionLike | None = None,
|
56
56
|
capture_locals: bool = False,
|
57
57
|
max_width: int = RICH_MAX_WIDTH,
|
@@ -82,7 +82,7 @@ def format_exception_stack(
|
|
82
82
|
|
83
83
|
def _yield_header_lines(
|
84
84
|
*,
|
85
|
-
start:
|
85
|
+
start: MaybeCallablePyDateTime | None = _START,
|
86
86
|
version: MaybeCallableVersionLike | None = None,
|
87
87
|
) -> Iterator[str]:
|
88
88
|
"""Yield the header lines."""
|
@@ -193,7 +193,7 @@ def _trim_path(path: PathLike, pattern: str, /) -> Path | None:
|
|
193
193
|
|
194
194
|
def make_except_hook(
|
195
195
|
*,
|
196
|
-
start:
|
196
|
+
start: MaybeCallablePyDateTime | None = _START,
|
197
197
|
version: MaybeCallableVersionLike | None = None,
|
198
198
|
path: MaybeCallablePathLike | None = None,
|
199
199
|
max_width: int = RICH_MAX_WIDTH,
|
@@ -228,7 +228,7 @@ def _make_except_hook_inner(
|
|
228
228
|
traceback: TracebackType | None,
|
229
229
|
/,
|
230
230
|
*,
|
231
|
-
start:
|
231
|
+
start: MaybeCallablePyDateTime | None = _START,
|
232
232
|
version: MaybeCallableVersionLike | None = None,
|
233
233
|
path: MaybeCallablePathLike | None = None,
|
234
234
|
max_width: int = RICH_MAX_WIDTH,
|