dycw-utilities 0.108.4__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.4 → dycw_utilities-0.109.0}/PKG-INFO +1 -1
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/pyproject.toml +2 -2
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_dataclasses.py +23 -12
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_operator.py +22 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_orjson.py +20 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_parse.py +10 -1
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_polars.py +0 -184
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_python_dotenv.py +17 -1
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing.py +27 -13
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/no_future.py +4 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/with_future.py +7 -7
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/parse.py +2 -2
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/polars.py +0 -99
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/.gitignore +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/LICENSE +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/README.md +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/git.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/period.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/zoneinfo.py +0 -0
@@ -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 = [
|
@@ -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,6 +40,8 @@ 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,
|
@@ -67,8 +69,6 @@ from utilities.sentinel import sentinel
|
|
67
69
|
from utilities.types import Dataclass, StrMapping
|
68
70
|
from utilities.typing import get_args, is_list_type, is_literal_type, is_optional_type
|
69
71
|
|
70
|
-
TruthLit = Literal["true", "false"] # in 3.12, use type TruthLit = ...
|
71
|
-
|
72
72
|
|
73
73
|
class TestDataClassRepr:
|
74
74
|
def test_overriding_repr(self) -> None:
|
@@ -462,21 +462,23 @@ class TestYieldFields:
|
|
462
462
|
assert get_args(result.type_) == (int,)
|
463
463
|
|
464
464
|
def test_class_future_literal(self) -> None:
|
465
|
-
result = one(yield_fields(DataClassFutureLiteral))
|
466
|
-
expected = _YieldFieldsClass(
|
465
|
+
result = one(yield_fields(DataClassFutureLiteral, globalns=globals()))
|
466
|
+
expected = _YieldFieldsClass(
|
467
|
+
name="truth", type_=TrueOrFalseFutureLit, kw_only=True
|
468
|
+
)
|
467
469
|
assert result == expected
|
468
470
|
assert is_literal_type(result.type_)
|
469
471
|
assert get_args(result.type_) == ("true", "false")
|
470
472
|
|
471
473
|
def test_class_future_literal_nullable(self) -> None:
|
472
|
-
result = one(yield_fields(DataClassFutureLiteralNullable))
|
474
|
+
result = one(yield_fields(DataClassFutureLiteralNullable, globalns=globals()))
|
473
475
|
expected = _YieldFieldsClass(
|
474
|
-
name="truth", type_=
|
476
|
+
name="truth", type_=TrueOrFalseFutureLit | None, default=None, kw_only=True
|
475
477
|
)
|
476
478
|
assert result == expected
|
477
479
|
assert is_optional_type(result.type_)
|
478
480
|
args = get_args(result.type_)
|
479
|
-
assert args == (
|
481
|
+
assert args == (TrueOrFalseFutureLit,)
|
480
482
|
arg = one(args)
|
481
483
|
assert get_args(arg) == ("true", "false")
|
482
484
|
|
@@ -491,8 +493,14 @@ class TestYieldFields:
|
|
491
493
|
assert result.type_ is DataClassFutureNestedOuterFirstInner
|
492
494
|
|
493
495
|
def test_class_future_type_literal(self) -> None:
|
494
|
-
result = one(
|
495
|
-
|
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
|
+
)
|
496
504
|
assert result == expected
|
497
505
|
assert is_literal_type(result.type_)
|
498
506
|
assert get_args(result.type_) == ("true", "false")
|
@@ -502,12 +510,15 @@ class TestYieldFields:
|
|
502
510
|
yield_fields(DataClassFutureTypeLiteralNullable, globalns=globals())
|
503
511
|
)
|
504
512
|
expected = _YieldFieldsClass(
|
505
|
-
name="truth",
|
513
|
+
name="truth",
|
514
|
+
type_=TrueOrFalseFutureTypeLit | None,
|
515
|
+
default=None,
|
516
|
+
kw_only=True,
|
506
517
|
)
|
507
518
|
assert result == expected
|
508
519
|
assert is_optional_type(result.type_)
|
509
520
|
args = get_args(result.type_)
|
510
|
-
assert args == (
|
521
|
+
assert args == (TrueOrFalseFutureTypeLit,)
|
511
522
|
arg = one(args)
|
512
523
|
assert get_args(arg) == ("true", "false")
|
513
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)
|
@@ -102,8 +102,6 @@ from utilities.polars import (
|
|
102
102
|
_InsertBetweenMissingColumnsError,
|
103
103
|
_InsertBetweenNonConsecutiveError,
|
104
104
|
_yield_struct_series_element_remove_nulls,
|
105
|
-
_YieldRowsAsDataClassesColumnsSuperSetError,
|
106
|
-
_YieldRowsAsDataClassesWrongTypeError,
|
107
105
|
append_dataclass,
|
108
106
|
are_frames_equal,
|
109
107
|
ceil_datetime,
|
@@ -138,7 +136,6 @@ from utilities.polars import (
|
|
138
136
|
touch,
|
139
137
|
unique_element,
|
140
138
|
week_num,
|
141
|
-
yield_rows_as_dataclasses,
|
142
139
|
yield_struct_series_dataclasses,
|
143
140
|
yield_struct_series_elements,
|
144
141
|
zoned_datetime,
|
@@ -161,9 +158,6 @@ if TYPE_CHECKING:
|
|
161
158
|
from utilities.types import MaybeType, StrMapping, WeekDay
|
162
159
|
|
163
160
|
|
164
|
-
TruthLit = Literal["true", "false"] # in 3.12, use type TruthLit = ...
|
165
|
-
|
166
|
-
|
167
161
|
class TestAppendDataClass:
|
168
162
|
@given(
|
169
163
|
data=fixed_dictionaries({
|
@@ -1809,184 +1803,6 @@ class TestWeekNum:
|
|
1809
1803
|
assert_series_equal(result, expected)
|
1810
1804
|
|
1811
1805
|
|
1812
|
-
class TestYieldRowsAsDataclasses:
|
1813
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1814
|
-
def test_main(self, *, check_types: Literal["none", "first", "all"]) -> None:
|
1815
|
-
df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
|
1816
|
-
|
1817
|
-
@dataclass(kw_only=True, slots=True)
|
1818
|
-
class Row:
|
1819
|
-
x: int
|
1820
|
-
|
1821
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1822
|
-
expected = [Row(x=1), Row(x=2), Row(x=3)]
|
1823
|
-
assert result == expected
|
1824
|
-
|
1825
|
-
def test_none(self) -> None:
|
1826
|
-
df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": int}, orient="row")
|
1827
|
-
|
1828
|
-
@dataclass(kw_only=True, slots=True)
|
1829
|
-
class Row:
|
1830
|
-
x: str
|
1831
|
-
|
1832
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types="none"))
|
1833
|
-
expected = [Row(x=cast("Any", 1)), Row(x=cast("Any", 2)), Row(x=cast("Any", 3))]
|
1834
|
-
assert result == expected
|
1835
|
-
|
1836
|
-
def test_first(self) -> None:
|
1837
|
-
df = DataFrame(data=[(1,), (None,), (None,)], schema={"x": int}, orient="row")
|
1838
|
-
|
1839
|
-
@dataclass(kw_only=True, slots=True)
|
1840
|
-
class Row:
|
1841
|
-
x: int
|
1842
|
-
|
1843
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types="first"))
|
1844
|
-
expected = [Row(x=1), Row(x=cast("Any", None)), Row(x=cast("Any", None))]
|
1845
|
-
assert result == expected
|
1846
|
-
|
1847
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1848
|
-
def test_missing_columns_for_fields_with_defaults(
|
1849
|
-
self, *, check_types: Literal["none", "first", "all"]
|
1850
|
-
) -> None:
|
1851
|
-
df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
|
1852
|
-
|
1853
|
-
@dataclass(kw_only=True, slots=True)
|
1854
|
-
class Row:
|
1855
|
-
x: int
|
1856
|
-
y: int | None = None
|
1857
|
-
|
1858
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1859
|
-
expected = [Row(x=1), Row(x=2), Row(x=3)]
|
1860
|
-
assert result == expected
|
1861
|
-
|
1862
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1863
|
-
def test_literal(self, *, check_types: Literal["none", "first", "all"]) -> None:
|
1864
|
-
df = DataFrame(
|
1865
|
-
data=[("true",), ("false",), ("true",)], schema={"x": String}, orient="row"
|
1866
|
-
)
|
1867
|
-
|
1868
|
-
@dataclass(kw_only=True, slots=True)
|
1869
|
-
class Row:
|
1870
|
-
x: Literal["true", "false"]
|
1871
|
-
|
1872
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1873
|
-
expected = [Row(x="true"), Row(x="false"), Row(x="true")]
|
1874
|
-
assert result == expected
|
1875
|
-
|
1876
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1877
|
-
def test_literal_nullable(
|
1878
|
-
self, *, check_types: Literal["none", "first", "all"]
|
1879
|
-
) -> None:
|
1880
|
-
df = DataFrame(
|
1881
|
-
data=[("true",), ("false",), (None,)], schema={"x": String}, orient="row"
|
1882
|
-
)
|
1883
|
-
|
1884
|
-
@dataclass(kw_only=True, slots=True)
|
1885
|
-
class Row:
|
1886
|
-
x: Literal["true", "false"] | None = None
|
1887
|
-
|
1888
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1889
|
-
expected = [Row(x="true"), Row(x="false"), Row()]
|
1890
|
-
assert result == expected
|
1891
|
-
|
1892
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1893
|
-
def test_literal_type(
|
1894
|
-
self, *, check_types: Literal["none", "first", "all"]
|
1895
|
-
) -> None:
|
1896
|
-
df = DataFrame(
|
1897
|
-
data=[("true",), ("false",), ("true",)], schema={"x": String}, orient="row"
|
1898
|
-
)
|
1899
|
-
|
1900
|
-
@dataclass(kw_only=True, slots=True)
|
1901
|
-
class Row:
|
1902
|
-
x: TruthLit
|
1903
|
-
|
1904
|
-
result = list(
|
1905
|
-
yield_rows_as_dataclasses(
|
1906
|
-
df, Row, check_types=check_types, globalns=globals()
|
1907
|
-
)
|
1908
|
-
)
|
1909
|
-
expected = [Row(x="true"), Row(x="false"), Row(x="true")]
|
1910
|
-
assert result == expected
|
1911
|
-
|
1912
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1913
|
-
def test_literal_type_nullable(
|
1914
|
-
self, *, check_types: Literal["none", "first", "all"]
|
1915
|
-
) -> None:
|
1916
|
-
df = DataFrame(
|
1917
|
-
data=[("true",), ("false",), (None,)], schema={"x": String}, orient="row"
|
1918
|
-
)
|
1919
|
-
|
1920
|
-
@dataclass(kw_only=True, slots=True)
|
1921
|
-
class Row:
|
1922
|
-
x: TruthLit | None = None
|
1923
|
-
|
1924
|
-
result = list(
|
1925
|
-
yield_rows_as_dataclasses(
|
1926
|
-
df, Row, globalns=globals(), check_types=check_types
|
1927
|
-
)
|
1928
|
-
)
|
1929
|
-
expected = [Row(x="true"), Row(x="false"), Row()]
|
1930
|
-
assert result == expected
|
1931
|
-
|
1932
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1933
|
-
def test_empty(self, *, check_types: Literal["none", "first", "all"]) -> None:
|
1934
|
-
df = DataFrame(data=[], schema={"x": Int64}, orient="row")
|
1935
|
-
|
1936
|
-
@dataclass(kw_only=True, slots=True)
|
1937
|
-
class Row:
|
1938
|
-
x: int
|
1939
|
-
|
1940
|
-
result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1941
|
-
expected = []
|
1942
|
-
assert result == expected
|
1943
|
-
|
1944
|
-
@given(check_types=sampled_from(["none", "first", "all"]))
|
1945
|
-
def test_error_superset(
|
1946
|
-
self, *, check_types: Literal["none", "first", "all"]
|
1947
|
-
) -> None:
|
1948
|
-
df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
|
1949
|
-
|
1950
|
-
@dataclass(kw_only=True, slots=True)
|
1951
|
-
class Row:
|
1952
|
-
y: int
|
1953
|
-
|
1954
|
-
with raises(
|
1955
|
-
_YieldRowsAsDataClassesColumnsSuperSetError,
|
1956
|
-
match="DataFrame columns .* must be a superset of dataclass fields .*; dataclass had extra fields .*",
|
1957
|
-
):
|
1958
|
-
_ = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1959
|
-
|
1960
|
-
@given(check_types=sampled_from(["first", "all"]))
|
1961
|
-
def test_error_first_or_all_wrong_type(
|
1962
|
-
self, *, check_types: Literal["first", "all"]
|
1963
|
-
) -> None:
|
1964
|
-
df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
|
1965
|
-
|
1966
|
-
@dataclass(kw_only=True, slots=True)
|
1967
|
-
class Row:
|
1968
|
-
x: str
|
1969
|
-
|
1970
|
-
with raises(
|
1971
|
-
_YieldRowsAsDataClassesWrongTypeError,
|
1972
|
-
match='wrong value type for field "x" - should be "str" instead of value "1" of type "int"',
|
1973
|
-
):
|
1974
|
-
_ = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
|
1975
|
-
|
1976
|
-
def test_error_all_wrong_type(self) -> None:
|
1977
|
-
df = DataFrame(data=[(1,), (None,), (3,)], schema={"x": Int64}, orient="row")
|
1978
|
-
|
1979
|
-
@dataclass(kw_only=True, slots=True)
|
1980
|
-
class Row:
|
1981
|
-
x: int
|
1982
|
-
|
1983
|
-
with raises(
|
1984
|
-
_YieldRowsAsDataClassesWrongTypeError,
|
1985
|
-
match='wrong value type for field "x" - should be "int" instead of value "None" of type "NoneType"',
|
1986
|
-
):
|
1987
|
-
_ = list(yield_rows_as_dataclasses(df, Row, check_types="all"))
|
1988
|
-
|
1989
|
-
|
1990
1806
|
class TestYieldStructSeriesDataclasses:
|
1991
1807
|
def test_main(self) -> None:
|
1992
1808
|
@dataclass(kw_only=True, slots=True)
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
3
3
|
import re
|
4
4
|
from dataclasses import dataclass
|
5
5
|
from re import DOTALL
|
6
|
-
from typing import TYPE_CHECKING
|
6
|
+
from typing import TYPE_CHECKING, Literal
|
7
7
|
|
8
8
|
from hypothesis import given
|
9
9
|
from hypothesis.strategies import DataObject, booleans, data, integers, sampled_from
|
@@ -87,6 +87,22 @@ class TestLoadSettings:
|
|
87
87
|
expected = Settings(key=value)
|
88
88
|
assert settings == expected
|
89
89
|
|
90
|
+
@given(root=git_repos(), value=sampled_from(["true", "false"]))
|
91
|
+
@settings_with_reduced_examples()
|
92
|
+
def test_literal_value(
|
93
|
+
self, *, root: Path, value: Literal["true", "false"]
|
94
|
+
) -> None:
|
95
|
+
@dataclass(kw_only=True, slots=True)
|
96
|
+
class Settings:
|
97
|
+
key: Literal["true", "false"]
|
98
|
+
|
99
|
+
with root.joinpath(".env").open(mode="w") as fh:
|
100
|
+
_ = fh.write(f"key = {value}\n")
|
101
|
+
|
102
|
+
settings = load_settings(Settings, cwd=root)
|
103
|
+
expected = Settings(key=value)
|
104
|
+
assert settings == expected
|
105
|
+
|
90
106
|
@given(root=git_repos())
|
91
107
|
@settings_with_reduced_examples()
|
92
108
|
def test_error_file_not_found(self, *, root: Path) -> None:
|
@@ -33,7 +33,10 @@ from tests.test_typing_funcs.with_future import (
|
|
33
33
|
DataClassFutureSentinel,
|
34
34
|
DataClassFutureStr,
|
35
35
|
DataClassFutureTimeDelta,
|
36
|
+
DataClassFutureTypeLiteral,
|
36
37
|
DataClassFutureUUID,
|
38
|
+
TrueOrFalseFutureLit,
|
39
|
+
TrueOrFalseFutureTypeLit,
|
37
40
|
)
|
38
41
|
from utilities.sentinel import Sentinel
|
39
42
|
from utilities.types import LogLevel, Parallelism
|
@@ -163,6 +166,18 @@ class TestGetTypeHints:
|
|
163
166
|
expected = {"ints": list[int]}
|
164
167
|
assert hints == expected
|
165
168
|
|
169
|
+
@given(data=data())
|
170
|
+
def test_literal(self, *, data: DataObject) -> None:
|
171
|
+
@dataclass(kw_only=True, slots=True)
|
172
|
+
class Example:
|
173
|
+
truth: TrueOrFalseFutureLit
|
174
|
+
|
175
|
+
cls = data.draw(sampled_from([Example, DataClassFutureLiteral]))
|
176
|
+
localns = data.draw(just(locals()) | none())
|
177
|
+
hints = get_type_hints(cls, globalns=globals(), localns=localns)
|
178
|
+
expected = {"truth": TrueOrFalseFutureLit}
|
179
|
+
assert hints == expected
|
180
|
+
|
166
181
|
def test_nested_local(self) -> None:
|
167
182
|
@dataclass(kw_only=True, slots=True)
|
168
183
|
class Outer:
|
@@ -200,19 +215,6 @@ class TestGetTypeHints:
|
|
200
215
|
expected = {"inner": DataClassFutureNestedOuterFirstInner}
|
201
216
|
assert hints == expected
|
202
217
|
|
203
|
-
@given(data=data())
|
204
|
-
def test_literal(self, *, data: DataObject) -> None:
|
205
|
-
@dataclass(kw_only=True, slots=True)
|
206
|
-
class Example:
|
207
|
-
truth: Literal["true", "false"]
|
208
|
-
|
209
|
-
cls = data.draw(sampled_from([Example, DataClassFutureLiteral]))
|
210
|
-
globalns = data.draw(just(globals()) | none())
|
211
|
-
localns = data.draw(just(locals()) | none())
|
212
|
-
hints = get_type_hints(cls, globalns=globalns, localns=localns)
|
213
|
-
expected = {"truth": Literal["true", "false"]}
|
214
|
-
assert hints == expected
|
215
|
-
|
216
218
|
@given(data=data())
|
217
219
|
def test_none(self, *, data: DataObject) -> None:
|
218
220
|
@dataclass(kw_only=True, slots=True)
|
@@ -278,6 +280,18 @@ class TestGetTypeHints:
|
|
278
280
|
expected = {"timedelta": dt.timedelta}
|
279
281
|
assert hints == expected
|
280
282
|
|
283
|
+
@given(data=data())
|
284
|
+
def test_type_literal(self, *, data: DataObject) -> None:
|
285
|
+
@dataclass(kw_only=True, slots=True)
|
286
|
+
class Example:
|
287
|
+
truth: TrueOrFalseFutureTypeLit
|
288
|
+
|
289
|
+
cls = data.draw(sampled_from([Example, DataClassFutureTypeLiteral]))
|
290
|
+
localns = data.draw(just(locals()) | none())
|
291
|
+
hints = get_type_hints(cls, globalns=globals(), localns=localns)
|
292
|
+
expected = {"truth": TrueOrFalseFutureTypeLit}
|
293
|
+
assert hints == expected
|
294
|
+
|
281
295
|
@given(data=data())
|
282
296
|
def test_uuid(self, *, data: DataObject) -> None:
|
283
297
|
@dataclass(kw_only=True, slots=True)
|
{dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/with_future.py
RENAMED
@@ -1,18 +1,18 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from dataclasses import dataclass, field
|
4
|
-
from typing import TYPE_CHECKING, override
|
4
|
+
from typing import TYPE_CHECKING, Literal, override
|
5
5
|
|
6
6
|
if TYPE_CHECKING:
|
7
7
|
import datetime as dt
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import Literal
|
10
9
|
from uuid import UUID
|
11
10
|
|
12
11
|
from utilities.sentinel import Sentinel
|
13
12
|
|
14
13
|
|
15
|
-
|
14
|
+
TrueOrFalseFutureLit = Literal["true", "false"]
|
15
|
+
type TrueOrFalseFutureTypeLit = Literal["true", "false"]
|
16
16
|
|
17
17
|
|
18
18
|
@dataclass(order=True, kw_only=True)
|
@@ -71,12 +71,12 @@ class DataClassFutureListIntsDefault:
|
|
71
71
|
|
72
72
|
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
73
73
|
class DataClassFutureLiteral:
|
74
|
-
truth:
|
74
|
+
truth: TrueOrFalseFutureLit
|
75
75
|
|
76
76
|
|
77
77
|
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
78
78
|
class DataClassFutureLiteralNullable:
|
79
|
-
truth:
|
79
|
+
truth: TrueOrFalseFutureLit | None = None
|
80
80
|
|
81
81
|
|
82
82
|
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
@@ -131,12 +131,12 @@ class DataClassFutureTimeDelta:
|
|
131
131
|
|
132
132
|
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
133
133
|
class DataClassFutureTypeLiteral:
|
134
|
-
truth:
|
134
|
+
truth: TrueOrFalseFutureTypeLit
|
135
135
|
|
136
136
|
|
137
137
|
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
138
138
|
class DataClassFutureTypeLiteralNullable:
|
139
|
-
truth:
|
139
|
+
truth: TrueOrFalseFutureTypeLit | None = None
|
140
140
|
|
141
141
|
|
142
142
|
@dataclass(order=True, unsafe_hash=True, kw_only=True)
|
@@ -6,7 +6,7 @@ from dataclasses import dataclass
|
|
6
6
|
from enum import Enum
|
7
7
|
from pathlib import Path
|
8
8
|
from types import NoneType
|
9
|
-
from typing import Any,
|
9
|
+
from typing import Any, override
|
10
10
|
|
11
11
|
from utilities.datetime import is_subclass_date_not_datetime
|
12
12
|
from utilities.enum import ParseEnumError, parse_enum
|
@@ -14,7 +14,7 @@ from utilities.functions import is_subclass_int_not_bool
|
|
14
14
|
from utilities.iterables import one, one_str
|
15
15
|
from utilities.sentinel import ParseSentinelError, Sentinel, parse_sentinel
|
16
16
|
from utilities.text import ParseBoolError, ParseNoneError, parse_bool, parse_none
|
17
|
-
from utilities.typing import is_literal_type, is_optional_type
|
17
|
+
from utilities.typing import get_args, is_literal_type, is_optional_type
|
18
18
|
from utilities.version import ParseVersionError, Version, parse_version
|
19
19
|
|
20
20
|
|