dycw-utilities 0.168.0__tar.gz → 0.168.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dycw-utilities might be problematic. Click here for more details.
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/PKG-INFO +2 -2
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/pyproject.toml +4 -4
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/conftest.py +1 -1
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_click.py +9 -9
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_hypothesis.py +9 -9
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_logging.py +2 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pydantic_settings.py +19 -4
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_whenever.py +9 -9
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/click.py +9 -9
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/hypothesis.py +1 -1
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/orjson.py +17 -17
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/parse.py +2 -2
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pydantic_settings.py +12 -1
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest.py +2 -2
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/timer.py +2 -2
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/traceback.py +1 -1
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/typed_settings.py +9 -9
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/whenever.py +5 -5
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/.gitignore +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/LICENSE +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/README.md +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_aeventkit.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_docker.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_jinja2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pydantic_settings_sops.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_testbook.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/aeventkit.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/docker.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/git.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/http.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/jinja2.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/json.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/math.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/os.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pydantic_settings_sops.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/random.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/re.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/string.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/testbook.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/text.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/types.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/version.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/zoneinfo.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dycw-utilities
|
|
3
|
-
Version: 0.168.
|
|
3
|
+
Version: 0.168.2
|
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Requires-Dist: atomicwrites<1.5,>=1.4.1
|
|
8
8
|
Requires-Dist: typing-extensions<4.16,>=4.15.0
|
|
9
9
|
Requires-Dist: tzlocal<5.4,>=5.3.1
|
|
10
|
-
Requires-Dist: whenever<0.
|
|
10
|
+
Requires-Dist: whenever<0.10,>=0.9.0
|
|
11
11
|
Provides-Extra: logging
|
|
12
12
|
Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
|
|
13
13
|
Provides-Extra: test
|
|
@@ -31,7 +31,7 @@ core = [
|
|
|
31
31
|
"atomicwrites >=1.4.1, <1.5",
|
|
32
32
|
"typing-extensions >=4.15.0, <4.16",
|
|
33
33
|
"tzlocal >=5.3.1, <5.4",
|
|
34
|
-
"whenever >=0.
|
|
34
|
+
"whenever >=0.9.0, <0.10",
|
|
35
35
|
]
|
|
36
36
|
cryptography = [
|
|
37
37
|
"cryptography >=46.0.1, <46.1",
|
|
@@ -244,12 +244,12 @@ dependencies = [
|
|
|
244
244
|
"atomicwrites >=1.4.1, <1.5",
|
|
245
245
|
"typing-extensions >=4.15.0, <4.16",
|
|
246
246
|
"tzlocal >=5.3.1, <5.4",
|
|
247
|
-
"whenever >=0.
|
|
247
|
+
"whenever >=0.9.0, <0.10",
|
|
248
248
|
]
|
|
249
249
|
name = "dycw-utilities"
|
|
250
250
|
readme = "README.md"
|
|
251
251
|
requires-python = ">= 3.12"
|
|
252
|
-
version = "0.168.
|
|
252
|
+
version = "0.168.2"
|
|
253
253
|
|
|
254
254
|
[project.entry-points.pytest11]
|
|
255
255
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
|
@@ -282,7 +282,7 @@ test = [
|
|
|
282
282
|
# bump-my-version
|
|
283
283
|
[tool.bumpversion]
|
|
284
284
|
allow_dirty = true
|
|
285
|
-
current_version = "0.168.
|
|
285
|
+
current_version = "0.168.2"
|
|
286
286
|
|
|
287
287
|
[[tool.bumpversion.files]]
|
|
288
288
|
filename = "src/utilities/__init__.py"
|
|
@@ -176,7 +176,7 @@ def _is_to_drop(table: str, /) -> bool:
|
|
|
176
176
|
text = extract_group(r"^(\d{8}T\d{2,})_", table)
|
|
177
177
|
except ExtractGroupError:
|
|
178
178
|
return True
|
|
179
|
-
date_time = PlainDateTime.
|
|
179
|
+
date_time = PlainDateTime.parse_iso(text)
|
|
180
180
|
age = now.difference(date_time, ignore_dst=True)
|
|
181
181
|
return age >= MINUTE
|
|
182
182
|
|
|
@@ -124,21 +124,21 @@ class TestParameters:
|
|
|
124
124
|
param=Date(),
|
|
125
125
|
name="date",
|
|
126
126
|
strategy=dates(),
|
|
127
|
-
serialize=whenever.Date.
|
|
127
|
+
serialize=whenever.Date.format_iso,
|
|
128
128
|
failable=True,
|
|
129
129
|
),
|
|
130
130
|
_Case(
|
|
131
131
|
param=DateDelta(),
|
|
132
132
|
name="date delta",
|
|
133
133
|
strategy=date_deltas(parsable=True),
|
|
134
|
-
serialize=whenever.DateDelta.
|
|
134
|
+
serialize=whenever.DateDelta.format_iso,
|
|
135
135
|
failable=True,
|
|
136
136
|
),
|
|
137
137
|
_Case(
|
|
138
138
|
param=DateTimeDelta(),
|
|
139
139
|
name="date-time delta",
|
|
140
140
|
strategy=date_time_deltas(parsable=True),
|
|
141
|
-
serialize=whenever.DateTimeDelta.
|
|
141
|
+
serialize=whenever.DateTimeDelta.format_iso,
|
|
142
142
|
failable=True,
|
|
143
143
|
),
|
|
144
144
|
_Case(
|
|
@@ -222,7 +222,7 @@ class TestParameters:
|
|
|
222
222
|
param=MonthDay(),
|
|
223
223
|
name="month-day",
|
|
224
224
|
strategy=month_days(),
|
|
225
|
-
serialize=whenever.MonthDay.
|
|
225
|
+
serialize=whenever.MonthDay.format_iso,
|
|
226
226
|
failable=True,
|
|
227
227
|
),
|
|
228
228
|
_Case(
|
|
@@ -232,21 +232,21 @@ class TestParameters:
|
|
|
232
232
|
param=PlainDateTime(),
|
|
233
233
|
name="plain date-time",
|
|
234
234
|
strategy=plain_date_times(),
|
|
235
|
-
serialize=whenever.PlainDateTime.
|
|
235
|
+
serialize=whenever.PlainDateTime.format_iso,
|
|
236
236
|
failable=True,
|
|
237
237
|
),
|
|
238
238
|
_Case(
|
|
239
239
|
param=Time(),
|
|
240
240
|
name="time",
|
|
241
241
|
strategy=times(),
|
|
242
|
-
serialize=whenever.Time.
|
|
242
|
+
serialize=whenever.Time.format_iso,
|
|
243
243
|
failable=True,
|
|
244
244
|
),
|
|
245
245
|
_Case(
|
|
246
246
|
param=TimeDelta(),
|
|
247
247
|
name="time-delta",
|
|
248
248
|
strategy=time_deltas(),
|
|
249
|
-
serialize=whenever.TimeDelta.
|
|
249
|
+
serialize=whenever.TimeDelta.format_iso,
|
|
250
250
|
failable=True,
|
|
251
251
|
),
|
|
252
252
|
_Case(
|
|
@@ -256,14 +256,14 @@ class TestParameters:
|
|
|
256
256
|
param=YearMonth(),
|
|
257
257
|
name="year-month",
|
|
258
258
|
strategy=year_months(),
|
|
259
|
-
serialize=whenever.YearMonth.
|
|
259
|
+
serialize=whenever.YearMonth.format_iso,
|
|
260
260
|
failable=True,
|
|
261
261
|
),
|
|
262
262
|
_Case(
|
|
263
263
|
param=ZonedDateTime(),
|
|
264
264
|
name="zoned date-time",
|
|
265
265
|
strategy=zoned_date_times(),
|
|
266
|
-
serialize=whenever.ZonedDateTime.
|
|
266
|
+
serialize=whenever.ZonedDateTime.format_iso,
|
|
267
267
|
failable=True,
|
|
268
268
|
),
|
|
269
269
|
]
|
|
@@ -209,7 +209,7 @@ class TestDateDeltas:
|
|
|
209
209
|
if max_value is not None:
|
|
210
210
|
assert days <= to_days(max_value)
|
|
211
211
|
if parsable:
|
|
212
|
-
assert DateDelta.
|
|
212
|
+
assert DateDelta.parse_iso(delta.format_iso()) == delta
|
|
213
213
|
|
|
214
214
|
|
|
215
215
|
class TestDatePeriods:
|
|
@@ -247,7 +247,7 @@ class TestDateTimeDeltas:
|
|
|
247
247
|
if max_value is not None:
|
|
248
248
|
assert nanos <= to_nanoseconds(max_value)
|
|
249
249
|
if parsable:
|
|
250
|
-
assert DateTimeDelta.
|
|
250
|
+
assert DateTimeDelta.parse_iso(delta.format_iso()) == delta
|
|
251
251
|
if nativable:
|
|
252
252
|
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
|
253
253
|
|
|
@@ -262,7 +262,7 @@ class TestDates:
|
|
|
262
262
|
dates(min_value=min_value, max_value=max_value, two_digit=two_digit)
|
|
263
263
|
)
|
|
264
264
|
assert isinstance(date, Date)
|
|
265
|
-
assert Date.
|
|
265
|
+
assert Date.parse_iso(date.format_iso()) == date
|
|
266
266
|
if min_value is not None:
|
|
267
267
|
assert date >= min_value
|
|
268
268
|
if max_value is not None:
|
|
@@ -722,7 +722,7 @@ class TestMonthDays:
|
|
|
722
722
|
with assume_does_not_raise(InvalidArgument):
|
|
723
723
|
month_day = data.draw(month_days(min_value=min_value, max_value=max_value))
|
|
724
724
|
assert isinstance(month_day, MonthDay)
|
|
725
|
-
assert MonthDay.
|
|
725
|
+
assert MonthDay.parse_iso(month_day.format_iso()) == month_day
|
|
726
726
|
if min_value is not None:
|
|
727
727
|
assert month_day >= min_value
|
|
728
728
|
if max_value is not None:
|
|
@@ -786,7 +786,7 @@ class TestPlainDateTimes:
|
|
|
786
786
|
plain_date_times(min_value=min_value, max_value=max_value)
|
|
787
787
|
)
|
|
788
788
|
assert isinstance(datetime, PlainDateTime)
|
|
789
|
-
assert PlainDateTime.
|
|
789
|
+
assert PlainDateTime.parse_iso(datetime.format_iso()) == datetime
|
|
790
790
|
if min_value is not None:
|
|
791
791
|
assert datetime >= min_value
|
|
792
792
|
if max_value is not None:
|
|
@@ -1037,7 +1037,7 @@ class TestTimeDeltas:
|
|
|
1037
1037
|
with assume_does_not_raise(InvalidArgument):
|
|
1038
1038
|
delta = data.draw(time_deltas(min_value=min_value, max_value=max_value))
|
|
1039
1039
|
assert isinstance(delta, TimeDelta)
|
|
1040
|
-
assert TimeDelta.
|
|
1040
|
+
assert TimeDelta.parse_iso(delta.format_iso()) == delta
|
|
1041
1041
|
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
|
1042
1042
|
if min_value is not None:
|
|
1043
1043
|
assert delta >= min_value
|
|
@@ -1067,7 +1067,7 @@ class TestTimes:
|
|
|
1067
1067
|
with assume_does_not_raise(InvalidArgument):
|
|
1068
1068
|
time = data.draw(times(min_value=min_value, max_value=max_value))
|
|
1069
1069
|
assert isinstance(time, Time)
|
|
1070
|
-
assert Time.
|
|
1070
|
+
assert Time.parse_iso(time.format_iso()) == time
|
|
1071
1071
|
if min_value is not None:
|
|
1072
1072
|
assert time >= min_value
|
|
1073
1073
|
if max_value is not None:
|
|
@@ -1204,7 +1204,7 @@ class TestYearMonths:
|
|
|
1204
1204
|
)
|
|
1205
1205
|
)
|
|
1206
1206
|
assert isinstance(year_month, YearMonth)
|
|
1207
|
-
assert YearMonth.
|
|
1207
|
+
assert YearMonth.parse_iso(year_month.format_iso()) == year_month
|
|
1208
1208
|
if min_value is not None:
|
|
1209
1209
|
assert year_month >= min_value
|
|
1210
1210
|
if max_value is not None:
|
|
@@ -1258,7 +1258,7 @@ class TestZonedDateTimes:
|
|
|
1258
1258
|
)
|
|
1259
1259
|
assert isinstance(datetime, ZonedDateTime)
|
|
1260
1260
|
_ = datetime.py_datetime()
|
|
1261
|
-
assert ZonedDateTime.
|
|
1261
|
+
assert ZonedDateTime.parse_iso(datetime.format_iso()) == datetime
|
|
1262
1262
|
assert datetime.tz == time_zone.key
|
|
1263
1263
|
if min_value is not None:
|
|
1264
1264
|
assert datetime >= min_value
|
|
@@ -449,10 +449,12 @@ class TestSizeAndTimeRotatingFileHandler:
|
|
|
449
449
|
)
|
|
450
450
|
)
|
|
451
451
|
|
|
452
|
+
await sleep(0.1)
|
|
452
453
|
files = list(tmp_path.iterdir())
|
|
453
454
|
assert len(files) == 1
|
|
454
455
|
assert any(p for p in files if search(r"^log\.txt$", p.name))
|
|
455
456
|
|
|
457
|
+
await sleep(0.1)
|
|
456
458
|
logger.warning("message 1")
|
|
457
459
|
files = list(tmp_path.iterdir())
|
|
458
460
|
assert len(files) == 1
|
|
@@ -6,10 +6,12 @@ from typing import TYPE_CHECKING, ClassVar
|
|
|
6
6
|
import tomlkit
|
|
7
7
|
import yaml
|
|
8
8
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
9
|
+
from pytest import mark, param
|
|
9
10
|
|
|
10
11
|
from utilities.os import temp_environ
|
|
11
12
|
from utilities.pydantic_settings import (
|
|
12
13
|
CustomBaseSettings,
|
|
14
|
+
HashableBaseSettings,
|
|
13
15
|
PathLikeOrWithSection,
|
|
14
16
|
load_settings,
|
|
15
17
|
)
|
|
@@ -101,11 +103,12 @@ class TestCustomBaseSettings:
|
|
|
101
103
|
settings = load_settings(Settings)
|
|
102
104
|
assert settings.x == 1
|
|
103
105
|
|
|
104
|
-
|
|
106
|
+
@mark.parametrize("inner_cls", [param(BaseSettings), param(HashableBaseSettings)])
|
|
107
|
+
def test_env_var_with_nested(self, *, inner_cls: type[BaseSettings]) -> None:
|
|
105
108
|
class Settings(CustomBaseSettings):
|
|
106
109
|
inner: Inner
|
|
107
110
|
|
|
108
|
-
class Inner(
|
|
111
|
+
class Inner(inner_cls):
|
|
109
112
|
x: int
|
|
110
113
|
|
|
111
114
|
_ = Settings.model_rebuild()
|
|
@@ -114,12 +117,15 @@ class TestCustomBaseSettings:
|
|
|
114
117
|
settings = load_settings(Settings)
|
|
115
118
|
assert settings.inner.x == 1
|
|
116
119
|
|
|
117
|
-
|
|
120
|
+
@mark.parametrize("inner_cls", [param(BaseSettings), param(HashableBaseSettings)])
|
|
121
|
+
def test_env_var_with_prefix_and_nested(
|
|
122
|
+
self, *, inner_cls: type[BaseSettings]
|
|
123
|
+
) -> None:
|
|
118
124
|
class Settings(CustomBaseSettings):
|
|
119
125
|
model_config = SettingsConfigDict(env_prefix="test__")
|
|
120
126
|
inner: Inner
|
|
121
127
|
|
|
122
|
-
class Inner(
|
|
128
|
+
class Inner(inner_cls):
|
|
123
129
|
x: int
|
|
124
130
|
|
|
125
131
|
_ = Settings.model_rebuild()
|
|
@@ -131,3 +137,12 @@ class TestCustomBaseSettings:
|
|
|
131
137
|
class Settings(CustomBaseSettings): ...
|
|
132
138
|
|
|
133
139
|
_ = load_settings(Settings)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class TestHashableBaseSettings:
|
|
143
|
+
def test_hashable(self) -> None:
|
|
144
|
+
class Settings(HashableBaseSettings):
|
|
145
|
+
x: int = 1
|
|
146
|
+
|
|
147
|
+
settings = load_settings(Settings)
|
|
148
|
+
_ = hash(settings)
|
|
@@ -345,14 +345,14 @@ class TestFormatCompact:
|
|
|
345
345
|
def test_date(self, *, date: Date) -> None:
|
|
346
346
|
result = format_compact(date)
|
|
347
347
|
assert isinstance(result, str)
|
|
348
|
-
parsed = Date.
|
|
348
|
+
parsed = Date.parse_iso(result)
|
|
349
349
|
assert parsed == date
|
|
350
350
|
|
|
351
351
|
@given(time=times())
|
|
352
352
|
def test_time(self, *, time: Time) -> None:
|
|
353
353
|
result = format_compact(time)
|
|
354
354
|
assert isinstance(result, str)
|
|
355
|
-
parsed = Time.
|
|
355
|
+
parsed = Time.parse_iso(result)
|
|
356
356
|
assert parsed.nanosecond == 0
|
|
357
357
|
expected = time.round()
|
|
358
358
|
assert parsed == expected
|
|
@@ -361,7 +361,7 @@ class TestFormatCompact:
|
|
|
361
361
|
def test_plain_date_time(self, *, date_time: PlainDateTime) -> None:
|
|
362
362
|
result = format_compact(date_time)
|
|
363
363
|
assert isinstance(result, str)
|
|
364
|
-
parsed = PlainDateTime.
|
|
364
|
+
parsed = PlainDateTime.parse_iso(result)
|
|
365
365
|
assert parsed.nanosecond == 0
|
|
366
366
|
expected = date_time.round()
|
|
367
367
|
assert parsed == expected
|
|
@@ -736,10 +736,10 @@ class TestMinMax:
|
|
|
736
736
|
_ = ZONED_DATE_TIME_MAX.add(microseconds=1)
|
|
737
737
|
|
|
738
738
|
def _format_parse_date_delta(self, delta: DateDelta, /) -> None:
|
|
739
|
-
_ = DateDelta.
|
|
739
|
+
_ = DateDelta.parse_iso(delta.format_iso())
|
|
740
740
|
|
|
741
741
|
def _format_parse_date_time_delta(self, delta: DateTimeDelta, /) -> None:
|
|
742
|
-
_ = DateTimeDelta.
|
|
742
|
+
_ = DateTimeDelta.parse_iso(delta.format_iso())
|
|
743
743
|
|
|
744
744
|
|
|
745
745
|
class TestMinMaxDate:
|
|
@@ -1025,7 +1025,7 @@ class TestToDate:
|
|
|
1025
1025
|
|
|
1026
1026
|
@given(date=dates())
|
|
1027
1027
|
def test_str(self, *, date: Date) -> None:
|
|
1028
|
-
assert to_date(date.
|
|
1028
|
+
assert to_date(date.format_iso()) == date
|
|
1029
1029
|
|
|
1030
1030
|
@given(date=dates())
|
|
1031
1031
|
def test_py_date(self, *, date: Date) -> None:
|
|
@@ -1482,7 +1482,7 @@ class TestToTime:
|
|
|
1482
1482
|
|
|
1483
1483
|
@given(time=times())
|
|
1484
1484
|
def test_str(self, *, time: Time) -> None:
|
|
1485
|
-
assert to_time(time.
|
|
1485
|
+
assert to_time(time.format_iso()) == time
|
|
1486
1486
|
|
|
1487
1487
|
@given(time=times())
|
|
1488
1488
|
def test_py_time(self, *, time: Time) -> None:
|
|
@@ -1628,7 +1628,7 @@ class TestToZonedDateTime:
|
|
|
1628
1628
|
def test_str(
|
|
1629
1629
|
self, *, data: DataObject, date_time: ZonedDateTime, time_zone: ZoneInfo
|
|
1630
1630
|
) -> None:
|
|
1631
|
-
text = date_time.
|
|
1631
|
+
text = date_time.format_iso()
|
|
1632
1632
|
text_use = data.draw(sampled_from([text, text.replace("/", "_")]))
|
|
1633
1633
|
result = to_zoned_date_time(text_use, time_zone=time_zone)
|
|
1634
1634
|
expected = date_time.to_tz(time_zone.key)
|
|
@@ -1699,7 +1699,7 @@ class TestToZonedDateTime:
|
|
|
1699
1699
|
|
|
1700
1700
|
|
|
1701
1701
|
class TestTwoDigitYearMonth:
|
|
1702
|
-
def
|
|
1702
|
+
def test_parse_iso(self) -> None:
|
|
1703
1703
|
result = two_digit_year_month(0, 1)
|
|
1704
1704
|
expected = YearMonth(2000, 1)
|
|
1705
1705
|
assert result == expected
|
|
@@ -72,7 +72,7 @@ class Date(ParamType):
|
|
|
72
72
|
return value
|
|
73
73
|
case str():
|
|
74
74
|
try:
|
|
75
|
-
return whenever.Date.
|
|
75
|
+
return whenever.Date.parse_iso(value)
|
|
76
76
|
except ValueError as error:
|
|
77
77
|
self.fail(str(error), param, ctx)
|
|
78
78
|
case never:
|
|
@@ -98,7 +98,7 @@ class DateDelta(ParamType):
|
|
|
98
98
|
return value
|
|
99
99
|
case str():
|
|
100
100
|
try:
|
|
101
|
-
return whenever.DateDelta.
|
|
101
|
+
return whenever.DateDelta.parse_iso(value)
|
|
102
102
|
except ValueError as error:
|
|
103
103
|
self.fail(str(error), param, ctx)
|
|
104
104
|
case never:
|
|
@@ -124,7 +124,7 @@ class DateTimeDelta(ParamType):
|
|
|
124
124
|
return value
|
|
125
125
|
case str():
|
|
126
126
|
try:
|
|
127
|
-
return whenever.DateTimeDelta.
|
|
127
|
+
return whenever.DateTimeDelta.parse_iso(value)
|
|
128
128
|
except ValueError as error:
|
|
129
129
|
self.fail(str(error), param, ctx)
|
|
130
130
|
case never:
|
|
@@ -235,7 +235,7 @@ class MonthDay(ParamType):
|
|
|
235
235
|
return value
|
|
236
236
|
case str():
|
|
237
237
|
try:
|
|
238
|
-
return whenever.MonthDay.
|
|
238
|
+
return whenever.MonthDay.parse_iso(value)
|
|
239
239
|
except ValueError as error:
|
|
240
240
|
self.fail(str(error), param, ctx)
|
|
241
241
|
case never:
|
|
@@ -284,7 +284,7 @@ class PlainDateTime(ParamType):
|
|
|
284
284
|
return value
|
|
285
285
|
case str():
|
|
286
286
|
try:
|
|
287
|
-
return whenever.PlainDateTime.
|
|
287
|
+
return whenever.PlainDateTime.parse_iso(value)
|
|
288
288
|
except ValueError as error:
|
|
289
289
|
self.fail(str(error), param, ctx)
|
|
290
290
|
case never:
|
|
@@ -310,7 +310,7 @@ class Time(ParamType):
|
|
|
310
310
|
return value
|
|
311
311
|
case str():
|
|
312
312
|
try:
|
|
313
|
-
return whenever.Time.
|
|
313
|
+
return whenever.Time.parse_iso(value)
|
|
314
314
|
except ValueError as error:
|
|
315
315
|
self.fail(str(error), param, ctx)
|
|
316
316
|
case never:
|
|
@@ -336,7 +336,7 @@ class TimeDelta(ParamType):
|
|
|
336
336
|
return value
|
|
337
337
|
case str():
|
|
338
338
|
try:
|
|
339
|
-
return whenever.TimeDelta.
|
|
339
|
+
return whenever.TimeDelta.parse_iso(value)
|
|
340
340
|
except ValueError as error:
|
|
341
341
|
self.fail(str(error), param, ctx)
|
|
342
342
|
case never:
|
|
@@ -388,7 +388,7 @@ class YearMonth(ParamType):
|
|
|
388
388
|
return value
|
|
389
389
|
case str():
|
|
390
390
|
try:
|
|
391
|
-
return whenever.YearMonth.
|
|
391
|
+
return whenever.YearMonth.parse_iso(value)
|
|
392
392
|
except ValueError as error:
|
|
393
393
|
self.fail(str(error), param, ctx)
|
|
394
394
|
case never:
|
|
@@ -414,7 +414,7 @@ class ZonedDateTime(ParamType):
|
|
|
414
414
|
return value
|
|
415
415
|
case str():
|
|
416
416
|
try:
|
|
417
|
-
return whenever.ZonedDateTime.
|
|
417
|
+
return whenever.ZonedDateTime.parse_iso(value)
|
|
418
418
|
except ValueError as error:
|
|
419
419
|
self.fail(str(error), param, ctx)
|
|
420
420
|
case never:
|
|
@@ -1570,7 +1570,7 @@ def zoned_date_times(
|
|
|
1570
1570
|
with (
|
|
1571
1571
|
assume_does_not_raise(RepeatedTime),
|
|
1572
1572
|
assume_does_not_raise(SkippedTime),
|
|
1573
|
-
assume_does_not_raise(ValueError, match=r"Resulting
|
|
1573
|
+
assume_does_not_raise(ValueError, match=r"Resulting time is out of range"),
|
|
1574
1574
|
):
|
|
1575
1575
|
zoned = plain.assume_tz(time_zone_.key, disambiguate="raise")
|
|
1576
1576
|
with assume_does_not_raise(OverflowError, match=r"date value out of range"):
|
|
@@ -481,49 +481,49 @@ def _object_hook(
|
|
|
481
481
|
if match := _NONE_PATTERN.search(text):
|
|
482
482
|
return None
|
|
483
483
|
if match := _DATE_PATTERN.search(text):
|
|
484
|
-
return Date.
|
|
484
|
+
return Date.parse_iso(match.group(1))
|
|
485
485
|
if match := _DATE_DELTA_PATTERN.search(text):
|
|
486
|
-
return DateDelta.
|
|
486
|
+
return DateDelta.parse_iso(match.group(1))
|
|
487
487
|
if match := _DATE_PERIOD_PATTERN.search(text):
|
|
488
|
-
start, end = map(Date.
|
|
488
|
+
start, end = map(Date.parse_iso, match.group(1).split(","))
|
|
489
489
|
return DatePeriod(start, end)
|
|
490
490
|
if match := _DATE_TIME_DELTA_PATTERN.search(text):
|
|
491
|
-
return DateTimeDelta.
|
|
491
|
+
return DateTimeDelta.parse_iso(match.group(1))
|
|
492
492
|
if match := _FLOAT_PATTERN.search(text):
|
|
493
493
|
return float(match.group(1))
|
|
494
494
|
if match := _MONTH_DAY_PATTERN.search(text):
|
|
495
|
-
return MonthDay.
|
|
495
|
+
return MonthDay.parse_iso(match.group(1))
|
|
496
496
|
if match := _PATH_PATTERN.search(text):
|
|
497
497
|
return Path(match.group(1))
|
|
498
498
|
if match := _PLAIN_DATE_TIME_PATTERN.search(text):
|
|
499
|
-
return PlainDateTime.
|
|
499
|
+
return PlainDateTime.parse_iso(match.group(1))
|
|
500
500
|
if match := _PY_DATE_PATTERN.search(text):
|
|
501
|
-
return Date.
|
|
501
|
+
return Date.parse_iso(match.group(1)).py_date()
|
|
502
502
|
if match := _PY_PLAIN_DATE_TIME_PATTERN.search(text):
|
|
503
|
-
return PlainDateTime.
|
|
503
|
+
return PlainDateTime.parse_iso(match.group(1)).py_datetime()
|
|
504
504
|
if match := _PY_TIME_PATTERN.search(text):
|
|
505
|
-
return Time.
|
|
505
|
+
return Time.parse_iso(match.group(1)).py_time()
|
|
506
506
|
if match := _PY_ZONED_DATE_TIME_PATTERN.search(text):
|
|
507
|
-
return ZonedDateTime.
|
|
507
|
+
return ZonedDateTime.parse_iso(match.group(1)).py_datetime()
|
|
508
508
|
if match := _TIME_PATTERN.search(text):
|
|
509
|
-
return Time.
|
|
509
|
+
return Time.parse_iso(match.group(1))
|
|
510
510
|
if match := _TIME_DELTA_PATTERN.search(text):
|
|
511
|
-
return TimeDelta.
|
|
511
|
+
return TimeDelta.parse_iso(match.group(1))
|
|
512
512
|
if match := _TIME_PERIOD_PATTERN.search(text):
|
|
513
|
-
start, end = map(Time.
|
|
513
|
+
start, end = map(Time.parse_iso, match.group(1).split(","))
|
|
514
514
|
return TimePeriod(start, end)
|
|
515
515
|
if match := _UUID_PATTERN.search(text):
|
|
516
516
|
return UUID(match.group(1))
|
|
517
517
|
if match := _VERSION_PATTERN.search(text):
|
|
518
518
|
return parse_version(match.group(1))
|
|
519
519
|
if match := _YEAR_MONTH_PATTERN.search(text):
|
|
520
|
-
return YearMonth.
|
|
520
|
+
return YearMonth.parse_iso(match.group(1))
|
|
521
521
|
if match := _ZONED_DATE_TIME_PATTERN.search(text):
|
|
522
|
-
return ZonedDateTime.
|
|
522
|
+
return ZonedDateTime.parse_iso(match.group(1))
|
|
523
523
|
if match := _ZONED_DATE_TIME_PERIOD_PATTERN.search(text):
|
|
524
524
|
start, end = match.group(1).split(",")
|
|
525
|
-
end = ZonedDateTime.
|
|
526
|
-
start = PlainDateTime.
|
|
525
|
+
end = ZonedDateTime.parse_iso(end)
|
|
526
|
+
start = PlainDateTime.parse_iso(start).assume_tz(end.tz)
|
|
527
527
|
return ZonedDateTimePeriod(start, end)
|
|
528
528
|
if (
|
|
529
529
|
exc_class := _object_hook_exception_class(
|
|
@@ -204,7 +204,7 @@ def _parse_object_type(
|
|
|
204
204
|
),
|
|
205
205
|
):
|
|
206
206
|
try:
|
|
207
|
-
return cls.
|
|
207
|
+
return cls.parse_iso(text)
|
|
208
208
|
except ValueError:
|
|
209
209
|
raise _ParseObjectParseError(type_=cls, text=text) from None
|
|
210
210
|
if issubclass(cls, Path):
|
|
@@ -477,7 +477,7 @@ def serialize_object(
|
|
|
477
477
|
ZonedDateTime,
|
|
478
478
|
),
|
|
479
479
|
):
|
|
480
|
-
return obj.
|
|
480
|
+
return obj.format_iso()
|
|
481
481
|
if isinstance(obj, Enum):
|
|
482
482
|
return obj.name
|
|
483
483
|
if isinstance(obj, dict):
|
|
@@ -29,7 +29,7 @@ type PathLikeOrWithSection = PathLike | PathLikeWithSection
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class CustomBaseSettings(BaseSettings):
|
|
32
|
-
"""Base settings for loading JSON files."""
|
|
32
|
+
"""Base settings for loading JSON/TOML/YAML files."""
|
|
33
33
|
|
|
34
34
|
# paths
|
|
35
35
|
json_files: ClassVar[Sequence[PathLikeOrWithSection]] = []
|
|
@@ -158,8 +158,19 @@ def _get_section(
|
|
|
158
158
|
return reduce(lambda acc, el: acc.get(el, {}), always_iterable(section), mapping)
|
|
159
159
|
|
|
160
160
|
|
|
161
|
+
##
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class HashableBaseSettings(BaseSettings):
|
|
165
|
+
"""Base settings for loading JSON files."""
|
|
166
|
+
|
|
167
|
+
# config
|
|
168
|
+
model_config: ClassVar[SettingsConfigDict] = SettingsConfigDict(frozen=True)
|
|
169
|
+
|
|
170
|
+
|
|
161
171
|
__all__ = [
|
|
162
172
|
"CustomBaseSettings",
|
|
173
|
+
"HashableBaseSettings",
|
|
163
174
|
"JsonConfigSectionSettingsSource",
|
|
164
175
|
"TomlConfigSectionSettingsSource",
|
|
165
176
|
"YamlConfigSectionSettingsSource",
|
|
@@ -299,7 +299,7 @@ def _skipif_recent(*, root: PathLike | None = None, delta: Delta = SECOND) -> No
|
|
|
299
299
|
except FileNotFoundError:
|
|
300
300
|
return
|
|
301
301
|
try:
|
|
302
|
-
last = ZonedDateTime.
|
|
302
|
+
last = ZonedDateTime.parse_iso(contents)
|
|
303
303
|
except ValueError:
|
|
304
304
|
return
|
|
305
305
|
now = get_now_local()
|
|
@@ -328,7 +328,7 @@ def _get_name() -> str:
|
|
|
328
328
|
def _write(root: PathLike | None = None, /) -> None:
|
|
329
329
|
path = _get_path(root)
|
|
330
330
|
with writer(path, overwrite=True) as temp:
|
|
331
|
-
_ = temp.write_text(get_now_local().
|
|
331
|
+
_ = temp.write_text(get_now_local().format_iso())
|
|
332
332
|
|
|
333
333
|
|
|
334
334
|
__all__ = [
|
|
@@ -56,11 +56,11 @@ class Timer:
|
|
|
56
56
|
|
|
57
57
|
@override
|
|
58
58
|
def __repr__(self) -> str:
|
|
59
|
-
return self.timedelta.
|
|
59
|
+
return self.timedelta.format_iso()
|
|
60
60
|
|
|
61
61
|
@override
|
|
62
62
|
def __str__(self) -> str:
|
|
63
|
-
return self.timedelta.
|
|
63
|
+
return self.timedelta.format_iso()
|
|
64
64
|
|
|
65
65
|
# comparison
|
|
66
66
|
|
|
@@ -98,7 +98,7 @@ def _yield_header_lines(
|
|
|
98
98
|
yield f"Date/time | {format_compact(now)}"
|
|
99
99
|
start_use = to_zoned_date_time(start).to_tz(LOCAL_TIME_ZONE_NAME)
|
|
100
100
|
yield f"Started | {format_compact(start_use)}"
|
|
101
|
-
yield f"Duration | {(now - start_use).
|
|
101
|
+
yield f"Duration | {(now - start_use).format_iso()}"
|
|
102
102
|
yield f"User | {getuser()}"
|
|
103
103
|
yield f"Host | {gethostname()}"
|
|
104
104
|
yield f"Process ID | {getpid()}"
|
|
@@ -57,19 +57,19 @@ class ExtendedTSConverter(TSConverter):
|
|
|
57
57
|
) -> None:
|
|
58
58
|
super().__init__(resolve_paths=resolve_paths, strlist_sep=strlist_sep)
|
|
59
59
|
cases: list[_ConverterItem] = [
|
|
60
|
-
(Date, Date.
|
|
61
|
-
(DateDelta, DateDelta.
|
|
62
|
-
(DateTimeDelta, DateTimeDelta.
|
|
60
|
+
(Date, Date.parse_iso),
|
|
61
|
+
(DateDelta, DateDelta.parse_iso),
|
|
62
|
+
(DateTimeDelta, DateTimeDelta.parse_iso),
|
|
63
63
|
(IPv4Address, IPv4Address),
|
|
64
64
|
(IPv6Address, IPv6Address),
|
|
65
|
-
(MonthDay, MonthDay.
|
|
65
|
+
(MonthDay, MonthDay.parse_iso),
|
|
66
66
|
(Path, partial(_parse_path, resolve=resolve_paths, pwd=Path.cwd())),
|
|
67
|
-
(PlainDateTime, PlainDateTime.
|
|
68
|
-
(Time, Time.
|
|
69
|
-
(TimeDelta, TimeDelta.
|
|
67
|
+
(PlainDateTime, PlainDateTime.parse_iso),
|
|
68
|
+
(Time, Time.parse_iso),
|
|
69
|
+
(TimeDelta, TimeDelta.parse_iso),
|
|
70
70
|
(UUID, UUID),
|
|
71
|
-
(YearMonth, YearMonth.
|
|
72
|
-
(ZonedDateTime, ZonedDateTime.
|
|
71
|
+
(YearMonth, YearMonth.parse_iso),
|
|
72
|
+
(ZonedDateTime, ZonedDateTime.parse_iso),
|
|
73
73
|
*extra,
|
|
74
74
|
]
|
|
75
75
|
extras = {cls: _make_converter(cls, func) for cls, func in cases}
|