dycw-utilities 0.126.11__tar.gz → 0.126.12__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.126.11 → dycw_utilities-0.126.12}/PKG-INFO +1 -1
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/pyproject.toml +2 -2
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio.py +3 -2
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_redis.py +33 -0
- dycw_utilities-0.126.12/src/tests/test_reprlib.py +87 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/__init__.py +1 -1
- dycw_utilities-0.126.12/src/utilities/reprlib.py +158 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/traceback.py +3 -5
- dycw_utilities-0.126.11/src/tests/test_reprlib.py +0 -38
- dycw_utilities-0.126.11/src/tests/test_rich.py +0 -24
- dycw_utilities-0.126.11/src/utilities/reprlib.py +0 -74
- dycw_utilities-0.126.11/src/utilities/rich.py +0 -74
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/.gitignore +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/LICENSE +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/README.md +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio_classes/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio_classes/loopers.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio_classes/redis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/click.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/git.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/http.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/math.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/os.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/period.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/random.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/re.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/string.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/text.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/types.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/version.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/zoneinfo.py +0 -0
@@ -94,7 +94,7 @@ dependencies = [
|
|
94
94
|
name = "dycw-utilities"
|
95
95
|
readme = "README.md"
|
96
96
|
requires-python = ">= 3.12"
|
97
|
-
version = "0.126.
|
97
|
+
version = "0.126.12"
|
98
98
|
|
99
99
|
[project.optional-dependencies]
|
100
100
|
test = [
|
@@ -334,7 +334,7 @@ zzz-test-zoneinfo = [
|
|
334
334
|
# bump-my-version
|
335
335
|
[tool.bumpversion]
|
336
336
|
allow_dirty = true
|
337
|
-
current_version = "0.126.
|
337
|
+
current_version = "0.126.12"
|
338
338
|
|
339
339
|
[[tool.bumpversion.files]]
|
340
340
|
filename = "src/utilities/__init__.py"
|
@@ -199,6 +199,7 @@ class TestEnhancedTaskGroup:
|
|
199
199
|
assert looper.running
|
200
200
|
assert not looper.running
|
201
201
|
|
202
|
+
@mark.flaky
|
202
203
|
async def test_max_tasks_disabled(self) -> None:
|
203
204
|
with Timer() as timer:
|
204
205
|
async with EnhancedTaskGroup() as tg:
|
@@ -611,8 +612,8 @@ class TestInfiniteLooper:
|
|
611
612
|
|
612
613
|
async with timeout(1.0), Parent(sleep_core=0.05) as parent:
|
613
614
|
...
|
614
|
-
assert
|
615
|
-
assert
|
615
|
+
assert 12 <= parent.counter <= 25
|
616
|
+
assert 12 <= parent.child.counter <= 25
|
616
617
|
|
617
618
|
async def test_error_default_event(self) -> None:
|
618
619
|
@dataclass(kw_only=True)
|
@@ -118,6 +118,7 @@ class TestIsMessage:
|
|
118
118
|
|
119
119
|
class TestPublish:
|
120
120
|
@given(data=lists(binary(min_size=1), min_size=1, max_size=5))
|
121
|
+
@mark.flaky
|
121
122
|
@settings(max_examples=1, phases={Phase.generate})
|
122
123
|
@SKIPIF_CI_AND_NOT_LINUX
|
123
124
|
async def test_bytes(self, *, data: Sequence[bytes]) -> None:
|
@@ -138,6 +139,7 @@ class TestPublish:
|
|
138
139
|
assert result == datum
|
139
140
|
|
140
141
|
@given(objects=lists(make_objects(), min_size=1, max_size=5))
|
142
|
+
@mark.flaky
|
141
143
|
@settings(max_examples=1, phases={Phase.generate})
|
142
144
|
@SKIPIF_CI_AND_NOT_LINUX
|
143
145
|
async def test_serializer(self, *, objects: Sequence[Any]) -> None:
|
@@ -157,6 +159,7 @@ class TestPublish:
|
|
157
159
|
assert is_equal(result, obj)
|
158
160
|
|
159
161
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
162
|
+
@mark.flaky
|
160
163
|
@settings(max_examples=1, phases={Phase.generate})
|
161
164
|
@SKIPIF_CI_AND_NOT_LINUX
|
162
165
|
async def test_text(self, *, messages: Sequence[str]) -> None:
|
@@ -183,6 +186,7 @@ class TestPublish:
|
|
183
186
|
|
184
187
|
class TestPublisher:
|
185
188
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
189
|
+
@mark.flaky
|
186
190
|
@settings(max_examples=1, phases={Phase.generate})
|
187
191
|
@SKIPIF_CI_AND_NOT_LINUX
|
188
192
|
async def test_main(self, *, messages: Sequence[str]) -> None:
|
@@ -210,6 +214,7 @@ class TestPublisher:
|
|
210
214
|
raise PublisherError(publisher=publisher)
|
211
215
|
|
212
216
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
217
|
+
@mark.flaky
|
213
218
|
@settings(max_examples=1, phases={Phase.generate})
|
214
219
|
@SKIPIF_CI_AND_NOT_LINUX
|
215
220
|
async def test_main_service(self, *, messages: Sequence[str]) -> None:
|
@@ -299,6 +304,7 @@ class TestPublishServiceMixin:
|
|
299
304
|
|
300
305
|
class TestRedisHashMapKey:
|
301
306
|
@given(key=int64s(), value=booleans())
|
307
|
+
@mark.flaky
|
302
308
|
@settings(max_examples=1, phases={Phase.generate})
|
303
309
|
@SKIPIF_CI_AND_NOT_LINUX
|
304
310
|
async def test_get_and_set_bool(self, *, key: int, value: bool) -> None:
|
@@ -308,6 +314,7 @@ class TestRedisHashMapKey:
|
|
308
314
|
assert await hm_key.get(redis, key) is value
|
309
315
|
|
310
316
|
@given(key=booleans() | int64s(), value=booleans())
|
317
|
+
@mark.flaky
|
311
318
|
@settings(max_examples=1, phases={Phase.generate})
|
312
319
|
@SKIPIF_CI_AND_NOT_LINUX
|
313
320
|
async def test_get_and_set_union_key(self, *, key: bool | int, value: bool) -> None:
|
@@ -317,6 +324,7 @@ class TestRedisHashMapKey:
|
|
317
324
|
assert await hm_key.get(redis, key) is value
|
318
325
|
|
319
326
|
@given(value=booleans())
|
327
|
+
@mark.flaky
|
320
328
|
@settings(max_examples=1, phases={Phase.generate})
|
321
329
|
@SKIPIF_CI_AND_NOT_LINUX
|
322
330
|
async def test_get_and_set_sentinel_key(self, *, value: bool) -> None:
|
@@ -331,6 +339,7 @@ class TestRedisHashMapKey:
|
|
331
339
|
assert await hm_key.get(redis, sentinel) is value
|
332
340
|
|
333
341
|
@given(key=int64s(), value=int64s() | booleans())
|
342
|
+
@mark.flaky
|
334
343
|
@settings(max_examples=1, phases={Phase.generate})
|
335
344
|
@SKIPIF_CI_AND_NOT_LINUX
|
336
345
|
async def test_get_and_set_union_value(
|
@@ -342,6 +351,7 @@ class TestRedisHashMapKey:
|
|
342
351
|
assert await hm_key.get(redis, key) == value
|
343
352
|
|
344
353
|
@given(key=int64s())
|
354
|
+
@mark.flaky
|
345
355
|
@settings(max_examples=1, phases={Phase.generate})
|
346
356
|
@SKIPIF_CI_AND_NOT_LINUX
|
347
357
|
async def test_get_and_set_sentinel_value(self, *, key: int) -> None:
|
@@ -364,6 +374,7 @@ class TestRedisHashMapKey:
|
|
364
374
|
assert await hm_key.get(redis, key) is sentinel
|
365
375
|
|
366
376
|
@given(data=data(), mapping=dictionaries(int64s(), booleans()))
|
377
|
+
@mark.flaky
|
367
378
|
@settings(max_examples=1, phases={Phase.generate})
|
368
379
|
@SKIPIF_CI_AND_NOT_LINUX
|
369
380
|
async def test_get_and_set_many(
|
@@ -380,6 +391,7 @@ class TestRedisHashMapKey:
|
|
380
391
|
assert await hm_key.get_many(redis, keys) == expected
|
381
392
|
|
382
393
|
@given(key=int64s(), value=booleans())
|
394
|
+
@mark.flaky
|
383
395
|
@settings(max_examples=1, phases={Phase.generate})
|
384
396
|
@SKIPIF_CI_AND_NOT_LINUX
|
385
397
|
async def test_delete(self, *, key: int, value: bool) -> None:
|
@@ -392,6 +404,7 @@ class TestRedisHashMapKey:
|
|
392
404
|
_ = await hm_key.get(redis, key)
|
393
405
|
|
394
406
|
@given(key=pairs(int64s()), value=booleans())
|
407
|
+
@mark.flaky
|
395
408
|
@settings(max_examples=1, phases={Phase.generate})
|
396
409
|
@SKIPIF_CI_AND_NOT_LINUX
|
397
410
|
async def test_delete_compound(self, *, key: tuple[int, int], value: bool) -> None:
|
@@ -404,6 +417,7 @@ class TestRedisHashMapKey:
|
|
404
417
|
_ = await hm_key.get(redis, key)
|
405
418
|
|
406
419
|
@given(key=int64s(), value=booleans())
|
420
|
+
@mark.flaky
|
407
421
|
@settings(max_examples=1, phases={Phase.generate})
|
408
422
|
@SKIPIF_CI_AND_NOT_LINUX
|
409
423
|
async def test_exists(self, *, key: int, value: bool) -> None:
|
@@ -414,6 +428,7 @@ class TestRedisHashMapKey:
|
|
414
428
|
assert await hm_key.exists(redis, key)
|
415
429
|
|
416
430
|
@given(key=pairs(int64s()), value=booleans())
|
431
|
+
@mark.flaky
|
417
432
|
@settings(max_examples=1, phases={Phase.generate})
|
418
433
|
@SKIPIF_CI_AND_NOT_LINUX
|
419
434
|
async def test_exists_compound(self, *, key: tuple[int, int], value: bool) -> None:
|
@@ -424,6 +439,7 @@ class TestRedisHashMapKey:
|
|
424
439
|
assert await hm_key.exists(redis, key)
|
425
440
|
|
426
441
|
@given(mapping=dictionaries(int64s(), booleans()))
|
442
|
+
@mark.flaky
|
427
443
|
@settings(max_examples=1, phases={Phase.generate})
|
428
444
|
@SKIPIF_CI_AND_NOT_LINUX
|
429
445
|
async def test_get_all(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -433,6 +449,7 @@ class TestRedisHashMapKey:
|
|
433
449
|
assert await hm_key.get_all(redis) == mapping
|
434
450
|
|
435
451
|
@given(mapping=dictionaries(int64s(), booleans()))
|
452
|
+
@mark.flaky
|
436
453
|
@settings(max_examples=1, phases={Phase.generate})
|
437
454
|
@SKIPIF_CI_AND_NOT_LINUX
|
438
455
|
async def test_keys(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -442,6 +459,7 @@ class TestRedisHashMapKey:
|
|
442
459
|
assert await hm_key.keys(redis) == list(mapping)
|
443
460
|
|
444
461
|
@given(mapping=dictionaries(int64s(), booleans()))
|
462
|
+
@mark.flaky
|
445
463
|
@settings(max_examples=1, phases={Phase.generate})
|
446
464
|
@SKIPIF_CI_AND_NOT_LINUX
|
447
465
|
async def test_length(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -451,6 +469,7 @@ class TestRedisHashMapKey:
|
|
451
469
|
assert await hm_key.length(redis) == len(mapping)
|
452
470
|
|
453
471
|
@given(key=int64s(), value=booleans())
|
472
|
+
@mark.flaky
|
454
473
|
@settings(max_examples=1, phases={Phase.generate})
|
455
474
|
@SKIPIF_CI_AND_NOT_LINUX
|
456
475
|
async def test_ttl(self, *, key: int, value: bool) -> None:
|
@@ -463,6 +482,7 @@ class TestRedisHashMapKey:
|
|
463
482
|
assert not await redis.exists(hm_key.name)
|
464
483
|
|
465
484
|
@given(mapping=dictionaries(int64s(), booleans()))
|
485
|
+
@mark.flaky
|
466
486
|
@settings(max_examples=1, phases={Phase.generate})
|
467
487
|
@SKIPIF_CI_AND_NOT_LINUX
|
468
488
|
async def test_values(self, *, mapping: Mapping[int, bool]) -> None:
|
@@ -474,6 +494,7 @@ class TestRedisHashMapKey:
|
|
474
494
|
|
475
495
|
class TestRedisKey:
|
476
496
|
@given(value=booleans())
|
497
|
+
@mark.flaky
|
477
498
|
@settings(max_examples=1, phases={Phase.generate})
|
478
499
|
@SKIPIF_CI_AND_NOT_LINUX
|
479
500
|
async def test_get_and_set_bool(self, *, value: bool) -> None:
|
@@ -483,6 +504,7 @@ class TestRedisKey:
|
|
483
504
|
assert await key.get(redis) is value
|
484
505
|
|
485
506
|
@given(value=booleans() | int64s())
|
507
|
+
@mark.flaky
|
486
508
|
@settings(max_examples=1, phases={Phase.generate})
|
487
509
|
@SKIPIF_CI_AND_NOT_LINUX
|
488
510
|
async def test_get_and_set_union(self, *, value: bool | int) -> None:
|
@@ -491,6 +513,7 @@ class TestRedisKey:
|
|
491
513
|
_ = await key.set(redis, value)
|
492
514
|
assert await key.get(redis) == value
|
493
515
|
|
516
|
+
@mark.flaky
|
494
517
|
@SKIPIF_CI_AND_NOT_LINUX
|
495
518
|
async def test_get_and_set_sentinel_with_serialize(self) -> None:
|
496
519
|
def serializer(sentinel: Sentinel, /) -> bytes:
|
@@ -508,6 +531,7 @@ class TestRedisKey:
|
|
508
531
|
assert await red_key.get(redis) is sentinel
|
509
532
|
|
510
533
|
@given(value=booleans())
|
534
|
+
@mark.flaky
|
511
535
|
@settings(max_examples=1, phases={Phase.generate})
|
512
536
|
@SKIPIF_CI_AND_NOT_LINUX
|
513
537
|
async def test_delete(self, *, value: bool) -> None:
|
@@ -520,6 +544,7 @@ class TestRedisKey:
|
|
520
544
|
_ = await key.get(redis)
|
521
545
|
|
522
546
|
@given(value=booleans())
|
547
|
+
@mark.flaky
|
523
548
|
@settings(max_examples=1, phases={Phase.generate})
|
524
549
|
@SKIPIF_CI_AND_NOT_LINUX
|
525
550
|
async def test_exists(self, *, value: bool) -> None:
|
@@ -530,6 +555,7 @@ class TestRedisKey:
|
|
530
555
|
assert await key.exists(redis)
|
531
556
|
|
532
557
|
@given(value=booleans())
|
558
|
+
@mark.flaky
|
533
559
|
@settings(max_examples=1, phases={Phase.generate})
|
534
560
|
@SKIPIF_CI_AND_NOT_LINUX
|
535
561
|
async def test_ttl(self, *, value: bool) -> None:
|
@@ -544,6 +570,7 @@ class TestRedisKey:
|
|
544
570
|
|
545
571
|
class TestSubscribe:
|
546
572
|
@given(messages=lists(binary(min_size=1), min_size=1, max_size=5))
|
573
|
+
@mark.flaky
|
547
574
|
@settings(max_examples=1, phases={Phase.generate})
|
548
575
|
@SKIPIF_CI_AND_NOT_LINUX
|
549
576
|
async def test_bytes(self, *, messages: Sequence[bytes]) -> None:
|
@@ -564,6 +591,7 @@ class TestSubscribe:
|
|
564
591
|
assert result == message
|
565
592
|
|
566
593
|
@given(objs=lists(make_objects(), min_size=1, max_size=5))
|
594
|
+
@mark.flaky
|
567
595
|
@settings(max_examples=1, phases={Phase.generate})
|
568
596
|
@SKIPIF_CI_AND_NOT_LINUX
|
569
597
|
async def test_deserialize(self, *, objs: Sequence[Any]) -> None:
|
@@ -587,6 +615,7 @@ class TestSubscribe:
|
|
587
615
|
short_messages=lists(text_ascii(max_size=4), min_size=1, max_size=5),
|
588
616
|
long_messages=lists(text_ascii(min_size=6), min_size=1, max_size=5),
|
589
617
|
)
|
618
|
+
@mark.flaky
|
590
619
|
@settings(max_examples=1, phases={Phase.generate})
|
591
620
|
@SKIPIF_CI_AND_NOT_LINUX
|
592
621
|
async def test_filter(
|
@@ -614,6 +643,7 @@ class TestSubscribe:
|
|
614
643
|
assert len(result) >= 3
|
615
644
|
|
616
645
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
646
|
+
@mark.flaky
|
617
647
|
@settings(max_examples=1, phases={Phase.generate})
|
618
648
|
@SKIPIF_CI_AND_NOT_LINUX
|
619
649
|
async def test_raw(self, *, messages: Sequence[str]) -> None:
|
@@ -637,6 +667,7 @@ class TestSubscribe:
|
|
637
667
|
assert result["data"] == message.encode()
|
638
668
|
|
639
669
|
@given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
|
670
|
+
@mark.flaky
|
640
671
|
@settings(max_examples=1, phases={Phase.generate})
|
641
672
|
@SKIPIF_CI_AND_NOT_LINUX
|
642
673
|
async def test_text(self, *, messages: Sequence[str]) -> None:
|
@@ -662,6 +693,7 @@ class TestSubscribe:
|
|
662
693
|
|
663
694
|
class TestSubscribeService:
|
664
695
|
@given(objects=lists(make_objects(), min_size=1, max_size=5))
|
696
|
+
@mark.flaky
|
665
697
|
@settings(max_examples=1, phases={Phase.generate})
|
666
698
|
@SKIPIF_CI_AND_NOT_LINUX
|
667
699
|
async def test_main(self, *, objects: list[str]) -> None:
|
@@ -679,6 +711,7 @@ class TestSubscribeService:
|
|
679
711
|
for result, obj in zip(results, objects, strict=True):
|
680
712
|
assert is_equal(result, obj)
|
681
713
|
|
714
|
+
@mark.flaky
|
682
715
|
@SKIPIF_CI_AND_NOT_LINUX
|
683
716
|
async def test_context_manager_already_subscribing(
|
684
717
|
self, *, caplog: LogCaptureFixture
|
@@ -0,0 +1,87 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from hypothesis import given
|
6
|
+
from hypothesis.strategies import sampled_from
|
7
|
+
|
8
|
+
from utilities.reprlib import (
|
9
|
+
get_call_args_mapping,
|
10
|
+
get_repr,
|
11
|
+
get_repr_and_class,
|
12
|
+
yield_call_args_repr,
|
13
|
+
yield_mapping_repr,
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
class TestGetCallArgsMapping:
|
18
|
+
def test_main(self) -> None:
|
19
|
+
mapping = get_call_args_mapping(1, 2, 3, x=4, y=5, z=6)
|
20
|
+
expected = {
|
21
|
+
"args[0]": 1,
|
22
|
+
"args[1]": 2,
|
23
|
+
"args[2]": 3,
|
24
|
+
"kwargs[x]": 4,
|
25
|
+
"kwargs[y]": 5,
|
26
|
+
"kwargs[z]": 6,
|
27
|
+
}
|
28
|
+
assert mapping == expected
|
29
|
+
|
30
|
+
|
31
|
+
class TestGetRepr:
|
32
|
+
@given(
|
33
|
+
case=sampled_from([
|
34
|
+
(None, "None"),
|
35
|
+
(0, "0"),
|
36
|
+
(
|
37
|
+
list(range(21)),
|
38
|
+
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +1]",
|
39
|
+
),
|
40
|
+
])
|
41
|
+
)
|
42
|
+
def test_main(self, *, case: tuple[Any, str]) -> None:
|
43
|
+
obj, expected = case
|
44
|
+
result = get_repr(obj)
|
45
|
+
assert result == expected
|
46
|
+
|
47
|
+
|
48
|
+
class TestGetReprAndClass:
|
49
|
+
@given(
|
50
|
+
case=sampled_from([
|
51
|
+
(None, "Object 'None' of type 'NoneType'"),
|
52
|
+
(0, "Object '0' of type 'int'"),
|
53
|
+
])
|
54
|
+
)
|
55
|
+
def test_main(self, *, case: tuple[Any, str]) -> None:
|
56
|
+
obj, expected = case
|
57
|
+
result = get_repr_and_class(obj)
|
58
|
+
assert result == expected
|
59
|
+
|
60
|
+
|
61
|
+
class TestYieldCallArgsRepr:
|
62
|
+
def test_main(self) -> None:
|
63
|
+
lines = list(
|
64
|
+
yield_call_args_repr(1, 2, list(range(100)), d=4, e=5, f=list(range(100)))
|
65
|
+
)
|
66
|
+
expected = [
|
67
|
+
"args[0] = 1",
|
68
|
+
"args[1] = 2",
|
69
|
+
"args[2] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
|
70
|
+
"kwargs[d] = 4",
|
71
|
+
"kwargs[e] = 5",
|
72
|
+
"kwargs[f] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
|
73
|
+
]
|
74
|
+
assert lines == expected
|
75
|
+
|
76
|
+
|
77
|
+
class TestYieldMappingRepr:
|
78
|
+
def test_main(self) -> None:
|
79
|
+
mapping = {"a": 1, "b": 2, "c": 3, "d": list(range(100))}
|
80
|
+
lines = list(yield_mapping_repr(mapping))
|
81
|
+
expected = [
|
82
|
+
"a = 1",
|
83
|
+
"b = 2",
|
84
|
+
"c = 3",
|
85
|
+
"d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
|
86
|
+
]
|
87
|
+
assert lines == expected
|
@@ -0,0 +1,158 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import reprlib
|
4
|
+
from functools import partial
|
5
|
+
from typing import TYPE_CHECKING, Any
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from collections.abc import Iterator
|
9
|
+
|
10
|
+
from utilities.types import StrMapping
|
11
|
+
|
12
|
+
RICH_MAX_WIDTH: int = 80
|
13
|
+
RICH_INDENT_SIZE: int = 4
|
14
|
+
RICH_MAX_LENGTH: int | None = 20
|
15
|
+
RICH_MAX_STRING: int | None = None
|
16
|
+
RICH_MAX_DEPTH: int | None = None
|
17
|
+
RICH_EXPAND_ALL: bool = False
|
18
|
+
|
19
|
+
|
20
|
+
##
|
21
|
+
|
22
|
+
|
23
|
+
def get_call_args_mapping(*args: Any, **kwargs: Any) -> StrMapping:
|
24
|
+
"""Get the representation of a set of call arguments."""
|
25
|
+
return {f"args[{i}]": v for i, v in enumerate(args)} | {
|
26
|
+
f"kwargs[{k}]": v for k, v in kwargs.items()
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
##
|
31
|
+
|
32
|
+
|
33
|
+
def get_repr(
|
34
|
+
obj: Any,
|
35
|
+
/,
|
36
|
+
*,
|
37
|
+
max_width: int = RICH_MAX_WIDTH,
|
38
|
+
indent_size: int = RICH_INDENT_SIZE,
|
39
|
+
max_length: int | None = RICH_MAX_LENGTH,
|
40
|
+
max_string: int | None = RICH_MAX_STRING,
|
41
|
+
max_depth: int | None = RICH_MAX_DEPTH,
|
42
|
+
expand_all: bool = RICH_EXPAND_ALL,
|
43
|
+
) -> str:
|
44
|
+
"""Get the representation of an object."""
|
45
|
+
try:
|
46
|
+
from rich.pretty import pretty_repr
|
47
|
+
except ModuleNotFoundError: # pragma: no cover
|
48
|
+
return reprlib.repr(obj)
|
49
|
+
return pretty_repr(
|
50
|
+
obj,
|
51
|
+
max_width=max_width,
|
52
|
+
indent_size=indent_size,
|
53
|
+
max_length=max_length,
|
54
|
+
max_string=max_string,
|
55
|
+
max_depth=max_depth,
|
56
|
+
expand_all=expand_all,
|
57
|
+
)
|
58
|
+
|
59
|
+
|
60
|
+
##
|
61
|
+
|
62
|
+
|
63
|
+
def get_repr_and_class(
|
64
|
+
obj: Any,
|
65
|
+
/,
|
66
|
+
*,
|
67
|
+
max_width: int = RICH_MAX_WIDTH,
|
68
|
+
indent_size: int = RICH_INDENT_SIZE,
|
69
|
+
max_length: int | None = RICH_MAX_LENGTH,
|
70
|
+
max_string: int | None = RICH_MAX_STRING,
|
71
|
+
max_depth: int | None = RICH_MAX_DEPTH,
|
72
|
+
expand_all: bool = RICH_EXPAND_ALL,
|
73
|
+
) -> str:
|
74
|
+
"""Get the `reprlib`-representation & class of an object."""
|
75
|
+
repr_use = get_repr(
|
76
|
+
obj,
|
77
|
+
max_width=max_width,
|
78
|
+
indent_size=indent_size,
|
79
|
+
max_length=max_length,
|
80
|
+
max_string=max_string,
|
81
|
+
max_depth=max_depth,
|
82
|
+
expand_all=expand_all,
|
83
|
+
)
|
84
|
+
return f"Object {repr_use!r} of type {type(obj).__name__!r}"
|
85
|
+
|
86
|
+
|
87
|
+
##
|
88
|
+
|
89
|
+
|
90
|
+
def yield_call_args_repr(
|
91
|
+
*args: Any,
|
92
|
+
_max_width: int = RICH_MAX_WIDTH,
|
93
|
+
_indent_size: int = RICH_INDENT_SIZE,
|
94
|
+
_max_length: int | None = RICH_MAX_LENGTH,
|
95
|
+
_max_string: int | None = RICH_MAX_STRING,
|
96
|
+
_max_depth: int | None = RICH_MAX_DEPTH,
|
97
|
+
_expand_all: bool = RICH_EXPAND_ALL,
|
98
|
+
**kwargs: Any,
|
99
|
+
) -> Iterator[str]:
|
100
|
+
"""Pretty print of a set of positional/keyword arguments."""
|
101
|
+
mapping = get_call_args_mapping(*args, **kwargs)
|
102
|
+
return yield_mapping_repr(
|
103
|
+
mapping,
|
104
|
+
_max_width=_max_width,
|
105
|
+
_indent_size=_indent_size,
|
106
|
+
_max_length=_max_length,
|
107
|
+
_max_string=_max_string,
|
108
|
+
_max_depth=_max_depth,
|
109
|
+
_expand_all=_expand_all,
|
110
|
+
)
|
111
|
+
|
112
|
+
|
113
|
+
##
|
114
|
+
|
115
|
+
|
116
|
+
def yield_mapping_repr(
|
117
|
+
mapping: StrMapping,
|
118
|
+
/,
|
119
|
+
*,
|
120
|
+
_max_width: int = RICH_MAX_WIDTH,
|
121
|
+
_indent_size: int = RICH_INDENT_SIZE,
|
122
|
+
_max_length: int | None = RICH_MAX_LENGTH,
|
123
|
+
_max_string: int | None = RICH_MAX_STRING,
|
124
|
+
_max_depth: int | None = RICH_MAX_DEPTH,
|
125
|
+
_expand_all: bool = RICH_EXPAND_ALL,
|
126
|
+
) -> Iterator[str]:
|
127
|
+
"""Pretty print of a set of keyword arguments."""
|
128
|
+
try:
|
129
|
+
from rich.pretty import pretty_repr
|
130
|
+
except ModuleNotFoundError: # pragma: no cover
|
131
|
+
repr_use = repr
|
132
|
+
else:
|
133
|
+
repr_use = partial(
|
134
|
+
pretty_repr,
|
135
|
+
max_width=_max_width,
|
136
|
+
indent_size=_indent_size,
|
137
|
+
max_length=_max_length,
|
138
|
+
max_string=_max_string,
|
139
|
+
max_depth=_max_depth,
|
140
|
+
expand_all=_expand_all,
|
141
|
+
)
|
142
|
+
for k, v in mapping.items():
|
143
|
+
yield f"{k} = {repr_use(v)}"
|
144
|
+
|
145
|
+
|
146
|
+
__all__ = [
|
147
|
+
"RICH_EXPAND_ALL",
|
148
|
+
"RICH_INDENT_SIZE",
|
149
|
+
"RICH_MAX_DEPTH",
|
150
|
+
"RICH_MAX_LENGTH",
|
151
|
+
"RICH_MAX_STRING",
|
152
|
+
"RICH_MAX_WIDTH",
|
153
|
+
"get_call_args_mapping",
|
154
|
+
"get_repr",
|
155
|
+
"get_repr_and_class",
|
156
|
+
"yield_call_args_repr",
|
157
|
+
"yield_mapping_repr",
|
158
|
+
]
|
@@ -42,6 +42,8 @@ from utilities.reprlib import (
|
|
42
42
|
RICH_MAX_LENGTH,
|
43
43
|
RICH_MAX_STRING,
|
44
44
|
RICH_MAX_WIDTH,
|
45
|
+
yield_call_args_repr,
|
46
|
+
yield_mapping_repr,
|
45
47
|
)
|
46
48
|
from utilities.types import TBaseException, TCallable
|
47
49
|
from utilities.version import get_version
|
@@ -199,8 +201,6 @@ class _CallArgs:
|
|
199
201
|
@classmethod
|
200
202
|
def create(cls, func: Callable[..., Any], *args: Any, **kwargs: Any) -> Self:
|
201
203
|
"""Make the initial trace data."""
|
202
|
-
from utilities.rich import yield_call_args_repr
|
203
|
-
|
204
204
|
sig = signature(func)
|
205
205
|
try:
|
206
206
|
bound_args = sig.bind(*args, **kwargs)
|
@@ -437,8 +437,6 @@ class _Frame:
|
|
437
437
|
depth: int = 0,
|
438
438
|
) -> str:
|
439
439
|
"""Format the traceback."""
|
440
|
-
from utilities.rich import yield_call_args_repr, yield_mapping_repr
|
441
|
-
|
442
440
|
lines: list[str] = [f"Frame {index + 1}/{total}: {self.name} ({self.module})"]
|
443
441
|
if detail:
|
444
442
|
lines.append(indent("Inputs:", _INDENT))
|
@@ -459,13 +457,13 @@ class _Frame:
|
|
459
457
|
lines.extend(
|
460
458
|
indent(line, 2 * _INDENT)
|
461
459
|
for line in yield_mapping_repr(
|
460
|
+
self.locals,
|
462
461
|
_max_width=self.max_width,
|
463
462
|
_indent_size=self.indent_size,
|
464
463
|
_max_length=self.max_length,
|
465
464
|
_max_string=self.max_string,
|
466
465
|
_max_depth=self.max_depth,
|
467
466
|
_expand_all=self.expand_all,
|
468
|
-
**self.locals,
|
469
467
|
)
|
470
468
|
)
|
471
469
|
lines.extend([
|
@@ -1,38 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from typing import Any
|
4
|
-
|
5
|
-
from hypothesis import given
|
6
|
-
from hypothesis.strategies import sampled_from
|
7
|
-
|
8
|
-
from utilities.reprlib import get_repr, get_repr_and_class
|
9
|
-
|
10
|
-
|
11
|
-
class TestGetRepr:
|
12
|
-
@given(
|
13
|
-
case=sampled_from([
|
14
|
-
(None, "None"),
|
15
|
-
(0, "0"),
|
16
|
-
(
|
17
|
-
list(range(21)),
|
18
|
-
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +1]",
|
19
|
-
),
|
20
|
-
])
|
21
|
-
)
|
22
|
-
def test_main(self, *, case: tuple[Any, str]) -> None:
|
23
|
-
obj, expected = case
|
24
|
-
result = get_repr(obj)
|
25
|
-
assert result == expected
|
26
|
-
|
27
|
-
|
28
|
-
class TestGetReprAndClass:
|
29
|
-
@given(
|
30
|
-
case=sampled_from([
|
31
|
-
(None, "Object 'None' of type 'NoneType'"),
|
32
|
-
(0, "Object '0' of type 'int'"),
|
33
|
-
])
|
34
|
-
)
|
35
|
-
def test_main(self, *, case: tuple[Any, str]) -> None:
|
36
|
-
obj, expected = case
|
37
|
-
result = get_repr_and_class(obj)
|
38
|
-
assert result == expected
|
@@ -1,24 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from utilities.rich import yield_call_args_repr, yield_mapping_repr
|
4
|
-
|
5
|
-
|
6
|
-
class TestYieldCallArgsRepr:
|
7
|
-
def test_main(self) -> None:
|
8
|
-
lines = list(yield_call_args_repr(1, 2, 3, x=4, y=5, z=6))
|
9
|
-
expected = [
|
10
|
-
"args[0] = 1",
|
11
|
-
"args[1] = 2",
|
12
|
-
"args[2] = 3",
|
13
|
-
"kwargs[x] = 4",
|
14
|
-
"kwargs[y] = 5",
|
15
|
-
"kwargs[z] = 6",
|
16
|
-
]
|
17
|
-
assert lines == expected
|
18
|
-
|
19
|
-
|
20
|
-
class TestYieldMappingRepr:
|
21
|
-
def test_main(self) -> None:
|
22
|
-
lines = list(yield_mapping_repr(a=1, b=2, c=3))
|
23
|
-
expected = ["a = 1", "b = 2", "c = 3"]
|
24
|
-
assert lines == expected
|