dycw-utilities 0.109.27__tar.gz → 0.109.29__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.109.27 → dycw_utilities-0.109.29}/PKG-INFO +1 -1
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/pyproject.toml +3 -2
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_datetime.py +1 -1
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_parse.py +138 -47
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/__init__.py +1 -1
- dycw_utilities-0.109.29/src/utilities/parse.py +536 -0
- dycw_utilities-0.109.27/src/utilities/parse.py +0 -212
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/.gitignore +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/LICENSE +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/README.md +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/click.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/git.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/http.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/math.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/os.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/period.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/random.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/re.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/text.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/types.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/version.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/zoneinfo.py +0 -0
@@ -40,6 +40,7 @@ dev = [
|
|
40
40
|
"optuna >= 4.3.0, < 4.4",
|
41
41
|
"orjson >= 3.10.16, < 3.11",
|
42
42
|
"pathvalidate >= 3.2.3, < 3.3",
|
43
|
+
"polars >= 1.27.1, < 1.28",
|
43
44
|
"polars-lts-cpu >= 1.27.1, < 1.28",
|
44
45
|
"polars-ols >= 0.3.5, < 0.4",
|
45
46
|
"pqdm >= 0.2.0, < 0.3",
|
@@ -93,7 +94,7 @@ dependencies = [
|
|
93
94
|
name = "dycw-utilities"
|
94
95
|
readme = "README.md"
|
95
96
|
requires-python = ">= 3.12"
|
96
|
-
version = "0.109.
|
97
|
+
version = "0.109.29"
|
97
98
|
|
98
99
|
[project.optional-dependencies]
|
99
100
|
test = [
|
@@ -336,7 +337,7 @@ zzz-test-zoneinfo = [
|
|
336
337
|
# bump-my-version
|
337
338
|
[tool.bumpversion]
|
338
339
|
allow_dirty = true
|
339
|
-
current_version = "0.109.
|
340
|
+
current_version = "0.109.29"
|
340
341
|
|
341
342
|
[[tool.bumpversion.files]]
|
342
343
|
filename = "src/utilities/__init__.py"
|
@@ -5,10 +5,21 @@ from collections.abc import Iterable
|
|
5
5
|
from dataclasses import dataclass
|
6
6
|
from pathlib import Path
|
7
7
|
from types import NoneType
|
8
|
-
from typing import Literal
|
8
|
+
from typing import Final, Literal
|
9
9
|
|
10
10
|
from hypothesis import given
|
11
|
-
from hypothesis.strategies import
|
11
|
+
from hypothesis.strategies import (
|
12
|
+
booleans,
|
13
|
+
dates,
|
14
|
+
dictionaries,
|
15
|
+
floats,
|
16
|
+
frozensets,
|
17
|
+
integers,
|
18
|
+
lists,
|
19
|
+
sampled_from,
|
20
|
+
sets,
|
21
|
+
times,
|
22
|
+
)
|
12
23
|
from pytest import raises
|
13
24
|
|
14
25
|
from tests.test_operator import TruthEnum
|
@@ -38,53 +49,53 @@ from utilities.parse import (
|
|
38
49
|
_ParseTextExtraNonUniqueError,
|
39
50
|
_ParseTextParseError,
|
40
51
|
parse_text,
|
52
|
+
to_text,
|
41
53
|
)
|
42
54
|
from utilities.sentinel import Sentinel, sentinel
|
43
55
|
from utilities.types import Duration, Number
|
44
56
|
from utilities.version import Version
|
45
|
-
from utilities.whenever import (
|
46
|
-
serialize_date,
|
47
|
-
serialize_datetime,
|
48
|
-
serialize_duration,
|
49
|
-
serialize_time,
|
50
|
-
serialize_timedelta,
|
51
|
-
)
|
52
57
|
|
53
58
|
|
54
|
-
class
|
59
|
+
class TestToAndParseText:
|
55
60
|
@given(value=booleans())
|
56
61
|
def test_bool(self, *, value: bool) -> None:
|
57
|
-
text =
|
62
|
+
text = to_text(value)
|
58
63
|
result = parse_text(bool, text)
|
59
64
|
assert result is value
|
60
65
|
|
61
66
|
@given(date=dates())
|
62
67
|
def test_date(self, *, date: dt.date) -> None:
|
63
|
-
text =
|
68
|
+
text = to_text(date)
|
64
69
|
result = parse_text(dt.date, text)
|
65
70
|
assert result == date
|
66
71
|
|
67
72
|
@given(datetime=local_datetimes() | zoned_datetimes())
|
68
73
|
def test_datetime(self, *, datetime: dt.datetime) -> None:
|
69
|
-
text =
|
74
|
+
text = to_text(datetime)
|
70
75
|
result = parse_text(dt.datetime, text)
|
71
76
|
assert result == datetime
|
72
77
|
|
78
|
+
@given(value=dictionaries(dates(), zoned_datetimes()))
|
79
|
+
def test_dict(self, *, value: dict[dt.date, dt.datetime]) -> None:
|
80
|
+
text = to_text(value)
|
81
|
+
result = parse_text(dict[dt.date, dt.datetime], text)
|
82
|
+
assert result == value
|
83
|
+
|
73
84
|
@given(duration=datetime_durations(two_way=True))
|
74
85
|
def test_duration(self, *, duration: Duration) -> None:
|
75
|
-
text =
|
86
|
+
text = to_text(duration)
|
76
87
|
result = parse_text(Duration, text)
|
77
88
|
assert result == duration
|
78
89
|
|
79
90
|
@given(truth=sampled_from(TruthEnum))
|
80
91
|
def test_enum(self, *, truth: TruthEnum) -> None:
|
81
|
-
text = truth
|
92
|
+
text = to_text(truth)
|
82
93
|
result = parse_text(TruthEnum, text)
|
83
94
|
assert result is truth
|
84
95
|
|
85
96
|
@given(value=integers())
|
86
97
|
def test_extra_type(self, *, value: int) -> None:
|
87
|
-
text =
|
98
|
+
text = to_text(value)
|
88
99
|
result = parse_text(
|
89
100
|
DataClassFutureInt,
|
90
101
|
text,
|
@@ -95,108 +106,126 @@ class TestParseText:
|
|
95
106
|
|
96
107
|
@given(value=floats())
|
97
108
|
def test_float(self, *, value: float) -> None:
|
98
|
-
text =
|
109
|
+
text = to_text(value)
|
99
110
|
result = parse_text(float, text)
|
100
111
|
assert is_equal(result, value)
|
101
112
|
|
113
|
+
@given(values=frozensets(dates()))
|
114
|
+
def test_frozenset(self, *, values: frozenset[dt.date]) -> None:
|
115
|
+
text = to_text(values)
|
116
|
+
result = parse_text(frozenset[dt.date], text)
|
117
|
+
assert result == values
|
118
|
+
|
102
119
|
@given(value=integers())
|
103
120
|
def test_int(self, *, value: int) -> None:
|
104
|
-
text =
|
121
|
+
text = to_text(value)
|
105
122
|
result = parse_text(int, text)
|
106
123
|
assert result == value
|
107
124
|
|
125
|
+
@given(values=lists(dates()))
|
126
|
+
def test_list(self, *, values: list[dt.date]) -> None:
|
127
|
+
text = to_text(values)
|
128
|
+
result = parse_text(list[dt.date], text)
|
129
|
+
assert result == values
|
130
|
+
|
108
131
|
@given(truth=sampled_from(["true", "false"]))
|
109
132
|
def test_literal(self, *, truth: Literal["true", "false"]) -> None:
|
110
133
|
result = parse_text(TrueOrFalseFutureLit, truth)
|
111
134
|
assert result == truth
|
112
135
|
|
113
136
|
def test_none(self) -> None:
|
114
|
-
text =
|
137
|
+
text = to_text(None)
|
115
138
|
result = parse_text(None, text)
|
116
139
|
assert result is None
|
117
140
|
|
118
141
|
def test_none_type(self) -> None:
|
119
|
-
text =
|
142
|
+
text = to_text(None)
|
120
143
|
result = parse_text(NoneType, text)
|
121
144
|
assert result is None
|
122
145
|
|
123
146
|
@given(number=numbers())
|
124
147
|
def test_number(self, *, number: Number) -> None:
|
125
|
-
text =
|
148
|
+
text = to_text(number)
|
126
149
|
result = parse_text(Number, text)
|
127
150
|
assert result == number
|
128
151
|
|
129
152
|
@given(path=paths())
|
130
153
|
def test_path(self, *, path: Path) -> None:
|
131
|
-
text =
|
154
|
+
text = to_text(path)
|
132
155
|
result = parse_text(Path, text)
|
133
156
|
assert result == path
|
134
157
|
|
135
158
|
@given(path=paths())
|
136
159
|
def test_path_expanded(self, *, path: Path) -> None:
|
137
160
|
path_use = Path("~", path)
|
138
|
-
text =
|
161
|
+
text = to_text(path_use)
|
139
162
|
result = ensure_path(parse_text(Path, text))
|
140
163
|
assert result == result.expanduser()
|
141
164
|
|
142
165
|
def test_nullable_number_none(self) -> None:
|
143
|
-
text =
|
166
|
+
text = to_text(None)
|
144
167
|
result = parse_text(Number | None, text)
|
145
168
|
assert result is None
|
146
169
|
|
147
170
|
@given(number=numbers())
|
148
171
|
def test_nullable_number_number(self, *, number: Number) -> None:
|
149
|
-
text =
|
172
|
+
text = to_text(number)
|
150
173
|
result = parse_text(Number | None, text)
|
151
174
|
assert result == number
|
152
175
|
|
153
176
|
def test_nullable_duration_none(self) -> None:
|
154
|
-
text =
|
177
|
+
text = to_text(None)
|
155
178
|
result = parse_text(Duration | None, text)
|
156
179
|
assert result is None
|
157
180
|
|
158
181
|
@given(duration=datetime_durations(two_way=True))
|
159
182
|
def test_nullable_duration_duration(self, *, duration: Duration) -> None:
|
160
|
-
text =
|
183
|
+
text = to_text(duration)
|
161
184
|
result = parse_text(Duration | None, text)
|
162
185
|
assert result == duration
|
163
186
|
|
164
187
|
def test_nullable_int_none(self) -> None:
|
165
|
-
text =
|
188
|
+
text = to_text(None)
|
166
189
|
result = parse_text(int | None, text)
|
167
190
|
assert result is None
|
168
191
|
|
169
192
|
@given(value=integers())
|
170
193
|
def test_nullable_int_int(self, *, value: int) -> None:
|
171
|
-
text =
|
194
|
+
text = to_text(value)
|
172
195
|
result = parse_text(int | None, text)
|
173
196
|
assert result == value
|
174
197
|
|
175
198
|
def test_sentinel(self) -> None:
|
176
|
-
text =
|
199
|
+
text = to_text(sentinel)
|
177
200
|
result = parse_text(Sentinel, text)
|
178
201
|
assert result is sentinel
|
179
202
|
|
203
|
+
@given(values=sets(dates()))
|
204
|
+
def test_set(self, *, values: set[dt.date]) -> None:
|
205
|
+
text = to_text(values)
|
206
|
+
result = parse_text(set[dt.date], text)
|
207
|
+
assert result == values
|
208
|
+
|
180
209
|
@given(text=text_ascii())
|
181
|
-
def
|
210
|
+
def test_to_text(self, *, text: str) -> None:
|
182
211
|
result = parse_text(str, text)
|
183
212
|
assert result == text
|
184
213
|
|
185
214
|
@given(time=times())
|
186
215
|
def test_time(self, *, time: dt.time) -> None:
|
187
|
-
text =
|
216
|
+
text = to_text(time)
|
188
217
|
result = parse_text(dt.time, text)
|
189
218
|
assert result == time
|
190
219
|
|
191
220
|
@given(timedelta=timedeltas_2w())
|
192
221
|
def test_timedelta(self, *, timedelta: dt.timedelta) -> None:
|
193
|
-
text =
|
222
|
+
text = to_text(timedelta)
|
194
223
|
result = parse_text(dt.timedelta, text)
|
195
224
|
assert result == timedelta
|
196
225
|
|
197
226
|
@given(x=integers(), y=integers())
|
198
227
|
def test_tuple(self, *, x: int, y: int) -> None:
|
199
|
-
text =
|
228
|
+
text = to_text((x, y))
|
200
229
|
result = parse_text(tuple[int, int], text)
|
201
230
|
assert result == (x, y)
|
202
231
|
|
@@ -217,7 +246,7 @@ class TestParseText:
|
|
217
246
|
case _:
|
218
247
|
raise ImpossibleCaseError(case=[f"{value=}"])
|
219
248
|
|
220
|
-
text =
|
249
|
+
text = to_text(value)
|
221
250
|
result = parse_text(
|
222
251
|
DataClassFutureIntEvenOrOddTypeUnion,
|
223
252
|
text,
|
@@ -244,7 +273,7 @@ class TestParseText:
|
|
244
273
|
case _:
|
245
274
|
raise ImpossibleCaseError(case=[f"{value=}"])
|
246
275
|
|
247
|
-
text =
|
276
|
+
text = to_text(value)
|
248
277
|
result = parse_text(
|
249
278
|
DataClassFutureIntEvenOrOddUnion,
|
250
279
|
text,
|
@@ -261,10 +290,12 @@ class TestParseText:
|
|
261
290
|
|
262
291
|
@given(version=versions())
|
263
292
|
def test_version(self, *, version: Version) -> None:
|
264
|
-
text =
|
293
|
+
text = to_text(version)
|
265
294
|
result = parse_text(Version, text)
|
266
295
|
assert result == version
|
267
296
|
|
297
|
+
|
298
|
+
class TestParseText:
|
268
299
|
def test_error_bool(self) -> None:
|
269
300
|
with raises(
|
270
301
|
_ParseTextParseError, match="Unable to parse <class 'bool'>; got 'invalid'"
|
@@ -285,6 +316,20 @@ class TestParseText:
|
|
285
316
|
):
|
286
317
|
_ = parse_text(dt.datetime, "invalid")
|
287
318
|
|
319
|
+
def test_error_dict_extract_group(self) -> None:
|
320
|
+
with raises(
|
321
|
+
_ParseTextParseError,
|
322
|
+
match=r"Unable to parse dict\[int, int\]; got 'invalid'",
|
323
|
+
):
|
324
|
+
_ = parse_text(dict[int, int], "invalid")
|
325
|
+
|
326
|
+
def test_error_dict_internal(self) -> None:
|
327
|
+
with raises(
|
328
|
+
_ParseTextParseError,
|
329
|
+
match=r"Unable to parse dict\[int, int\]; got '\{invalid=invalid\}'",
|
330
|
+
):
|
331
|
+
_ = parse_text(dict[int, int], "{invalid=invalid}")
|
332
|
+
|
288
333
|
def test_error_duration(self) -> None:
|
289
334
|
with raises(
|
290
335
|
_ParseTextParseError, match=r"Unable to parse Duration; got 'invalid'"
|
@@ -324,7 +369,7 @@ class TestParseText:
|
|
324
369
|
):
|
325
370
|
_ = parse_text(
|
326
371
|
Child,
|
327
|
-
|
372
|
+
to_text(value),
|
328
373
|
extra={
|
329
374
|
Parent1: lambda text: Child(x=int(text)),
|
330
375
|
Parent2: lambda text: Child(y=int(text)),
|
@@ -344,12 +389,39 @@ class TestParseText:
|
|
344
389
|
):
|
345
390
|
_ = parse_text(float, "invalid")
|
346
391
|
|
392
|
+
def test_error_frozenset_extract_group(self) -> None:
|
393
|
+
with raises(
|
394
|
+
_ParseTextParseError,
|
395
|
+
match=r"Unable to parse frozenset\[int\]; got 'invalid'",
|
396
|
+
):
|
397
|
+
_ = parse_text(frozenset[int], "invalid")
|
398
|
+
|
399
|
+
def test_error_frozenset_internal(self) -> None:
|
400
|
+
with raises(
|
401
|
+
_ParseTextParseError,
|
402
|
+
match=r"Unable to parse frozenset\[int\]; got '\{invalid\}'",
|
403
|
+
):
|
404
|
+
_ = parse_text(frozenset[int], "{invalid}")
|
405
|
+
|
347
406
|
def test_error_int(self) -> None:
|
348
407
|
with raises(
|
349
408
|
_ParseTextParseError, match="Unable to parse <class 'int'>; got 'invalid'"
|
350
409
|
):
|
351
410
|
_ = parse_text(int, "invalid")
|
352
411
|
|
412
|
+
def test_error_list_extract_group(self) -> None:
|
413
|
+
with raises(
|
414
|
+
_ParseTextParseError, match=r"Unable to parse list\[int\]; got 'invalid'"
|
415
|
+
):
|
416
|
+
_ = parse_text(list[int], "invalid")
|
417
|
+
|
418
|
+
def test_error_list_internal(self) -> None:
|
419
|
+
with raises(
|
420
|
+
_ParseTextParseError,
|
421
|
+
match=r"Unable to parse list\[int\]; got '\[invalid\]'",
|
422
|
+
):
|
423
|
+
_ = parse_text(list[int], "[invalid]")
|
424
|
+
|
353
425
|
def test_error_none(self) -> None:
|
354
426
|
with raises(_ParseTextParseError, match="Unable to parse None; got 'invalid'"):
|
355
427
|
_ = parse_text(None, "invalid")
|
@@ -387,6 +459,18 @@ class TestParseText:
|
|
387
459
|
):
|
388
460
|
_ = parse_text(Sentinel, "invalid")
|
389
461
|
|
462
|
+
def test_error_set_extract_group(self) -> None:
|
463
|
+
with raises(
|
464
|
+
_ParseTextParseError, match=r"Unable to parse set\[int\]; got 'invalid'"
|
465
|
+
):
|
466
|
+
_ = parse_text(set[int], "invalid")
|
467
|
+
|
468
|
+
def test_error_set_internal(self) -> None:
|
469
|
+
with raises(
|
470
|
+
_ParseTextParseError, match=r"Unable to parse set\[int\]; got '\{invalid\}'"
|
471
|
+
):
|
472
|
+
_ = parse_text(set[int], "{invalid}")
|
473
|
+
|
390
474
|
def test_error_time(self) -> None:
|
391
475
|
with raises(
|
392
476
|
_ParseTextParseError,
|
@@ -401,34 +485,35 @@ class TestParseText:
|
|
401
485
|
):
|
402
486
|
_ = parse_text(dt.timedelta, "invalid")
|
403
487
|
|
404
|
-
def
|
488
|
+
def test_error_tuple_extract_group(self) -> None:
|
405
489
|
with raises(
|
406
490
|
_ParseTextParseError,
|
407
491
|
match=r"Unable to parse tuple\[int, int\]; got 'invalid'",
|
408
492
|
):
|
409
493
|
_ = parse_text(tuple[int, int], "invalid")
|
410
494
|
|
411
|
-
def
|
495
|
+
def test_error_tuple_internal(self) -> None:
|
412
496
|
with raises(
|
413
497
|
_ParseTextParseError,
|
414
|
-
match=r"Unable to parse tuple\[int, int\]; got '\(
|
498
|
+
match=r"Unable to parse tuple\[int, int\]; got '\(invalid,invalid\)'",
|
415
499
|
):
|
416
|
-
_ = parse_text(tuple[int, int], "(
|
500
|
+
_ = parse_text(tuple[int, int], "(invalid,invalid)")
|
417
501
|
|
418
|
-
def
|
502
|
+
def test_error_tuple_inconsistent_args_and_texts(self) -> None:
|
419
503
|
with raises(
|
420
|
-
_ParseTextParseError,
|
504
|
+
_ParseTextParseError,
|
505
|
+
match=r"Unable to parse tuple\[int, int\]; got '\(text1, text2, text3\)'",
|
421
506
|
):
|
422
|
-
_ = parse_text(int
|
507
|
+
_ = parse_text(tuple[int, int], "(text1, text2, text3)")
|
423
508
|
|
424
|
-
def
|
509
|
+
def test_error_type_not_implemented(self) -> None:
|
425
510
|
with raises(
|
426
511
|
_ParseTextParseError,
|
427
512
|
match=r"Unable to parse <class 'tests\.test_typing_funcs\.with_future\.DataClassFutureInt'>; got 'invalid'",
|
428
513
|
):
|
429
514
|
_ = parse_text(DataClassFutureInt, "invalid")
|
430
515
|
|
431
|
-
def
|
516
|
+
def test_error_union_not_implemented(self) -> None:
|
432
517
|
with raises(
|
433
518
|
_ParseTextParseError,
|
434
519
|
match=r"Unable to parse tests\.test_typing_funcs\.with_future\.DataClassFutureIntEven \| tests\.test_typing_funcs\.with_future\.DataClassFutureIntOdd; got 'invalid'",
|
@@ -441,3 +526,9 @@ class TestParseText:
|
|
441
526
|
match=r"Unable to parse <class 'utilities\.version\.Version'>; got 'invalid'",
|
442
527
|
):
|
443
528
|
_ = parse_text(Version, "invalid")
|
529
|
+
|
530
|
+
|
531
|
+
class TestToText:
|
532
|
+
def test_error_not_implemented(self) -> None:
|
533
|
+
with raises(NotImplementedError):
|
534
|
+
_ = to_text(Final)
|