dycw-utilities 0.154.0__tar.gz → 0.155.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.154.0 → dycw_utilities-0.155.0}/PKG-INFO +2 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/pyproject.toml +6 -6
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_altair.py +2 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_click.py +4 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_hypothesis.py +159 -37
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_logging.py +7 -5
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_objects/objects.py +10 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_orjson.py +23 -6
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_parse.py +4 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_polars.py +6 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_sqlalchemy_polars.py +2 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typed_settings.py +6 -6
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_whenever.py +106 -212
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_zoneinfo.py +4 -4
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/hypothesis.py +143 -41
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/orjson.py +45 -12
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/polars.py +2 -2
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_regressions.py +3 -1
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/.gitignore +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/LICENSE +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/README.md +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_yield_access/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_yield_access/script.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_yield_access/script.sh +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/json.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/string.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/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.0
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
5
5
|
License-File: LICENSE
|
6
6
|
Requires-Python: >=3.12
|
@@ -12,7 +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.
|
15
|
+
Requires-Dist: hypothesis<6.138,>=6.137.1; extra == 'test'
|
16
16
|
Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
|
17
17
|
Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
|
18
18
|
Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
|
@@ -69,7 +69,7 @@ http-test = [
|
|
69
69
|
"orjson",
|
70
70
|
]
|
71
71
|
hypothesis = [
|
72
|
-
"hypothesis >=6.
|
72
|
+
"hypothesis >=6.137.1, <6.138",
|
73
73
|
]
|
74
74
|
hypothesis-test = [
|
75
75
|
"libcst",
|
@@ -119,7 +119,7 @@ orjson-test = [
|
|
119
119
|
"polars",
|
120
120
|
]
|
121
121
|
polars = [
|
122
|
-
"polars >=1.32.
|
122
|
+
"polars >=1.32.2, <1.33",
|
123
123
|
]
|
124
124
|
polars-ols = [
|
125
125
|
"polars-ols >=0.3.5, <0.4",
|
@@ -168,7 +168,7 @@ pytest-test = [
|
|
168
168
|
"pytest-rerunfailures",
|
169
169
|
]
|
170
170
|
redis = [
|
171
|
-
"redis >=6.
|
171
|
+
"redis >=6.4.0, <6.5",
|
172
172
|
"orjson",
|
173
173
|
]
|
174
174
|
redis-test = [
|
@@ -229,7 +229,7 @@ dependencies = [
|
|
229
229
|
name = "dycw-utilities"
|
230
230
|
readme = "README.md"
|
231
231
|
requires-python = ">= 3.12"
|
232
|
-
version = "0.
|
232
|
+
version = "0.155.0"
|
233
233
|
|
234
234
|
[project.entry-points.pytest11]
|
235
235
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -241,7 +241,7 @@ logging = [
|
|
241
241
|
]
|
242
242
|
test = [
|
243
243
|
"dycw-pytest-only >=2.1.1, <2.2",
|
244
|
-
"hypothesis >=6.
|
244
|
+
"hypothesis >=6.137.1, <6.138",
|
245
245
|
"pudb >=2025.1, <2025.2",
|
246
246
|
"pytest >=8.4.1, <8.5",
|
247
247
|
"pytest-asyncio >=1.1.0, <1.2",
|
@@ -262,7 +262,7 @@ test = [
|
|
262
262
|
# bump-my-version
|
263
263
|
[tool.bumpversion]
|
264
264
|
allow_dirty = true
|
265
|
-
current_version = "0.
|
265
|
+
current_version = "0.155.0"
|
266
266
|
|
267
267
|
[[tool.bumpversion.files]]
|
268
268
|
filename = "src/utilities/__init__.py"
|
@@ -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
|
),
|
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
5
5
|
from re import search
|
6
6
|
from typing import TYPE_CHECKING, Any, cast
|
7
7
|
|
8
|
-
from hypothesis import
|
8
|
+
from hypothesis import assume, given, settings
|
9
9
|
from hypothesis.errors import InvalidArgument
|
10
10
|
from hypothesis.extra.numpy import array_shapes
|
11
11
|
from hypothesis.strategies import (
|
@@ -46,6 +46,7 @@ from utilities.hypothesis import (
|
|
46
46
|
assume_does_not_raise,
|
47
47
|
bool_arrays,
|
48
48
|
date_deltas,
|
49
|
+
date_periods,
|
49
50
|
date_time_deltas,
|
50
51
|
dates,
|
51
52
|
draw2,
|
@@ -57,6 +58,8 @@ from utilities.hypothesis import (
|
|
57
58
|
hashables,
|
58
59
|
import_froms,
|
59
60
|
imports,
|
61
|
+
int8s,
|
62
|
+
int16s,
|
60
63
|
int32s,
|
61
64
|
int64s,
|
62
65
|
int_arrays,
|
@@ -65,7 +68,7 @@ from utilities.hypothesis import (
|
|
65
68
|
numbers,
|
66
69
|
pairs,
|
67
70
|
paths,
|
68
|
-
|
71
|
+
plain_date_times,
|
69
72
|
random_states,
|
70
73
|
sentinels,
|
71
74
|
sets_fixed_length,
|
@@ -82,6 +85,7 @@ from utilities.hypothesis import (
|
|
82
85
|
text_digits,
|
83
86
|
text_printable,
|
84
87
|
time_deltas,
|
88
|
+
time_periods,
|
85
89
|
times,
|
86
90
|
triples,
|
87
91
|
uint8s,
|
@@ -91,13 +95,16 @@ from utilities.hypothesis import (
|
|
91
95
|
urls,
|
92
96
|
versions,
|
93
97
|
year_months,
|
94
|
-
|
98
|
+
zoned_date_time_periods,
|
99
|
+
zoned_date_times,
|
95
100
|
)
|
96
101
|
from utilities.iterables import one
|
97
102
|
from utilities.libcst import parse_import
|
98
103
|
from utilities.math import (
|
99
104
|
MAX_FLOAT32,
|
100
105
|
MAX_FLOAT64,
|
106
|
+
MAX_INT8,
|
107
|
+
MAX_INT16,
|
101
108
|
MAX_INT32,
|
102
109
|
MAX_INT64,
|
103
110
|
MAX_UINT8,
|
@@ -106,6 +113,8 @@ from utilities.math import (
|
|
106
113
|
MAX_UINT64,
|
107
114
|
MIN_FLOAT32,
|
108
115
|
MIN_FLOAT64,
|
116
|
+
MIN_INT8,
|
117
|
+
MIN_INT16,
|
109
118
|
MIN_INT32,
|
110
119
|
MIN_INT64,
|
111
120
|
MIN_UINT8,
|
@@ -120,12 +129,14 @@ from utilities.version import Version
|
|
120
129
|
from utilities.whenever import (
|
121
130
|
DATE_TWO_DIGIT_YEAR_MAX,
|
122
131
|
DATE_TWO_DIGIT_YEAR_MIN,
|
132
|
+
DatePeriod,
|
133
|
+
TimePeriod,
|
134
|
+
ZonedDateTimePeriod,
|
123
135
|
to_days,
|
124
136
|
to_nanoseconds,
|
125
137
|
)
|
126
138
|
|
127
139
|
if TYPE_CHECKING:
|
128
|
-
from collections.abc import Iterable
|
129
140
|
from collections.abc import Set as AbstractSet
|
130
141
|
from zoneinfo import ZoneInfo
|
131
142
|
|
@@ -195,6 +206,20 @@ class TestDateDeltas:
|
|
195
206
|
assert DateDelta.parse_common_iso(delta.format_common_iso()) == delta
|
196
207
|
|
197
208
|
|
209
|
+
class TestDatePeriods:
|
210
|
+
@given(data=data())
|
211
|
+
def test_main(self, *, data: DataObject) -> None:
|
212
|
+
min_value = data.draw(dates() | none())
|
213
|
+
max_value = data.draw(dates() | none())
|
214
|
+
with assume_does_not_raise(InvalidArgument):
|
215
|
+
period = data.draw(date_periods(min_value=min_value, max_value=max_value))
|
216
|
+
assert isinstance(period, DatePeriod)
|
217
|
+
if min_value is not None:
|
218
|
+
assert period.start >= min_value
|
219
|
+
if max_value is not None:
|
220
|
+
assert period.end <= max_value
|
221
|
+
|
222
|
+
|
198
223
|
class TestDateTimeDeltas:
|
199
224
|
@given(data=data(), parsable=booleans())
|
200
225
|
def test_main(self, *, data: DataObject, parsable: bool) -> None:
|
@@ -347,17 +372,27 @@ class TestDraw2:
|
|
347
372
|
class TestFloat32s:
|
348
373
|
@given(data=data())
|
349
374
|
def test_main(self, *, data: DataObject) -> None:
|
350
|
-
min_value, max_value = data.draw(pairs(float32s()
|
351
|
-
|
352
|
-
|
375
|
+
min_value, max_value = data.draw(pairs(float32s() | none()))
|
376
|
+
with assume_does_not_raise(InvalidArgument):
|
377
|
+
x = data.draw(float32s(min_value=min_value, max_value=max_value))
|
378
|
+
assert MIN_FLOAT32 <= x <= MAX_FLOAT32
|
379
|
+
if min_value is not None:
|
380
|
+
assert x >= min_value
|
381
|
+
if max_value is not None:
|
382
|
+
assert x <= max_value
|
353
383
|
|
354
384
|
|
355
385
|
class TestFloat64s:
|
356
386
|
@given(data=data())
|
357
387
|
def test_main(self, *, data: DataObject) -> None:
|
358
|
-
min_value, max_value = data.draw(pairs(float64s()
|
359
|
-
|
360
|
-
|
388
|
+
min_value, max_value = data.draw(pairs(float64s() | none()))
|
389
|
+
with assume_does_not_raise(InvalidArgument):
|
390
|
+
x = data.draw(float64s(min_value=min_value, max_value=max_value))
|
391
|
+
assert MIN_FLOAT64 <= x <= MAX_FLOAT64
|
392
|
+
if min_value is not None:
|
393
|
+
assert x >= min_value
|
394
|
+
if max_value is not None:
|
395
|
+
assert x <= max_value
|
361
396
|
|
362
397
|
|
363
398
|
class TestFloatArrays:
|
@@ -574,20 +609,56 @@ class TestIntArrays:
|
|
574
609
|
assert len(set(flat)) == len(flat)
|
575
610
|
|
576
611
|
|
612
|
+
class TestInt8s:
|
613
|
+
@given(data=data())
|
614
|
+
def test_main(self, *, data: DataObject) -> None:
|
615
|
+
min_value, max_value = data.draw(pairs(int8s() | none()))
|
616
|
+
with assume_does_not_raise(InvalidArgument):
|
617
|
+
x = data.draw(int8s(min_value=min_value, max_value=max_value))
|
618
|
+
assert MIN_INT8 <= x <= MAX_INT8
|
619
|
+
if min_value is not None:
|
620
|
+
assert x >= min_value
|
621
|
+
if max_value is not None:
|
622
|
+
assert x <= max_value
|
623
|
+
|
624
|
+
|
625
|
+
class TestInt16s:
|
626
|
+
@given(data=data())
|
627
|
+
def test_main(self, *, data: DataObject) -> None:
|
628
|
+
min_value, max_value = data.draw(pairs(int16s() | none()))
|
629
|
+
with assume_does_not_raise(InvalidArgument):
|
630
|
+
x = data.draw(int16s(min_value=min_value, max_value=max_value))
|
631
|
+
assert MIN_INT16 <= x <= MAX_INT16
|
632
|
+
if min_value is not None:
|
633
|
+
assert x >= min_value
|
634
|
+
if max_value is not None:
|
635
|
+
assert x <= max_value
|
636
|
+
|
637
|
+
|
577
638
|
class TestInt32s:
|
578
639
|
@given(data=data())
|
579
640
|
def test_main(self, *, data: DataObject) -> None:
|
580
|
-
min_value, max_value = data.draw(pairs(int32s()
|
581
|
-
|
582
|
-
|
641
|
+
min_value, max_value = data.draw(pairs(int32s() | none()))
|
642
|
+
with assume_does_not_raise(InvalidArgument):
|
643
|
+
x = data.draw(int32s(min_value=min_value, max_value=max_value))
|
644
|
+
assert MIN_INT32 <= x <= MAX_INT32
|
645
|
+
if min_value is not None:
|
646
|
+
assert x >= min_value
|
647
|
+
if max_value is not None:
|
648
|
+
assert x <= max_value
|
583
649
|
|
584
650
|
|
585
651
|
class TestInt64s:
|
586
652
|
@given(data=data())
|
587
653
|
def test_main(self, *, data: DataObject) -> None:
|
588
|
-
min_value, max_value = data.draw(pairs(int64s()
|
589
|
-
|
590
|
-
|
654
|
+
min_value, max_value = data.draw(pairs(int64s() | none()))
|
655
|
+
with assume_does_not_raise(InvalidArgument):
|
656
|
+
x = data.draw(int64s(min_value=min_value, max_value=max_value))
|
657
|
+
assert MIN_INT64 <= x <= MAX_INT64
|
658
|
+
if min_value is not None:
|
659
|
+
assert x >= min_value
|
660
|
+
if max_value is not None:
|
661
|
+
assert x <= max_value
|
591
662
|
|
592
663
|
|
593
664
|
class TestListsFixedLength:
|
@@ -671,11 +742,11 @@ class TestPaths:
|
|
671
742
|
class TestPlainDateTimes:
|
672
743
|
@given(data=data())
|
673
744
|
def test_main(self, *, data: DataObject) -> None:
|
674
|
-
min_value = data.draw(
|
675
|
-
max_value = data.draw(
|
745
|
+
min_value = data.draw(plain_date_times() | none())
|
746
|
+
max_value = data.draw(plain_date_times() | none())
|
676
747
|
with assume_does_not_raise(InvalidArgument):
|
677
748
|
datetime = data.draw(
|
678
|
-
|
749
|
+
plain_date_times(min_value=min_value, max_value=max_value)
|
679
750
|
)
|
680
751
|
assert isinstance(datetime, PlainDateTime)
|
681
752
|
assert PlainDateTime.parse_common_iso(datetime.format_common_iso()) == datetime
|
@@ -722,13 +793,11 @@ class TestSetupHypothesisProfiles:
|
|
722
793
|
def test_main(self) -> None:
|
723
794
|
setup_hypothesis_profiles()
|
724
795
|
curr = settings()
|
725
|
-
assert Phase.shrink in cast("Iterable[Phase]", curr.phases)
|
726
796
|
assert curr.max_examples in {10, 100, 1000}
|
727
797
|
|
728
798
|
def test_no_shrink(self) -> None:
|
729
799
|
with temp_environ({"HYPOTHESIS_NO_SHRINK": "1"}):
|
730
800
|
setup_hypothesis_profiles()
|
731
|
-
assert Phase.shrink not in cast("Iterable[Phase]", settings().phases)
|
732
801
|
|
733
802
|
@given(max_examples=integers(1, 100))
|
734
803
|
def test_max_examples(self, *, max_examples: int) -> None:
|
@@ -926,6 +995,20 @@ class TestTimeDeltas:
|
|
926
995
|
assert delta <= max_value
|
927
996
|
|
928
997
|
|
998
|
+
class TestTimePeriods:
|
999
|
+
@given(data=data())
|
1000
|
+
def test_main(self, *, data: DataObject) -> None:
|
1001
|
+
min_value = data.draw(times() | none())
|
1002
|
+
max_value = data.draw(times() | none())
|
1003
|
+
with assume_does_not_raise(InvalidArgument):
|
1004
|
+
period = data.draw(time_periods(min_value=min_value, max_value=max_value))
|
1005
|
+
assert isinstance(period, TimePeriod)
|
1006
|
+
if min_value is not None:
|
1007
|
+
assert period.start >= min_value
|
1008
|
+
if max_value is not None:
|
1009
|
+
assert period.end <= max_value
|
1010
|
+
|
1011
|
+
|
929
1012
|
class TestTimes:
|
930
1013
|
@given(data=data())
|
931
1014
|
def test_main(self, *, data: DataObject) -> None:
|
@@ -958,33 +1041,53 @@ class TestTriples:
|
|
958
1041
|
class TestUInt8s:
|
959
1042
|
@given(data=data())
|
960
1043
|
def test_main(self, *, data: DataObject) -> None:
|
961
|
-
min_value, max_value = data.draw(pairs(uint8s()
|
962
|
-
|
963
|
-
|
1044
|
+
min_value, max_value = data.draw(pairs(uint8s() | none()))
|
1045
|
+
with assume_does_not_raise(InvalidArgument):
|
1046
|
+
x = data.draw(uint8s(min_value=min_value, max_value=max_value))
|
1047
|
+
assert MIN_UINT8 <= x <= MAX_UINT8
|
1048
|
+
if min_value is not None:
|
1049
|
+
assert x >= min_value
|
1050
|
+
if max_value is not None:
|
1051
|
+
assert x <= max_value
|
964
1052
|
|
965
1053
|
|
966
1054
|
class TestUInt16s:
|
967
1055
|
@given(data=data())
|
968
1056
|
def test_main(self, *, data: DataObject) -> None:
|
969
|
-
min_value, max_value = data.draw(pairs(uint16s()
|
970
|
-
|
971
|
-
|
1057
|
+
min_value, max_value = data.draw(pairs(uint16s() | none()))
|
1058
|
+
with assume_does_not_raise(InvalidArgument):
|
1059
|
+
x = data.draw(uint16s(min_value=min_value, max_value=max_value))
|
1060
|
+
assert MIN_UINT16 <= x <= MAX_UINT16
|
1061
|
+
if min_value is not None:
|
1062
|
+
assert x >= min_value
|
1063
|
+
if max_value is not None:
|
1064
|
+
assert x <= max_value
|
972
1065
|
|
973
1066
|
|
974
1067
|
class TestUInt32s:
|
975
1068
|
@given(data=data())
|
976
1069
|
def test_main(self, *, data: DataObject) -> None:
|
977
|
-
min_value, max_value = data.draw(pairs(uint32s()
|
978
|
-
|
979
|
-
|
1070
|
+
min_value, max_value = data.draw(pairs(uint32s() | none()))
|
1071
|
+
with assume_does_not_raise(InvalidArgument):
|
1072
|
+
x = data.draw(uint32s(min_value=min_value, max_value=max_value))
|
1073
|
+
assert MIN_UINT32 <= x <= MAX_UINT32
|
1074
|
+
if min_value is not None:
|
1075
|
+
assert x >= min_value
|
1076
|
+
if max_value is not None:
|
1077
|
+
assert x <= max_value
|
980
1078
|
|
981
1079
|
|
982
1080
|
class TestUInt64s:
|
983
1081
|
@given(data=data())
|
984
1082
|
def test_main(self, *, data: DataObject) -> None:
|
985
|
-
min_value, max_value = data.draw(pairs(uint64s()
|
986
|
-
|
987
|
-
|
1083
|
+
min_value, max_value = data.draw(pairs(uint64s() | none()))
|
1084
|
+
with assume_does_not_raise(InvalidArgument):
|
1085
|
+
x = data.draw(uint64s(min_value=min_value, max_value=max_value))
|
1086
|
+
assert MIN_UINT64 <= x <= MAX_UINT64
|
1087
|
+
if min_value is not None:
|
1088
|
+
assert x >= min_value
|
1089
|
+
if max_value is not None:
|
1090
|
+
assert x <= max_value
|
988
1091
|
|
989
1092
|
|
990
1093
|
class TestURLs:
|
@@ -1063,14 +1166,33 @@ class TestYearMonths:
|
|
1063
1166
|
assert year_month.on_day(28) <= DATE_TWO_DIGIT_YEAR_MAX
|
1064
1167
|
|
1065
1168
|
|
1169
|
+
class TestZonedDateTimePeriods:
|
1170
|
+
@given(data=data(), time_zone=timezones())
|
1171
|
+
def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
1172
|
+
min_value = data.draw(zoned_date_times() | none())
|
1173
|
+
max_value = data.draw(zoned_date_times() | none())
|
1174
|
+
with assume_does_not_raise(InvalidArgument):
|
1175
|
+
period = data.draw(
|
1176
|
+
zoned_date_time_periods(
|
1177
|
+
min_value=min_value, max_value=max_value, time_zone=time_zone
|
1178
|
+
)
|
1179
|
+
)
|
1180
|
+
assert isinstance(period, ZonedDateTimePeriod)
|
1181
|
+
assert period.time_zone is time_zone
|
1182
|
+
if min_value is not None:
|
1183
|
+
assert period.start >= min_value
|
1184
|
+
if max_value is not None:
|
1185
|
+
assert period.end <= max_value
|
1186
|
+
|
1187
|
+
|
1066
1188
|
class TestZonedDateTimes:
|
1067
1189
|
@given(data=data(), time_zone=timezones())
|
1068
1190
|
def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
1069
|
-
min_value = data.draw(
|
1070
|
-
max_value = data.draw(
|
1191
|
+
min_value = data.draw(zoned_date_times() | none())
|
1192
|
+
max_value = data.draw(zoned_date_times() | none())
|
1071
1193
|
with assume_does_not_raise(InvalidArgument):
|
1072
1194
|
datetime = data.draw(
|
1073
|
-
|
1195
|
+
zoned_date_times(
|
1074
1196
|
min_value=min_value, max_value=max_value, time_zone=time_zone
|
1075
1197
|
)
|
1076
1198
|
)
|
@@ -1087,5 +1209,5 @@ class TestZonedDateTimes:
|
|
1087
1209
|
def test_examples(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
|
1088
1210
|
with assume_does_not_raise(TimeZoneNotFoundError):
|
1089
1211
|
max_value = ZonedDateTime(1, 1, 2, tz=time_zone.key)
|
1090
|
-
datetime = data.draw(
|
1212
|
+
datetime = data.draw(zoned_date_times(max_value=max_value, time_zone=time_zone))
|
1091
1213
|
_ = 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)
|
@@ -52,13 +52,15 @@ from tests.test_typing_funcs.with_future import (
|
|
52
52
|
)
|
53
53
|
from utilities.functions import is_sequence_of
|
54
54
|
from utilities.hypothesis import (
|
55
|
+
date_periods,
|
55
56
|
dates,
|
56
57
|
int64s,
|
57
58
|
paths,
|
58
59
|
temp_paths,
|
59
60
|
text_ascii,
|
60
61
|
text_printable,
|
61
|
-
|
62
|
+
time_periods,
|
63
|
+
zoned_date_times,
|
62
64
|
)
|
63
65
|
from utilities.iterables import always_iterable, one
|
64
66
|
from utilities.logging import get_logging_level_number
|
@@ -84,7 +86,7 @@ from utilities.sentinel import Sentinel, sentinel
|
|
84
86
|
from utilities.types import LogLevel, MaybeIterable, PathLike
|
85
87
|
from utilities.typing import get_args
|
86
88
|
from utilities.tzlocal import LOCAL_TIME_ZONE
|
87
|
-
from utilities.whenever import MINUTE, SECOND, get_now
|
89
|
+
from utilities.whenever import MINUTE, SECOND, DatePeriod, TimePeriod, get_now
|
88
90
|
|
89
91
|
if TYPE_CHECKING:
|
90
92
|
from collections.abc import Sequence
|
@@ -203,9 +205,9 @@ class TestGetLogRecords:
|
|
203
205
|
date=dates() | none(),
|
204
206
|
min_date=dates() | none(),
|
205
207
|
max_date=dates() | none(),
|
206
|
-
datetime=
|
207
|
-
min_datetime=
|
208
|
-
max_datetime=
|
208
|
+
datetime=zoned_date_times() | none(),
|
209
|
+
min_datetime=zoned_date_times() | none(),
|
210
|
+
max_datetime=zoned_date_times() | none(),
|
209
211
|
func_name=booleans() | text_ascii() | none(),
|
210
212
|
extra=booleans() | text_ascii() | sets(text_ascii()) | none(),
|
211
213
|
log_file=booleans() | paths() | text_ascii() | none(),
|
@@ -581,6 +583,11 @@ class TestSerializeAndDeserialize:
|
|
581
583
|
):
|
582
584
|
_ = deserialize(ser, objects=set())
|
583
585
|
|
586
|
+
@given(period=date_periods())
|
587
|
+
def test_date_periods(self, *, period: DatePeriod) -> None:
|
588
|
+
result = deserialize(serialize(period))
|
589
|
+
assert result == period
|
590
|
+
|
584
591
|
def test_deserialize_hook(self) -> None:
|
585
592
|
obj = DataClassFutureDefaultInInitChild()
|
586
593
|
ser = serialize(obj)
|
@@ -645,6 +652,11 @@ class TestSerializeAndDeserialize:
|
|
645
652
|
result = deserialize(serialize(obj), objects={SubTuple})
|
646
653
|
assert is_equal(result, obj)
|
647
654
|
|
655
|
+
@given(period=time_periods())
|
656
|
+
def test_time_periods(self, *, period: TimePeriod) -> None:
|
657
|
+
result = deserialize(serialize(period))
|
658
|
+
assert result == period
|
659
|
+
|
648
660
|
def test_unserializable(self) -> None:
|
649
661
|
ser = serialize(sentinel)
|
650
662
|
exp_ser = b'{"[dc|Unserializable]":{"qualname":"Sentinel","repr":"<sentinel>","str":"<sentinel>"}}'
|
@@ -666,7 +678,7 @@ class TestSerialize:
|
|
666
678
|
def test_dataclass(self) -> None:
|
667
679
|
obj = DataClassFutureNone(none=None)
|
668
680
|
result = serialize(obj)
|
669
|
-
expected = b'{"[dc|DataClassFutureNone]":{"none":"[
|
681
|
+
expected = b'{"[dc|DataClassFutureNone]":{"none":"[0]"}}'
|
670
682
|
assert result == expected
|
671
683
|
|
672
684
|
def test_dataclass_nested(self) -> None:
|
@@ -708,6 +720,11 @@ class TestSerialize:
|
|
708
720
|
expected = b'{"[ex|TestSerialize.test_exception_instance.<locals>.CustomError]":{"[tu]":[1,2,3]}}'
|
709
721
|
assert result == expected
|
710
722
|
|
723
|
+
def test_none(self) -> None:
|
724
|
+
result = serialize(None)
|
725
|
+
expected = b'"[0]"'
|
726
|
+
assert result == expected
|
727
|
+
|
711
728
|
@given(x=sampled_from([MIN_INT64 - 1, MAX_INT64 + 1]))
|
712
729
|
def test_pre_process(self, *, x: int) -> None:
|
713
730
|
with raises(_SerializeIntegerError, match="Integer .* is out of range"):
|