dycw-utilities 0.108.3__tar.gz → 0.109.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.108.3 → dycw_utilities-0.109.0}/PKG-INFO +5 -5
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/pyproject.toml +8 -8
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_dataclasses.py +104 -31
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_operator.py +22 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_orjson.py +20 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_parse.py +10 -1
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_polars.py +0 -184
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_python_dotenv.py +17 -1
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_typing.py +27 -13
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/no_future.py +4 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/with_future.py +7 -7
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/dataclasses.py +166 -18
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/parse.py +2 -2
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/polars.py +0 -99
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/.gitignore +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/LICENSE +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/README.md +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/git.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/period.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.108.3 → dycw_utilities-0.109.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.109.0
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
5
5
|
License-File: LICENSE
|
6
6
|
Requires-Python: >=3.12
|
@@ -82,7 +82,7 @@ Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
|
|
82
82
|
Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-hypothesis'
|
83
83
|
Requires-Dist: hypothesis<6.132,>=6.131.6; extra == 'zzz-test-hypothesis'
|
84
84
|
Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-hypothesis'
|
85
|
-
Requires-Dist: numpy<2.3,>=2.2.
|
85
|
+
Requires-Dist: numpy<2.3,>=2.2.5; extra == 'zzz-test-hypothesis'
|
86
86
|
Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
|
87
87
|
Requires-Dist: redis<5.3,>=5.2.1; extra == 'zzz-test-hypothesis'
|
88
88
|
Requires-Dist: sqlalchemy<2.1,>=2.0.40; extra == 'zzz-test-hypothesis'
|
@@ -112,14 +112,14 @@ Provides-Extra: zzz-test-luigi
|
|
112
112
|
Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-luigi'
|
113
113
|
Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-luigi'
|
114
114
|
Provides-Extra: zzz-test-math
|
115
|
-
Requires-Dist: numpy<2.3,>=2.2.
|
115
|
+
Requires-Dist: numpy<2.3,>=2.2.5; extra == 'zzz-test-math'
|
116
116
|
Provides-Extra: zzz-test-memory-profiler
|
117
117
|
Requires-Dist: memory-profiler<0.62,>=0.61.0; extra == 'zzz-test-memory-profiler'
|
118
118
|
Provides-Extra: zzz-test-modules
|
119
119
|
Provides-Extra: zzz-test-more-itertools
|
120
120
|
Requires-Dist: more-itertools<10.7,>=10.6.0; extra == 'zzz-test-more-itertools'
|
121
121
|
Provides-Extra: zzz-test-numpy
|
122
|
-
Requires-Dist: numpy<2.3,>=2.2.
|
122
|
+
Requires-Dist: numpy<2.3,>=2.2.5; extra == 'zzz-test-numpy'
|
123
123
|
Provides-Extra: zzz-test-operator
|
124
124
|
Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-operator'
|
125
125
|
Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-operator'
|
@@ -177,7 +177,7 @@ Requires-Dist: scipy<1.16,>=1.15.2; extra == 'zzz-test-scipy'
|
|
177
177
|
Provides-Extra: zzz-test-sentinel
|
178
178
|
Provides-Extra: zzz-test-shelve
|
179
179
|
Provides-Extra: zzz-test-slack-sdk
|
180
|
-
Requires-Dist: aiohttp<3.12,>=3.11.
|
180
|
+
Requires-Dist: aiohttp<3.12,>=3.11.17; extra == 'zzz-test-slack-sdk'
|
181
181
|
Requires-Dist: slack-sdk<3.36,>=3.35.0; extra == 'zzz-test-slack-sdk'
|
182
182
|
Provides-Extra: zzz-test-socket
|
183
183
|
Provides-Extra: zzz-test-sqlalchemy
|
@@ -8,7 +8,7 @@ requires = ["hatchling"]
|
|
8
8
|
# dependency groups
|
9
9
|
[dependency-groups]
|
10
10
|
dev = [
|
11
|
-
"aiohttp >= 3.11.
|
11
|
+
"aiohttp >= 3.11.17, < 3.12", # for slack
|
12
12
|
"aiosqlite >= 0.21.0, < 0.22",
|
13
13
|
"altair >= 5.5.0, < 5.6",
|
14
14
|
"astor >= 0.8.1, < 0.9",
|
@@ -35,7 +35,7 @@ dev = [
|
|
35
35
|
"more-itertools >= 10.6.0, < 10.7",
|
36
36
|
"nest-asyncio >= 1.6.0, < 1.7", # for sqlalchemy async
|
37
37
|
"nox >= 2025.2.9, < 2025.3",
|
38
|
-
"numpy >= 2.2.
|
38
|
+
"numpy >= 2.2.5, < 2.3",
|
39
39
|
"optuna >= 4.3.0, < 4.4",
|
40
40
|
"orjson >= 3.10.16, < 3.11",
|
41
41
|
"pathvalidate >= 3.2.3, < 3.3",
|
@@ -89,7 +89,7 @@ dependencies = [
|
|
89
89
|
name = "dycw-utilities"
|
90
90
|
readme = "README.md"
|
91
91
|
requires-python = ">= 3.12"
|
92
|
-
version = "0.
|
92
|
+
version = "0.109.0"
|
93
93
|
|
94
94
|
[project.optional-dependencies]
|
95
95
|
test = [
|
@@ -173,7 +173,7 @@ zzz-test-hypothesis = [
|
|
173
173
|
"greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
|
174
174
|
"hypothesis >= 6.131.6, < 6.132",
|
175
175
|
"luigi >= 3.6.0, < 3.7",
|
176
|
-
"numpy >= 2.2.
|
176
|
+
"numpy >= 2.2.5, < 2.3",
|
177
177
|
"pathvalidate >= 3.2.3, < 3.3",
|
178
178
|
"redis >= 5.2.1, < 5.3",
|
179
179
|
"sqlalchemy >= 2.0.40, < 2.1",
|
@@ -205,11 +205,11 @@ zzz-test-luigi = [
|
|
205
205
|
"luigi >= 3.6.0, < 3.7",
|
206
206
|
"whenever >= 0.7.3, < 0.8",
|
207
207
|
]
|
208
|
-
zzz-test-math = ["numpy >= 2.2.
|
208
|
+
zzz-test-math = ["numpy >= 2.2.5, < 2.3"]
|
209
209
|
zzz-test-memory-profiler = ["memory-profiler >= 0.61.0, < 0.62"]
|
210
210
|
zzz-test-modules = []
|
211
211
|
zzz-test-more-itertools = ["more-itertools >= 10.6.0, < 10.7"]
|
212
|
-
zzz-test-numpy = ["numpy >= 2.2.
|
212
|
+
zzz-test-numpy = ["numpy >= 2.2.5, < 2.3"]
|
213
213
|
zzz-test-operator = [
|
214
214
|
"polars-lts-cpu >= 1.27.1, < 1.28",
|
215
215
|
"whenever >= 0.7.3, < 0.8",
|
@@ -268,7 +268,7 @@ zzz-test-scipy = ["scipy >= 1.15.2, < 1.16"]
|
|
268
268
|
zzz-test-sentinel = []
|
269
269
|
zzz-test-shelve = []
|
270
270
|
zzz-test-slack-sdk = [
|
271
|
-
"aiohttp >= 3.11.
|
271
|
+
"aiohttp >= 3.11.17, < 3.12", # for slack
|
272
272
|
"slack-sdk >= 3.35.0, < 3.36",
|
273
273
|
]
|
274
274
|
zzz-test-socket = []
|
@@ -332,7 +332,7 @@ zzz-test-zoneinfo = [
|
|
332
332
|
# bump-my-version
|
333
333
|
[tool.bumpversion]
|
334
334
|
allow_dirty = true
|
335
|
-
current_version = "0.
|
335
|
+
current_version = "0.109.0"
|
336
336
|
|
337
337
|
[[tool.bumpversion.files]]
|
338
338
|
filename = "src/utilities/__init__.py"
|
@@ -5,7 +5,7 @@ from dataclasses import dataclass, field
|
|
5
5
|
from pathlib import Path
|
6
6
|
from re import DOTALL
|
7
7
|
from types import NoneType
|
8
|
-
from typing import Any,
|
8
|
+
from typing import Any, cast, override
|
9
9
|
|
10
10
|
from hypothesis import given
|
11
11
|
from hypothesis.strategies import (
|
@@ -40,17 +40,24 @@ from tests.test_typing_funcs.with_future import (
|
|
40
40
|
DataClassFutureStr,
|
41
41
|
DataClassFutureTypeLiteral,
|
42
42
|
DataClassFutureTypeLiteralNullable,
|
43
|
+
TrueOrFalseFutureLit,
|
44
|
+
TrueOrFalseFutureTypeLit,
|
43
45
|
)
|
44
46
|
from utilities.dataclasses import (
|
45
47
|
YieldFieldsError,
|
46
48
|
_MappingToDataclassCaseInsensitiveNonUniqueError,
|
47
49
|
_MappingToDataclassEmptyError,
|
50
|
+
_TextToDataClassGetFieldEmptyError,
|
51
|
+
_TextToDataClassGetFieldNonUniqueError,
|
52
|
+
_TextToDataClassParseValueError,
|
53
|
+
_TextToDataClassSplitKeyValuePairError,
|
48
54
|
_YieldFieldsClass,
|
49
55
|
_YieldFieldsInstance,
|
50
56
|
dataclass_repr,
|
51
57
|
dataclass_to_dict,
|
52
58
|
mapping_to_dataclass,
|
53
59
|
replace_non_sentinel,
|
60
|
+
text_to_dataclass,
|
54
61
|
yield_fields,
|
55
62
|
)
|
56
63
|
from utilities.functions import get_class_name
|
@@ -62,7 +69,42 @@ from utilities.sentinel import sentinel
|
|
62
69
|
from utilities.types import Dataclass, StrMapping
|
63
70
|
from utilities.typing import get_args, is_list_type, is_literal_type, is_optional_type
|
64
71
|
|
65
|
-
|
72
|
+
|
73
|
+
class TestDataClassRepr:
|
74
|
+
def test_overriding_repr(self) -> None:
|
75
|
+
@dataclass(kw_only=True, slots=True)
|
76
|
+
class Example(DataClassFutureIntDefault):
|
77
|
+
@override
|
78
|
+
def __repr__(self) -> str:
|
79
|
+
return dataclass_repr(self)
|
80
|
+
|
81
|
+
obj = Example()
|
82
|
+
result = repr(obj)
|
83
|
+
expected = "Example()"
|
84
|
+
assert result == expected
|
85
|
+
|
86
|
+
def test_overriding_repr_defaults(self) -> None:
|
87
|
+
@dataclass(kw_only=True)
|
88
|
+
class Example(DataClassFutureIntDefault):
|
89
|
+
@override
|
90
|
+
def __repr__(self) -> str:
|
91
|
+
return dataclass_repr(self, defaults=True)
|
92
|
+
|
93
|
+
obj = Example()
|
94
|
+
result = repr(obj)
|
95
|
+
expected = "Example(int_=0)"
|
96
|
+
assert result == expected
|
97
|
+
|
98
|
+
@given(x=integers())
|
99
|
+
def test_non_repr_field(self, *, x: int) -> None:
|
100
|
+
@dataclass(kw_only=True, slots=True)
|
101
|
+
class Example:
|
102
|
+
x: int = field(default=0, repr=False)
|
103
|
+
|
104
|
+
obj = Example(x=x)
|
105
|
+
result = dataclass_repr(obj)
|
106
|
+
expected = "Example()"
|
107
|
+
assert result == expected
|
66
108
|
|
67
109
|
|
68
110
|
class TestDataclassToDictAndDataclassRepr:
|
@@ -328,31 +370,51 @@ class TestReplaceNonSentinel:
|
|
328
370
|
assert obj.int_ == 1
|
329
371
|
|
330
372
|
|
331
|
-
class
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
@override
|
338
|
-
def __repr__(self) -> str:
|
339
|
-
return dataclass_repr(self)
|
373
|
+
class TestTextToDataClass:
|
374
|
+
@given(int_=integers())
|
375
|
+
def test_main_text(self, *, int_: int) -> None:
|
376
|
+
result = text_to_dataclass(f"int_={int_}", DataClassFutureInt)
|
377
|
+
expected = DataClassFutureInt(int_=int_)
|
378
|
+
assert result == expected
|
340
379
|
|
341
|
-
|
342
|
-
|
343
|
-
|
380
|
+
@given(int_=integers())
|
381
|
+
def test_main_mapping(self, *, int_: int) -> None:
|
382
|
+
result = text_to_dataclass({"int_": str(int_)}, DataClassFutureInt)
|
383
|
+
expected = DataClassFutureInt(int_=int_)
|
344
384
|
assert result == expected
|
345
385
|
|
346
|
-
|
347
|
-
|
348
|
-
|
386
|
+
def test_error_split_key_value_pair(self) -> None:
|
387
|
+
with raises(
|
388
|
+
_TextToDataClassSplitKeyValuePairError,
|
389
|
+
match="Unable to construct 'DataClassFutureInt'; failed to split key-value pair 'keyvalue'",
|
390
|
+
):
|
391
|
+
_ = text_to_dataclass("keyvalue", DataClassFutureInt)
|
392
|
+
|
393
|
+
def test_error_get_field_empty(self) -> None:
|
394
|
+
with raises(
|
395
|
+
_TextToDataClassGetFieldEmptyError,
|
396
|
+
match=r"Dataclass 'DataClassFutureInt' does not contain any field starting with 'k' \(modulo case\)",
|
397
|
+
):
|
398
|
+
_ = text_to_dataclass("k=value", DataClassFutureInt)
|
399
|
+
|
400
|
+
def test_error_get_field_non_unique(self) -> None:
|
401
|
+
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
349
402
|
class Example:
|
350
|
-
|
403
|
+
int1: int
|
404
|
+
int2: int
|
351
405
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
406
|
+
with raises(
|
407
|
+
_TextToDataClassGetFieldNonUniqueError,
|
408
|
+
match=r"Dataclass 'Example' must contain exactly one field starting with 'int' \(modulo case\); got 'int1', 'int2' and perhaps more",
|
409
|
+
):
|
410
|
+
_ = text_to_dataclass("int=value", Example)
|
411
|
+
|
412
|
+
def test_error_parse_value(self) -> None:
|
413
|
+
with raises(
|
414
|
+
_TextToDataClassParseValueError,
|
415
|
+
match="Unable to construct 'DataClassFutureInt'; unable to parse field 'int_' of type <class 'int'>; got 'invalid'",
|
416
|
+
):
|
417
|
+
_ = text_to_dataclass("int_=invalid", DataClassFutureInt)
|
356
418
|
|
357
419
|
|
358
420
|
class TestYieldFields:
|
@@ -400,21 +462,23 @@ class TestYieldFields:
|
|
400
462
|
assert get_args(result.type_) == (int,)
|
401
463
|
|
402
464
|
def test_class_future_literal(self) -> None:
|
403
|
-
result = one(yield_fields(DataClassFutureLiteral))
|
404
|
-
expected = _YieldFieldsClass(
|
465
|
+
result = one(yield_fields(DataClassFutureLiteral, globalns=globals()))
|
466
|
+
expected = _YieldFieldsClass(
|
467
|
+
name="truth", type_=TrueOrFalseFutureLit, kw_only=True
|
468
|
+
)
|
405
469
|
assert result == expected
|
406
470
|
assert is_literal_type(result.type_)
|
407
471
|
assert get_args(result.type_) == ("true", "false")
|
408
472
|
|
409
473
|
def test_class_future_literal_nullable(self) -> None:
|
410
|
-
result = one(yield_fields(DataClassFutureLiteralNullable))
|
474
|
+
result = one(yield_fields(DataClassFutureLiteralNullable, globalns=globals()))
|
411
475
|
expected = _YieldFieldsClass(
|
412
|
-
name="truth", type_=
|
476
|
+
name="truth", type_=TrueOrFalseFutureLit | None, default=None, kw_only=True
|
413
477
|
)
|
414
478
|
assert result == expected
|
415
479
|
assert is_optional_type(result.type_)
|
416
480
|
args = get_args(result.type_)
|
417
|
-
assert args == (
|
481
|
+
assert args == (TrueOrFalseFutureLit,)
|
418
482
|
arg = one(args)
|
419
483
|
assert get_args(arg) == ("true", "false")
|
420
484
|
|
@@ -429,8 +493,14 @@ class TestYieldFields:
|
|
429
493
|
assert result.type_ is DataClassFutureNestedOuterFirstInner
|
430
494
|
|
431
495
|
def test_class_future_type_literal(self) -> None:
|
432
|
-
result = one(
|
433
|
-
|
496
|
+
result = one(
|
497
|
+
yield_fields(
|
498
|
+
DataClassFutureTypeLiteral, globalns=globals(), localns=locals()
|
499
|
+
)
|
500
|
+
)
|
501
|
+
expected = _YieldFieldsClass(
|
502
|
+
name="truth", type_=TrueOrFalseFutureTypeLit, kw_only=True
|
503
|
+
)
|
434
504
|
assert result == expected
|
435
505
|
assert is_literal_type(result.type_)
|
436
506
|
assert get_args(result.type_) == ("true", "false")
|
@@ -440,12 +510,15 @@ class TestYieldFields:
|
|
440
510
|
yield_fields(DataClassFutureTypeLiteralNullable, globalns=globals())
|
441
511
|
)
|
442
512
|
expected = _YieldFieldsClass(
|
443
|
-
name="truth",
|
513
|
+
name="truth",
|
514
|
+
type_=TrueOrFalseFutureTypeLit | None,
|
515
|
+
default=None,
|
516
|
+
kw_only=True,
|
444
517
|
)
|
445
518
|
assert result == expected
|
446
519
|
assert is_optional_type(result.type_)
|
447
520
|
args = get_args(result.type_)
|
448
|
-
assert args == (
|
521
|
+
assert args == (TrueOrFalseFutureTypeLit,)
|
449
522
|
arg = one(args)
|
450
523
|
assert get_args(arg) == ("true", "false")
|
451
524
|
|
@@ -43,6 +43,8 @@ from tests.test_typing_funcs.with_future import (
|
|
43
43
|
DataClassFutureNestedInnerFirstOuter,
|
44
44
|
DataClassFutureNestedOuterFirstOuter,
|
45
45
|
DataClassFutureNone,
|
46
|
+
DataClassFutureTypeLiteral,
|
47
|
+
DataClassFutureTypeLiteralNullable,
|
46
48
|
)
|
47
49
|
from utilities.hypothesis import (
|
48
50
|
assume_does_not_raise,
|
@@ -76,6 +78,8 @@ def base_objects(
|
|
76
78
|
dataclass_literal_nullable: bool = False,
|
77
79
|
dataclass_nested: bool = False,
|
78
80
|
dataclass_none: bool = False,
|
81
|
+
dataclass_type_literal: bool = False,
|
82
|
+
dataclass_type_literal_nullable: bool = False,
|
79
83
|
enum: bool = False,
|
80
84
|
exception_class: bool = False,
|
81
85
|
exception_instance: bool = False,
|
@@ -132,6 +136,15 @@ def base_objects(
|
|
132
136
|
)
|
133
137
|
if dataclass_none:
|
134
138
|
base |= builds(DataClassFutureNone)
|
139
|
+
if dataclass_type_literal:
|
140
|
+
base |= builds(
|
141
|
+
DataClassFutureTypeLiteral, truth=sampled_from(["true", "false"])
|
142
|
+
)
|
143
|
+
if dataclass_type_literal_nullable:
|
144
|
+
base |= builds(
|
145
|
+
DataClassFutureTypeLiteralNullable,
|
146
|
+
truth=sampled_from(["true", "false"]) | none(),
|
147
|
+
)
|
135
148
|
if enum:
|
136
149
|
base |= sampled_from(TruthEnum)
|
137
150
|
if exception_class:
|
@@ -151,6 +164,8 @@ def make_objects(
|
|
151
164
|
dataclass_literal_nullable: bool = False,
|
152
165
|
dataclass_nested: bool = False,
|
153
166
|
dataclass_none: bool = False,
|
167
|
+
dataclass_type_literal: bool = False,
|
168
|
+
dataclass_type_literal_nullable: bool = False,
|
154
169
|
enum: bool = False,
|
155
170
|
exception_class: bool = False,
|
156
171
|
exception_instance: bool = False,
|
@@ -173,6 +188,8 @@ def make_objects(
|
|
173
188
|
dataclass_literal_nullable=dataclass_literal_nullable,
|
174
189
|
dataclass_nested=dataclass_nested,
|
175
190
|
dataclass_none=dataclass_none,
|
191
|
+
dataclass_type_literal=dataclass_type_literal,
|
192
|
+
dataclass_type_literal_nullable=dataclass_type_literal_nullable,
|
176
193
|
enum=enum,
|
177
194
|
exception_class=exception_class,
|
178
195
|
exception_instance=exception_instance,
|
@@ -272,6 +289,8 @@ class TestIsEqual:
|
|
272
289
|
dataclass_literal_nullable=True,
|
273
290
|
dataclass_nested=True,
|
274
291
|
dataclass_none=True,
|
292
|
+
dataclass_type_literal=True,
|
293
|
+
dataclass_type_literal_nullable=True,
|
275
294
|
enum=True,
|
276
295
|
sub_frozenset=True,
|
277
296
|
sub_list=True,
|
@@ -287,12 +306,15 @@ class TestIsEqual:
|
|
287
306
|
objs=pairs(
|
288
307
|
make_objects(
|
289
308
|
dataclass_custom_equality=True,
|
309
|
+
dataclass_default_in_init_child=True,
|
290
310
|
dataclass_int=True,
|
291
311
|
dataclass_int_default=True,
|
292
312
|
dataclass_literal=True,
|
293
313
|
dataclass_literal_nullable=True,
|
294
314
|
dataclass_nested=True,
|
295
315
|
dataclass_none=True,
|
316
|
+
dataclass_type_literal=True,
|
317
|
+
dataclass_type_literal_nullable=True,
|
296
318
|
enum=True,
|
297
319
|
sub_frozenset=True,
|
298
320
|
sub_list=True,
|
@@ -48,6 +48,8 @@ from tests.test_typing_funcs.with_future import (
|
|
48
48
|
DataClassFutureNestedOuterFirstInner,
|
49
49
|
DataClassFutureNestedOuterFirstOuter,
|
50
50
|
DataClassFutureNone,
|
51
|
+
DataClassFutureTypeLiteral,
|
52
|
+
DataClassFutureTypeLiteralNullable,
|
51
53
|
)
|
52
54
|
from utilities.datetime import MINUTE, SECOND, get_now, get_now_local
|
53
55
|
from utilities.functions import is_sequence_of
|
@@ -435,12 +437,15 @@ class TestSerializeAndDeserialize:
|
|
435
437
|
@given(
|
436
438
|
obj=make_objects(
|
437
439
|
dataclass_custom_equality=True,
|
440
|
+
dataclass_default_in_init_child=False,
|
438
441
|
dataclass_int=True,
|
439
442
|
dataclass_int_default=True,
|
440
443
|
dataclass_literal=True,
|
441
444
|
dataclass_literal_nullable=True,
|
442
445
|
dataclass_nested=True,
|
443
446
|
dataclass_none=True,
|
447
|
+
dataclass_type_literal=True,
|
448
|
+
dataclass_type_literal_nullable=True,
|
444
449
|
enum=True,
|
445
450
|
exception_class=True,
|
446
451
|
exception_instance=True,
|
@@ -467,6 +472,8 @@ class TestSerializeAndDeserialize:
|
|
467
472
|
DataClassFutureNestedOuterFirstInner,
|
468
473
|
DataClassFutureNestedOuterFirstOuter,
|
469
474
|
DataClassFutureNone,
|
475
|
+
DataClassFutureTypeLiteral,
|
476
|
+
DataClassFutureTypeLiteralNullable,
|
470
477
|
SubFrozenSet,
|
471
478
|
SubList,
|
472
479
|
SubSet,
|
@@ -559,6 +566,19 @@ class TestSerializeAndDeserialize:
|
|
559
566
|
result = deserialize(ser, objects={DataClassFutureNone})
|
560
567
|
assert is_equal(result, obj)
|
561
568
|
|
569
|
+
@given(obj=make_objects(dataclass_type_literal=True))
|
570
|
+
def test_dataclass_type_literal(self, *, obj: Any) -> None:
|
571
|
+
result = deserialize(serialize(obj), objects={DataClassFutureTypeLiteral})
|
572
|
+
assert is_equal(result, obj)
|
573
|
+
|
574
|
+
@given(obj=make_objects(dataclass_type_literal_nullable=True))
|
575
|
+
def test_dataclass_type_literal_nullable(self, *, obj: Any) -> None:
|
576
|
+
result = deserialize(
|
577
|
+
serialize(obj), objects={DataClassFutureTypeLiteralNullable}
|
578
|
+
)
|
579
|
+
with assume_does_not_raise(IsEqualError):
|
580
|
+
assert is_equal(result, obj)
|
581
|
+
|
562
582
|
@given(obj=builds(DataClassFutureNone))
|
563
583
|
def test_dataclass_no_objects_error(self, *, obj: DataClassFutureNone) -> None:
|
564
584
|
ser = serialize(obj)
|
@@ -12,6 +12,10 @@ from hypothesis.strategies import booleans, dates, floats, integers, sampled_fro
|
|
12
12
|
from pytest import raises
|
13
13
|
|
14
14
|
from tests.test_operator import TruthEnum
|
15
|
+
from tests.test_typing_funcs.with_future import (
|
16
|
+
TrueOrFalseFutureLit,
|
17
|
+
TrueOrFalseFutureTypeLit,
|
18
|
+
)
|
15
19
|
from utilities.functions import ensure_path
|
16
20
|
from utilities.hypothesis import (
|
17
21
|
local_datetimes,
|
@@ -72,7 +76,7 @@ class TestParseText:
|
|
72
76
|
|
73
77
|
@given(truth=sampled_from(["true", "false"]))
|
74
78
|
def test_literal(self, *, truth: Literal["true", "false"]) -> None:
|
75
|
-
result = parse_text(
|
79
|
+
result = parse_text(TrueOrFalseFutureLit, truth)
|
76
80
|
assert result == truth
|
77
81
|
|
78
82
|
def test_nullable_int_none(self) -> None:
|
@@ -131,6 +135,11 @@ class TestParseText:
|
|
131
135
|
result = parse_text(dt.timedelta, text)
|
132
136
|
assert result == timedelta
|
133
137
|
|
138
|
+
@given(truth=sampled_from(["true", "false"]))
|
139
|
+
def test_type_literal(self, *, truth: Literal["true", "false"]) -> None:
|
140
|
+
result = parse_text(TrueOrFalseFutureTypeLit, truth)
|
141
|
+
assert result == truth
|
142
|
+
|
134
143
|
@given(version=versions())
|
135
144
|
def test_version(self, *, version: Version) -> None:
|
136
145
|
text = str(version)
|