dycw-utilities 0.109.23__tar.gz → 0.109.25__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.23 → dycw_utilities-0.109.25}/PKG-INFO +1 -1
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/pyproject.toml +2 -2
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_iterables.py +5 -1
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pqdm.py +3 -3
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_text.py +68 -13
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/click.py +35 -51
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/dataclasses.py +3 -5
- dycw_utilities-0.109.25/src/utilities/text.py +249 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/types.py +2 -0
- dycw_utilities-0.109.23/src/utilities/text.py +0 -139
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/.gitignore +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/LICENSE +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/README.md +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/git.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/http.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/math.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/os.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/period.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/random.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/re.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/version.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/zoneinfo.py +0 -0
@@ -93,7 +93,7 @@ dependencies = [
|
|
93
93
|
name = "dycw-utilities"
|
94
94
|
readme = "README.md"
|
95
95
|
requires-python = ">= 3.12"
|
96
|
-
version = "0.109.
|
96
|
+
version = "0.109.25"
|
97
97
|
|
98
98
|
[project.optional-dependencies]
|
99
99
|
test = [
|
@@ -336,7 +336,7 @@ zzz-test-zoneinfo = [
|
|
336
336
|
# bump-my-version
|
337
337
|
[tool.bumpversion]
|
338
338
|
allow_dirty = true
|
339
|
-
current_version = "0.109.
|
339
|
+
current_version = "0.109.25"
|
340
340
|
|
341
341
|
[[tool.bumpversion.files]]
|
342
342
|
filename = "src/utilities/__init__.py"
|
@@ -4,7 +4,7 @@ import re
|
|
4
4
|
from dataclasses import dataclass, replace
|
5
5
|
from enum import Enum, auto
|
6
6
|
from itertools import chain, repeat
|
7
|
-
from math import isfinite, isinf, isnan
|
7
|
+
from math import isfinite, isinf, isnan, nan
|
8
8
|
from operator import add, neg, sub
|
9
9
|
from re import DOTALL
|
10
10
|
from typing import TYPE_CHECKING, Any, ClassVar, override
|
@@ -1359,6 +1359,10 @@ class TestSortIterablesCmpFloats:
|
|
1359
1359
|
if isnan(x) is not isnan(y):
|
1360
1360
|
assert result1 != result2
|
1361
1361
|
|
1362
|
+
def test_nan_vs_nan(self) -> None:
|
1363
|
+
result = _sort_iterable_cmp_floats(nan, nan)
|
1364
|
+
assert result == 0
|
1365
|
+
|
1362
1366
|
|
1363
1367
|
class TestSumMappings:
|
1364
1368
|
@given(mappings=lists(dictionaries(text_ascii(), integers())))
|
@@ -14,11 +14,11 @@ from utilities.hypothesis import int32s, pairs, settings_with_reduced_examples
|
|
14
14
|
from utilities.iterables import transpose
|
15
15
|
from utilities.pqdm import _get_desc, pqdm_map, pqdm_starmap
|
16
16
|
from utilities.sentinel import Sentinel, sentinel
|
17
|
-
from utilities.types import Parallelism
|
17
|
+
from utilities.types import Parallelism, StrStrMapping
|
18
18
|
from utilities.typing import get_args
|
19
19
|
|
20
20
|
if TYPE_CHECKING:
|
21
|
-
from collections.abc import Callable
|
21
|
+
from collections.abc import Callable
|
22
22
|
|
23
23
|
|
24
24
|
class TestGetDesc:
|
@@ -36,7 +36,7 @@ class TestGetDesc:
|
|
36
36
|
*,
|
37
37
|
desc: str | None | Sentinel,
|
38
38
|
func: Callable[..., Any],
|
39
|
-
expected:
|
39
|
+
expected: StrStrMapping,
|
40
40
|
) -> None:
|
41
41
|
assert _get_desc(desc, func) == expected
|
42
42
|
|
@@ -1,32 +1,41 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
3
5
|
from hypothesis import given
|
4
6
|
from hypothesis.strategies import (
|
5
7
|
DataObject,
|
6
8
|
booleans,
|
7
9
|
data,
|
8
10
|
integers,
|
11
|
+
just,
|
9
12
|
lists,
|
13
|
+
none,
|
10
14
|
sampled_from,
|
11
15
|
sets,
|
12
16
|
)
|
13
17
|
from pytest import mark, param, raises
|
14
18
|
|
15
19
|
from utilities.hypothesis import text_ascii
|
16
|
-
from utilities.sentinel import sentinel
|
17
20
|
from utilities.text import (
|
18
21
|
ParseBoolError,
|
19
22
|
ParseNoneError,
|
23
|
+
SplitKeyValuePairsError,
|
24
|
+
SplitStrError,
|
20
25
|
join_strs,
|
21
26
|
parse_bool,
|
22
27
|
parse_none,
|
23
28
|
repr_encode,
|
24
29
|
snake_case,
|
30
|
+
split_key_value_pairs,
|
25
31
|
split_str,
|
26
32
|
str_encode,
|
27
33
|
strip_and_dedent,
|
28
34
|
)
|
29
35
|
|
36
|
+
if TYPE_CHECKING:
|
37
|
+
from collections.abc import Sequence
|
38
|
+
|
30
39
|
|
31
40
|
class TestParseBool:
|
32
41
|
@given(data=data(), value=booleans())
|
@@ -66,20 +75,60 @@ class TestReprEncode:
|
|
66
75
|
assert result == expected
|
67
76
|
|
68
77
|
|
78
|
+
class TestSplitKeyValuePairs:
|
79
|
+
@given(
|
80
|
+
case=sampled_from([
|
81
|
+
("", []),
|
82
|
+
("a=1", [("a", "1")]),
|
83
|
+
("a=1,b=22", [("a", "1"), ("b", "22")]),
|
84
|
+
("a=1,b=22,c=333", [("a", "1"), ("b", "22"), ("c", "333")]),
|
85
|
+
("=1", [("", "1")]),
|
86
|
+
("a=", [("a", "")]),
|
87
|
+
("a=1,=22,c=333", [("a", "1"), ("", "22"), ("c", "333")]),
|
88
|
+
("a=1,b=,c=333", [("a", "1"), ("b", ""), ("c", "333")]),
|
89
|
+
])
|
90
|
+
)
|
91
|
+
def test_main(self, *, case: tuple[str, Sequence[tuple[str, str]]]) -> None:
|
92
|
+
text, expected = case
|
93
|
+
result = split_key_value_pairs(text)
|
94
|
+
assert result == expected
|
95
|
+
|
96
|
+
def test_mapping(self) -> None:
|
97
|
+
result = split_key_value_pairs("a=1,b=22,c=333", mapping=True)
|
98
|
+
expected = {"a": "1", "b": "22", "c": "333"}
|
99
|
+
assert result == expected
|
100
|
+
|
101
|
+
def test_error(self) -> None:
|
102
|
+
with raises(
|
103
|
+
SplitKeyValuePairsError,
|
104
|
+
match=r"Unable to split 'a=1,a=22,a=333' into a mapping since there are duplicate keys; got \{'a': 3\}",
|
105
|
+
):
|
106
|
+
_ = split_key_value_pairs("a=1,a=22,a=333", mapping=True)
|
107
|
+
|
108
|
+
|
69
109
|
class TestSplitStrAndJoinStr:
|
70
|
-
@
|
71
|
-
(
|
72
|
-
[
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
110
|
+
@given(
|
111
|
+
data=data(),
|
112
|
+
case=sampled_from([
|
113
|
+
("", 0, []),
|
114
|
+
(r"\,", 1, [""]),
|
115
|
+
(",", 2, ["", ""]),
|
116
|
+
(",,", 3, ["", "", ""]),
|
117
|
+
("1", 1, ["1"]),
|
118
|
+
("1,22", 2, ["1", "22"]),
|
119
|
+
("1,22,333", 3, ["1", "22", "333"]),
|
120
|
+
("1,,333", 3, ["1", "", "333"]),
|
121
|
+
]),
|
79
122
|
)
|
80
|
-
def test_main(self, *,
|
81
|
-
|
82
|
-
|
123
|
+
def test_main(self, *, case: tuple[str, int, list[str]], data: DataObject) -> None:
|
124
|
+
text, n, expected = case
|
125
|
+
n_use = data.draw(just(n) | none())
|
126
|
+
result = split_str(text, n=n_use)
|
127
|
+
if n_use is None:
|
128
|
+
assert result == expected
|
129
|
+
else:
|
130
|
+
assert result == tuple(expected)
|
131
|
+
assert join_strs(result) == text
|
83
132
|
|
84
133
|
@given(texts=lists(text_ascii()))
|
85
134
|
def test_generic(self, *, texts: list[str]) -> None:
|
@@ -89,6 +138,12 @@ class TestSplitStrAndJoinStr:
|
|
89
138
|
def test_sort(self, *, texts: set[str]) -> None:
|
90
139
|
assert split_str(join_strs(texts, sort=True)) == sorted(texts)
|
91
140
|
|
141
|
+
def test_error(self) -> None:
|
142
|
+
with raises(
|
143
|
+
SplitStrError, match=r"Unable to split '1,22,333' into 4 part\(s\); got 3"
|
144
|
+
):
|
145
|
+
_ = split_str("1,22,333", n=4)
|
146
|
+
|
92
147
|
|
93
148
|
class TestSnakeCase:
|
94
149
|
@given(
|
@@ -21,7 +21,6 @@ from utilities.datetime import EnsureMonthError, MonthLike, ensure_month
|
|
21
21
|
from utilities.enum import EnsureEnumError, ensure_enum
|
22
22
|
from utilities.functions import EnsureStrError, ensure_str, get_class_name
|
23
23
|
from utilities.iterables import is_iterable_not_str
|
24
|
-
from utilities.sentinel import SENTINEL_REPR
|
25
24
|
from utilities.text import split_str
|
26
25
|
from utilities.types import (
|
27
26
|
DateLike,
|
@@ -245,13 +244,10 @@ class ZonedDateTime(ParamType):
|
|
245
244
|
class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
|
246
245
|
"""A frozenset-valued parameter."""
|
247
246
|
|
248
|
-
def __init__(
|
249
|
-
self, param: _TParam, /, *, separator: str = ",", empty: str = SENTINEL_REPR
|
250
|
-
) -> None:
|
247
|
+
def __init__(self, param: _TParam, /, *, separator: str = ",") -> None:
|
251
248
|
self.name = f"FROZENSET[{param.name}]"
|
252
249
|
self._param = param
|
253
250
|
self._separator = separator
|
254
|
-
self._empty = empty
|
255
251
|
super().__init__()
|
256
252
|
|
257
253
|
@override
|
@@ -273,7 +269,7 @@ class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
|
|
273
269
|
text = ensure_str(value)
|
274
270
|
except EnsureStrError as error:
|
275
271
|
return self.fail(str(error), param=param, ctx=ctx)
|
276
|
-
values = split_str(text, separator=self._separator
|
272
|
+
values = split_str(text, separator=self._separator)
|
277
273
|
return frozenset(self._param.convert(v, param, ctx) for v in values)
|
278
274
|
|
279
275
|
@override
|
@@ -290,15 +286,15 @@ class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
|
|
290
286
|
class FrozenSetBools(FrozenSetParameter[BoolParamType, str]):
|
291
287
|
"""A frozenset-of-bools-valued parameter."""
|
292
288
|
|
293
|
-
def __init__(self, *, separator: str = ","
|
294
|
-
super().__init__(BoolParamType(), separator=separator
|
289
|
+
def __init__(self, *, separator: str = ",") -> None:
|
290
|
+
super().__init__(BoolParamType(), separator=separator)
|
295
291
|
|
296
292
|
|
297
293
|
class FrozenSetDates(FrozenSetParameter[Date, dt.date]):
|
298
294
|
"""A frozenset-of-dates-valued parameter."""
|
299
295
|
|
300
|
-
def __init__(self, *, separator: str = ","
|
301
|
-
super().__init__(Date(), separator=separator
|
296
|
+
def __init__(self, *, separator: str = ",") -> None:
|
297
|
+
super().__init__(Date(), separator=separator)
|
302
298
|
|
303
299
|
|
304
300
|
class FrozenSetChoices(FrozenSetParameter[Choice, str]):
|
@@ -311,12 +307,9 @@ class FrozenSetChoices(FrozenSetParameter[Choice, str]):
|
|
311
307
|
*,
|
312
308
|
case_sensitive: bool = False,
|
313
309
|
separator: str = ",",
|
314
|
-
empty: str = SENTINEL_REPR,
|
315
310
|
) -> None:
|
316
311
|
super().__init__(
|
317
|
-
Choice(choices, case_sensitive=case_sensitive),
|
318
|
-
separator=separator,
|
319
|
-
empty=empty,
|
312
|
+
Choice(choices, case_sensitive=case_sensitive), separator=separator
|
320
313
|
)
|
321
314
|
|
322
315
|
|
@@ -330,46 +323,43 @@ class FrozenSetEnums(FrozenSetParameter[Enum[TEnum], TEnum]):
|
|
330
323
|
*,
|
331
324
|
case_sensitive: bool = False,
|
332
325
|
separator: str = ",",
|
333
|
-
empty: str = SENTINEL_REPR,
|
334
326
|
) -> None:
|
335
|
-
super().__init__(
|
336
|
-
Enum(enum, case_sensitive=case_sensitive), separator=separator, empty=empty
|
337
|
-
)
|
327
|
+
super().__init__(Enum(enum, case_sensitive=case_sensitive), separator=separator)
|
338
328
|
|
339
329
|
|
340
330
|
class FrozenSetFloats(FrozenSetParameter[FloatParamType, float]):
|
341
331
|
"""A frozenset-of-floats-valued parameter."""
|
342
332
|
|
343
|
-
def __init__(self, *, separator: str = ","
|
344
|
-
super().__init__(FloatParamType(), separator=separator
|
333
|
+
def __init__(self, *, separator: str = ",") -> None:
|
334
|
+
super().__init__(FloatParamType(), separator=separator)
|
345
335
|
|
346
336
|
|
347
337
|
class FrozenSetInts(FrozenSetParameter[IntParamType, int]):
|
348
338
|
"""A frozenset-of-ints-valued parameter."""
|
349
339
|
|
350
|
-
def __init__(self, *, separator: str = ","
|
351
|
-
super().__init__(IntParamType(), separator=separator
|
340
|
+
def __init__(self, *, separator: str = ",") -> None:
|
341
|
+
super().__init__(IntParamType(), separator=separator)
|
352
342
|
|
353
343
|
|
354
344
|
class FrozenSetMonths(FrozenSetParameter[Month, utilities.datetime.Month]):
|
355
345
|
"""A frozenset-of-months-valued parameter."""
|
356
346
|
|
357
|
-
def __init__(self, *, separator: str = ","
|
358
|
-
super().__init__(Month(), separator=separator
|
347
|
+
def __init__(self, *, separator: str = ",") -> None:
|
348
|
+
super().__init__(Month(), separator=separator)
|
359
349
|
|
360
350
|
|
361
351
|
class FrozenSetStrs(FrozenSetParameter[StringParamType, str]):
|
362
352
|
"""A frozenset-of-strs-valued parameter."""
|
363
353
|
|
364
|
-
def __init__(self, *, separator: str = ","
|
365
|
-
super().__init__(StringParamType(), separator=separator
|
354
|
+
def __init__(self, *, separator: str = ",") -> None:
|
355
|
+
super().__init__(StringParamType(), separator=separator)
|
366
356
|
|
367
357
|
|
368
358
|
class FrozenSetUUIDs(FrozenSetParameter[UUIDParameterType, UUID]):
|
369
359
|
"""A frozenset-of-UUIDs-valued parameter."""
|
370
360
|
|
371
|
-
def __init__(self, *, separator: str = ","
|
372
|
-
super().__init__(UUIDParameterType(), separator=separator
|
361
|
+
def __init__(self, *, separator: str = ",") -> None:
|
362
|
+
super().__init__(UUIDParameterType(), separator=separator)
|
373
363
|
|
374
364
|
|
375
365
|
# parameters - list
|
@@ -378,13 +368,10 @@ class FrozenSetUUIDs(FrozenSetParameter[UUIDParameterType, UUID]):
|
|
378
368
|
class ListParameter(ParamType, Generic[_TParam, _T]):
|
379
369
|
"""A list-valued parameter."""
|
380
370
|
|
381
|
-
def __init__(
|
382
|
-
self, param: _TParam, /, *, separator: str = ",", empty: str = SENTINEL_REPR
|
383
|
-
) -> None:
|
371
|
+
def __init__(self, param: _TParam, /, *, separator: str = ",") -> None:
|
384
372
|
self.name = f"LIST[{param.name}]"
|
385
373
|
self._param = param
|
386
374
|
self._separator = separator
|
387
|
-
self._empty = empty
|
388
375
|
super().__init__()
|
389
376
|
|
390
377
|
@override
|
@@ -406,7 +393,7 @@ class ListParameter(ParamType, Generic[_TParam, _T]):
|
|
406
393
|
text = ensure_str(value)
|
407
394
|
except EnsureStrError as error:
|
408
395
|
return self.fail(str(error), param=param, ctx=ctx)
|
409
|
-
values = split_str(text, separator=self._separator
|
396
|
+
values = split_str(text, separator=self._separator)
|
410
397
|
return [self._param.convert(v, param, ctx) for v in values]
|
411
398
|
|
412
399
|
@override
|
@@ -423,15 +410,15 @@ class ListParameter(ParamType, Generic[_TParam, _T]):
|
|
423
410
|
class ListBools(ListParameter[BoolParamType, str]):
|
424
411
|
"""A list-of-bools-valued parameter."""
|
425
412
|
|
426
|
-
def __init__(self, *, separator: str = ","
|
427
|
-
super().__init__(BoolParamType(), separator=separator
|
413
|
+
def __init__(self, *, separator: str = ",") -> None:
|
414
|
+
super().__init__(BoolParamType(), separator=separator)
|
428
415
|
|
429
416
|
|
430
417
|
class ListDates(ListParameter[Date, dt.date]):
|
431
418
|
"""A list-of-dates-valued parameter."""
|
432
419
|
|
433
|
-
def __init__(self, *, separator: str = ","
|
434
|
-
super().__init__(Date(), separator=separator
|
420
|
+
def __init__(self, *, separator: str = ",") -> None:
|
421
|
+
super().__init__(Date(), separator=separator)
|
435
422
|
|
436
423
|
|
437
424
|
class ListEnums(ListParameter[Enum[TEnum], TEnum]):
|
@@ -444,46 +431,43 @@ class ListEnums(ListParameter[Enum[TEnum], TEnum]):
|
|
444
431
|
*,
|
445
432
|
case_sensitive: bool = False,
|
446
433
|
separator: str = ",",
|
447
|
-
empty: str = SENTINEL_REPR,
|
448
434
|
) -> None:
|
449
|
-
super().__init__(
|
450
|
-
Enum(enum, case_sensitive=case_sensitive), separator=separator, empty=empty
|
451
|
-
)
|
435
|
+
super().__init__(Enum(enum, case_sensitive=case_sensitive), separator=separator)
|
452
436
|
|
453
437
|
|
454
438
|
class ListFloats(ListParameter[FloatParamType, float]):
|
455
439
|
"""A list-of-floats-valued parameter."""
|
456
440
|
|
457
|
-
def __init__(self, *, separator: str = ","
|
458
|
-
super().__init__(FloatParamType(), separator=separator
|
441
|
+
def __init__(self, *, separator: str = ",") -> None:
|
442
|
+
super().__init__(FloatParamType(), separator=separator)
|
459
443
|
|
460
444
|
|
461
445
|
class ListInts(ListParameter[IntParamType, int]):
|
462
446
|
"""A list-of-ints-valued parameter."""
|
463
447
|
|
464
|
-
def __init__(self, *, separator: str = ","
|
465
|
-
super().__init__(IntParamType(), separator=separator
|
448
|
+
def __init__(self, *, separator: str = ",") -> None:
|
449
|
+
super().__init__(IntParamType(), separator=separator)
|
466
450
|
|
467
451
|
|
468
452
|
class ListMonths(ListParameter[Month, utilities.datetime.Month]):
|
469
453
|
"""A list-of-months-valued parameter."""
|
470
454
|
|
471
|
-
def __init__(self, *, separator: str = ","
|
472
|
-
super().__init__(Month(), separator=separator
|
455
|
+
def __init__(self, *, separator: str = ",") -> None:
|
456
|
+
super().__init__(Month(), separator=separator)
|
473
457
|
|
474
458
|
|
475
459
|
class ListStrs(ListParameter[StringParamType, str]):
|
476
460
|
"""A list-of-strs-valued parameter."""
|
477
461
|
|
478
|
-
def __init__(self, *, separator: str = ","
|
479
|
-
super().__init__(StringParamType(), separator=separator
|
462
|
+
def __init__(self, *, separator: str = ",") -> None:
|
463
|
+
super().__init__(StringParamType(), separator=separator)
|
480
464
|
|
481
465
|
|
482
466
|
class ListUUIDs(ListParameter[UUIDParameterType, UUID]):
|
483
467
|
"""A list-of-UUIDs-valued parameter."""
|
484
468
|
|
485
|
-
def __init__(self, *, separator: str = ","
|
486
|
-
super().__init__(UUIDParameterType(), separator=separator
|
469
|
+
def __init__(self, *, separator: str = ",") -> None:
|
470
|
+
super().__init__(UUIDParameterType(), separator=separator)
|
487
471
|
|
488
472
|
|
489
473
|
# private
|
@@ -24,7 +24,7 @@ from utilities.iterables import OneStrEmptyError, OneStrNonUniqueError, one_str
|
|
24
24
|
from utilities.operator import is_equal
|
25
25
|
from utilities.parse import ParseTextError, parse_text
|
26
26
|
from utilities.sentinel import Sentinel, sentinel
|
27
|
-
from utilities.types import ParseTextExtra, TDataclass
|
27
|
+
from utilities.types import ParseTextExtra, StrStrMapping, TDataclass
|
28
28
|
from utilities.typing import get_type_hints
|
29
29
|
|
30
30
|
if TYPE_CHECKING:
|
@@ -444,7 +444,7 @@ class StrMappingToFieldMappingError(Exception):
|
|
444
444
|
|
445
445
|
|
446
446
|
def text_to_dataclass(
|
447
|
-
text_or_mapping: str |
|
447
|
+
text_or_mapping: str | StrStrMapping,
|
448
448
|
cls: type[TDataclass],
|
449
449
|
/,
|
450
450
|
*,
|
@@ -499,9 +499,7 @@ def text_to_dataclass(
|
|
499
499
|
)
|
500
500
|
|
501
501
|
|
502
|
-
def _text_to_dataclass_split_text(
|
503
|
-
text: str, cls: type[TDataclass], /
|
504
|
-
) -> Mapping[str, str]:
|
502
|
+
def _text_to_dataclass_split_text(text: str, cls: type[TDataclass], /) -> StrStrMapping:
|
505
503
|
pairs = (t for t in text.split(",") if t != "")
|
506
504
|
return dict(_text_to_dataclass_split_key_value_pair(pair, cls) for pair in pairs)
|
507
505
|
|