dycw-utilities 0.154.0__tar.gz → 0.155.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/PKG-INFO +2 -3
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/pyproject.toml +6 -10
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_altair.py +2 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_click.py +4 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_hypothesis.py +173 -42
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_logging.py +7 -5
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_objects/objects.py +10 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_orjson.py +23 -6
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_parse.py +4 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_polars.py +160 -106
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy_polars.py +2 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typed_settings.py +6 -6
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing.py +147 -7
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/with_future.py +63 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_whenever.py +119 -212
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_zoneinfo.py +4 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/hypothesis.py +151 -42
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/orjson.py +45 -12
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/polars.py +76 -43
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_regressions.py +3 -1
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/traceback.py +1 -1
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/typing.py +9 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/whenever.py +10 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/.gitignore +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/LICENSE +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/README.md +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.sh +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/click.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/http.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/json.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/math.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/os.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/random.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/re.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/string.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/text.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/types.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/version.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dycw-utilities
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.155.1
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
5
5
|
License-File: LICENSE
|
6
6
|
Requires-Python: >=3.12
|
@@ -12,8 +12,7 @@ Provides-Extra: logging
|
|
12
12
|
Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
|
13
13
|
Provides-Extra: test
|
14
14
|
Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
|
15
|
-
Requires-Dist: hypothesis<6.
|
16
|
-
Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
|
15
|
+
Requires-Dist: hypothesis<6.138,>=6.137.1; extra == 'test'
|
17
16
|
Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
|
18
17
|
Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
|
19
18
|
Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
|
@@ -44,7 +44,6 @@ dev = [
|
|
44
44
|
"coloredlogs >=15.0.1, <15.1",
|
45
45
|
"coverage-conditional-plugin >=0.9.0, <0.10",
|
46
46
|
"dycw-pytest-only >=2.1.1, <2.2",
|
47
|
-
"pudb >=2025.1, <2025.2",
|
48
47
|
"pyright[nodejs] >=1.1.401, <1.2",
|
49
48
|
"pytest-cov >=6.2.1, <6.3",
|
50
49
|
"pytest-timeout >=2.4.0, <2.5",
|
@@ -69,7 +68,7 @@ http-test = [
|
|
69
68
|
"orjson",
|
70
69
|
]
|
71
70
|
hypothesis = [
|
72
|
-
"hypothesis >=6.
|
71
|
+
"hypothesis >=6.137.1, <6.138",
|
73
72
|
]
|
74
73
|
hypothesis-test = [
|
75
74
|
"libcst",
|
@@ -119,7 +118,7 @@ orjson-test = [
|
|
119
118
|
"polars",
|
120
119
|
]
|
121
120
|
polars = [
|
122
|
-
"polars >=1.32.
|
121
|
+
"polars >=1.32.2, <1.33",
|
123
122
|
]
|
124
123
|
polars-ols = [
|
125
124
|
"polars-ols >=0.3.5, <0.4",
|
@@ -148,7 +147,6 @@ pyinstrument = [
|
|
148
147
|
"pyinstrument >=5.0.3, <5.1",
|
149
148
|
]
|
150
149
|
pytest = [
|
151
|
-
"pudb >=2025.1, <2025.2",
|
152
150
|
"pytest >=8.4.1, <8.5",
|
153
151
|
"pytest-asyncio >=1.1.0, <1.2",
|
154
152
|
"pytest-randomly >=3.16.0, <3.17",
|
@@ -168,7 +166,7 @@ pytest-test = [
|
|
168
166
|
"pytest-rerunfailures",
|
169
167
|
]
|
170
168
|
redis = [
|
171
|
-
"redis >=6.
|
169
|
+
"redis >=6.4.0, <6.5",
|
172
170
|
"orjson",
|
173
171
|
]
|
174
172
|
redis-test = [
|
@@ -229,7 +227,7 @@ dependencies = [
|
|
229
227
|
name = "dycw-utilities"
|
230
228
|
readme = "README.md"
|
231
229
|
requires-python = ">= 3.12"
|
232
|
-
version = "0.
|
230
|
+
version = "0.155.1"
|
233
231
|
|
234
232
|
[project.entry-points.pytest11]
|
235
233
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -241,8 +239,7 @@ logging = [
|
|
241
239
|
]
|
242
240
|
test = [
|
243
241
|
"dycw-pytest-only >=2.1.1, <2.2",
|
244
|
-
"hypothesis >=6.
|
245
|
-
"pudb >=2025.1, <2025.2",
|
242
|
+
"hypothesis >=6.137.1, <6.138",
|
246
243
|
"pytest >=8.4.1, <8.5",
|
247
244
|
"pytest-asyncio >=1.1.0, <1.2",
|
248
245
|
"pytest-cov >=6.2.1, <6.3",
|
@@ -262,7 +259,7 @@ test = [
|
|
262
259
|
# bump-my-version
|
263
260
|
[tool.bumpversion]
|
264
261
|
allow_dirty = true
|
265
|
-
current_version = "0.
|
262
|
+
current_version = "0.155.1"
|
266
263
|
|
267
264
|
[[tool.bumpversion.files]]
|
268
265
|
filename = "src/utilities/__init__.py"
|
@@ -366,7 +363,6 @@ addopts = [
|
|
366
363
|
"--color=auto",
|
367
364
|
"--durations=10",
|
368
365
|
"--durations-min=10",
|
369
|
-
"--pdbcls=pudb.debugger:Debugger",
|
370
366
|
"--strict-markers",
|
371
367
|
"--timeout=600",
|
372
368
|
]
|
@@ -27,7 +27,7 @@ from utilities.altair import (
|
|
27
27
|
vconcat_charts,
|
28
28
|
)
|
29
29
|
from utilities.functions import ensure_class
|
30
|
-
from utilities.hypothesis import dates, text_ascii,
|
30
|
+
from utilities.hypothesis import dates, text_ascii, zoned_date_times
|
31
31
|
from utilities.polars import DatetimeUTC, zoned_datetime_dtype
|
32
32
|
from utilities.tzdata import HongKong, Tokyo
|
33
33
|
from utilities.whenever import get_now
|
@@ -119,7 +119,7 @@ class TestPlotDataFrames:
|
|
119
119
|
)
|
120
120
|
_ = plot_dataframes(df, x="index", y="value")
|
121
121
|
|
122
|
-
@given(data=lists(tuples(
|
122
|
+
@given(data=lists(tuples(zoned_date_times(), floats(-10, 10))))
|
123
123
|
def test_tooltip_format_date_time(
|
124
124
|
self, *, data: list[tuple[ZonedDateTime, float]]
|
125
125
|
) -> None:
|
@@ -57,12 +57,12 @@ from utilities.hypothesis import (
|
|
57
57
|
date_time_deltas,
|
58
58
|
dates,
|
59
59
|
month_days,
|
60
|
-
|
60
|
+
plain_date_times,
|
61
61
|
text_ascii,
|
62
62
|
time_deltas,
|
63
63
|
times,
|
64
64
|
year_months,
|
65
|
-
|
65
|
+
zoned_date_times,
|
66
66
|
)
|
67
67
|
from utilities.text import join_strs, strip_and_dedent
|
68
68
|
|
@@ -304,7 +304,7 @@ class TestParameters:
|
|
304
304
|
_Case(
|
305
305
|
param=PlainDateTime(),
|
306
306
|
name="plain date-time",
|
307
|
-
strategy=
|
307
|
+
strategy=plain_date_times(),
|
308
308
|
serialize=whenever.PlainDateTime.format_common_iso,
|
309
309
|
failable=True,
|
310
310
|
),
|
@@ -335,7 +335,7 @@ class TestParameters:
|
|
335
335
|
_Case(
|
336
336
|
param=ZonedDateTime(),
|
337
337
|
name="zoned date-time",
|
338
|
-
strategy=
|
338
|
+
strategy=zoned_date_times(),
|
339
339
|
serialize=whenever.ZonedDateTime.format_common_iso,
|
340
340
|
failable=True,
|
341
341
|
),
|
@@ -1,11 +1,12 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
import datetime as dt
|
3
4
|
from itertools import pairwise
|
4
5
|
from pathlib import Path
|
5
6
|
from re import search
|
6
7
|
from typing import TYPE_CHECKING, Any, cast
|
7
8
|
|
8
|
-
from hypothesis import
|
9
|
+
from hypothesis import assume, given, settings
|
9
10
|
from hypothesis.errors import InvalidArgument
|
10
11
|
from hypothesis.extra.numpy import array_shapes
|
11
12
|
from hypothesis.strategies import (
|
@@ -46,6 +47,7 @@ from utilities.hypothesis import (
|
|
46
47
|
assume_does_not_raise,
|
47
48
|
bool_arrays,
|
48
49
|
date_deltas,
|
50
|
+
date_periods,
|
49
51
|
date_time_deltas,
|
50
52
|
dates,
|
51
53
|
draw2,
|
@@ -57,6 +59,8 @@ from utilities.hypothesis import (
|
|
57
59
|
hashables,
|
58
60
|
import_froms,
|
59
61
|
imports,
|
62
|
+
int8s,
|
63
|
+
int16s,
|
60
64
|
int32s,
|
61
65
|
int64s,
|
62
66
|
int_arrays,
|
@@ -65,7 +69,7 @@ from utilities.hypothesis import (
|
|
65
69
|
numbers,
|
66
70
|
pairs,
|
67
71
|
paths,
|
68
|
-
|
72
|
+
plain_date_times,
|
69
73
|
random_states,
|
70
74
|
sentinels,
|
71
75
|
sets_fixed_length,
|
@@ -82,6 +86,7 @@ from utilities.hypothesis import (
|
|
82
86
|
text_digits,
|
83
87
|
text_printable,
|
84
88
|
time_deltas,
|
89
|
+
time_periods,
|
85
90
|
times,
|
86
91
|
triples,
|
87
92
|
uint8s,
|
@@ -91,13 +96,16 @@ from utilities.hypothesis import (
|
|
91
96
|
urls,
|
92
97
|
versions,
|
93
98
|
year_months,
|
94
|
-
|
99
|
+
zoned_date_time_periods,
|
100
|
+
zoned_date_times,
|
95
101
|
)
|
96
102
|
from utilities.iterables import one
|
97
103
|
from utilities.libcst import parse_import
|
98
104
|
from utilities.math import (
|
99
105
|
MAX_FLOAT32,
|
100
106
|
MAX_FLOAT64,
|
107
|
+
MAX_INT8,
|
108
|
+
MAX_INT16,
|
101
109
|
MAX_INT32,
|
102
110
|
MAX_INT64,
|
103
111
|
MAX_UINT8,
|
@@ -106,6 +114,8 @@ from utilities.math import (
|
|
106
114
|
MAX_UINT64,
|
107
115
|
MIN_FLOAT32,
|
108
116
|
MIN_FLOAT64,
|
117
|
+
MIN_INT8,
|
118
|
+
MIN_INT16,
|
109
119
|
MIN_INT32,
|
110
120
|
MIN_INT64,
|
111
121
|
MIN_UINT8,
|
@@ -120,12 +130,15 @@ from utilities.version import Version
|
|
120
130
|
from utilities.whenever import (
|
121
131
|
DATE_TWO_DIGIT_YEAR_MAX,
|
122
132
|
DATE_TWO_DIGIT_YEAR_MIN,
|
133
|
+
DatePeriod,
|
134
|
+
TimePeriod,
|
135
|
+
ZonedDateTimePeriod,
|
123
136
|
to_days,
|
124
137
|
to_nanoseconds,
|
138
|
+
to_py_time_delta,
|
125
139
|
)
|
126
140
|
|
127
141
|
if TYPE_CHECKING:
|
128
|
-
from collections.abc import Iterable
|
129
142
|
from collections.abc import Set as AbstractSet
|
130
143
|
from zoneinfo import ZoneInfo
|
131
144
|
|
@@ -186,6 +199,7 @@ class TestDateDeltas:
|
|
186
199
|
date_deltas(min_value=min_value, max_value=max_value, parsable=parsable)
|
187
200
|
)
|
188
201
|
assert isinstance(delta, DateDelta)
|
202
|
+
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
189
203
|
days = to_days(delta)
|
190
204
|
if min_value is not None:
|
191
205
|
assert days >= to_days(min_value)
|
@@ -195,15 +209,32 @@ class TestDateDeltas:
|
|
195
209
|
assert DateDelta.parse_common_iso(delta.format_common_iso()) == delta
|
196
210
|
|
197
211
|
|
212
|
+
class TestDatePeriods:
|
213
|
+
@given(data=data())
|
214
|
+
def test_main(self, *, data: DataObject) -> None:
|
215
|
+
min_value = data.draw(dates() | none())
|
216
|
+
max_value = data.draw(dates() | none())
|
217
|
+
with assume_does_not_raise(InvalidArgument):
|
218
|
+
period = data.draw(date_periods(min_value=min_value, max_value=max_value))
|
219
|
+
assert isinstance(period, DatePeriod)
|
220
|
+
if min_value is not None:
|
221
|
+
assert period.start >= min_value
|
222
|
+
if max_value is not None:
|
223
|
+
assert period.end <= max_value
|
224
|
+
|
225
|
+
|
198
226
|
class TestDateTimeDeltas:
|
199
|
-
@given(data=data(), parsable=booleans())
|
200
|
-
def test_main(self, *, data: DataObject, parsable: bool) -> None:
|
227
|
+
@given(data=data(), parsable=booleans(), nativable=booleans())
|
228
|
+
def test_main(self, *, data: DataObject, parsable: bool, nativable: bool) -> None:
|
201
229
|
min_value = data.draw(date_time_deltas() | none())
|
202
230
|
max_value = data.draw(date_time_deltas() | none())
|
203
231
|
with assume_does_not_raise(InvalidArgument):
|
204
232
|
delta = data.draw(
|
205
233
|
date_time_deltas(
|
206
|
-
min_value=min_value,
|
234
|
+
min_value=min_value,
|
235
|
+
max_value=max_value,
|
236
|
+
parsable=parsable,
|
237
|
+
nativable=nativable,
|
207
238
|
)
|
208
239
|
)
|
209
240
|
assert isinstance(delta, DateTimeDelta)
|
@@ -214,6 +245,8 @@ class TestDateTimeDeltas:
|
|
214
245
|
assert nanos <= to_nanoseconds(max_value)
|
215
246
|
if parsable:
|
216
247
|
assert DateTimeDelta.parse_common_iso(delta.format_common_iso()) == delta
|
248
|
+
if nativable:
|
249
|
+
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
217
250
|
|
218
251
|
|
219
252
|
class TestDates:
|
@@ -347,17 +380,27 @@ class TestDraw2:
|
|
347
380
|
class TestFloat32s:
|
348
381
|
@given(data=data())
|
349
382
|
def test_main(self, *, data: DataObject) -> None:
|
350
|
-
min_value, max_value = data.draw(pairs(float32s()
|
351
|
-
|
352
|
-
|
383
|
+
min_value, max_value = data.draw(pairs(float32s() | none()))
|
384
|
+
with assume_does_not_raise(InvalidArgument):
|
385
|
+
x = data.draw(float32s(min_value=min_value, max_value=max_value))
|
386
|
+
assert MIN_FLOAT32 <= x <= MAX_FLOAT32
|
387
|
+
if min_value is not None:
|
388
|
+
assert x >= min_value
|
389
|
+
if max_value is not None:
|
390
|
+
assert x <= max_value
|
353
391
|
|
354
392
|
|
355
393
|
class TestFloat64s:
|
356
394
|
@given(data=data())
|
357
395
|
def test_main(self, *, data: DataObject) -> None:
|
358
|
-
min_value, max_value = data.draw(pairs(float64s()
|
359
|
-
|
360
|
-
|
396
|
+
min_value, max_value = data.draw(pairs(float64s() | none()))
|
397
|
+
with assume_does_not_raise(InvalidArgument):
|
398
|
+
x = data.draw(float64s(min_value=min_value, max_value=max_value))
|
399
|
+
assert MIN_FLOAT64 <= x <= MAX_FLOAT64
|
400
|
+
if min_value is not None:
|
401
|
+
assert x >= min_value
|
402
|
+
if max_value is not None:
|
403
|
+
assert x <= max_value
|
361
404
|
|
362
405
|
|
363
406
|
class TestFloatArrays:
|
@@ -574,20 +617,56 @@ class TestIntArrays:
|
|
574
617
|
assert len(set(flat)) == len(flat)
|
575
618
|
|
576
619
|
|
620
|
+
class TestInt8s:
|
621
|
+
@given(data=data())
|
622
|
+
def test_main(self, *, data: DataObject) -> None:
|
623
|
+
min_value, max_value = data.draw(pairs(int8s() | none()))
|
624
|
+
with assume_does_not_raise(InvalidArgument):
|
625
|
+
x = data.draw(int8s(min_value=min_value, max_value=max_value))
|
626
|
+
assert MIN_INT8 <= x <= MAX_INT8
|
627
|
+
if min_value is not None:
|
628
|
+
assert x >= min_value
|
629
|
+
if max_value is not None:
|
630
|
+
assert x <= max_value
|
631
|
+
|
632
|
+
|
633
|
+
class TestInt16s:
|
634
|
+
@given(data=data())
|
635
|
+
def test_main(self, *, data: DataObject) -> None:
|
636
|
+
min_value, max_value = data.draw(pairs(int16s() | none()))
|
637
|
+
with assume_does_not_raise(InvalidArgument):
|
638
|
+
x = data.draw(int16s(min_value=min_value, max_value=max_value))
|
639
|
+
assert MIN_INT16 <= x <= MAX_INT16
|
640
|
+
if min_value is not None:
|
641
|
+
assert x >= min_value
|
642
|
+
if max_value is not None:
|
643
|
+
assert x <= max_value
|
644
|
+
|
645
|
+
|
577
646
|
class TestInt32s:
|
578
647
|
@given(data=data())
|
579
648
|
def test_main(self, *, data: DataObject) -> None:
|
580
|
-
min_value, max_value = data.draw(pairs(int32s()
|
581
|
-
|
582
|
-
|
649
|
+
min_value, max_value = data.draw(pairs(int32s() | none()))
|
650
|
+
with assume_does_not_raise(InvalidArgument):
|
651
|
+
x = data.draw(int32s(min_value=min_value, max_value=max_value))
|
652
|
+
assert MIN_INT32 <= x <= MAX_INT32
|
653
|
+
if min_value is not None:
|
654
|
+
assert x >= min_value
|
655
|
+
if max_value is not None:
|
656
|
+
assert x <= max_value
|
583
657
|
|
584
658
|
|
585
659
|
class TestInt64s:
|
586
660
|
@given(data=data())
|
587
661
|
def test_main(self, *, data: DataObject) -> None:
|
588
|
-
min_value, max_value = data.draw(pairs(int64s()
|
589
|
-
|
590
|
-
|
662
|
+
min_value, max_value = data.draw(pairs(int64s() | none()))
|
663
|
+
with assume_does_not_raise(InvalidArgument):
|
664
|
+
x = data.draw(int64s(min_value=min_value, max_value=max_value))
|
665
|
+
assert MIN_INT64 <= x <= MAX_INT64
|
666
|
+
if min_value is not None:
|
667
|
+
assert x >= min_value
|
668
|
+
if max_value is not None:
|
669
|
+
assert x <= max_value
|
591
670
|
|
592
671
|
|
593
672
|
class TestListsFixedLength:
|
@@ -655,8 +734,8 @@ class TestPairs:
|
|
655
734
|
class TestPaths:
|
656
735
|
@given(data=data())
|
657
736
|
def test_main(self, *, data: DataObject) -> None:
|
658
|
-
min_depth = data.draw(integers(0,
|
659
|
-
max_depth = data.draw(integers(0,
|
737
|
+
min_depth = data.draw(integers(0, 3) | none())
|
738
|
+
max_depth = data.draw(integers(0, 3) | none())
|
660
739
|
with assume_does_not_raise(InvalidArgument):
|
661
740
|
path = data.draw(paths(min_depth=min_depth, max_depth=max_depth))
|
662
741
|
assert isinstance(path, Path)
|
@@ -671,11 +750,11 @@ class TestPaths:
|
|
671
750
|
class TestPlainDateTimes:
|
672
751
|
@given(data=data())
|
673
752
|
def test_main(self, *, data: DataObject) -> None:
|
674
|
-
min_value = data.draw(
|
675
|
-
max_value = data.draw(
|
753
|
+
min_value = data.draw(plain_date_times() | none())
|
754
|
+
max_value = data.draw(plain_date_times() | none())
|
676
755
|
with assume_does_not_raise(InvalidArgument):
|
677
756
|
datetime = data.draw(
|
678
|
-
|
757
|
+
plain_date_times(min_value=min_value, max_value=max_value)
|
679
758
|
)
|
680
759
|
assert isinstance(datetime, PlainDateTime)
|
681
760
|
assert PlainDateTime.parse_common_iso(datetime.format_common_iso()) == datetime
|
@@ -722,13 +801,11 @@ class TestSetupHypothesisProfiles:
|
|
722
801
|
def test_main(self) -> None:
|
723
802
|
setup_hypothesis_profiles()
|
724
803
|
curr = settings()
|
725
|
-
assert Phase.shrink in cast("Iterable[Phase]", curr.phases)
|
726
804
|
assert curr.max_examples in {10, 100, 1000}
|
727
805
|
|
728
806
|
def test_no_shrink(self) -> None:
|
729
807
|
with temp_environ({"HYPOTHESIS_NO_SHRINK": "1"}):
|
730
808
|
setup_hypothesis_profiles()
|
731
|
-
assert Phase.shrink not in cast("Iterable[Phase]", settings().phases)
|
732
809
|
|
733
810
|
@given(max_examples=integers(1, 100))
|
734
811
|
def test_max_examples(self, *, max_examples: int) -> None:
|
@@ -920,12 +997,27 @@ class TestTimeDeltas:
|
|
920
997
|
delta = data.draw(time_deltas(min_value=min_value, max_value=max_value))
|
921
998
|
assert isinstance(delta, TimeDelta)
|
922
999
|
assert TimeDelta.parse_common_iso(delta.format_common_iso()) == delta
|
1000
|
+
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
923
1001
|
if min_value is not None:
|
924
1002
|
assert delta >= min_value
|
925
1003
|
if max_value is not None:
|
926
1004
|
assert delta <= max_value
|
927
1005
|
|
928
1006
|
|
1007
|
+
class TestTimePeriods:
|
1008
|
+
@given(data=data())
|
1009
|
+
def test_main(self, *, data: DataObject) -> None:
|
1010
|
+
min_value = data.draw(times() | none())
|
1011
|
+
max_value = data.draw(times() | none())
|
1012
|
+
with assume_does_not_raise(InvalidArgument):
|
1013
|
+
period = data.draw(time_periods(min_value=min_value, max_value=max_value))
|
1014
|
+
assert isinstance(period, TimePeriod)
|
1015
|
+
if min_value is not None:
|
1016
|
+
assert period.start >= min_value
|
1017
|
+
if max_value is not None:
|
1018
|
+
assert period.end <= max_value
|
1019
|
+
|
1020
|
+
|
929
1021
|
class TestTimes:
|
930
1022
|
@given(data=data())
|
931
1023
|
def test_main(self, *, data: DataObject) -> None:
|
@@ -958,33 +1050,53 @@ class TestTriples:
|
|
958
1050
|
class TestUInt8s:
|
959
1051
|
@given(data=data())
|
960
1052
|
def test_main(self, *, data: DataObject) -> None:
|
961
|
-
min_value, max_value = data.draw(pairs(uint8s()
|
962
|
-
|
963
|
-
|
1053
|
+
min_value, max_value = data.draw(pairs(uint8s() | none()))
|
1054
|
+
with assume_does_not_raise(InvalidArgument):
|
1055
|
+
x = data.draw(uint8s(min_value=min_value, max_value=max_value))
|
1056
|
+
assert MIN_UINT8 <= x <= MAX_UINT8
|
1057
|
+
if min_value is not None:
|
1058
|
+
assert x >= min_value
|
1059
|
+
if max_value is not None:
|
1060
|
+
assert x <= max_value
|
964
1061
|
|
965
1062
|
|
966
1063
|
class TestUInt16s:
|
967
1064
|
@given(data=data())
|
968
1065
|
def test_main(self, *, data: DataObject) -> None:
|
969
|
-
min_value, max_value = data.draw(pairs(uint16s()
|
970
|
-
|
971
|
-
|
1066
|
+
min_value, max_value = data.draw(pairs(uint16s() | none()))
|
1067
|
+
with assume_does_not_raise(InvalidArgument):
|
1068
|
+
x = data.draw(uint16s(min_value=min_value, max_value=max_value))
|
1069
|
+
assert MIN_UINT16 <= x <= MAX_UINT16
|
1070
|
+
if min_value is not None:
|
1071
|
+
assert x >= min_value
|
1072
|
+
if max_value is not None:
|
1073
|
+
assert x <= max_value
|
972
1074
|
|
973
1075
|
|
974
1076
|
class TestUInt32s:
|
975
1077
|
@given(data=data())
|
976
1078
|
def test_main(self, *, data: DataObject) -> None:
|
977
|
-
min_value, max_value = data.draw(pairs(uint32s()
|
978
|
-
|
979
|
-
|
1079
|
+
min_value, max_value = data.draw(pairs(uint32s() | none()))
|
1080
|
+
with assume_does_not_raise(InvalidArgument):
|
1081
|
+
x = data.draw(uint32s(min_value=min_value, max_value=max_value))
|
1082
|
+
assert MIN_UINT32 <= x <= MAX_UINT32
|
1083
|
+
if min_value is not None:
|
1084
|
+
assert x >= min_value
|
1085
|
+
if max_value is not None:
|
1086
|
+
assert x <= max_value
|
980
1087
|
|
981
1088
|
|
982
1089
|
class TestUInt64s:
|
983
1090
|
@given(data=data())
|
984
1091
|
def test_main(self, *, data: DataObject) -> None:
|
985
|
-
min_value, max_value = data.draw(pairs(uint64s()
|
986
|
-
|
987
|
-
|
1092
|
+
min_value, max_value = data.draw(pairs(uint64s() | none()))
|
1093
|
+
with assume_does_not_raise(InvalidArgument):
|
1094
|
+
x = data.draw(uint64s(min_value=min_value, max_value=max_value))
|
1095
|
+
assert MIN_UINT64 <= x <= MAX_UINT64
|
1096
|
+
if min_value is not None:
|
1097
|
+
assert x >= min_value
|
1098
|
+
if max_value is not None:
|
1099
|
+
assert x <= max_value
|
988
1100
|
|
989
1101
|
|
990
1102
|
class TestURLs:
|
@@ -1063,14 +1175,33 @@ class TestYearMonths:
|
|
1063
1175
|
assert year_month.on_day(28) <= DATE_TWO_DIGIT_YEAR_MAX
|
1064
1176
|
|
1065
1177
|
|
1178
|
+
class TestZonedDateTimePeriods:
|
1179
|
+
@given(data=data(), time_zone=timezones())
|
1180
|
+
def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
1181
|
+
min_value = data.draw(zoned_date_times() | none())
|
1182
|
+
max_value = data.draw(zoned_date_times() | none())
|
1183
|
+
with assume_does_not_raise(InvalidArgument):
|
1184
|
+
period = data.draw(
|
1185
|
+
zoned_date_time_periods(
|
1186
|
+
min_value=min_value, max_value=max_value, time_zone=time_zone
|
1187
|
+
)
|
1188
|
+
)
|
1189
|
+
assert isinstance(period, ZonedDateTimePeriod)
|
1190
|
+
assert period.time_zone is time_zone
|
1191
|
+
if min_value is not None:
|
1192
|
+
assert period.start >= min_value
|
1193
|
+
if max_value is not None:
|
1194
|
+
assert period.end <= max_value
|
1195
|
+
|
1196
|
+
|
1066
1197
|
class TestZonedDateTimes:
|
1067
1198
|
@given(data=data(), time_zone=timezones())
|
1068
1199
|
def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
1069
|
-
min_value = data.draw(
|
1070
|
-
max_value = data.draw(
|
1200
|
+
min_value = data.draw(zoned_date_times() | none())
|
1201
|
+
max_value = data.draw(zoned_date_times() | none())
|
1071
1202
|
with assume_does_not_raise(InvalidArgument):
|
1072
1203
|
datetime = data.draw(
|
1073
|
-
|
1204
|
+
zoned_date_times(
|
1074
1205
|
min_value=min_value, max_value=max_value, time_zone=time_zone
|
1075
1206
|
)
|
1076
1207
|
)
|
@@ -1087,5 +1218,5 @@ class TestZonedDateTimes:
|
|
1087
1218
|
def test_examples(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
1088
1219
|
with assume_does_not_raise(TimeZoneNotFoundError):
|
1089
1220
|
max_value = ZonedDateTime(1, 1, 2, tz=time_zone.key)
|
1090
|
-
datetime = data.draw(
|
1221
|
+
datetime = data.draw(zoned_date_times(max_value=max_value, time_zone=time_zone))
|
1091
1222
|
_ = datetime.py_datetime()
|
@@ -12,7 +12,7 @@ from hypothesis.strategies import booleans, integers
|
|
12
12
|
from pytest import LogCaptureFixture, mark, param, raises
|
13
13
|
|
14
14
|
from tests.conftest import SKIPIF_CI_AND_WINDOWS
|
15
|
-
from utilities.hypothesis import pairs, temp_paths, text_ascii,
|
15
|
+
from utilities.hypothesis import pairs, temp_paths, text_ascii, zoned_date_times
|
16
16
|
from utilities.iterables import one
|
17
17
|
from utilities.logging import (
|
18
18
|
GetLoggingLevelNumberError,
|
@@ -274,7 +274,7 @@ class TestRotatingLogFile:
|
|
274
274
|
assert result.start is None
|
275
275
|
assert result.end is None
|
276
276
|
|
277
|
-
@given(index=integers(min_value=1), end=
|
277
|
+
@given(index=integers(min_value=1), end=zoned_date_times())
|
278
278
|
def test_from_path_with_index_and_end(
|
279
279
|
self, *, index: int, end: ZonedDateTime
|
280
280
|
) -> None:
|
@@ -287,7 +287,9 @@ class TestRotatingLogFile:
|
|
287
287
|
assert result.start is None
|
288
288
|
assert result.end == end.round()
|
289
289
|
|
290
|
-
@given(
|
290
|
+
@given(
|
291
|
+
index=integers(min_value=1), datetimes=pairs(zoned_date_times(), sorted=True)
|
292
|
+
)
|
291
293
|
def test_from_path_with_index_start_and_end(
|
292
294
|
self, *, index: int, datetimes: tuple[ZonedDateTime, ZonedDateTime]
|
293
295
|
) -> None:
|
@@ -315,7 +317,7 @@ class TestRotatingLogFile:
|
|
315
317
|
file = _RotatingLogFile(directory=root, stem="log", suffix=".txt", index=index)
|
316
318
|
assert file.path == root.joinpath(f"log.{index}.txt")
|
317
319
|
|
318
|
-
@given(root=temp_paths(), index=integers(min_value=1), end=
|
320
|
+
@given(root=temp_paths(), index=integers(min_value=1), end=zoned_date_times())
|
319
321
|
def test_path_with_index_and_end(
|
320
322
|
self, *, root: Path, index: int, end: ZonedDateTime
|
321
323
|
) -> None:
|
@@ -327,7 +329,7 @@ class TestRotatingLogFile:
|
|
327
329
|
@given(
|
328
330
|
root=temp_paths(),
|
329
331
|
index=integers(min_value=1),
|
330
|
-
datetimes=pairs(
|
332
|
+
datetimes=pairs(zoned_date_times(), sorted=True),
|
331
333
|
)
|
332
334
|
def test_path_with_index_start_and_end(
|
333
335
|
self, *, root: Path, index: int, datetimes: tuple[ZonedDateTime, ZonedDateTime]
|
@@ -37,20 +37,23 @@ from tests.test_typing_funcs.with_future import (
|
|
37
37
|
from utilities.hypothesis import (
|
38
38
|
assume_does_not_raise,
|
39
39
|
date_deltas,
|
40
|
+
date_periods,
|
40
41
|
date_time_deltas,
|
41
42
|
dates,
|
42
43
|
int64s,
|
43
44
|
month_days,
|
44
45
|
paths,
|
45
|
-
|
46
|
+
plain_date_times,
|
46
47
|
py_datetimes,
|
47
48
|
text_ascii,
|
48
49
|
text_printable,
|
49
50
|
time_deltas,
|
51
|
+
time_periods,
|
50
52
|
times,
|
51
53
|
versions,
|
52
54
|
year_months,
|
53
|
-
|
55
|
+
zoned_date_time_periods,
|
56
|
+
zoned_date_times,
|
54
57
|
)
|
55
58
|
from utilities.math import MAX_INT64, MIN_INT64
|
56
59
|
|
@@ -82,6 +85,7 @@ def objects(
|
|
82
85
|
) -> SearchStrategy[Any]:
|
83
86
|
base = (
|
84
87
|
booleans()
|
88
|
+
| date_periods()
|
85
89
|
| dates()
|
86
90
|
| hypothesis.strategies.dates()
|
87
91
|
| py_datetimes(zoned=booleans())
|
@@ -90,15 +94,17 @@ def objects(
|
|
90
94
|
| month_days()
|
91
95
|
| none()
|
92
96
|
| paths()
|
93
|
-
|
|
97
|
+
| plain_date_times()
|
94
98
|
| text_printable().filter(lambda x: not x.startswith("["))
|
95
99
|
| time_deltas()
|
100
|
+
| time_periods()
|
96
101
|
| times()
|
97
102
|
| hypothesis.strategies.times()
|
98
103
|
| uuids()
|
99
104
|
| versions()
|
100
105
|
| year_months()
|
101
|
-
|
|
106
|
+
| zoned_date_time_periods()
|
107
|
+
| zoned_date_times()
|
102
108
|
)
|
103
109
|
if dataclass_custom_equality:
|
104
110
|
base |= builds(DataClassFutureCustomEquality)
|