dycw-utilities 0.155.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.155.0 → dycw_utilities-0.155.1}/PKG-INFO +1 -2
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/pyproject.toml +2 -6
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_hypothesis.py +14 -5
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_polars.py +159 -107
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing.py +147 -7
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/with_future.py +63 -4
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_whenever.py +13 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/hypothesis.py +8 -1
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/polars.py +74 -41
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/traceback.py +1 -1
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/typing.py +9 -2
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/whenever.py +10 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/.gitignore +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/LICENSE +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/README.md +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.sh +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/click.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/http.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/json.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/math.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/os.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/random.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/re.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/string.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/text.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/types.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/version.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.155.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.155.
|
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
|
@@ -13,7 +13,6 @@ 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
15
|
Requires-Dist: hypothesis<6.138,>=6.137.1; extra == 'test'
|
16
|
-
Requires-Dist: pudb<2025.2,>=2025.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",
|
@@ -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",
|
@@ -229,7 +227,7 @@ dependencies = [
|
|
229
227
|
name = "dycw-utilities"
|
230
228
|
readme = "README.md"
|
231
229
|
requires-python = ">= 3.12"
|
232
|
-
version = "0.155.
|
230
|
+
version = "0.155.1"
|
233
231
|
|
234
232
|
[project.entry-points.pytest11]
|
235
233
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -242,7 +240,6 @@ logging = [
|
|
242
240
|
test = [
|
243
241
|
"dycw-pytest-only >=2.1.1, <2.2",
|
244
242
|
"hypothesis >=6.137.1, <6.138",
|
245
|
-
"pudb >=2025.1, <2025.2",
|
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.155.
|
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
|
]
|
@@ -1,5 +1,6 @@
|
|
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
|
@@ -134,6 +135,7 @@ from utilities.whenever import (
|
|
134
135
|
ZonedDateTimePeriod,
|
135
136
|
to_days,
|
136
137
|
to_nanoseconds,
|
138
|
+
to_py_time_delta,
|
137
139
|
)
|
138
140
|
|
139
141
|
if TYPE_CHECKING:
|
@@ -197,6 +199,7 @@ class TestDateDeltas:
|
|
197
199
|
date_deltas(min_value=min_value, max_value=max_value, parsable=parsable)
|
198
200
|
)
|
199
201
|
assert isinstance(delta, DateDelta)
|
202
|
+
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
200
203
|
days = to_days(delta)
|
201
204
|
if min_value is not None:
|
202
205
|
assert days >= to_days(min_value)
|
@@ -221,14 +224,17 @@ class TestDatePeriods:
|
|
221
224
|
|
222
225
|
|
223
226
|
class TestDateTimeDeltas:
|
224
|
-
@given(data=data(), parsable=booleans())
|
225
|
-
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:
|
226
229
|
min_value = data.draw(date_time_deltas() | none())
|
227
230
|
max_value = data.draw(date_time_deltas() | none())
|
228
231
|
with assume_does_not_raise(InvalidArgument):
|
229
232
|
delta = data.draw(
|
230
233
|
date_time_deltas(
|
231
|
-
min_value=min_value,
|
234
|
+
min_value=min_value,
|
235
|
+
max_value=max_value,
|
236
|
+
parsable=parsable,
|
237
|
+
nativable=nativable,
|
232
238
|
)
|
233
239
|
)
|
234
240
|
assert isinstance(delta, DateTimeDelta)
|
@@ -239,6 +245,8 @@ class TestDateTimeDeltas:
|
|
239
245
|
assert nanos <= to_nanoseconds(max_value)
|
240
246
|
if parsable:
|
241
247
|
assert DateTimeDelta.parse_common_iso(delta.format_common_iso()) == delta
|
248
|
+
if nativable:
|
249
|
+
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
242
250
|
|
243
251
|
|
244
252
|
class TestDates:
|
@@ -726,8 +734,8 @@ class TestPairs:
|
|
726
734
|
class TestPaths:
|
727
735
|
@given(data=data())
|
728
736
|
def test_main(self, *, data: DataObject) -> None:
|
729
|
-
min_depth = data.draw(integers(0,
|
730
|
-
max_depth = data.draw(integers(0,
|
737
|
+
min_depth = data.draw(integers(0, 3) | none())
|
738
|
+
max_depth = data.draw(integers(0, 3) | none())
|
731
739
|
with assume_does_not_raise(InvalidArgument):
|
732
740
|
path = data.draw(paths(min_depth=min_depth, max_depth=max_depth))
|
733
741
|
assert isinstance(path, Path)
|
@@ -989,6 +997,7 @@ class TestTimeDeltas:
|
|
989
997
|
delta = data.draw(time_deltas(min_value=min_value, max_value=max_value))
|
990
998
|
assert isinstance(delta, TimeDelta)
|
991
999
|
assert TimeDelta.parse_common_iso(delta.format_common_iso()) == delta
|
1000
|
+
assert isinstance(to_py_time_delta(delta), dt.timedelta)
|
992
1001
|
if min_value is not None:
|
993
1002
|
assert delta >= min_value
|
994
1003
|
if max_value is not None:
|
@@ -7,7 +7,6 @@ from dataclasses import dataclass, field
|
|
7
7
|
from enum import auto
|
8
8
|
from itertools import chain, repeat
|
9
9
|
from math import isfinite, nan
|
10
|
-
from pathlib import Path
|
11
10
|
from random import Random
|
12
11
|
from typing import TYPE_CHECKING, Any, ClassVar, Literal, assert_never, cast
|
13
12
|
from uuid import UUID, uuid4
|
@@ -15,6 +14,7 @@ from uuid import UUID, uuid4
|
|
15
14
|
import hypothesis.strategies
|
16
15
|
import numpy as np
|
17
16
|
import polars as pl
|
17
|
+
import whenever
|
18
18
|
from hypothesis import given
|
19
19
|
from hypothesis.strategies import (
|
20
20
|
DataObject,
|
@@ -27,15 +27,14 @@ from hypothesis.strategies import (
|
|
27
27
|
lists,
|
28
28
|
none,
|
29
29
|
sampled_from,
|
30
|
-
timezones,
|
31
30
|
)
|
32
31
|
from numpy import allclose, linspace, pi
|
33
32
|
from polars import (
|
34
33
|
Boolean,
|
35
34
|
DataFrame,
|
36
35
|
DataType,
|
37
|
-
Date,
|
38
36
|
Datetime,
|
37
|
+
Duration,
|
39
38
|
Expr,
|
40
39
|
Float64,
|
41
40
|
Int32,
|
@@ -55,24 +54,25 @@ from polars import (
|
|
55
54
|
struct,
|
56
55
|
)
|
57
56
|
from polars._typing import IntoExprColumn, SchemaDict
|
58
|
-
from polars.exceptions import (
|
59
|
-
ComputeError, # pyright: ignore[reportAttributeAccessIssue]
|
60
|
-
)
|
61
57
|
from polars.schema import Schema
|
62
58
|
from polars.testing import assert_frame_equal, assert_series_equal
|
63
59
|
from pytest import mark, param, raises
|
64
|
-
from whenever import
|
60
|
+
from whenever import DateDelta, DateTimeDelta, PlainDateTime, TimeDelta, ZonedDateTime
|
65
61
|
|
66
62
|
import tests.test_math
|
67
63
|
import utilities.polars
|
68
64
|
from utilities.hypothesis import (
|
69
|
-
|
65
|
+
date_deltas,
|
66
|
+
date_time_deltas,
|
67
|
+
dates,
|
70
68
|
float64s,
|
71
69
|
int64s,
|
72
70
|
pairs,
|
73
71
|
py_datetimes,
|
74
72
|
temp_paths,
|
75
73
|
text_ascii,
|
74
|
+
time_deltas,
|
75
|
+
times,
|
76
76
|
zoned_date_times,
|
77
77
|
)
|
78
78
|
from utilities.math import number_of_decimals
|
@@ -207,11 +207,21 @@ from utilities.polars import (
|
|
207
207
|
)
|
208
208
|
from utilities.sentinel import Sentinel, sentinel
|
209
209
|
from utilities.tzdata import HongKong, Tokyo, USCentral, USEastern
|
210
|
-
from utilities.whenever import
|
210
|
+
from utilities.whenever import (
|
211
|
+
NOW_UTC,
|
212
|
+
TODAY_UTC,
|
213
|
+
DatePeriod,
|
214
|
+
TimePeriod,
|
215
|
+
ZonedDateTimePeriod,
|
216
|
+
get_now,
|
217
|
+
get_now_plain,
|
218
|
+
get_today,
|
219
|
+
)
|
211
220
|
from utilities.zoneinfo import UTC, get_time_zone_name
|
212
221
|
|
213
222
|
if TYPE_CHECKING:
|
214
223
|
from collections.abc import Callable, Iterable, Mapping, Sequence
|
224
|
+
from pathlib import Path
|
215
225
|
from zoneinfo import ZoneInfo
|
216
226
|
|
217
227
|
from _pytest.mark import ParameterSet
|
@@ -392,17 +402,13 @@ class TestAppendDataClass:
|
|
392
402
|
height = 0 if (row.a is None) and (row.b is None) else 1
|
393
403
|
check_polars_dataframe(result, height=height, schema_list=df.schema)
|
394
404
|
|
395
|
-
@given(
|
396
|
-
data=fixed_dictionaries({
|
397
|
-
"datetime": zoned_date_times().map(lambda d: d.py_datetime())
|
398
|
-
})
|
399
|
-
)
|
405
|
+
@given(data=fixed_dictionaries({"datetime": zoned_date_times()}))
|
400
406
|
def test_zoned_datetime(self, *, data: StrMapping) -> None:
|
401
407
|
df = DataFrame(schema={"datetime": DatetimeUTC})
|
402
408
|
|
403
409
|
@dataclass(kw_only=True, slots=True)
|
404
410
|
class Row:
|
405
|
-
datetime:
|
411
|
+
datetime: ZonedDateTime
|
406
412
|
|
407
413
|
row = Row(**data)
|
408
414
|
result = append_dataclass(df, row)
|
@@ -1014,7 +1020,6 @@ class TestDataClassToDataFrame:
|
|
1014
1020
|
int_field: int
|
1015
1021
|
float_field: float
|
1016
1022
|
str_field: str
|
1017
|
-
date_field: dt.date
|
1018
1023
|
|
1019
1024
|
objs = data.draw(lists(builds(Example, int_field=int64s()), min_size=1))
|
1020
1025
|
df = dataclass_to_dataframe(objs)
|
@@ -1026,10 +1031,41 @@ class TestDataClassToDataFrame:
|
|
1026
1031
|
"int_field": Int64,
|
1027
1032
|
"float_field": Float64,
|
1028
1033
|
"str_field": String,
|
1029
|
-
"date_field": Date,
|
1030
1034
|
},
|
1031
1035
|
)
|
1032
1036
|
|
1037
|
+
@given(data=data())
|
1038
|
+
def test_date(self, *, data: DataObject) -> None:
|
1039
|
+
@dataclass(kw_only=True, slots=True)
|
1040
|
+
class Example:
|
1041
|
+
x: whenever.Date
|
1042
|
+
|
1043
|
+
objs = data.draw(lists(builds(Example, x=dates()), min_size=1))
|
1044
|
+
df = dataclass_to_dataframe(objs)
|
1045
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": pl.Date})
|
1046
|
+
|
1047
|
+
@given(data=data())
|
1048
|
+
def test_date_delta(self, *, data: DataObject) -> None:
|
1049
|
+
@dataclass(kw_only=True, slots=True)
|
1050
|
+
class Example:
|
1051
|
+
x: DateDelta
|
1052
|
+
|
1053
|
+
objs = data.draw(lists(builds(Example, x=date_deltas()), min_size=1))
|
1054
|
+
df = dataclass_to_dataframe(objs)
|
1055
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
|
1056
|
+
|
1057
|
+
@given(data=data())
|
1058
|
+
def test_date_time_delta(self, *, data: DataObject) -> None:
|
1059
|
+
@dataclass(kw_only=True, slots=True)
|
1060
|
+
class Example:
|
1061
|
+
x: DateTimeDelta
|
1062
|
+
|
1063
|
+
objs = data.draw(
|
1064
|
+
lists(builds(Example, x=date_time_deltas(nativable=True)), min_size=1)
|
1065
|
+
)
|
1066
|
+
df = dataclass_to_dataframe(objs)
|
1067
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
|
1068
|
+
|
1033
1069
|
@given(data=data())
|
1034
1070
|
def test_nested(self, *, data: DataObject) -> None:
|
1035
1071
|
@dataclass(kw_only=True, slots=True)
|
@@ -1056,6 +1092,26 @@ class TestDataClassToDataFrame:
|
|
1056
1092
|
df = dataclass_to_dataframe(obj, localns=locals())
|
1057
1093
|
check_polars_dataframe(df, height=len(df), schema_list={"x": String})
|
1058
1094
|
|
1095
|
+
@given(data=data())
|
1096
|
+
def test_time(self, *, data: DataObject) -> None:
|
1097
|
+
@dataclass(kw_only=True, slots=True)
|
1098
|
+
class Example:
|
1099
|
+
x: whenever.Time
|
1100
|
+
|
1101
|
+
objs = data.draw(lists(builds(Example, x=times()), min_size=1))
|
1102
|
+
df = dataclass_to_dataframe(objs)
|
1103
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": pl.Time})
|
1104
|
+
|
1105
|
+
@given(data=data())
|
1106
|
+
def test_time_delta(self, *, data: DataObject) -> None:
|
1107
|
+
@dataclass(kw_only=True, slots=True)
|
1108
|
+
class Example:
|
1109
|
+
x: TimeDelta
|
1110
|
+
|
1111
|
+
objs = data.draw(lists(builds(Example, x=time_deltas()), min_size=1))
|
1112
|
+
df = dataclass_to_dataframe(objs)
|
1113
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
|
1114
|
+
|
1059
1115
|
@given(data=data())
|
1060
1116
|
def test_uuid(self, *, data: DataObject) -> None:
|
1061
1117
|
@dataclass(kw_only=True, slots=True)
|
@@ -1066,32 +1122,16 @@ class TestDataClassToDataFrame:
|
|
1066
1122
|
df = dataclass_to_dataframe(obj, localns=locals())
|
1067
1123
|
check_polars_dataframe(df, height=len(df), schema_list={"x": String})
|
1068
1124
|
|
1069
|
-
@given(data=data()
|
1070
|
-
def test_zoned_datetime(self, *, data: DataObject
|
1125
|
+
@given(data=data())
|
1126
|
+
def test_zoned_datetime(self, *, data: DataObject) -> None:
|
1071
1127
|
@dataclass(kw_only=True, slots=True)
|
1072
1128
|
class Example:
|
1073
|
-
x:
|
1129
|
+
x: ZonedDateTime
|
1074
1130
|
|
1075
|
-
objs = data.draw(
|
1076
|
-
|
1077
|
-
builds(
|
1078
|
-
Example,
|
1079
|
-
x=zoned_date_times(time_zone=time_zone).map(
|
1080
|
-
lambda d: d.py_datetime()
|
1081
|
-
),
|
1082
|
-
),
|
1083
|
-
min_size=1,
|
1084
|
-
)
|
1085
|
-
)
|
1086
|
-
with assume_does_not_raise(
|
1087
|
-
ComputeError, # unable to parse time zone
|
1088
|
-
ValueError, # failed to parse timezone
|
1089
|
-
):
|
1090
|
-
df = dataclass_to_dataframe(objs, localns=locals())
|
1131
|
+
objs = data.draw(lists(builds(Example, x=zoned_date_times()), min_size=1))
|
1132
|
+
df = dataclass_to_dataframe(objs, localns=locals())
|
1091
1133
|
check_polars_dataframe(
|
1092
|
-
df,
|
1093
|
-
height=len(objs),
|
1094
|
-
schema_list={"x": zoned_datetime_dtype(time_zone=time_zone)},
|
1134
|
+
df, height=len(objs), schema_list={"x": zoned_datetime_dtype()}
|
1095
1135
|
)
|
1096
1136
|
|
1097
1137
|
def test_error_empty(self) -> None:
|
@@ -1119,15 +1159,12 @@ class TestDataClassToDataFrame:
|
|
1119
1159
|
|
1120
1160
|
class TestDataClassToSchema:
|
1121
1161
|
def test_basic(self) -> None:
|
1122
|
-
today = get_today().py_date()
|
1123
|
-
|
1124
1162
|
@dataclass(kw_only=True, slots=True)
|
1125
1163
|
class Example:
|
1126
1164
|
bool_field: bool = False
|
1127
1165
|
int_field: int = 0
|
1128
1166
|
float_field: float = 0.0
|
1129
1167
|
str_field: str = ""
|
1130
|
-
date_field: dt.date = today
|
1131
1168
|
|
1132
1169
|
obj = Example()
|
1133
1170
|
result = dataclass_to_schema(obj)
|
@@ -1136,7 +1173,6 @@ class TestDataClassToSchema:
|
|
1136
1173
|
"int_field": Int64,
|
1137
1174
|
"float_field": Float64,
|
1138
1175
|
"str_field": String,
|
1139
|
-
"date_field": Date,
|
1140
1176
|
}
|
1141
1177
|
assert result == expected
|
1142
1178
|
|
@@ -1150,42 +1186,60 @@ class TestDataClassToSchema:
|
|
1150
1186
|
expected = {"x": Int64}
|
1151
1187
|
assert result == expected
|
1152
1188
|
|
1153
|
-
def
|
1154
|
-
|
1189
|
+
def test_containers(self) -> None:
|
1190
|
+
@dataclass(kw_only=True, slots=True)
|
1191
|
+
class Example:
|
1192
|
+
frozenset_field: frozenset[int] = field(default_factory=frozenset)
|
1193
|
+
list_field: list[int] = field(default_factory=list)
|
1194
|
+
set_field: set[int] = field(default_factory=set)
|
1195
|
+
|
1196
|
+
obj = Example()
|
1197
|
+
result = dataclass_to_schema(obj)
|
1198
|
+
expected = {
|
1199
|
+
"frozenset_field": List(Int64),
|
1200
|
+
"list_field": List(Int64),
|
1201
|
+
"set_field": List(Int64),
|
1202
|
+
}
|
1203
|
+
assert result == expected
|
1155
1204
|
|
1205
|
+
def test_date(self) -> None:
|
1156
1206
|
@dataclass(kw_only=True, slots=True)
|
1157
1207
|
class Example:
|
1158
|
-
x:
|
1208
|
+
x: whenever.Date = field(default_factory=get_today)
|
1159
1209
|
|
1160
1210
|
obj = Example()
|
1161
1211
|
result = dataclass_to_schema(obj)
|
1162
|
-
expected = {"x":
|
1212
|
+
expected = {"x": Object}
|
1163
1213
|
assert result == expected
|
1164
1214
|
|
1165
|
-
def
|
1166
|
-
|
1215
|
+
def test_date_period(self) -> None:
|
1216
|
+
@dataclass(kw_only=True, slots=True)
|
1217
|
+
class Example:
|
1218
|
+
x: DatePeriod
|
1167
1219
|
|
1220
|
+
obj = Example(x=DatePeriod(TODAY_UTC, TODAY_UTC))
|
1221
|
+
result = dataclass_to_schema(obj, globalns=globals())
|
1222
|
+
expected = {"x": Object}
|
1223
|
+
assert result == expected
|
1224
|
+
|
1225
|
+
def test_date_delta(self) -> None:
|
1168
1226
|
@dataclass(kw_only=True, slots=True)
|
1169
1227
|
class Example:
|
1170
|
-
x:
|
1228
|
+
x: DateDelta = field(default_factory=DateDelta)
|
1171
1229
|
|
1172
1230
|
obj = Example()
|
1173
1231
|
result = dataclass_to_schema(obj)
|
1174
|
-
expected = {"x":
|
1232
|
+
expected = {"x": Object}
|
1175
1233
|
assert result == expected
|
1176
1234
|
|
1177
|
-
|
1178
|
-
def test_date_or_datetime_as_zoned_datetime(self, *, time_zone: ZoneInfo) -> None:
|
1179
|
-
with assume_does_not_raise(TimeZoneNotFoundError):
|
1180
|
-
now = get_now(time_zone).py_datetime()
|
1181
|
-
|
1235
|
+
def test_date_time_delta(self) -> None:
|
1182
1236
|
@dataclass(kw_only=True, slots=True)
|
1183
1237
|
class Example:
|
1184
|
-
x:
|
1238
|
+
x: DateTimeDelta = field(default_factory=DateTimeDelta)
|
1185
1239
|
|
1186
1240
|
obj = Example()
|
1187
1241
|
result = dataclass_to_schema(obj)
|
1188
|
-
expected = {"x":
|
1242
|
+
expected = {"x": Object}
|
1189
1243
|
assert result == expected
|
1190
1244
|
|
1191
1245
|
def test_enum(self) -> None:
|
@@ -1212,16 +1266,14 @@ class TestDataClassToSchema:
|
|
1212
1266
|
expected = {"x": pl.Enum(["true", "false"])}
|
1213
1267
|
assert result == expected
|
1214
1268
|
|
1215
|
-
def
|
1216
|
-
now = get_now().to_plain().py_datetime()
|
1217
|
-
|
1269
|
+
def test_plain_date_time(self) -> None:
|
1218
1270
|
@dataclass(kw_only=True, slots=True)
|
1219
1271
|
class Example:
|
1220
|
-
x:
|
1272
|
+
x: PlainDateTime = field(default_factory=get_now_plain)
|
1221
1273
|
|
1222
1274
|
obj = Example()
|
1223
1275
|
result = dataclass_to_schema(obj)
|
1224
|
-
expected = {"x":
|
1276
|
+
expected = {"x": Object}
|
1225
1277
|
assert result == expected
|
1226
1278
|
|
1227
1279
|
def test_nested_once(self) -> None:
|
@@ -1289,71 +1341,69 @@ class TestDataClassToSchema:
|
|
1289
1341
|
class Example:
|
1290
1342
|
x: Path = PWD
|
1291
1343
|
|
1292
|
-
_ = Path # add to locals
|
1293
1344
|
obj = Example()
|
1294
|
-
result = dataclass_to_schema(obj
|
1345
|
+
result = dataclass_to_schema(obj)
|
1295
1346
|
expected = {"x": Object}
|
1296
1347
|
assert result == expected
|
1297
1348
|
|
1298
|
-
def
|
1349
|
+
def test_time(self) -> None:
|
1299
1350
|
@dataclass(kw_only=True, slots=True)
|
1300
1351
|
class Example:
|
1301
|
-
x:
|
1352
|
+
x: whenever.Time = field(default_factory=whenever.Time)
|
1302
1353
|
|
1303
|
-
_ = UUID # add to locals
|
1304
1354
|
obj = Example()
|
1305
|
-
result = dataclass_to_schema(obj
|
1355
|
+
result = dataclass_to_schema(obj)
|
1306
1356
|
expected = {"x": Object}
|
1307
1357
|
assert result == expected
|
1308
1358
|
|
1309
|
-
|
1310
|
-
def test_zoned_datetime(self, *, time_zone: ZoneInfo) -> None:
|
1311
|
-
with assume_does_not_raise(TimeZoneNotFoundError):
|
1312
|
-
now = get_now(time_zone).py_datetime()
|
1313
|
-
|
1359
|
+
def test_time_delta(self) -> None:
|
1314
1360
|
@dataclass(kw_only=True, slots=True)
|
1315
1361
|
class Example:
|
1316
|
-
x:
|
1362
|
+
x: TimeDelta = field(default_factory=TimeDelta)
|
1317
1363
|
|
1318
1364
|
obj = Example()
|
1319
1365
|
result = dataclass_to_schema(obj)
|
1320
|
-
expected = {"x":
|
1366
|
+
expected = {"x": Object}
|
1321
1367
|
assert result == expected
|
1322
1368
|
|
1323
|
-
|
1324
|
-
def test_zoned_datetime_nested(self, *, start: ZoneInfo, end: ZoneInfo) -> None:
|
1325
|
-
with assume_does_not_raise(TimeZoneNotFoundError):
|
1326
|
-
now_start = get_now(start).py_datetime()
|
1327
|
-
now_end = get_now(end).py_datetime()
|
1328
|
-
|
1369
|
+
def test_time_period(self) -> None:
|
1329
1370
|
@dataclass(kw_only=True, slots=True)
|
1330
|
-
class
|
1331
|
-
|
1332
|
-
|
1371
|
+
class Example:
|
1372
|
+
x: TimePeriod
|
1373
|
+
|
1374
|
+
obj = Example(x=TimePeriod(whenever.Time(), whenever.Time()))
|
1375
|
+
result = dataclass_to_schema(obj, globalns=globals())
|
1376
|
+
expected = {"x": Object}
|
1377
|
+
assert result == expected
|
1333
1378
|
|
1379
|
+
def test_uuid(self) -> None:
|
1334
1380
|
@dataclass(kw_only=True, slots=True)
|
1335
|
-
class
|
1336
|
-
|
1381
|
+
class Example:
|
1382
|
+
x: UUID = field(default_factory=uuid4)
|
1337
1383
|
|
1338
|
-
obj =
|
1339
|
-
result = dataclass_to_schema(obj
|
1340
|
-
expected = {"
|
1384
|
+
obj = Example()
|
1385
|
+
result = dataclass_to_schema(obj)
|
1386
|
+
expected = {"x": Object}
|
1341
1387
|
assert result == expected
|
1342
1388
|
|
1343
|
-
def
|
1389
|
+
def test_zoned_date_time(self) -> None:
|
1344
1390
|
@dataclass(kw_only=True, slots=True)
|
1345
1391
|
class Example:
|
1346
|
-
|
1347
|
-
list_field: list[int] = field(default_factory=list)
|
1348
|
-
set_field: set[int] = field(default_factory=set)
|
1392
|
+
x: ZonedDateTime = field(default_factory=get_now)
|
1349
1393
|
|
1350
1394
|
obj = Example()
|
1351
1395
|
result = dataclass_to_schema(obj)
|
1352
|
-
expected = {
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1396
|
+
expected = {"x": Object}
|
1397
|
+
assert result == expected
|
1398
|
+
|
1399
|
+
def test_zoned_date_time_period(self) -> None:
|
1400
|
+
@dataclass(kw_only=True, slots=True)
|
1401
|
+
class Example:
|
1402
|
+
x: ZonedDateTimePeriod
|
1403
|
+
|
1404
|
+
obj = Example(x=ZonedDateTimePeriod(NOW_UTC, NOW_UTC))
|
1405
|
+
result = dataclass_to_schema(obj, globalns=globals())
|
1406
|
+
expected = {"x": Object}
|
1357
1407
|
assert result == expected
|
1358
1408
|
|
1359
1409
|
def test_error(self) -> None:
|
@@ -2275,8 +2325,10 @@ class TestNormal:
|
|
2275
2325
|
|
2276
2326
|
|
2277
2327
|
class TestOffsetDateTime:
|
2278
|
-
@mark.parametrize(
|
2279
|
-
|
2328
|
+
@mark.parametrize(
|
2329
|
+
("n", "time"), [param(1, whenever.Time(13, 30)), param(2, whenever.Time(15))]
|
2330
|
+
)
|
2331
|
+
def test_main(self, *, n: int, time: whenever.Time) -> None:
|
2280
2332
|
datetime = ZonedDateTime(2000, 1, 1, 12, tz=UTC.key)
|
2281
2333
|
result = offset_datetime(datetime, "1h30m", n=n)
|
2282
2334
|
expected = datetime.replace_time(time)
|
@@ -2450,8 +2502,8 @@ class TestSerializeAndDeserializeDataFrame:
|
|
2450
2502
|
cases: ClassVar[list[tuple[PolarsDataType, SearchStrategy[Any]]]] = [
|
2451
2503
|
(Boolean, booleans()),
|
2452
2504
|
(Boolean(), booleans()),
|
2453
|
-
(Date, hypothesis.strategies.dates()),
|
2454
|
-
(Date(), hypothesis.strategies.dates()),
|
2505
|
+
(pl.Date, hypothesis.strategies.dates()),
|
2506
|
+
(pl.Date(), hypothesis.strategies.dates()),
|
2455
2507
|
(Datetime(), py_datetimes(zoned=False)),
|
2456
2508
|
(Datetime(time_zone=UTC.key), py_datetimes(zoned=True)),
|
2457
2509
|
(Int64, int64s()),
|
@@ -2550,8 +2602,8 @@ class TestStructFromDataClass:
|
|
2550
2602
|
class Example:
|
2551
2603
|
bool_: bool
|
2552
2604
|
bool_maybe: bool | None = None
|
2553
|
-
date:
|
2554
|
-
date_maybe:
|
2605
|
+
date: whenever.Date
|
2606
|
+
date_maybe: whenever.Date | None = None
|
2555
2607
|
float_: float
|
2556
2608
|
float_maybe: float | None = None
|
2557
2609
|
int_: int
|
@@ -2563,8 +2615,8 @@ class TestStructFromDataClass:
|
|
2563
2615
|
expected = Struct({
|
2564
2616
|
"bool_": Boolean,
|
2565
2617
|
"bool_maybe": Boolean,
|
2566
|
-
"date": Date,
|
2567
|
-
"date_maybe": Date,
|
2618
|
+
"date": pl.Date,
|
2619
|
+
"date_maybe": pl.Date,
|
2568
2620
|
"float_": Float64,
|
2569
2621
|
"float_maybe": Float64,
|
2570
2622
|
"int_": Int64,
|