dycw-utilities 0.166.4__tar.gz → 0.166.5__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.166.4 → dycw_utilities-0.166.5}/PKG-INFO +1 -1
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/pyproject.toml +2 -2
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_typed_settings.py +107 -48
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/typed_settings.py +9 -3
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/.gitignore +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/LICENSE +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/README.md +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_aeventkit.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_testbook.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/aeventkit.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/click.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/http.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/json.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/math.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/os.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/random.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/re.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/string.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/testbook.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/text.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/types.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/version.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/zoneinfo.py +0 -0
@@ -233,7 +233,7 @@ dependencies = [
|
|
233
233
|
name = "dycw-utilities"
|
234
234
|
readme = "README.md"
|
235
235
|
requires-python = ">= 3.12"
|
236
|
-
version = "0.166.
|
236
|
+
version = "0.166.5"
|
237
237
|
|
238
238
|
[project.entry-points.pytest11]
|
239
239
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -266,7 +266,7 @@ test = [
|
|
266
266
|
# bump-my-version
|
267
267
|
[tool.bumpversion]
|
268
268
|
allow_dirty = true
|
269
|
-
current_version = "0.166.
|
269
|
+
current_version = "0.166.5"
|
270
270
|
|
271
271
|
[[tool.bumpversion.files]]
|
272
272
|
filename = "src/utilities/__init__.py"
|
@@ -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 Any, ClassVar, assert_never
|
5
|
+
from typing import Any, ClassVar, Self, assert_never, override
|
6
6
|
from uuid import UUID
|
7
7
|
|
8
8
|
import typed_settings
|
@@ -12,7 +12,9 @@ from hypothesis.strategies import (
|
|
12
12
|
SearchStrategy,
|
13
13
|
booleans,
|
14
14
|
data,
|
15
|
+
integers,
|
15
16
|
ip_addresses,
|
17
|
+
sampled_from,
|
16
18
|
tuples,
|
17
19
|
uuids,
|
18
20
|
)
|
@@ -45,6 +47,8 @@ from utilities.hypothesis import (
|
|
45
47
|
zoned_date_times,
|
46
48
|
)
|
47
49
|
from utilities.os import temp_environ
|
50
|
+
from utilities.re import extract_group
|
51
|
+
from utilities.sentinel import Sentinel, sentinel
|
48
52
|
from utilities.text import strip_and_dedent
|
49
53
|
from utilities.typed_settings import (
|
50
54
|
ExtendedTSConverter,
|
@@ -64,40 +68,20 @@ class _Case[T]:
|
|
64
68
|
|
65
69
|
class TestExtendedTSConverter:
|
66
70
|
cases: ClassVar[list[_Case]] = [
|
67
|
-
_Case(cls=Date, strategy=dates(), serialize=
|
71
|
+
_Case(cls=Date, strategy=dates(), serialize=str),
|
72
|
+
_Case(cls=DateDelta, strategy=date_deltas(parsable=True), serialize=str),
|
68
73
|
_Case(
|
69
|
-
cls=
|
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,
|
74
|
+
cls=DateTimeDelta, strategy=date_time_deltas(parsable=True), serialize=str
|
77
75
|
),
|
78
76
|
_Case(cls=IPv4Address, strategy=ip_addresses(v=4), serialize=str),
|
79
77
|
_Case(cls=IPv6Address, strategy=ip_addresses(v=6), serialize=str),
|
80
|
-
_Case(
|
81
|
-
|
82
|
-
),
|
83
|
-
_Case(
|
84
|
-
cls=PlainDateTime,
|
85
|
-
strategy=plain_date_times(),
|
86
|
-
serialize=PlainDateTime.format_common_iso,
|
87
|
-
),
|
88
|
-
_Case(cls=Time, strategy=times(), serialize=Time.format_common_iso),
|
89
|
-
_Case(
|
90
|
-
cls=TimeDelta, strategy=time_deltas(), serialize=TimeDelta.format_common_iso
|
91
|
-
),
|
78
|
+
_Case(cls=MonthDay, strategy=month_days(), serialize=str),
|
79
|
+
_Case(cls=PlainDateTime, strategy=plain_date_times(), serialize=str),
|
80
|
+
_Case(cls=Time, strategy=times(), serialize=str),
|
81
|
+
_Case(cls=TimeDelta, strategy=time_deltas(), serialize=str),
|
92
82
|
_Case(cls=UUID, strategy=uuids(), serialize=str),
|
93
|
-
_Case(
|
94
|
-
|
95
|
-
),
|
96
|
-
_Case(
|
97
|
-
cls=ZonedDateTime,
|
98
|
-
strategy=zoned_date_times(),
|
99
|
-
serialize=ZonedDateTime.format_common_iso,
|
100
|
-
),
|
83
|
+
_Case(cls=YearMonth, strategy=year_months(), serialize=str),
|
84
|
+
_Case(cls=ZonedDateTime, strategy=zoned_date_times(), serialize=str),
|
101
85
|
]
|
102
86
|
|
103
87
|
@given(data=data())
|
@@ -217,41 +201,116 @@ class TestExtendedTSConverter:
|
|
217
201
|
|
218
202
|
|
219
203
|
class TestLoadSettings:
|
220
|
-
@given(root=temp_paths(),
|
221
|
-
def test_main(self, *, root: Path,
|
204
|
+
@given(root=temp_paths(), date_time=zoned_date_times(), app_name=app_names)
|
205
|
+
def test_main(self, *, root: Path, date_time: ZonedDateTime, app_name: str) -> None:
|
222
206
|
@dataclass(frozen=True, kw_only=True, slots=True)
|
223
207
|
class Settings:
|
224
|
-
|
208
|
+
date_time: ZonedDateTime
|
225
209
|
|
226
|
-
file =
|
227
|
-
_ = file.write_text("")
|
210
|
+
file = root.joinpath("settings.toml")
|
228
211
|
_ = file.write_text(
|
229
212
|
strip_and_dedent(f"""
|
230
|
-
[app_name]
|
231
|
-
|
213
|
+
[{app_name}]
|
214
|
+
date_time = {str(date_time)!r}
|
232
215
|
""")
|
233
216
|
)
|
234
|
-
settings = load_settings(
|
235
|
-
|
236
|
-
)
|
237
|
-
assert settings.datetime == datetime
|
217
|
+
settings = load_settings(Settings, app_name, start_dir=root)
|
218
|
+
assert settings.date_time == date_time
|
238
219
|
|
239
220
|
@given(
|
240
221
|
prefix=app_names.map(lambda text: f"TEST_{text}".upper()),
|
241
|
-
|
222
|
+
date_time=zoned_date_times(),
|
223
|
+
app_name=app_names,
|
242
224
|
)
|
243
|
-
def test_loaders(
|
244
|
-
|
225
|
+
def test_loaders(
|
226
|
+
self, *, prefix: str, date_time: ZonedDateTime, app_name: str
|
227
|
+
) -> None:
|
228
|
+
key = f"{prefix}__DATE_TIME"
|
245
229
|
|
246
230
|
@dataclass(frozen=True, kw_only=True, slots=True)
|
247
231
|
class Settings:
|
248
|
-
|
232
|
+
date_time: ZonedDateTime
|
249
233
|
|
250
|
-
with temp_environ({key:
|
234
|
+
with temp_environ({key: str(date_time)}):
|
251
235
|
settings = load_settings(
|
252
|
-
Settings,
|
236
|
+
Settings, app_name, loaders=[EnvLoader(prefix=f"{prefix}__")]
|
253
237
|
)
|
254
|
-
assert settings.
|
238
|
+
assert settings.date_time == date_time
|
239
|
+
|
240
|
+
@given(root=temp_paths(), app_name=app_names)
|
241
|
+
def test_converter_simple(self, *, root: Path, app_name: str) -> None:
|
242
|
+
@dataclass(frozen=True, kw_only=True, slots=True)
|
243
|
+
class Settings:
|
244
|
+
sentinel: Sentinel
|
245
|
+
|
246
|
+
file = root.joinpath("settings.toml")
|
247
|
+
_ = file.write_text(
|
248
|
+
strip_and_dedent(f"""
|
249
|
+
[{app_name}]
|
250
|
+
sentinel = 'sentinel'
|
251
|
+
""")
|
252
|
+
)
|
253
|
+
|
254
|
+
def convert(text: str, /) -> Sentinel:
|
255
|
+
if text == "sentinel":
|
256
|
+
return sentinel
|
257
|
+
raise ValueError
|
258
|
+
|
259
|
+
settings = load_settings(
|
260
|
+
Settings, app_name, start_dir=root, converters=[(Sentinel, convert)]
|
261
|
+
)
|
262
|
+
assert settings.sentinel is sentinel
|
263
|
+
|
264
|
+
@given(data=data(), root=temp_paths(), n=integers(), app_name=app_names)
|
265
|
+
def test_converter_dataclass(
|
266
|
+
self, *, data: DataObject, root: Path, n: int, app_name: str
|
267
|
+
) -> None:
|
268
|
+
@dataclass(repr=False, frozen=True, kw_only=True, slots=True)
|
269
|
+
class Left:
|
270
|
+
x: int
|
271
|
+
|
272
|
+
@override
|
273
|
+
def __str__(self) -> str:
|
274
|
+
return f"left{self.x}"
|
275
|
+
|
276
|
+
@classmethod
|
277
|
+
def parse(cls, text: str, /) -> Self:
|
278
|
+
x = extract_group(r"^left(.+?)$", text)
|
279
|
+
return cls(x=int(x))
|
280
|
+
|
281
|
+
@dataclass(frozen=True, kw_only=True, slots=True)
|
282
|
+
class Right:
|
283
|
+
y: int
|
284
|
+
|
285
|
+
@override
|
286
|
+
def __str__(self) -> str:
|
287
|
+
return f"right{self.y}"
|
288
|
+
|
289
|
+
@classmethod
|
290
|
+
def parse(cls, text: str, /) -> Self:
|
291
|
+
y = extract_group(r"^right(.+?)$", text)
|
292
|
+
return cls(y=int(y))
|
293
|
+
|
294
|
+
value = data.draw(sampled_from([Left(x=n), Right(y=n)]))
|
295
|
+
|
296
|
+
@dataclass(frozen=True, kw_only=True, slots=True)
|
297
|
+
class Settings:
|
298
|
+
inner: Left | Right
|
299
|
+
|
300
|
+
file = root.joinpath("settings.toml")
|
301
|
+
_ = file.write_text(
|
302
|
+
strip_and_dedent(f"""
|
303
|
+
[{app_name}]
|
304
|
+
inner = {str(value)!r}
|
305
|
+
""")
|
306
|
+
)
|
307
|
+
settings = load_settings(
|
308
|
+
Settings,
|
309
|
+
app_name,
|
310
|
+
start_dir=root,
|
311
|
+
converters=[(Left, Left.parse), (Right, Right.parse)],
|
312
|
+
)
|
313
|
+
assert settings.inner == value
|
255
314
|
|
256
315
|
@mark.parametrize("app_name", [param("app_"), param("app1"), param("app__name")])
|
257
316
|
def test_error(self, *, app_name: str) -> None:
|
@@ -30,7 +30,7 @@ from utilities.pathlib import to_path
|
|
30
30
|
from utilities.string import substitute_environ
|
31
31
|
|
32
32
|
if TYPE_CHECKING:
|
33
|
-
from collections.abc import Callable
|
33
|
+
from collections.abc import Callable, Iterable
|
34
34
|
|
35
35
|
from typed_settings.loaders import Loader
|
36
36
|
from typed_settings.processors import Processor
|
@@ -38,6 +38,9 @@ if TYPE_CHECKING:
|
|
38
38
|
from utilities.types import MaybeCallablePathLike, MaybeIterable, PathLike
|
39
39
|
|
40
40
|
|
41
|
+
type _ConverterItem = tuple[type[Any], Callable[..., Any]]
|
42
|
+
|
43
|
+
|
41
44
|
##
|
42
45
|
|
43
46
|
|
@@ -50,9 +53,10 @@ class ExtendedTSConverter(TSConverter):
|
|
50
53
|
*,
|
51
54
|
resolve_paths: bool = True,
|
52
55
|
strlist_sep: str | Callable[[str], list] | None = ":",
|
56
|
+
extra: Iterable[_ConverterItem] = (),
|
53
57
|
) -> None:
|
54
58
|
super().__init__(resolve_paths=resolve_paths, strlist_sep=strlist_sep)
|
55
|
-
cases: list[
|
59
|
+
cases: list[_ConverterItem] = [
|
56
60
|
(Date, Date.parse_common_iso),
|
57
61
|
(DateDelta, DateDelta.parse_common_iso),
|
58
62
|
(DateTimeDelta, DateTimeDelta.parse_common_iso),
|
@@ -66,6 +70,7 @@ class ExtendedTSConverter(TSConverter):
|
|
66
70
|
(UUID, UUID),
|
67
71
|
(YearMonth, YearMonth.parse_common_iso),
|
68
72
|
(ZonedDateTime, ZonedDateTime.parse_common_iso),
|
73
|
+
*extra,
|
69
74
|
]
|
70
75
|
extras = {cls: _make_converter(cls, func) for cls, func in cases}
|
71
76
|
self.scalar_converters |= extras
|
@@ -113,6 +118,7 @@ def load_settings[T](
|
|
113
118
|
start_dir: PathLike | None = None,
|
114
119
|
loaders: MaybeIterable[Loader] | None = None,
|
115
120
|
processors: MaybeIterable[Processor] = (),
|
121
|
+
converters: Iterable[_ConverterItem] = (),
|
116
122
|
base_dir: Path = _BASE_DIR,
|
117
123
|
) -> T:
|
118
124
|
if not search(r"^[A-Za-z]+(?:_[A-Za-z]+)*$", app_name):
|
@@ -129,7 +135,7 @@ def load_settings[T](
|
|
129
135
|
cls,
|
130
136
|
loaders_use,
|
131
137
|
processors=list(always_iterable(processors)),
|
132
|
-
converter=ExtendedTSConverter(),
|
138
|
+
converter=ExtendedTSConverter(extra=converters),
|
133
139
|
base_dir=base_dir,
|
134
140
|
)
|
135
141
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_with/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/modules/package_without/module_2.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/tests/test_typing_funcs/with_future.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest_plugins/pytest_randomly.py
RENAMED
File without changes
|
{dycw_utilities-0.166.4 → dycw_utilities-0.166.5}/src/utilities/pytest_plugins/pytest_regressions.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|