dycw-utilities 0.136.10__tar.gz → 0.138.0__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.136.10 → dycw_utilities-0.138.0}/PKG-INFO +1 -1
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/pyproject.toml +2 -2
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_click.py +15 -6
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_hypothesis.py +38 -19
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_logging.py +6 -6
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_objects/objects.py +4 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_parse.py +29 -7
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_sqlalchemy.py +2 -3
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_typed_settings.py +74 -29
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_whenever.py +15 -133
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/click.py +47 -12
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/fpdf2.py +2 -2
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/hypothesis.py +56 -30
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/logging.py +8 -3
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/orjson.py +17 -1
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/parse.py +6 -3
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pyinstrument.py +2 -2
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/traceback.py +4 -3
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/typed_settings.py +5 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/types.py +6 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/whenever.py +14 -143
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/.gitignore +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/LICENSE +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/README.md +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_aiolimiter.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_asyncio_classes/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_asyncio_classes/loopers.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_asyncio_classes/redis.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/aiolimiter.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/git.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/period.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/string.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.136.10 → dycw_utilities-0.138.0}/src/utilities/zoneinfo.py +0 -0
@@ -105,7 +105,7 @@ dependencies = [
|
|
105
105
|
name = "dycw-utilities"
|
106
106
|
readme = "README.md"
|
107
107
|
requires-python = ">= 3.12"
|
108
|
-
version = "0.
|
108
|
+
version = "0.138.0"
|
109
109
|
|
110
110
|
[project.optional-dependencies]
|
111
111
|
logging = [
|
@@ -133,7 +133,7 @@ test = [
|
|
133
133
|
# bump-my-version
|
134
134
|
[tool.bumpversion]
|
135
135
|
allow_dirty = true
|
136
|
-
current_version = "0.
|
136
|
+
current_version = "0.138.0"
|
137
137
|
|
138
138
|
[[tool.bumpversion.files]]
|
139
139
|
filename = "src/utilities/__init__.py"
|
@@ -43,10 +43,11 @@ from utilities.click import (
|
|
43
43
|
ListChoices,
|
44
44
|
ListEnums,
|
45
45
|
ListStrs,
|
46
|
-
|
46
|
+
MonthDay,
|
47
47
|
PlainDateTime,
|
48
48
|
Time,
|
49
49
|
TimeDelta,
|
50
|
+
YearMonth,
|
50
51
|
ZonedDateTime,
|
51
52
|
)
|
52
53
|
from utilities.hypothesis import (
|
@@ -54,11 +55,12 @@ from utilities.hypothesis import (
|
|
54
55
|
date_time_deltas,
|
55
56
|
dates,
|
56
57
|
freqs,
|
57
|
-
|
58
|
+
month_days,
|
58
59
|
plain_datetimes,
|
59
60
|
text_ascii,
|
60
61
|
time_deltas,
|
61
62
|
times,
|
63
|
+
year_months,
|
62
64
|
zoned_datetimes,
|
63
65
|
)
|
64
66
|
from utilities.text import join_strs, strip_and_dedent
|
@@ -283,10 +285,10 @@ class TestParameters:
|
|
283
285
|
failable=True,
|
284
286
|
),
|
285
287
|
_Case(
|
286
|
-
param=
|
287
|
-
name="month",
|
288
|
-
strategy=
|
289
|
-
serialize=
|
288
|
+
param=MonthDay(),
|
289
|
+
name="month-day",
|
290
|
+
strategy=month_days(),
|
291
|
+
serialize=whenever.MonthDay.format_common_iso,
|
290
292
|
failable=True,
|
291
293
|
),
|
292
294
|
_Case(
|
@@ -310,6 +312,13 @@ class TestParameters:
|
|
310
312
|
serialize=whenever.TimeDelta.format_common_iso,
|
311
313
|
failable=True,
|
312
314
|
),
|
315
|
+
_Case(
|
316
|
+
param=YearMonth(),
|
317
|
+
name="year-month",
|
318
|
+
strategy=year_months(),
|
319
|
+
serialize=whenever.YearMonth.format_common_iso,
|
320
|
+
failable=True,
|
321
|
+
),
|
313
322
|
_Case(
|
314
323
|
param=ZonedDateTime(),
|
315
324
|
name="zoned date-time",
|
@@ -30,10 +30,12 @@ from whenever import (
|
|
30
30
|
Date,
|
31
31
|
DateDelta,
|
32
32
|
DateTimeDelta,
|
33
|
+
MonthDay,
|
33
34
|
PlainDateTime,
|
34
35
|
Time,
|
35
36
|
TimeDelta,
|
36
37
|
TimeZoneNotFoundError,
|
38
|
+
YearMonth,
|
37
39
|
ZonedDateTime,
|
38
40
|
)
|
39
41
|
|
@@ -62,7 +64,7 @@ from utilities.hypothesis import (
|
|
62
64
|
int64s,
|
63
65
|
int_arrays,
|
64
66
|
lists_fixed_length,
|
65
|
-
|
67
|
+
month_days,
|
66
68
|
namespace_mixins,
|
67
69
|
numbers,
|
68
70
|
pairs,
|
@@ -89,6 +91,7 @@ from utilities.hypothesis import (
|
|
89
91
|
uint32s,
|
90
92
|
uint64s,
|
91
93
|
versions,
|
94
|
+
year_months,
|
92
95
|
zoned_datetimes,
|
93
96
|
)
|
94
97
|
from utilities.iterables import one
|
@@ -115,7 +118,6 @@ from utilities.whenever import (
|
|
115
118
|
DATE_TWO_DIGIT_YEAR_MAX,
|
116
119
|
DATE_TWO_DIGIT_YEAR_MIN,
|
117
120
|
Freq,
|
118
|
-
Month,
|
119
121
|
to_days,
|
120
122
|
to_nanos,
|
121
123
|
)
|
@@ -611,24 +613,19 @@ class TestListsFixedLength:
|
|
611
613
|
assert sorted(result) == result
|
612
614
|
|
613
615
|
|
614
|
-
class
|
615
|
-
@given(data=data()
|
616
|
-
def test_main(self, *, data: DataObject
|
617
|
-
min_value = data.draw(
|
618
|
-
max_value = data.draw(
|
616
|
+
class TestMonthDays:
|
617
|
+
@given(data=data())
|
618
|
+
def test_main(self, *, data: DataObject) -> None:
|
619
|
+
min_value = data.draw(month_days() | none())
|
620
|
+
max_value = data.draw(month_days() | none())
|
619
621
|
with assume_does_not_raise(InvalidArgument):
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
assert isinstance(month, Month)
|
624
|
-
assert Month.parse_common_iso(month.format_common_iso()) == month
|
622
|
+
month_day = data.draw(month_days(min_value=min_value, max_value=max_value))
|
623
|
+
assert isinstance(month_day, MonthDay)
|
624
|
+
assert MonthDay.parse_common_iso(month_day.format_common_iso()) == month_day
|
625
625
|
if min_value is not None:
|
626
|
-
assert
|
626
|
+
assert month_day >= min_value
|
627
627
|
if max_value is not None:
|
628
|
-
assert
|
629
|
-
if two_digit:
|
630
|
-
assert month.to_date() >= DATE_TWO_DIGIT_YEAR_MIN
|
631
|
-
assert month.to_date() <= DATE_TWO_DIGIT_YEAR_MAX
|
628
|
+
assert month_day <= max_value
|
632
629
|
|
633
630
|
|
634
631
|
class TestNamespaceMixins:
|
@@ -683,8 +680,8 @@ class TestPairs:
|
|
683
680
|
class TestPaths:
|
684
681
|
@given(data=data())
|
685
682
|
def test_main(self, *, data: DataObject) -> None:
|
686
|
-
min_depth = data.draw(integers(0,
|
687
|
-
max_depth = data.draw(integers(0,
|
683
|
+
min_depth = data.draw(integers(0, 5) | none())
|
684
|
+
max_depth = data.draw(integers(0, 5) | none())
|
688
685
|
with assume_does_not_raise(InvalidArgument):
|
689
686
|
path = data.draw(paths(min_depth=min_depth, max_depth=max_depth))
|
690
687
|
assert isinstance(path, Path)
|
@@ -1010,6 +1007,28 @@ class TestVersions:
|
|
1010
1007
|
assert version.suffix is None
|
1011
1008
|
|
1012
1009
|
|
1010
|
+
class TestYearMonths:
|
1011
|
+
@given(data=data(), two_digit=booleans())
|
1012
|
+
def test_main(self, *, data: DataObject, two_digit: bool) -> None:
|
1013
|
+
min_value = data.draw(year_months() | none())
|
1014
|
+
max_value = data.draw(year_months() | none())
|
1015
|
+
with assume_does_not_raise(InvalidArgument):
|
1016
|
+
year_month = data.draw(
|
1017
|
+
year_months(
|
1018
|
+
min_value=min_value, max_value=max_value, two_digit=two_digit
|
1019
|
+
)
|
1020
|
+
)
|
1021
|
+
assert isinstance(year_month, YearMonth)
|
1022
|
+
assert YearMonth.parse_common_iso(year_month.format_common_iso()) == year_month
|
1023
|
+
if min_value is not None:
|
1024
|
+
assert year_month >= min_value
|
1025
|
+
if max_value is not None:
|
1026
|
+
assert year_month <= max_value
|
1027
|
+
if two_digit:
|
1028
|
+
assert year_month.on_day(1) >= DATE_TWO_DIGIT_YEAR_MIN
|
1029
|
+
assert year_month.on_day(28) <= DATE_TWO_DIGIT_YEAR_MAX
|
1030
|
+
|
1031
|
+
|
1013
1032
|
class TestZonedDateTimes:
|
1014
1033
|
@given(data=data(), time_zone=timezones())
|
1015
1034
|
def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
@@ -38,7 +38,7 @@ from utilities.logging import (
|
|
38
38
|
from utilities.text import unique_str
|
39
39
|
from utilities.types import LogLevel
|
40
40
|
from utilities.typing import get_args
|
41
|
-
from utilities.whenever import format_compact, get_now
|
41
|
+
from utilities.whenever import format_compact, get_now, to_local_plain
|
42
42
|
|
43
43
|
if TYPE_CHECKING:
|
44
44
|
from collections.abc import Mapping
|
@@ -192,7 +192,7 @@ class TestComputeRolloverActions:
|
|
192
192
|
|
193
193
|
await sleep(1)
|
194
194
|
tmp_path.joinpath("log.txt").touch()
|
195
|
-
now = format_compact(get_now()
|
195
|
+
now = format_compact(to_local_plain(get_now()))
|
196
196
|
tmp_path.joinpath(f"log.99__{now}__{now}.txt").touch()
|
197
197
|
actions = _compute_rollover_actions(tmp_path, "log", ".txt")
|
198
198
|
assert len(actions.deletions) == 2
|
@@ -319,7 +319,7 @@ class TestRotatingLogFile:
|
|
319
319
|
def test_from_path_with_index_and_end(
|
320
320
|
self, *, index: int, end: ZonedDateTime
|
321
321
|
) -> None:
|
322
|
-
path = Path(f"log.{index}__{format_compact(end
|
322
|
+
path = Path(f"log.{index}__{format_compact(to_local_plain(end))}.txt")
|
323
323
|
result = _RotatingLogFile.from_path(path, "log", ".txt")
|
324
324
|
assert result is not None
|
325
325
|
assert result.stem == "log"
|
@@ -334,7 +334,7 @@ class TestRotatingLogFile:
|
|
334
334
|
) -> None:
|
335
335
|
start, end = datetimes
|
336
336
|
path = Path(
|
337
|
-
f"log.{index}__{format_compact(start
|
337
|
+
f"log.{index}__{format_compact(to_local_plain(start))}__{format_compact(to_local_plain(end))}.txt"
|
338
338
|
)
|
339
339
|
result = _RotatingLogFile.from_path(path, "log", ".txt")
|
340
340
|
assert result is not None
|
@@ -366,7 +366,7 @@ class TestRotatingLogFile:
|
|
366
366
|
directory=root, stem="log", suffix=".txt", index=index, end=end
|
367
367
|
)
|
368
368
|
assert file.path == root.joinpath(
|
369
|
-
f"log.{index}__{format_compact(end
|
369
|
+
f"log.{index}__{format_compact(to_local_plain(end))}.txt"
|
370
370
|
)
|
371
371
|
|
372
372
|
@given(
|
@@ -382,7 +382,7 @@ class TestRotatingLogFile:
|
|
382
382
|
directory=root, stem="log", suffix=".txt", index=index, start=start, end=end
|
383
383
|
)
|
384
384
|
assert file.path == root.joinpath(
|
385
|
-
f"log.{index}__{format_compact(start
|
385
|
+
f"log.{index}__{format_compact(to_local_plain(start))}__{format_compact(to_local_plain(end))}.txt"
|
386
386
|
)
|
387
387
|
|
388
388
|
|
@@ -39,6 +39,7 @@ from utilities.hypothesis import (
|
|
39
39
|
date_time_deltas,
|
40
40
|
dates,
|
41
41
|
int64s,
|
42
|
+
month_days,
|
42
43
|
paths,
|
43
44
|
plain_datetimes,
|
44
45
|
text_ascii,
|
@@ -46,6 +47,7 @@ from utilities.hypothesis import (
|
|
46
47
|
time_deltas,
|
47
48
|
times,
|
48
49
|
versions,
|
50
|
+
year_months,
|
49
51
|
zoned_datetimes,
|
50
52
|
)
|
51
53
|
from utilities.math import MAX_INT64, MIN_INT64
|
@@ -81,6 +83,7 @@ def objects(
|
|
81
83
|
| dates()
|
82
84
|
| floats(allow_nan=floats_allow_nan)
|
83
85
|
| (int64s() if parsable else integers())
|
86
|
+
| month_days()
|
84
87
|
| none()
|
85
88
|
| paths()
|
86
89
|
| plain_datetimes()
|
@@ -89,6 +92,7 @@ def objects(
|
|
89
92
|
| times()
|
90
93
|
| uuids()
|
91
94
|
| versions()
|
95
|
+
| year_months()
|
92
96
|
| zoned_datetimes()
|
93
97
|
)
|
94
98
|
if dataclass_custom_equality:
|
@@ -24,9 +24,11 @@ from whenever import (
|
|
24
24
|
Date,
|
25
25
|
DateDelta,
|
26
26
|
DateTimeDelta,
|
27
|
+
MonthDay,
|
27
28
|
PlainDateTime,
|
28
29
|
Time,
|
29
30
|
TimeDelta,
|
31
|
+
YearMonth,
|
30
32
|
ZonedDateTime,
|
31
33
|
)
|
32
34
|
|
@@ -45,7 +47,7 @@ from utilities.functions import ensure_path
|
|
45
47
|
from utilities.hypothesis import (
|
46
48
|
dates,
|
47
49
|
int64s,
|
48
|
-
|
50
|
+
month_days,
|
49
51
|
numbers,
|
50
52
|
paths,
|
51
53
|
plain_datetimes,
|
@@ -53,6 +55,7 @@ from utilities.hypothesis import (
|
|
53
55
|
time_deltas,
|
54
56
|
times,
|
55
57
|
versions,
|
58
|
+
year_months,
|
56
59
|
zoned_datetimes,
|
57
60
|
)
|
58
61
|
from utilities.math import is_equal
|
@@ -68,7 +71,6 @@ from utilities.sentinel import Sentinel, sentinel
|
|
68
71
|
from utilities.text import parse_bool
|
69
72
|
from utilities.types import Number
|
70
73
|
from utilities.version import Version
|
71
|
-
from utilities.whenever import Month
|
72
74
|
|
73
75
|
|
74
76
|
class TestSerializeAndParseObject:
|
@@ -143,11 +145,11 @@ class TestSerializeAndParseObject:
|
|
143
145
|
result = parse_object(TrueOrFalseFutureLit, truth)
|
144
146
|
assert result == truth
|
145
147
|
|
146
|
-
@given(
|
147
|
-
def
|
148
|
-
serialized = serialize_object(
|
149
|
-
result = parse_object(
|
150
|
-
assert result ==
|
148
|
+
@given(month_day=month_days())
|
149
|
+
def test_month_day(self, *, month_day: MonthDay) -> None:
|
150
|
+
serialized = serialize_object(month_day)
|
151
|
+
result = parse_object(MonthDay, serialized)
|
152
|
+
assert result == month_day
|
151
153
|
|
152
154
|
def test_none(self) -> None:
|
153
155
|
serialized = serialize_object(None)
|
@@ -316,6 +318,12 @@ class TestSerializeAndParseObject:
|
|
316
318
|
result = parse_object(Version, serialized)
|
317
319
|
assert result == version
|
318
320
|
|
321
|
+
@given(year_month=year_months())
|
322
|
+
def test_year_month(self, *, year_month: YearMonth) -> None:
|
323
|
+
serialized = serialize_object(year_month)
|
324
|
+
result = parse_object(YearMonth, serialized)
|
325
|
+
assert result == year_month
|
326
|
+
|
319
327
|
@given(datetime=zoned_datetimes())
|
320
328
|
def test_zoned_datetime(self, *, datetime: ZonedDateTime) -> None:
|
321
329
|
serialized = serialize_object(datetime)
|
@@ -507,6 +515,13 @@ class TestParseObject:
|
|
507
515
|
):
|
508
516
|
_ = parse_object(list[int], "[invalid]")
|
509
517
|
|
518
|
+
def test_error_month_day(self) -> None:
|
519
|
+
with raises(
|
520
|
+
_ParseObjectParseError,
|
521
|
+
match=r"Unable to parse <class 'whenever\.MonthDay'>; got 'invalid'",
|
522
|
+
):
|
523
|
+
_ = parse_object(MonthDay, "invalid")
|
524
|
+
|
510
525
|
def test_error_none(self) -> None:
|
511
526
|
with raises(
|
512
527
|
_ParseObjectParseError, match="Unable to parse None; got 'invalid'"
|
@@ -622,6 +637,13 @@ class TestParseObject:
|
|
622
637
|
):
|
623
638
|
_ = parse_object(Version, "invalid")
|
624
639
|
|
640
|
+
def test_error_year_month(self) -> None:
|
641
|
+
with raises(
|
642
|
+
_ParseObjectParseError,
|
643
|
+
match=r"Unable to parse <class 'whenever\.YearMonth'>; got 'invalid'",
|
644
|
+
):
|
645
|
+
_ = parse_object(YearMonth, "invalid")
|
646
|
+
|
625
647
|
def test_error_zoned_datetime(self) -> None:
|
626
648
|
with raises(
|
627
649
|
_ParseObjectParseError,
|
@@ -89,7 +89,7 @@ from utilities.sqlalchemy import (
|
|
89
89
|
)
|
90
90
|
from utilities.text import strip_and_dedent
|
91
91
|
from utilities.typing import get_args, get_literal_elements
|
92
|
-
from utilities.whenever import SECOND, format_compact, get_now
|
92
|
+
from utilities.whenever import SECOND, format_compact, get_now, to_local_plain
|
93
93
|
|
94
94
|
if TYPE_CHECKING:
|
95
95
|
from collections.abc import Callable, Iterator
|
@@ -102,9 +102,8 @@ if TYPE_CHECKING:
|
|
102
102
|
|
103
103
|
def _table_names() -> str:
|
104
104
|
"""Generate at unique string."""
|
105
|
-
now = get_now()
|
106
105
|
key = str(uuid4()).replace("-", "")
|
107
|
-
return f"{format_compact(
|
106
|
+
return f"{format_compact(to_local_plain(get_now()))}_{key}"
|
108
107
|
|
109
108
|
|
110
109
|
@overload
|
@@ -2,7 +2,7 @@ from collections.abc import Callable
|
|
2
2
|
from dataclasses import dataclass
|
3
3
|
from ipaddress import IPv4Address, IPv6Address
|
4
4
|
from pathlib import Path
|
5
|
-
from typing import assert_never
|
5
|
+
from typing import Any, ClassVar, assert_never
|
6
6
|
|
7
7
|
import typed_settings
|
8
8
|
from hypothesis import given
|
@@ -20,9 +20,11 @@ from whenever import (
|
|
20
20
|
Date,
|
21
21
|
DateDelta,
|
22
22
|
DateTimeDelta,
|
23
|
+
MonthDay,
|
23
24
|
PlainDateTime,
|
24
25
|
Time,
|
25
26
|
TimeDelta,
|
27
|
+
YearMonth,
|
26
28
|
ZonedDateTime,
|
27
29
|
)
|
28
30
|
|
@@ -31,12 +33,14 @@ from utilities.hypothesis import (
|
|
31
33
|
date_time_deltas,
|
32
34
|
dates,
|
33
35
|
freqs,
|
36
|
+
month_days,
|
34
37
|
paths,
|
35
38
|
plain_datetimes,
|
36
39
|
temp_paths,
|
37
40
|
text_ascii,
|
38
41
|
time_deltas,
|
39
42
|
times,
|
43
|
+
year_months,
|
40
44
|
zoned_datetimes,
|
41
45
|
)
|
42
46
|
from utilities.os import temp_environ
|
@@ -51,47 +55,88 @@ from utilities.whenever import Freq
|
|
51
55
|
app_names = text_ascii(min_size=1).map(str.lower)
|
52
56
|
|
53
57
|
|
58
|
+
@dataclass(kw_only=True, slots=True)
|
59
|
+
class _Case[T]:
|
60
|
+
cls: type[T]
|
61
|
+
strategy: SearchStrategy[T]
|
62
|
+
serialize: Callable[[T], str]
|
63
|
+
|
64
|
+
|
54
65
|
class TestExtendedTSConverter:
|
66
|
+
cases: ClassVar[list[_Case]] = [
|
67
|
+
_Case(cls=Date, strategy=dates(), serialize=Date.format_common_iso),
|
68
|
+
_Case(
|
69
|
+
cls=DateDelta,
|
70
|
+
strategy=date_deltas(parsable=True),
|
71
|
+
serialize=DateDelta.format_common_iso,
|
72
|
+
),
|
73
|
+
_Case(
|
74
|
+
cls=DateTimeDelta,
|
75
|
+
strategy=date_time_deltas(parsable=True),
|
76
|
+
serialize=DateTimeDelta.format_common_iso,
|
77
|
+
),
|
78
|
+
_Case(cls=Freq, strategy=freqs(), serialize=Freq.serialize),
|
79
|
+
_Case(cls=IPv4Address, strategy=ip_addresses(v=4), serialize=str),
|
80
|
+
_Case(cls=IPv6Address, strategy=ip_addresses(v=6), serialize=str),
|
81
|
+
_Case(
|
82
|
+
cls=MonthDay, strategy=month_days(), serialize=MonthDay.format_common_iso
|
83
|
+
),
|
84
|
+
_Case(
|
85
|
+
cls=PlainDateTime,
|
86
|
+
strategy=plain_datetimes(),
|
87
|
+
serialize=PlainDateTime.format_common_iso,
|
88
|
+
),
|
89
|
+
_Case(cls=Time, strategy=times(), serialize=Time.format_common_iso),
|
90
|
+
_Case(
|
91
|
+
cls=TimeDelta, strategy=time_deltas(), serialize=TimeDelta.format_common_iso
|
92
|
+
),
|
93
|
+
_Case(
|
94
|
+
cls=YearMonth, strategy=year_months(), serialize=YearMonth.format_common_iso
|
95
|
+
),
|
96
|
+
_Case(
|
97
|
+
cls=ZonedDateTime,
|
98
|
+
strategy=zoned_datetimes(),
|
99
|
+
serialize=ZonedDateTime.format_common_iso,
|
100
|
+
),
|
101
|
+
]
|
102
|
+
|
103
|
+
@given(data=data())
|
104
|
+
@mark.parametrize(("cls", "strategy"), [param(c.cls, c.strategy) for c in cases])
|
105
|
+
def test_default(
|
106
|
+
self, *, data: DataObject, cls: type[Any], strategy: SearchStrategy[Any]
|
107
|
+
) -> None:
|
108
|
+
default = data.draw(strategy)
|
109
|
+
|
110
|
+
@dataclass(frozen=True, kw_only=True, slots=True)
|
111
|
+
class Settings:
|
112
|
+
value: cls = default # pyright: ignore[reportInvalidTypeForm]
|
113
|
+
|
114
|
+
loaded = typed_settings.load_settings(
|
115
|
+
Settings, loaders=[], converter=ExtendedTSConverter()
|
116
|
+
)
|
117
|
+
assert loaded.value == default
|
118
|
+
|
55
119
|
@given(data=data(), root=temp_paths(), app_name=app_names)
|
56
120
|
@mark.parametrize(
|
57
|
-
("
|
58
|
-
[
|
59
|
-
param(Date, dates(), Date.format_common_iso),
|
60
|
-
param(DateDelta, date_deltas(parsable=True), DateDelta.format_common_iso),
|
61
|
-
param(
|
62
|
-
DateTimeDelta,
|
63
|
-
date_time_deltas(parsable=True),
|
64
|
-
DateTimeDelta.format_common_iso,
|
65
|
-
),
|
66
|
-
param(Freq, freqs(), Freq.serialize),
|
67
|
-
param(IPv4Address, ip_addresses(v=4), IPv4Address),
|
68
|
-
param(IPv6Address, ip_addresses(v=6), IPv6Address),
|
69
|
-
param(PlainDateTime, plain_datetimes(), PlainDateTime.format_common_iso),
|
70
|
-
param(Time, times(), Time.format_common_iso),
|
71
|
-
param(TimeDelta, time_deltas(), TimeDelta.format_common_iso),
|
72
|
-
param(ZonedDateTime, zoned_datetimes(), ZonedDateTime.format_common_iso),
|
73
|
-
],
|
121
|
+
("cls", "strategy", "serialize"),
|
122
|
+
[param(c.cls, c.strategy, c.serialize) for c in cases],
|
74
123
|
)
|
75
|
-
def
|
124
|
+
def test_loaded(
|
76
125
|
self,
|
77
126
|
*,
|
78
127
|
data: DataObject,
|
79
128
|
root: Path,
|
80
129
|
app_name: str,
|
81
|
-
|
82
|
-
strategy: SearchStrategy[
|
83
|
-
serialize: Callable[[
|
130
|
+
cls: type[Any],
|
131
|
+
strategy: SearchStrategy[Any],
|
132
|
+
serialize: Callable[[Any], str],
|
84
133
|
) -> None:
|
85
134
|
default, value = data.draw(tuples(strategy, strategy))
|
86
135
|
|
87
136
|
@dataclass(frozen=True, kw_only=True, slots=True)
|
88
137
|
class Settings:
|
89
|
-
value:
|
138
|
+
value: cls = default # pyright: ignore[reportInvalidTypeForm]
|
90
139
|
|
91
|
-
settings_default = typed_settings.load_settings(
|
92
|
-
Settings, loaders=[], converter=ExtendedTSConverter()
|
93
|
-
)
|
94
|
-
assert settings_default.value == default
|
95
140
|
file = Path(root, "file.toml")
|
96
141
|
_ = file.write_text(
|
97
142
|
strip_and_dedent(f"""
|
@@ -99,14 +144,14 @@ class TestExtendedTSConverter:
|
|
99
144
|
value = '{serialize(value)}'
|
100
145
|
""")
|
101
146
|
)
|
102
|
-
|
147
|
+
loaded = typed_settings.load_settings(
|
103
148
|
Settings,
|
104
149
|
loaders=[
|
105
150
|
FileLoader(formats={"*.toml": TomlFormat(app_name)}, files=[file])
|
106
151
|
],
|
107
152
|
converter=ExtendedTSConverter(),
|
108
153
|
)
|
109
|
-
assert
|
154
|
+
assert loaded.value == value
|
110
155
|
|
111
156
|
@given(
|
112
157
|
root=temp_paths(),
|