dycw-utilities 0.131.17__tar.gz → 0.131.18__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.131.17 → dycw_utilities-0.131.18}/PKG-INFO +1 -1
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/pyproject.toml +2 -2
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/conftest.py +8 -3
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_datetime.py +0 -300
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_hashlib.py +2 -2
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_iterables.py +5 -22
- dycw_utilities-0.131.18/src/tests/test_objects/__init__.py +1 -0
- dycw_utilities-0.131.18/src/tests/test_objects/objects.py +212 -0
- dycw_utilities-0.131.18/src/tests/test_operator.py +129 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_orjson.py +30 -46
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_parse.py +89 -78
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_redis.py +12 -12
- dycw_utilities-0.131.18/src/tests/test_whenever.py +180 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/datetime.py +2 -279
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/iterables.py +1 -30
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/operator.py +21 -15
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/orjson.py +67 -84
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/parse.py +24 -53
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/whenever.py +2 -216
- dycw_utilities-0.131.17/src/tests/test_operator.py +0 -409
- dycw_utilities-0.131.17/src/tests/test_whenever.py +0 -372
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/.gitignore +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/LICENSE +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/README.md +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_aiolimiter.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio_classes/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio_classes/loopers.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio_classes/redis.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_whenever2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/aiolimiter.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/click.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/git.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/http.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/math.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/os.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/period.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/random.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/re.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/string.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/text.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/types.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/version.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/whenever2.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/zoneinfo.py +0 -0
@@ -94,7 +94,7 @@ dependencies = [
|
|
94
94
|
name = "dycw-utilities"
|
95
95
|
readme = "README.md"
|
96
96
|
requires-python = ">= 3.12"
|
97
|
-
version = "0.131.
|
97
|
+
version = "0.131.18"
|
98
98
|
|
99
99
|
[project.optional-dependencies]
|
100
100
|
logging = [
|
@@ -121,7 +121,7 @@ test = [
|
|
121
121
|
# bump-my-version
|
122
122
|
[tool.bumpversion]
|
123
123
|
allow_dirty = true
|
124
|
-
current_version = "0.131.
|
124
|
+
current_version = "0.131.18"
|
125
125
|
|
126
126
|
[[tool.bumpversion.files]]
|
127
127
|
filename = "src/utilities/__init__.py"
|
@@ -8,13 +8,16 @@ from os import environ
|
|
8
8
|
from re import MULTILINE, Pattern
|
9
9
|
from typing import TYPE_CHECKING, Any
|
10
10
|
|
11
|
+
from hypothesis import HealthCheck
|
11
12
|
from pytest import fixture, mark, param
|
12
13
|
from sqlalchemy import text
|
14
|
+
from whenever import PlainDateTime
|
13
15
|
|
14
|
-
from utilities.datetime import MINUTE, get_now, parse_datetime_compact
|
15
16
|
from utilities.platform import IS_NOT_LINUX, IS_WINDOWS
|
16
17
|
from utilities.re import ExtractGroupError, extract_group
|
17
18
|
from utilities.text import strip_and_dedent
|
19
|
+
from utilities.tzlocal import LOCAL_TIME_ZONE_NAME
|
20
|
+
from utilities.whenever2 import MINUTE, get_now
|
18
21
|
|
19
22
|
if TYPE_CHECKING:
|
20
23
|
from collections.abc import Iterator, Sequence
|
@@ -41,7 +44,7 @@ try:
|
|
41
44
|
except ModuleNotFoundError:
|
42
45
|
pass
|
43
46
|
else:
|
44
|
-
setup_hypothesis_profiles()
|
47
|
+
setup_hypothesis_profiles(suppress_health_check={HealthCheck.differing_executors})
|
45
48
|
|
46
49
|
|
47
50
|
# fixture - logging
|
@@ -97,7 +100,9 @@ def _is_to_drop(table: str, /) -> bool:
|
|
97
100
|
datetime_str = extract_group(r"^(\d{8}T\d{6})_", table)
|
98
101
|
except ExtractGroupError:
|
99
102
|
return True
|
100
|
-
datetime =
|
103
|
+
datetime = PlainDateTime.parse_common_iso(datetime_str).assume_tz(
|
104
|
+
LOCAL_TIME_ZONE_NAME
|
105
|
+
)
|
101
106
|
now = get_now()
|
102
107
|
return (now - datetime) >= MINUTE
|
103
108
|
|
@@ -10,7 +10,6 @@ from typing import TYPE_CHECKING, Any, Self
|
|
10
10
|
from hypothesis import HealthCheck, assume, given, settings
|
11
11
|
from hypothesis.strategies import (
|
12
12
|
DataObject,
|
13
|
-
booleans,
|
14
13
|
data,
|
15
14
|
dates,
|
16
15
|
datetimes,
|
@@ -26,7 +25,6 @@ from pytest import mark, param, raises
|
|
26
25
|
|
27
26
|
from utilities.dataclasses import replace_non_sentinel
|
28
27
|
from utilities.datetime import (
|
29
|
-
_MICROSECONDS_PER_MILLISECOND,
|
30
28
|
DAY,
|
31
29
|
EPOCH_DATE,
|
32
30
|
EPOCH_NAIVE,
|
@@ -46,22 +44,16 @@ from utilities.datetime import (
|
|
46
44
|
ZERO_TIME,
|
47
45
|
AddDurationError,
|
48
46
|
AddWeekdaysError,
|
49
|
-
AreEqualDatesOrDateTimesError,
|
50
47
|
AreEqualDateTimesError,
|
51
48
|
CheckDateNotDateTimeError,
|
52
49
|
EnsureMonthError,
|
53
50
|
GetMinMaxDateError,
|
54
51
|
MeanDateTimeError,
|
55
52
|
MeanTimeDeltaError,
|
56
|
-
MillisecondsSinceEpochError,
|
57
53
|
Month,
|
58
54
|
MonthError,
|
59
|
-
ParseDateCompactError,
|
60
|
-
ParseDateTimeCompactError,
|
61
55
|
ParseMonthError,
|
62
|
-
SerializeCompactError,
|
63
56
|
SubDurationError,
|
64
|
-
TimedeltaToMillisecondsError,
|
65
57
|
YieldDaysError,
|
66
58
|
YieldWeekdaysError,
|
67
59
|
_DateDurationToIntFloatError,
|
@@ -77,25 +69,16 @@ from utilities.datetime import (
|
|
77
69
|
_ParseTwoDigitYearInvalidStringError,
|
78
70
|
add_duration,
|
79
71
|
add_weekdays,
|
80
|
-
are_equal_date_durations,
|
81
|
-
are_equal_dates_or_datetimes,
|
82
|
-
are_equal_datetime_durations,
|
83
72
|
are_equal_datetimes,
|
84
|
-
are_equal_months,
|
85
73
|
check_date_not_datetime,
|
86
74
|
date_duration_to_int,
|
87
75
|
date_duration_to_timedelta,
|
88
|
-
date_to_datetime,
|
89
76
|
date_to_month,
|
90
77
|
datetime_duration_to_float,
|
91
78
|
datetime_duration_to_microseconds,
|
92
|
-
datetime_duration_to_milliseconds,
|
93
79
|
datetime_duration_to_timedelta,
|
94
80
|
datetime_utc,
|
95
|
-
days_since_epoch,
|
96
|
-
days_since_epoch_to_date,
|
97
81
|
ensure_month,
|
98
|
-
format_datetime_local_and_utc,
|
99
82
|
get_date,
|
100
83
|
get_datetime,
|
101
84
|
get_half_years,
|
@@ -106,27 +89,19 @@ from utilities.datetime import (
|
|
106
89
|
get_today,
|
107
90
|
get_years,
|
108
91
|
is_integral_timedelta,
|
109
|
-
is_plain_datetime,
|
110
92
|
is_weekday,
|
111
93
|
is_zero_time,
|
112
|
-
is_zoned_datetime,
|
113
94
|
maybe_sub_pct_y,
|
114
95
|
mean_datetime,
|
115
96
|
mean_timedelta,
|
116
97
|
microseconds_since_epoch,
|
117
98
|
microseconds_since_epoch_to_datetime,
|
118
99
|
microseconds_to_timedelta,
|
119
|
-
milliseconds_since_epoch,
|
120
|
-
milliseconds_since_epoch_to_datetime,
|
121
|
-
milliseconds_to_timedelta,
|
122
|
-
parse_date_compact,
|
123
|
-
parse_datetime_compact,
|
124
100
|
parse_month,
|
125
101
|
parse_two_digit_year,
|
126
102
|
round_datetime,
|
127
103
|
round_to_next_weekday,
|
128
104
|
round_to_prev_weekday,
|
129
|
-
serialize_compact,
|
130
105
|
serialize_month,
|
131
106
|
sub_duration,
|
132
107
|
timedelta_since_epoch,
|
@@ -146,7 +121,6 @@ from utilities.hypothesis import (
|
|
146
121
|
)
|
147
122
|
from utilities.math import MAX_INT32, MIN_INT32, is_integral, round_to_float
|
148
123
|
from utilities.sentinel import Sentinel, sentinel
|
149
|
-
from utilities.tzdata import HongKong
|
150
124
|
from utilities.zoneinfo import UTC
|
151
125
|
|
152
126
|
if TYPE_CHECKING:
|
@@ -253,83 +227,6 @@ class TestAddWeekdays:
|
|
253
227
|
assert result is expected
|
254
228
|
|
255
229
|
|
256
|
-
class TestAreEqualDateDurations:
|
257
|
-
@given(x=integers(), y=integers())
|
258
|
-
def test_ints(self, *, x: int, y: int) -> None:
|
259
|
-
with assume_does_not_raise(OverflowError):
|
260
|
-
result = are_equal_date_durations(x, y)
|
261
|
-
expected = x == y
|
262
|
-
assert result is expected
|
263
|
-
|
264
|
-
@given(x=integers(), y=integers())
|
265
|
-
def test_timedeltas(self, *, x: int, y: int) -> None:
|
266
|
-
with assume_does_not_raise(OverflowError):
|
267
|
-
x_timedelta, y_timedelta = dt.timedelta(days=x), dt.timedelta(days=y)
|
268
|
-
result = are_equal_date_durations(x_timedelta, y_timedelta)
|
269
|
-
expected = x == y
|
270
|
-
assert result is expected
|
271
|
-
|
272
|
-
@given(data=data(), x=integers(), y=integers())
|
273
|
-
def test_int_vs_timedelta(self, *, data: DataObject, x: int, y: int) -> None:
|
274
|
-
with assume_does_not_raise(OverflowError):
|
275
|
-
y_timedelta = dt.timedelta(days=y)
|
276
|
-
left, right = data.draw(permutations([x, y_timedelta]))
|
277
|
-
with assume_does_not_raise(OverflowError):
|
278
|
-
result = are_equal_date_durations(left, right)
|
279
|
-
expected = x == y
|
280
|
-
assert result is expected
|
281
|
-
|
282
|
-
|
283
|
-
class TestAreEqualDateOrDateTimes:
|
284
|
-
@given(x=dates(), y=dates())
|
285
|
-
def test_dates(self, *, x: dt.date, y: dt.date) -> None:
|
286
|
-
result = are_equal_dates_or_datetimes(x, y)
|
287
|
-
expected = x == y
|
288
|
-
assert result is expected
|
289
|
-
|
290
|
-
@given(x=datetimes(), y=datetimes())
|
291
|
-
def test_datetimes(self, *, x: dt.datetime, y: dt.datetime) -> None:
|
292
|
-
result = are_equal_dates_or_datetimes(x, y)
|
293
|
-
expected = x == y
|
294
|
-
assert result is expected
|
295
|
-
|
296
|
-
@given(data=data(), x=dates(), y=datetimes())
|
297
|
-
def test_date_vs_datetime(
|
298
|
-
self, *, data: DataObject, x: dt.date, y: dt.datetime
|
299
|
-
) -> None:
|
300
|
-
left, right = data.draw(permutations([x, y]))
|
301
|
-
with raises(
|
302
|
-
AreEqualDatesOrDateTimesError,
|
303
|
-
match=r"Cannot compare date and datetime \(.*, .*\)",
|
304
|
-
):
|
305
|
-
_ = are_equal_dates_or_datetimes(left, right)
|
306
|
-
|
307
|
-
|
308
|
-
class TestAreEqualDateTimeDurations:
|
309
|
-
@given(x=integers(), y=integers())
|
310
|
-
def test_ints(self, *, x: int, y: int) -> None:
|
311
|
-
with assume_does_not_raise(OverflowError):
|
312
|
-
result = are_equal_datetime_durations(x, y)
|
313
|
-
expected = x == y
|
314
|
-
assert result is expected
|
315
|
-
|
316
|
-
@given(x=timedeltas(), y=timedeltas())
|
317
|
-
def test_timedeltas(self, *, x: dt.timedelta, y: dt.timedelta) -> None:
|
318
|
-
result = are_equal_datetime_durations(x, y)
|
319
|
-
expected = x == y
|
320
|
-
assert result is expected
|
321
|
-
|
322
|
-
@given(data=data(), x=integers(), y=timedeltas())
|
323
|
-
def test_int_vs_timedelta(
|
324
|
-
self, *, data: DataObject, x: int, y: dt.timedelta
|
325
|
-
) -> None:
|
326
|
-
left, right = data.draw(permutations([x, y]))
|
327
|
-
with assume_does_not_raise(OverflowError):
|
328
|
-
result = are_equal_datetime_durations(left, right)
|
329
|
-
expected = x == datetime_duration_to_float(y)
|
330
|
-
assert result is expected
|
331
|
-
|
332
|
-
|
333
230
|
class TestAreEqualDateTimes:
|
334
231
|
@given(x=datetimes(), y=datetimes())
|
335
232
|
def test_local(self, *, x: dt.datetime, y: dt.datetime) -> None:
|
@@ -379,27 +276,6 @@ class TestAreEqualDateTimes:
|
|
379
276
|
_ = are_equal_datetimes(left, right)
|
380
277
|
|
381
278
|
|
382
|
-
class TestAreEqualMonths:
|
383
|
-
@given(x=dates(), y=dates())
|
384
|
-
def test_dates(self, *, x: dt.date, y: dt.date) -> None:
|
385
|
-
result = are_equal_months(x, y)
|
386
|
-
expected = (x.year == y.year) and (x.month == y.month)
|
387
|
-
assert result is expected
|
388
|
-
|
389
|
-
@given(x=months(), y=months())
|
390
|
-
def test_months(self, *, x: Month, y: Month) -> None:
|
391
|
-
result = are_equal_months(x, y)
|
392
|
-
expected = x == y
|
393
|
-
assert result is expected
|
394
|
-
|
395
|
-
@given(data=data(), x=dates(), y=months())
|
396
|
-
def test_date_vs_month(self, *, data: DataObject, x: dt.date, y: Month) -> None:
|
397
|
-
left, right = data.draw(permutations([x, y]))
|
398
|
-
result = are_equal_months(left, right)
|
399
|
-
expected = (x.year == y.year) and (x.month == y.month)
|
400
|
-
assert result is expected
|
401
|
-
|
402
|
-
|
403
279
|
class TestCheckDateNotDateTime:
|
404
280
|
@given(date=dates())
|
405
281
|
def test_main(self, *, date: dt.date) -> None:
|
@@ -534,45 +410,6 @@ class TestDateTimeDurationToMicrosecondsOrMilliseconds:
|
|
534
410
|
result = datetime_duration_to_microseconds(timedelta)
|
535
411
|
assert result == microseconds
|
536
412
|
|
537
|
-
@given(timedelta=timedeltas(), strict=booleans())
|
538
|
-
@settings(suppress_health_check={HealthCheck.filter_too_much})
|
539
|
-
def test_timedelta_to_milliseconds_exact(
|
540
|
-
self, *, timedelta: dt.timedelta, strict: bool
|
541
|
-
) -> None:
|
542
|
-
_, remainder = divmod(timedelta.microseconds, _MICROSECONDS_PER_MILLISECOND)
|
543
|
-
_ = assume(remainder == 0)
|
544
|
-
milliseconds = datetime_duration_to_milliseconds(timedelta, strict=strict)
|
545
|
-
assert isinstance(milliseconds, int)
|
546
|
-
result = milliseconds_to_timedelta(milliseconds)
|
547
|
-
assert result == timedelta
|
548
|
-
|
549
|
-
@given(timedelta=timedeltas())
|
550
|
-
def test_timedelta_to_milliseconds_inexact(
|
551
|
-
self, *, timedelta: dt.timedelta
|
552
|
-
) -> None:
|
553
|
-
_, remainder = divmod(timedelta.microseconds, _MICROSECONDS_PER_MILLISECOND)
|
554
|
-
_ = assume(remainder != 0)
|
555
|
-
milliseconds = datetime_duration_to_milliseconds(timedelta)
|
556
|
-
result = milliseconds_to_timedelta(round(milliseconds))
|
557
|
-
assert abs(result - timedelta) <= SECOND
|
558
|
-
|
559
|
-
@given(timedelta=timedeltas())
|
560
|
-
def test_timedelta_to_milliseconds_error(self, *, timedelta: dt.timedelta) -> None:
|
561
|
-
_, microseconds = divmod(timedelta.microseconds, _MICROSECONDS_PER_MILLISECOND)
|
562
|
-
_ = assume(microseconds != 0)
|
563
|
-
with raises(
|
564
|
-
TimedeltaToMillisecondsError,
|
565
|
-
match=r"Unable to convert .* to milliseconds; got .* microsecond\(s\)",
|
566
|
-
):
|
567
|
-
_ = datetime_duration_to_milliseconds(timedelta, strict=True)
|
568
|
-
|
569
|
-
@given(milliseconds=int32s())
|
570
|
-
def test_milliseconds_to_timedelta(self, *, milliseconds: int) -> None:
|
571
|
-
with assume_does_not_raise(OverflowError):
|
572
|
-
timedelta = milliseconds_to_timedelta(milliseconds)
|
573
|
-
result = datetime_duration_to_milliseconds(timedelta)
|
574
|
-
assert result == milliseconds
|
575
|
-
|
576
413
|
|
577
414
|
class TestDateTimeDurationToTimeDelta:
|
578
415
|
@given(n=int32s())
|
@@ -593,13 +430,6 @@ class TestDateTimeDurationToTimeDelta:
|
|
593
430
|
assert result == duration
|
594
431
|
|
595
432
|
|
596
|
-
class TestDateToDateTime:
|
597
|
-
@given(date=dates())
|
598
|
-
def test_main(self, *, date: dt.date) -> None:
|
599
|
-
result = date_to_datetime(date).date()
|
600
|
-
assert result == date
|
601
|
-
|
602
|
-
|
603
433
|
class TestDateToMonth:
|
604
434
|
@given(date=dates())
|
605
435
|
def test_main(self, *, date: dt.date) -> None:
|
@@ -622,14 +452,6 @@ class TestDatetimeUTC:
|
|
622
452
|
assert result == datetime
|
623
453
|
|
624
454
|
|
625
|
-
class TestDaysSinceEpoch:
|
626
|
-
@given(date=dates())
|
627
|
-
def test_main(self, *, date: dt.date) -> None:
|
628
|
-
days = days_since_epoch(date)
|
629
|
-
result = days_since_epoch_to_date(days)
|
630
|
-
assert result == date
|
631
|
-
|
632
|
-
|
633
455
|
class TestEpoch:
|
634
456
|
def test_date(self) -> None:
|
635
457
|
assert isinstance(EPOCH_DATE, dt.date)
|
@@ -643,37 +465,6 @@ class TestEpoch:
|
|
643
465
|
assert epoch.tzinfo is time_zone
|
644
466
|
|
645
467
|
|
646
|
-
class TestFormatDateTimeLocalAndUTC:
|
647
|
-
@mark.parametrize(
|
648
|
-
("datetime", "expected"),
|
649
|
-
[
|
650
|
-
param(
|
651
|
-
dt.datetime(2000, 1, 1, 2, 3, 4, tzinfo=UTC),
|
652
|
-
"2000-01-01 02:03:04 (Sat, UTC)",
|
653
|
-
),
|
654
|
-
param(
|
655
|
-
dt.datetime(2000, 1, 1, 2, 3, 4, tzinfo=HongKong),
|
656
|
-
"2000-01-01 02:03:04 (Sat, Asia/Hong_Kong, 1999-12-31 18:03:04 UTC)",
|
657
|
-
),
|
658
|
-
param(
|
659
|
-
dt.datetime(2000, 2, 1, 2, 3, 4, tzinfo=HongKong),
|
660
|
-
"2000-02-01 02:03:04 (Tue, Asia/Hong_Kong, 01-31 18:03:04 UTC)",
|
661
|
-
),
|
662
|
-
param(
|
663
|
-
dt.datetime(2000, 2, 2, 2, 3, 4, tzinfo=HongKong),
|
664
|
-
"2000-02-02 02:03:04 (Wed, Asia/Hong_Kong, 02-01 18:03:04 UTC)",
|
665
|
-
),
|
666
|
-
param(
|
667
|
-
dt.datetime(2000, 2, 2, 14, 3, 4, tzinfo=HongKong),
|
668
|
-
"2000-02-02 14:03:04 (Wed, Asia/Hong_Kong, 06:03:04 UTC)",
|
669
|
-
),
|
670
|
-
],
|
671
|
-
)
|
672
|
-
def test_main(self, *, datetime: dt.datetime, expected: str) -> None:
|
673
|
-
result = format_datetime_local_and_utc(datetime)
|
674
|
-
assert result == expected
|
675
|
-
|
676
|
-
|
677
468
|
class TestGetDate:
|
678
469
|
@given(date=dates())
|
679
470
|
def test_date(self, *, date: dt.date) -> None:
|
@@ -875,20 +666,6 @@ class TestIsIntegralTimeDelta:
|
|
875
666
|
assert not is_integral_timedelta(timedelta)
|
876
667
|
|
877
668
|
|
878
|
-
class TestIsPlainDateTime:
|
879
|
-
@mark.parametrize(
|
880
|
-
("obj", "expected"),
|
881
|
-
[
|
882
|
-
param(None, False),
|
883
|
-
param(dt.datetime(2000, 1, 1, tzinfo=UTC).replace(tzinfo=None), True),
|
884
|
-
param(dt.datetime(2000, 1, 1, tzinfo=UTC), False),
|
885
|
-
],
|
886
|
-
)
|
887
|
-
def test_main(self, *, obj: Any, expected: bool) -> None:
|
888
|
-
result = is_plain_datetime(obj)
|
889
|
-
assert result is expected
|
890
|
-
|
891
|
-
|
892
669
|
class TestIsWeekday:
|
893
670
|
@given(date=dates())
|
894
671
|
def test_main(self, *, date: dt.date) -> None:
|
@@ -906,20 +683,6 @@ class TestIsZeroTime:
|
|
906
683
|
assert result is expected
|
907
684
|
|
908
685
|
|
909
|
-
class TestIsZonedDateTime:
|
910
|
-
@mark.parametrize(
|
911
|
-
("obj", "expected"),
|
912
|
-
[
|
913
|
-
param(None, False),
|
914
|
-
param(dt.datetime(2000, 1, 1, tzinfo=UTC).replace(tzinfo=None), False),
|
915
|
-
param(dt.datetime(2000, 1, 1, tzinfo=UTC), True),
|
916
|
-
],
|
917
|
-
)
|
918
|
-
def test_main(self, *, obj: Any, expected: bool) -> None:
|
919
|
-
result = is_zoned_datetime(obj)
|
920
|
-
assert result is expected
|
921
|
-
|
922
|
-
|
923
686
|
class TestMaybeSubPctY:
|
924
687
|
@given(text=text_clean())
|
925
688
|
def test_main(self, *, text: str) -> None:
|
@@ -978,40 +741,6 @@ class TestMicrosecondsOrMillisecondsSinceEpoch:
|
|
978
741
|
result = microseconds_since_epoch(datetime)
|
979
742
|
assert result == microseconds
|
980
743
|
|
981
|
-
@given(datetime=datetimes() | zoned_datetimes())
|
982
|
-
@mark.parametrize("strict", [param(True), param(False)]) # use mark.parametrize
|
983
|
-
@settings(suppress_health_check={HealthCheck.filter_too_much})
|
984
|
-
def test_datetime_to_milliseconds_exact(
|
985
|
-
self, *, datetime: dt.datetime, strict: bool
|
986
|
-
) -> None:
|
987
|
-
_ = assume(datetime.microsecond == 0)
|
988
|
-
milliseconds = milliseconds_since_epoch(datetime, strict=strict)
|
989
|
-
if strict:
|
990
|
-
assert isinstance(milliseconds, int)
|
991
|
-
else:
|
992
|
-
assert milliseconds == round(milliseconds)
|
993
|
-
result = milliseconds_since_epoch_to_datetime(
|
994
|
-
round(milliseconds), time_zone=datetime.tzinfo
|
995
|
-
)
|
996
|
-
assert result == datetime
|
997
|
-
|
998
|
-
@given(datetime=datetimes() | zoned_datetimes())
|
999
|
-
def test_datetime_to_milliseconds_error(self, *, datetime: dt.datetime) -> None:
|
1000
|
-
_, microseconds = divmod(datetime.microsecond, _MICROSECONDS_PER_MILLISECOND)
|
1001
|
-
_ = assume(microseconds != 0)
|
1002
|
-
with raises(
|
1003
|
-
MillisecondsSinceEpochError,
|
1004
|
-
match=r"Unable to convert .* to milliseconds since epoch; got .* microsecond\(s\)",
|
1005
|
-
):
|
1006
|
-
_ = milliseconds_since_epoch(datetime, strict=True)
|
1007
|
-
|
1008
|
-
@given(milliseconds=integers())
|
1009
|
-
def test_milliseconds_to_datetime(self, *, milliseconds: int) -> None:
|
1010
|
-
with assume_does_not_raise(OverflowError):
|
1011
|
-
datetime = milliseconds_since_epoch_to_datetime(milliseconds)
|
1012
|
-
result = milliseconds_since_epoch(datetime)
|
1013
|
-
assert result == milliseconds
|
1014
|
-
|
1015
744
|
|
1016
745
|
class TestMonth:
|
1017
746
|
@mark.parametrize(
|
@@ -1176,35 +905,6 @@ class TestRoundToWeekday:
|
|
1176
905
|
assert operator(result, date)
|
1177
906
|
|
1178
907
|
|
1179
|
-
class TestSerializeAndParseCompact:
|
1180
|
-
@given(date=dates())
|
1181
|
-
def test_dates(self, *, date: dt.date) -> None:
|
1182
|
-
result = parse_date_compact(serialize_compact(date))
|
1183
|
-
assert result == date
|
1184
|
-
|
1185
|
-
@given(datetime=zoned_datetimes(round_="standard", timedelta=SECOND))
|
1186
|
-
def test_datetimes(self, *, datetime: dt.datetime) -> None:
|
1187
|
-
result = parse_datetime_compact(serialize_compact(datetime))
|
1188
|
-
assert result == datetime
|
1189
|
-
|
1190
|
-
@given(datetime=datetimes())
|
1191
|
-
def test_error_serialize(self, *, datetime: dt.datetime) -> None:
|
1192
|
-
with raises(
|
1193
|
-
SerializeCompactError, match="Unable to serialize plain datetime .*"
|
1194
|
-
):
|
1195
|
-
_ = serialize_compact(datetime)
|
1196
|
-
|
1197
|
-
def test_error_parse_date(self) -> None:
|
1198
|
-
with raises(ParseDateCompactError, match="Unable to parse '.*' into a date"):
|
1199
|
-
_ = parse_date_compact("invalid")
|
1200
|
-
|
1201
|
-
def test_error_parse_datetime(self) -> None:
|
1202
|
-
with raises(
|
1203
|
-
ParseDateTimeCompactError, match="Unable to parse '.*' into a datetime"
|
1204
|
-
):
|
1205
|
-
_ = parse_datetime_compact("invalid")
|
1206
|
-
|
1207
|
-
|
1208
908
|
class TestSubDuration:
|
1209
909
|
@given(date=dates(), n=integers())
|
1210
910
|
def test_date(self, *, date: dt.date, n: int) -> None:
|
@@ -4,11 +4,11 @@ from typing import Any
|
|
4
4
|
|
5
5
|
from hypothesis import given
|
6
6
|
|
7
|
-
from tests.
|
7
|
+
from tests.test_objects.objects import objects
|
8
8
|
from utilities.hashlib import md5_hash
|
9
9
|
|
10
10
|
|
11
11
|
class TestMD5Hash:
|
12
|
-
@given(obj=
|
12
|
+
@given(obj=objects(parsable=True))
|
13
13
|
def test_main(self, *, obj: Any) -> None:
|
14
14
|
_ = md5_hash(obj)
|
@@ -16,7 +16,6 @@ from hypothesis.strategies import (
|
|
16
16
|
binary,
|
17
17
|
booleans,
|
18
18
|
data,
|
19
|
-
datetimes,
|
20
19
|
dictionaries,
|
21
20
|
floats,
|
22
21
|
frozensets,
|
@@ -32,14 +31,9 @@ from hypothesis.strategies import (
|
|
32
31
|
)
|
33
32
|
from pytest import mark, param, raises
|
34
33
|
|
35
|
-
from tests.
|
34
|
+
from tests.test_objects.objects import objects
|
36
35
|
from utilities.functions import is_sequence_of
|
37
|
-
from utilities.hypothesis import
|
38
|
-
sentinels,
|
39
|
-
sets_fixed_length,
|
40
|
-
text_ascii,
|
41
|
-
zoned_datetimes,
|
42
|
-
)
|
36
|
+
from utilities.hypothesis import pairs, sentinels, sets_fixed_length, text_ascii
|
43
37
|
from utilities.iterables import (
|
44
38
|
CheckBijectionError,
|
45
39
|
CheckDuplicatesError,
|
@@ -72,7 +66,6 @@ from utilities.iterables import (
|
|
72
66
|
_RangePartitionsNumError,
|
73
67
|
_RangePartitionsStopError,
|
74
68
|
_RangePartitionsTotalError,
|
75
|
-
_sort_iterable_cmp_datetimes,
|
76
69
|
_sort_iterable_cmp_floats,
|
77
70
|
always_iterable,
|
78
71
|
always_iterable_hashable,
|
@@ -130,7 +123,6 @@ from utilities.iterables import (
|
|
130
123
|
from utilities.sentinel import Sentinel, sentinel
|
131
124
|
|
132
125
|
if TYPE_CHECKING:
|
133
|
-
import datetime as dt
|
134
126
|
from collections.abc import Iterable, Iterator, Mapping, Sequence
|
135
127
|
|
136
128
|
from utilities.types import MaybeIterable, StrMapping
|
@@ -1213,10 +1205,9 @@ class TestResolveIncludeAndExclude:
|
|
1213
1205
|
|
1214
1206
|
|
1215
1207
|
class TestSortIterable:
|
1216
|
-
@given(
|
1217
|
-
|
1218
|
-
|
1219
|
-
def test_main(self, *, x: Any, y: Any) -> None:
|
1208
|
+
@given(objs=pairs(objects(floats_allow_nan=False, sortable=True)))
|
1209
|
+
def test_main(self, *, objs: tuple[Any, Any]) -> None:
|
1210
|
+
x, y = objs
|
1220
1211
|
result1 = sort_iterable([x, y])
|
1221
1212
|
result2 = sort_iterable([y, x])
|
1222
1213
|
assert result1 == result2
|
@@ -1263,14 +1254,6 @@ class TestSortIterable:
|
|
1263
1254
|
_ = sort_iterable([sentinel, sentinel])
|
1264
1255
|
|
1265
1256
|
|
1266
|
-
class TestSortIterablesCmpDateTimes:
|
1267
|
-
@given(x=datetimes() | zoned_datetimes(), y=datetimes() | zoned_datetimes())
|
1268
|
-
def test_main(self, *, x: dt.datetime, y: dt.datetime) -> None:
|
1269
|
-
result1 = _sort_iterable_cmp_datetimes(x, y)
|
1270
|
-
result2 = _sort_iterable_cmp_datetimes(y, x)
|
1271
|
-
assert result1 == -result2
|
1272
|
-
|
1273
|
-
|
1274
1257
|
class TestSortIterablesCmpFloats:
|
1275
1258
|
@given(x=floats(), y=floats())
|
1276
1259
|
def test_main(self, *, x: float, y: float) -> None:
|
@@ -0,0 +1 @@
|
|
1
|
+
from __future__ import annotations
|