dycw-utilities 0.110.8__tar.gz → 0.111.1__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.110.8 → dycw_utilities-0.111.1}/PKG-INFO +1 -1
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/pyproject.toml +2 -2
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_datetime.py +0 -19
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_functions.py +0 -61
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_orjson.py +1 -3
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_parse.py +63 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_typing.py +128 -7
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/datetime.py +4 -21
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/functions.py +0 -47
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/orjson.py +1 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/parse.py +33 -48
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/period.py +10 -5
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/polars.py +2 -2
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/sqlalchemy_polars.py +12 -12
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/typing.py +161 -4
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/.gitignore +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/LICENSE +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/README.md +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/click.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/git.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/http.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/math.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/os.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/random.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/re.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/text.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/types.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/version.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.110.8 → dycw_utilities-0.111.1}/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.
|
97
|
+
version = "0.111.1"
|
98
98
|
|
99
99
|
[project.optional-dependencies]
|
100
100
|
test = [
|
@@ -337,7 +337,7 @@ zzz-test-zoneinfo = [
|
|
337
337
|
# bump-my-version
|
338
338
|
[tool.bumpversion]
|
339
339
|
allow_dirty = true
|
340
|
-
current_version = "0.
|
340
|
+
current_version = "0.111.1"
|
341
341
|
|
342
342
|
[[tool.bumpversion.files]]
|
343
343
|
filename = "src/utilities/__init__.py"
|
@@ -107,10 +107,8 @@ from utilities.datetime import (
|
|
107
107
|
get_today_local,
|
108
108
|
get_today_tokyo,
|
109
109
|
get_years,
|
110
|
-
is_instance_date_not_datetime,
|
111
110
|
is_integral_timedelta,
|
112
111
|
is_local_datetime,
|
113
|
-
is_subclass_date_not_datetime,
|
114
112
|
is_weekday,
|
115
113
|
is_zero_time,
|
116
114
|
is_zoned_datetime,
|
@@ -751,16 +749,6 @@ class TestGetToday:
|
|
751
749
|
assert isinstance(today, dt.date)
|
752
750
|
|
753
751
|
|
754
|
-
class TestIsInstanceDateNotDateTime:
|
755
|
-
@given(date=dates())
|
756
|
-
def test_date(self, *, date: dt.date) -> None:
|
757
|
-
assert is_instance_date_not_datetime(date)
|
758
|
-
|
759
|
-
@given(datetime=datetimes())
|
760
|
-
def test_datetime(self, *, datetime: dt.datetime) -> None:
|
761
|
-
assert not is_instance_date_not_datetime(datetime)
|
762
|
-
|
763
|
-
|
764
752
|
class TestIsIntegralTimeDelta:
|
765
753
|
@given(n=integers())
|
766
754
|
def test_integral(self, *, n: int) -> None:
|
@@ -794,13 +782,6 @@ class TestIsLocalDateTime:
|
|
794
782
|
assert result is expected
|
795
783
|
|
796
784
|
|
797
|
-
class TestIsSubClassDateNotDateTime:
|
798
|
-
@given(case=sampled_from([(dt.date, True), (dt.datetime, False)]))
|
799
|
-
def test_date(self, *, case: tuple[type[Any], bool]) -> None:
|
800
|
-
type_, expected = case
|
801
|
-
assert is_subclass_date_not_datetime(type_) is expected
|
802
|
-
|
803
|
-
|
804
785
|
class TestIsWeekday:
|
805
786
|
@given(date=dates())
|
806
787
|
def test_main(self, *, date: dt.date) -> None:
|
@@ -12,7 +12,6 @@ from typing import TYPE_CHECKING, Any, ClassVar, ParamSpec, TypeVar, cast
|
|
12
12
|
from hypothesis import given
|
13
13
|
from hypothesis.strategies import (
|
14
14
|
DataObject,
|
15
|
-
SearchStrategy,
|
16
15
|
booleans,
|
17
16
|
builds,
|
18
17
|
data,
|
@@ -74,7 +73,6 @@ from utilities.functions import (
|
|
74
73
|
is_dataclass_class,
|
75
74
|
is_dataclass_instance,
|
76
75
|
is_hashable,
|
77
|
-
is_instance_not_bool_int,
|
78
76
|
is_iterable_of,
|
79
77
|
is_none,
|
80
78
|
is_not_none,
|
@@ -83,7 +81,6 @@ from utilities.functions import (
|
|
83
81
|
is_sized,
|
84
82
|
is_sized_not_str,
|
85
83
|
is_string_mapping,
|
86
|
-
is_subclass_not_bool_int,
|
87
84
|
is_tuple,
|
88
85
|
is_tuple_or_str_mapping,
|
89
86
|
make_isinstance,
|
@@ -622,39 +619,6 @@ class TestIsHashable:
|
|
622
619
|
assert is_hashable(obj) is expected
|
623
620
|
|
624
621
|
|
625
|
-
class TestIsInstanceNotIntBool:
|
626
|
-
@given(
|
627
|
-
data=data(),
|
628
|
-
case=sampled_from([
|
629
|
-
(booleans(), bool, True),
|
630
|
-
(booleans(), int, False),
|
631
|
-
(integers(), bool, False),
|
632
|
-
(integers(), int, True),
|
633
|
-
(booleans(), (bool, int), True),
|
634
|
-
(integers(), (bool, int), True),
|
635
|
-
]),
|
636
|
-
)
|
637
|
-
def test_main(
|
638
|
-
self, *, data: DataObject, case: tuple[SearchStrategy[Any], type[Any], bool]
|
639
|
-
) -> None:
|
640
|
-
strategy, type_, expected = case
|
641
|
-
value = data.draw(strategy)
|
642
|
-
assert is_instance_not_bool_int(value, type_) is expected
|
643
|
-
|
644
|
-
@given(bool_=booleans())
|
645
|
-
def test_bool_value_vs_custom_int(self, *, bool_: bool) -> None:
|
646
|
-
class MyInt(int): ...
|
647
|
-
|
648
|
-
assert not is_instance_not_bool_int(bool_, MyInt)
|
649
|
-
|
650
|
-
@given(int_=integers())
|
651
|
-
def test_int_value_vs_custom_int(self, *, int_: int) -> None:
|
652
|
-
class MyInt(int): ...
|
653
|
-
|
654
|
-
assert not is_instance_not_bool_int(int_, MyInt)
|
655
|
-
assert is_instance_not_bool_int(MyInt(int_), MyInt)
|
656
|
-
|
657
|
-
|
658
622
|
class TestIsIterableOf:
|
659
623
|
@given(
|
660
624
|
case=sampled_from([
|
@@ -775,31 +739,6 @@ class TestIsStringMapping:
|
|
775
739
|
assert result is expected
|
776
740
|
|
777
741
|
|
778
|
-
class TestIsSubclassNotBoolInt:
|
779
|
-
@given(
|
780
|
-
case=sampled_from([
|
781
|
-
(bool, bool, True),
|
782
|
-
(bool, int, False),
|
783
|
-
(int, bool, False),
|
784
|
-
(int, int, True),
|
785
|
-
(bool, (bool, int), True),
|
786
|
-
(int, (bool, int), True),
|
787
|
-
])
|
788
|
-
)
|
789
|
-
def test_main(self, *, case: tuple[type[Any], type[Any], bool]) -> None:
|
790
|
-
child, parent, expected = case
|
791
|
-
assert is_subclass_not_bool_int(child, parent) is expected
|
792
|
-
|
793
|
-
def test_custom_int(self) -> None:
|
794
|
-
class MyInt(int): ...
|
795
|
-
|
796
|
-
assert not is_subclass_not_bool_int(bool, MyInt)
|
797
|
-
assert not is_subclass_not_bool_int(MyInt, bool)
|
798
|
-
assert not is_subclass_not_bool_int(int, MyInt)
|
799
|
-
assert is_subclass_not_bool_int(MyInt, int)
|
800
|
-
assert is_subclass_not_bool_int(MyInt, MyInt)
|
801
|
-
|
802
|
-
|
803
742
|
class TestIsTuple:
|
804
743
|
@given(case=sampled_from([(None, False), ((1, 2, 3), True), ([1, 2, 3], False)]))
|
805
744
|
def test_main(self, *, case: tuple[Any, bool]) -> None:
|
@@ -23,7 +23,7 @@ from hypothesis.strategies import (
|
|
23
23
|
)
|
24
24
|
from orjson import JSONDecodeError
|
25
25
|
from polars import Object, String, UInt64
|
26
|
-
from pytest import approx,
|
26
|
+
from pytest import approx, raises
|
27
27
|
|
28
28
|
from tests.conftest import SKIPIF_CI_AND_WINDOWS
|
29
29
|
from tests.test_operator import (
|
@@ -147,7 +147,6 @@ class TestGetLogRecords:
|
|
147
147
|
),
|
148
148
|
root=temp_paths(),
|
149
149
|
)
|
150
|
-
@mark.flaky
|
151
150
|
def test_dataframe(
|
152
151
|
self, *, root: Path, items: Sequence[tuple[LogLevel, str, StrMapping]]
|
153
152
|
) -> None:
|
@@ -205,7 +204,6 @@ class TestGetLogRecords:
|
|
205
204
|
min_log_file_line_num=integers() | none(),
|
206
205
|
max_log_file_line_num=integers() | none(),
|
207
206
|
)
|
208
|
-
@mark.flaky
|
209
207
|
def test_filter(
|
210
208
|
self,
|
211
209
|
*,
|
@@ -300,6 +300,43 @@ class TestSerializeAndParseObject:
|
|
300
300
|
|
301
301
|
|
302
302
|
class TestParseObject:
|
303
|
+
@given(text=sampled_from(["F_a_l_s_e", "T_r_u_e"]))
|
304
|
+
def test_bool_custom(self, *, text: str) -> None:
|
305
|
+
def parser(text: str, /) -> bool:
|
306
|
+
match text:
|
307
|
+
case "F_a_l_s_e":
|
308
|
+
return False
|
309
|
+
case "T_r_u_e":
|
310
|
+
return True
|
311
|
+
case _:
|
312
|
+
raise ImpossibleCaseError(case=[f"{text=}"])
|
313
|
+
|
314
|
+
bool_ = parse_object(bool, text, extra={bool: parser})
|
315
|
+
match text:
|
316
|
+
case "F_a_l_s_e":
|
317
|
+
expected = False
|
318
|
+
case "T_r_u_e":
|
319
|
+
expected = True
|
320
|
+
case _:
|
321
|
+
raise ImpossibleCaseError(case=[f"{text=}"])
|
322
|
+
assert bool_ is expected
|
323
|
+
|
324
|
+
@given(text=sampled_from(["F_a_l_s_e", "T_r_u_e"]))
|
325
|
+
def test_bool_extra_not_used(self, *, text: str) -> None:
|
326
|
+
def parser(text: str, /) -> bool:
|
327
|
+
match text:
|
328
|
+
case "F_a_l_s_e":
|
329
|
+
return False
|
330
|
+
case "T_r_u_e":
|
331
|
+
return True
|
332
|
+
case _:
|
333
|
+
raise ImpossibleCaseError(case=[f"{text=}"])
|
334
|
+
|
335
|
+
with raises(
|
336
|
+
_ParseObjectParseError, match="Unable to parse <class 'bool'>; got '.*'"
|
337
|
+
):
|
338
|
+
_ = parse_object(bool, text, extra={int: parser})
|
339
|
+
|
303
340
|
def test_error_bool(self) -> None:
|
304
341
|
with raises(
|
305
342
|
_ParseObjectParseError,
|
@@ -531,6 +568,32 @@ class TestParseObject:
|
|
531
568
|
|
532
569
|
|
533
570
|
class TestSerializeObject:
|
571
|
+
@given(bool_=booleans())
|
572
|
+
def test_bool_custom(self, *, bool_: bool) -> None:
|
573
|
+
def serializer(bool_: bool, /) -> str: # noqa: FBT001
|
574
|
+
match bool_:
|
575
|
+
case True:
|
576
|
+
return "1"
|
577
|
+
case False:
|
578
|
+
return "0"
|
579
|
+
|
580
|
+
serialized = serialize_object(bool_, extra={bool: serializer})
|
581
|
+
match bool_:
|
582
|
+
case True:
|
583
|
+
expected = "1"
|
584
|
+
case False:
|
585
|
+
expected = "0"
|
586
|
+
assert serialized == expected
|
587
|
+
|
588
|
+
@given(bool_=booleans())
|
589
|
+
def test_bool_extra_not_used(self, *, bool_: bool) -> None:
|
590
|
+
def serializer(int_: int, /) -> str:
|
591
|
+
return f"({int_})"
|
592
|
+
|
593
|
+
serialized = serialize_object(bool_, extra={int: serializer})
|
594
|
+
expected = str(bool_)
|
595
|
+
assert serialized == expected
|
596
|
+
|
534
597
|
@given(int_=integers())
|
535
598
|
def test_type_with_extra(self, *, int_: int) -> None:
|
536
599
|
obj = DataClassFutureInt(int_=int_)
|
@@ -10,7 +10,19 @@ from typing import TYPE_CHECKING, Any, Literal, NamedTuple, Self
|
|
10
10
|
from uuid import UUID
|
11
11
|
|
12
12
|
from hypothesis import given
|
13
|
-
from hypothesis.strategies import
|
13
|
+
from hypothesis.strategies import (
|
14
|
+
DataObject,
|
15
|
+
SearchStrategy,
|
16
|
+
booleans,
|
17
|
+
data,
|
18
|
+
dates,
|
19
|
+
datetimes,
|
20
|
+
floats,
|
21
|
+
integers,
|
22
|
+
just,
|
23
|
+
none,
|
24
|
+
sampled_from,
|
25
|
+
)
|
14
26
|
from pytest import mark, param, raises
|
15
27
|
|
16
28
|
from tests.test_typing_funcs.no_future import (
|
@@ -42,15 +54,19 @@ from tests.test_typing_funcs.with_future import (
|
|
42
54
|
from utilities.sentinel import Sentinel
|
43
55
|
from utilities.types import Duration, LogLevel, Number, Parallelism, Seed
|
44
56
|
from utilities.typing import (
|
45
|
-
|
46
|
-
|
57
|
+
_GetTypeClassesTupleError,
|
58
|
+
_GetTypeClassesTypeError,
|
59
|
+
_GetUnionTypeClassesInternalTypeError,
|
60
|
+
_GetUnionTypeClassesUnionTypeError,
|
47
61
|
contains_self,
|
48
62
|
get_args,
|
49
63
|
get_literal_elements,
|
64
|
+
get_type_classes,
|
50
65
|
get_type_hints,
|
51
66
|
get_union_type_classes,
|
52
67
|
is_dict_type,
|
53
68
|
is_frozenset_type,
|
69
|
+
is_instance_gen,
|
54
70
|
is_list_type,
|
55
71
|
is_literal_type,
|
56
72
|
is_mapping_type,
|
@@ -59,6 +75,7 @@ from utilities.typing import (
|
|
59
75
|
is_optional_type,
|
60
76
|
is_sequence_type,
|
61
77
|
is_set_type,
|
78
|
+
is_subclass_gen,
|
62
79
|
is_tuple_type,
|
63
80
|
is_union_type,
|
64
81
|
)
|
@@ -118,6 +135,38 @@ class TestGetLiteralElements:
|
|
118
135
|
assert result == expected
|
119
136
|
|
120
137
|
|
138
|
+
class TestGetTypeClasses:
|
139
|
+
@given(
|
140
|
+
case=sampled_from([
|
141
|
+
(int, (int,)),
|
142
|
+
((int, float), (int, float)),
|
143
|
+
(Duration, (int, float, dt.timedelta)),
|
144
|
+
(Number, (int, float)),
|
145
|
+
(Seed, (int, float, str, bytes, bytearray, Random)),
|
146
|
+
((int, Number), (int, int, float)),
|
147
|
+
((int, (Number,)), (int, int, float)),
|
148
|
+
])
|
149
|
+
)
|
150
|
+
def test_main(self, *, case: tuple[Any, tuple[type[Any], ...]]) -> None:
|
151
|
+
obj, expected = case
|
152
|
+
result = get_type_classes(obj)
|
153
|
+
assert result == expected
|
154
|
+
|
155
|
+
def test_error_type(self) -> None:
|
156
|
+
with raises(
|
157
|
+
_GetTypeClassesTypeError,
|
158
|
+
match="Object must be a type, tuple or Union type; got None",
|
159
|
+
):
|
160
|
+
_ = get_type_classes(None)
|
161
|
+
|
162
|
+
def test_error_tuple(self) -> None:
|
163
|
+
with raises(
|
164
|
+
_GetTypeClassesTupleError,
|
165
|
+
match="Tuple must contain types, tuples or Union types only; got None",
|
166
|
+
):
|
167
|
+
_ = get_type_classes((None,))
|
168
|
+
|
169
|
+
|
121
170
|
class TestGetTypeHints:
|
122
171
|
@given(data=data())
|
123
172
|
def test_date(self, *, data: DataObject) -> None:
|
@@ -352,16 +401,16 @@ class TestGetUnionTypeClasses:
|
|
352
401
|
result = get_union_type_classes(obj)
|
353
402
|
assert result == expected
|
354
403
|
|
355
|
-
def
|
404
|
+
def test_error_union_type(self) -> None:
|
356
405
|
with raises(
|
357
|
-
|
406
|
+
_GetUnionTypeClassesUnionTypeError,
|
358
407
|
match="Object must be a Union type; got None",
|
359
408
|
):
|
360
409
|
_ = get_union_type_classes(None)
|
361
410
|
|
362
|
-
def
|
411
|
+
def test_error_interal_type(self) -> None:
|
363
412
|
with raises(
|
364
|
-
|
413
|
+
_GetUnionTypeClassesInternalTypeError,
|
365
414
|
match=r"Union type must contain types only; got typing\.Literal\[True\]",
|
366
415
|
):
|
367
416
|
_ = get_union_type_classes(Literal[True] | None)
|
@@ -438,6 +487,46 @@ class TestIsAnnotationOfType:
|
|
438
487
|
assert func(obj) is expected
|
439
488
|
|
440
489
|
|
490
|
+
class TestIsInstanceGen:
|
491
|
+
@given(
|
492
|
+
data=data(),
|
493
|
+
case=sampled_from([
|
494
|
+
(booleans(), bool, True),
|
495
|
+
(booleans(), int, False),
|
496
|
+
(integers(), bool, False),
|
497
|
+
(integers(), int, True),
|
498
|
+
(booleans(), (bool, int), True),
|
499
|
+
(integers(), (bool, int), True),
|
500
|
+
(dates(), dt.date, True),
|
501
|
+
(dates(), dt.datetime, False),
|
502
|
+
(datetimes(), dt.date, False),
|
503
|
+
(datetimes(), dt.datetime, True),
|
504
|
+
(booleans(), Number, False),
|
505
|
+
(integers(), Number, True),
|
506
|
+
(floats(), Number, True),
|
507
|
+
]),
|
508
|
+
)
|
509
|
+
def test_main(
|
510
|
+
self, *, data: DataObject, case: tuple[SearchStrategy[Any], Any, bool]
|
511
|
+
) -> None:
|
512
|
+
strategy, type_, expected = case
|
513
|
+
value = data.draw(strategy)
|
514
|
+
assert is_instance_gen(value, type_) is expected
|
515
|
+
|
516
|
+
@given(bool_=booleans())
|
517
|
+
def test_bool_value_vs_custom_int(self, *, bool_: bool) -> None:
|
518
|
+
class MyInt(int): ...
|
519
|
+
|
520
|
+
assert not is_instance_gen(bool_, MyInt)
|
521
|
+
|
522
|
+
@given(int_=integers())
|
523
|
+
def test_int_value_vs_custom_int(self, *, int_: int) -> None:
|
524
|
+
class MyInt(int): ...
|
525
|
+
|
526
|
+
assert not is_instance_gen(int_, MyInt)
|
527
|
+
assert is_instance_gen(MyInt(int_), MyInt)
|
528
|
+
|
529
|
+
|
441
530
|
class TestIsNamedTuple:
|
442
531
|
def test_main(self) -> None:
|
443
532
|
class Example(NamedTuple):
|
@@ -453,3 +542,35 @@ class TestIsNamedTuple:
|
|
453
542
|
|
454
543
|
assert not is_namedtuple_class(Example)
|
455
544
|
assert not is_namedtuple_instance(Example(x=0))
|
545
|
+
|
546
|
+
|
547
|
+
class TestIsSubclassGen:
|
548
|
+
@given(
|
549
|
+
case=sampled_from([
|
550
|
+
(bool, bool, True),
|
551
|
+
(bool, int, False),
|
552
|
+
(int, bool, False),
|
553
|
+
(int, int, True),
|
554
|
+
(bool, (bool, int), True),
|
555
|
+
(int, (bool, int), True),
|
556
|
+
(dt.date, dt.date, True),
|
557
|
+
(dt.date, dt.datetime, False),
|
558
|
+
(dt.datetime, dt.date, False),
|
559
|
+
(dt.datetime, dt.datetime, True),
|
560
|
+
(bool, Number, False),
|
561
|
+
(int, Number, True),
|
562
|
+
(float, Number, True),
|
563
|
+
])
|
564
|
+
)
|
565
|
+
def test_main(self, *, case: tuple[type[Any], Any, bool]) -> None:
|
566
|
+
child, parent, expected = case
|
567
|
+
assert is_subclass_gen(child, parent) is expected
|
568
|
+
|
569
|
+
def test_custom_int(self) -> None:
|
570
|
+
class MyInt(int): ...
|
571
|
+
|
572
|
+
assert not is_subclass_gen(bool, MyInt)
|
573
|
+
assert not is_subclass_gen(MyInt, bool)
|
574
|
+
assert not is_subclass_gen(int, MyInt)
|
575
|
+
assert is_subclass_gen(MyInt, int)
|
576
|
+
assert is_subclass_gen(MyInt, MyInt)
|
@@ -22,6 +22,7 @@ from utilities.math import SafeRoundError, round_, safe_round
|
|
22
22
|
from utilities.platform import SYSTEM
|
23
23
|
from utilities.sentinel import Sentinel, sentinel
|
24
24
|
from utilities.types import MaybeStr
|
25
|
+
from utilities.typing import is_instance_gen
|
25
26
|
from utilities.zoneinfo import (
|
26
27
|
UTC,
|
27
28
|
HongKong,
|
@@ -140,9 +141,9 @@ def are_equal_dates_or_datetimes(
|
|
140
141
|
x: DateOrDateTime, y: DateOrDateTime, /, *, strict: bool = False
|
141
142
|
) -> bool:
|
142
143
|
"""Check if x == y for dates/datetimes."""
|
143
|
-
if
|
144
|
+
if is_instance_gen(x, dt.date) and is_instance_gen(y, dt.date):
|
144
145
|
return x == y
|
145
|
-
if
|
146
|
+
if is_instance_gen(x, dt.datetime) and is_instance_gen(y, dt.datetime):
|
146
147
|
return are_equal_datetimes(x, y, strict=strict)
|
147
148
|
raise AreEqualDatesOrDateTimesError(x=x, y=y)
|
148
149
|
|
@@ -210,7 +211,7 @@ def are_equal_months(x: DateOrMonth, y: DateOrMonth, /) -> bool:
|
|
210
211
|
|
211
212
|
def check_date_not_datetime(date: dt.date, /) -> None:
|
212
213
|
"""Check if a date is not a datetime."""
|
213
|
-
if not
|
214
|
+
if not is_instance_gen(date, dt.date):
|
214
215
|
raise CheckDateNotDateTimeError(date=date)
|
215
216
|
|
216
217
|
|
@@ -604,14 +605,6 @@ YEAR = get_years(n=1)
|
|
604
605
|
##
|
605
606
|
|
606
607
|
|
607
|
-
def is_instance_date_not_datetime(obj: Any, /) -> TypeGuard[dt.date]:
|
608
|
-
"""Check if an object is a date, and not a datetime."""
|
609
|
-
return isinstance(obj, dt.date) and not isinstance(obj, dt.datetime)
|
610
|
-
|
611
|
-
|
612
|
-
##
|
613
|
-
|
614
|
-
|
615
608
|
def is_integral_timedelta(timedelta: dt.timedelta, /) -> bool:
|
616
609
|
"""Check if a timedelta is integral."""
|
617
610
|
return (timedelta.seconds == 0) and (timedelta.microseconds == 0)
|
@@ -628,14 +621,6 @@ def is_local_datetime(obj: Any, /) -> TypeGuard[dt.datetime]:
|
|
628
621
|
##
|
629
622
|
|
630
623
|
|
631
|
-
def is_subclass_date_not_datetime(cls: type[Any], /) -> TypeGuard[type[dt.date]]:
|
632
|
-
"""Check if a class is a date, and not a datetime."""
|
633
|
-
return issubclass(cls, dt.date) and not issubclass(cls, dt.datetime)
|
634
|
-
|
635
|
-
|
636
|
-
##
|
637
|
-
|
638
|
-
|
639
624
|
_FRIDAY = 5
|
640
625
|
|
641
626
|
|
@@ -1359,10 +1344,8 @@ __all__ = [
|
|
1359
1344
|
"get_today_local",
|
1360
1345
|
"get_today_tokyo",
|
1361
1346
|
"get_years",
|
1362
|
-
"is_instance_date_not_datetime",
|
1363
1347
|
"is_integral_timedelta",
|
1364
1348
|
"is_local_datetime",
|
1365
|
-
"is_subclass_date_not_datetime",
|
1366
1349
|
"is_weekday",
|
1367
1350
|
"is_zero_time",
|
1368
1351
|
"is_zoned_datetime",
|
@@ -22,7 +22,6 @@ from typing import (
|
|
22
22
|
Literal,
|
23
23
|
TypeGuard,
|
24
24
|
TypeVar,
|
25
|
-
assert_never,
|
26
25
|
cast,
|
27
26
|
overload,
|
28
27
|
override,
|
@@ -660,28 +659,6 @@ def is_hashable(obj: Any, /) -> TypeGuard[Hashable]:
|
|
660
659
|
##
|
661
660
|
|
662
661
|
|
663
|
-
def is_instance_not_bool_int(
|
664
|
-
obj: Any, class_or_tuple: TypeLike[Any], /
|
665
|
-
) -> TypeGuard[int]:
|
666
|
-
"""Check if an instance relationship holds, except bool<int."""
|
667
|
-
match class_or_tuple:
|
668
|
-
case type() as type_:
|
669
|
-
return _is_instance_not_bool_int(obj, type_)
|
670
|
-
case tuple() as types:
|
671
|
-
return any(_is_instance_not_bool_int(obj, p) for p in types)
|
672
|
-
case _ as never:
|
673
|
-
assert_never(never)
|
674
|
-
|
675
|
-
|
676
|
-
def _is_instance_not_bool_int(obj: Any, type_: type[Any], /) -> bool:
|
677
|
-
return isinstance(obj, type_) and not (
|
678
|
-
isinstance(obj, bool) and issubclass(type_, int) and not issubclass(type_, bool)
|
679
|
-
)
|
680
|
-
|
681
|
-
|
682
|
-
##
|
683
|
-
|
684
|
-
|
685
662
|
@overload
|
686
663
|
def is_iterable_of(obj: Any, cls: type[_T], /) -> TypeGuard[Iterable[_T]]: ...
|
687
664
|
@overload
|
@@ -796,28 +773,6 @@ def is_string_mapping(obj: Any, /) -> TypeGuard[StrMapping]:
|
|
796
773
|
##
|
797
774
|
|
798
775
|
|
799
|
-
def is_subclass_not_bool_int(cls: type[Any], class_or_tuple: TypeLike[Any], /) -> bool:
|
800
|
-
"""Check if a subclass relationship holds, except bool<int."""
|
801
|
-
match class_or_tuple:
|
802
|
-
case type() as parent:
|
803
|
-
return _is_subclass_int_not_bool_one(cls, parent)
|
804
|
-
case tuple() as parents:
|
805
|
-
return any(_is_subclass_int_not_bool_one(cls, p) for p in parents)
|
806
|
-
case _ as never:
|
807
|
-
assert_never(never)
|
808
|
-
|
809
|
-
|
810
|
-
def _is_subclass_int_not_bool_one(cls: type[Any], parent: type[Any], /) -> bool:
|
811
|
-
return issubclass(cls, parent) and not (
|
812
|
-
issubclass(cls, bool)
|
813
|
-
and issubclass(parent, int)
|
814
|
-
and not issubclass(parent, bool)
|
815
|
-
)
|
816
|
-
|
817
|
-
|
818
|
-
##
|
819
|
-
|
820
|
-
|
821
776
|
def is_tuple(obj: Any, /) -> TypeGuard[tuple[Any, ...]]:
|
822
777
|
"""Check if an object is a tuple or string mapping."""
|
823
778
|
return make_isinstance(tuple)(obj)
|
@@ -1075,7 +1030,6 @@ __all__ = [
|
|
1075
1030
|
"is_dataclass_class",
|
1076
1031
|
"is_dataclass_instance",
|
1077
1032
|
"is_hashable",
|
1078
|
-
"is_instance_not_bool_int",
|
1079
1033
|
"is_iterable_of",
|
1080
1034
|
"is_none",
|
1081
1035
|
"is_not_none",
|
@@ -1083,7 +1037,6 @@ __all__ = [
|
|
1083
1037
|
"is_sized",
|
1084
1038
|
"is_sized_not_str",
|
1085
1039
|
"is_string_mapping",
|
1086
|
-
"is_subclass_not_bool_int",
|
1087
1040
|
"is_tuple",
|
1088
1041
|
"is_tuple_or_str_mapping",
|
1089
1042
|
"make_isinstance",
|