dycw-utilities 0.111.0__tar.gz → 0.112.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/PKG-INFO +1 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/pyproject.toml +2 -2
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_altair.py +2 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_datetime.py +10 -41
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_orjson.py +3 -2
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_parse.py +63 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_polars.py +2 -2
- dycw_utilities-0.112.0/src/tests/test_tzdata.py +60 -0
- dycw_utilities-0.112.0/src/tests/test_tzlocal.py +41 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_whenever.py +3 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_zoneinfo.py +1 -2
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/datetime.py +1 -60
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/fastapi.py +2 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/fpdf2.py +2 -2
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/hypothesis.py +1 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/logging.py +7 -2
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/parse.py +25 -37
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pyinstrument.py +2 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/traceback.py +7 -3
- dycw_utilities-0.112.0/src/utilities/tzdata.py +63 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/tzlocal.py +24 -1
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/whenever.py +1 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/zoneinfo.py +3 -10
- dycw_utilities-0.111.0/src/tests/test_tzdata.py +0 -14
- dycw_utilities-0.111.0/src/tests/test_tzlocal.py +0 -11
- dycw_utilities-0.111.0/src/utilities/tzdata.py +0 -9
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/.gitignore +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/LICENSE +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/README.md +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_statsmodel.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/git.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/period.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/zipfile.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.112.0"
|
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.112.0"
|
341
341
|
|
342
342
|
[[tool.bumpversion.files]]
|
343
343
|
filename = "src/utilities/__init__.py"
|
@@ -33,7 +33,8 @@ from utilities.datetime import get_now
|
|
33
33
|
from utilities.functions import ensure_class
|
34
34
|
from utilities.hypothesis import text_ascii, zoned_datetimes
|
35
35
|
from utilities.polars import DatetimeUTC, zoned_datetime
|
36
|
-
from utilities.
|
36
|
+
from utilities.tzdata import HongKong, Tokyo
|
37
|
+
from utilities.zoneinfo import UTC
|
37
38
|
|
38
39
|
if TYPE_CHECKING:
|
39
40
|
from pathlib import Path
|
@@ -6,7 +6,6 @@ from math import isclose
|
|
6
6
|
from operator import eq, gt, lt
|
7
7
|
from re import search
|
8
8
|
from typing import TYPE_CHECKING, Any, Self
|
9
|
-
from zoneinfo import ZoneInfo
|
10
9
|
|
11
10
|
from hypothesis import HealthCheck, assume, given, settings
|
12
11
|
from hypothesis.strategies import (
|
@@ -38,13 +37,9 @@ from utilities.datetime import (
|
|
38
37
|
MILLISECOND,
|
39
38
|
MINUTE,
|
40
39
|
MONTH,
|
41
|
-
NOW_HK,
|
42
|
-
NOW_TOKYO,
|
43
40
|
NOW_UTC,
|
44
41
|
QUARTER,
|
45
42
|
SECOND,
|
46
|
-
TODAY_HK,
|
47
|
-
TODAY_TOKYO,
|
48
43
|
TODAY_UTC,
|
49
44
|
WEEK,
|
50
45
|
YEAR,
|
@@ -98,14 +93,8 @@ from utilities.datetime import (
|
|
98
93
|
get_half_years,
|
99
94
|
get_months,
|
100
95
|
get_now,
|
101
|
-
get_now_hk,
|
102
|
-
get_now_local,
|
103
|
-
get_now_tokyo,
|
104
96
|
get_quarters,
|
105
97
|
get_today,
|
106
|
-
get_today_hk,
|
107
|
-
get_today_local,
|
108
|
-
get_today_tokyo,
|
109
98
|
get_years,
|
110
99
|
is_integral_timedelta,
|
111
100
|
is_local_datetime,
|
@@ -149,10 +138,12 @@ from utilities.hypothesis import (
|
|
149
138
|
)
|
150
139
|
from utilities.math import MAX_INT32, MIN_INT32, is_integral, round_to_float
|
151
140
|
from utilities.sentinel import Sentinel, sentinel
|
152
|
-
from utilities.
|
141
|
+
from utilities.tzdata import HongKong
|
142
|
+
from utilities.zoneinfo import UTC
|
153
143
|
|
154
144
|
if TYPE_CHECKING:
|
155
145
|
from collections.abc import Callable
|
146
|
+
from zoneinfo import ZoneInfo
|
156
147
|
|
157
148
|
from utilities.sentinel import Sentinel
|
158
149
|
from utilities.types import (
|
@@ -686,24 +677,14 @@ class TestGetDateTime:
|
|
686
677
|
|
687
678
|
class TestGetNow:
|
688
679
|
@given(time_zone=timezones())
|
689
|
-
def
|
680
|
+
def test_function(self, *, time_zone: ZoneInfo) -> None:
|
690
681
|
now = get_now(time_zone=time_zone)
|
691
682
|
assert isinstance(now, dt.datetime)
|
692
683
|
assert now.tzinfo is time_zone
|
693
684
|
|
694
|
-
def
|
695
|
-
|
696
|
-
assert
|
697
|
-
ETC = ZoneInfo("Etc/UTC") # noqa: N806
|
698
|
-
assert now.tzinfo in {ETC, HongKong, Tokyo, UTC}
|
699
|
-
|
700
|
-
@given(get_now=sampled_from([get_now, get_now_local, get_now_hk, get_now_tokyo]))
|
701
|
-
def test_getters(self, *, get_now: Callable[[], dt.datetime]) -> None:
|
702
|
-
assert isinstance(get_now(), dt.date)
|
703
|
-
|
704
|
-
@given(now=sampled_from([NOW_UTC, NOW_HK, NOW_TOKYO]))
|
705
|
-
def test_constants(self, *, now: dt.datetime) -> None:
|
706
|
-
assert isinstance(now, dt.date)
|
685
|
+
def test_constant(self) -> None:
|
686
|
+
assert isinstance(NOW_UTC, dt.datetime)
|
687
|
+
assert NOW_UTC.tzinfo is UTC
|
707
688
|
|
708
689
|
|
709
690
|
class TestGetTimedelta:
|
@@ -729,24 +710,12 @@ class TestGetTimedelta:
|
|
729
710
|
|
730
711
|
class TestGetToday:
|
731
712
|
@given(time_zone=timezones())
|
732
|
-
def
|
713
|
+
def test_function(self, *, time_zone: ZoneInfo) -> None:
|
733
714
|
today = get_today(time_zone=time_zone)
|
734
715
|
assert isinstance(today, dt.date)
|
735
716
|
|
736
|
-
|
737
|
-
|
738
|
-
get_today,
|
739
|
-
get_today_local,
|
740
|
-
get_today_hk,
|
741
|
-
get_today_tokyo,
|
742
|
-
])
|
743
|
-
)
|
744
|
-
def test_getters(self, *, get_today: Callable[[], dt.datetime]) -> None:
|
745
|
-
assert isinstance(get_today(), dt.date)
|
746
|
-
|
747
|
-
@given(today=sampled_from([TODAY_UTC, TODAY_HK, TODAY_TOKYO]))
|
748
|
-
def test_constants(self, *, today: dt.date) -> None:
|
749
|
-
assert isinstance(today, dt.date)
|
717
|
+
def test_constant(self) -> None:
|
718
|
+
assert isinstance(TODAY_UTC, dt.date)
|
750
719
|
|
751
720
|
|
752
721
|
class TestIsIntegralTimeDelta:
|
@@ -51,7 +51,7 @@ from tests.test_typing_funcs.with_future import (
|
|
51
51
|
DataClassFutureTypeLiteral,
|
52
52
|
DataClassFutureTypeLiteralNullable,
|
53
53
|
)
|
54
|
-
from utilities.datetime import MINUTE, SECOND, get_now
|
54
|
+
from utilities.datetime import MINUTE, SECOND, get_now
|
55
55
|
from utilities.functions import is_sequence_of
|
56
56
|
from utilities.hypothesis import (
|
57
57
|
assume_does_not_raise,
|
@@ -83,6 +83,7 @@ from utilities.polars import check_polars_dataframe, zoned_datetime
|
|
83
83
|
from utilities.sentinel import Sentinel, sentinel
|
84
84
|
from utilities.types import DateOrDateTime, LogLevel, MaybeIterable, PathLike
|
85
85
|
from utilities.typing import get_args
|
86
|
+
from utilities.tzlocal import get_now_local
|
86
87
|
|
87
88
|
if TYPE_CHECKING:
|
88
89
|
from collections.abc import Sequence
|
@@ -124,7 +125,7 @@ class TestGetLogRecords:
|
|
124
125
|
assert record.name == str(tmp_path)
|
125
126
|
assert record.message == ""
|
126
127
|
assert record.level == WARNING
|
127
|
-
assert record.line_num == approx(
|
128
|
+
assert record.line_num == approx(102, rel=0.1)
|
128
129
|
assert abs(record.datetime - get_now()) <= MINUTE
|
129
130
|
assert record.func_name == "test_main"
|
130
131
|
assert record.stack_info is None
|
@@ -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_)
|
@@ -156,8 +156,8 @@ from utilities.polars import (
|
|
156
156
|
)
|
157
157
|
from utilities.random import get_state
|
158
158
|
from utilities.sentinel import Sentinel, sentinel
|
159
|
-
from utilities.tzdata import USCentral, USEastern
|
160
|
-
from utilities.zoneinfo import UTC,
|
159
|
+
from utilities.tzdata import HongKong, Tokyo, USCentral, USEastern
|
160
|
+
from utilities.zoneinfo import UTC, get_time_zone_name
|
161
161
|
|
162
162
|
if TYPE_CHECKING:
|
163
163
|
from collections.abc import Callable, Mapping, Sequence
|
@@ -0,0 +1,60 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import datetime as dt
|
4
|
+
from typing import TYPE_CHECKING
|
5
|
+
from zoneinfo import ZoneInfo
|
6
|
+
|
7
|
+
from hypothesis import given
|
8
|
+
from hypothesis.strategies import sampled_from
|
9
|
+
|
10
|
+
from utilities.tzdata import (
|
11
|
+
NOW_HONG_KONG,
|
12
|
+
NOW_TOKYO,
|
13
|
+
TODAY_HONG_KONG,
|
14
|
+
TODAY_TOKYO,
|
15
|
+
HongKong,
|
16
|
+
Tokyo,
|
17
|
+
USCentral,
|
18
|
+
USEastern,
|
19
|
+
get_now_hong_kong,
|
20
|
+
get_now_tokyo,
|
21
|
+
get_today_hong_kong,
|
22
|
+
get_today_tokyo,
|
23
|
+
)
|
24
|
+
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from collections.abc import Callable
|
27
|
+
|
28
|
+
|
29
|
+
class TestGetNow:
|
30
|
+
@given(case=sampled_from([(get_now_hong_kong, HongKong), (get_now_tokyo, Tokyo)]))
|
31
|
+
def test_function(
|
32
|
+
self, *, case: tuple[Callable[[], dt.datetime], ZoneInfo]
|
33
|
+
) -> None:
|
34
|
+
func, time_zone = case
|
35
|
+
self._assert(func(), time_zone)
|
36
|
+
|
37
|
+
@given(case=sampled_from([(NOW_HONG_KONG, HongKong), (NOW_TOKYO, Tokyo)]))
|
38
|
+
def test_constant(self, *, case: tuple[dt.datetime, ZoneInfo]) -> None:
|
39
|
+
datetime, time_zone = case
|
40
|
+
self._assert(datetime, time_zone)
|
41
|
+
|
42
|
+
def _assert(self, datetime: dt.datetime, time_zone: ZoneInfo, /) -> None:
|
43
|
+
assert isinstance(datetime, dt.datetime)
|
44
|
+
assert datetime.tzinfo is time_zone
|
45
|
+
|
46
|
+
|
47
|
+
class TestGetToday:
|
48
|
+
@given(func=sampled_from([get_today_hong_kong, get_today_tokyo]))
|
49
|
+
def test_function(self, *, func: Callable[[], dt.date]) -> None:
|
50
|
+
assert isinstance(func(), dt.date)
|
51
|
+
|
52
|
+
@given(date=sampled_from([TODAY_HONG_KONG, TODAY_TOKYO]))
|
53
|
+
def test_constant(self, *, date: dt.date) -> None:
|
54
|
+
assert isinstance(date, dt.date)
|
55
|
+
|
56
|
+
|
57
|
+
class TestTimeZones:
|
58
|
+
@given(time_zone=sampled_from([HongKong, Tokyo, USCentral, USEastern]))
|
59
|
+
def test_main(self, *, time_zone: ZoneInfo) -> None:
|
60
|
+
assert isinstance(time_zone, ZoneInfo)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import datetime as dt
|
4
|
+
from zoneinfo import ZoneInfo
|
5
|
+
|
6
|
+
from utilities.tzdata import HongKong, Tokyo
|
7
|
+
from utilities.tzlocal import (
|
8
|
+
NOW_LOCAL,
|
9
|
+
TODAY_LOCAL,
|
10
|
+
get_local_time_zone,
|
11
|
+
get_now_local,
|
12
|
+
get_today_local,
|
13
|
+
)
|
14
|
+
from utilities.zoneinfo import UTC
|
15
|
+
|
16
|
+
|
17
|
+
class TestGetLocalTimeZone:
|
18
|
+
def test_main(self) -> None:
|
19
|
+
time_zone = get_local_time_zone()
|
20
|
+
assert isinstance(time_zone, ZoneInfo)
|
21
|
+
|
22
|
+
|
23
|
+
class TestGetNowLocal:
|
24
|
+
def test_function(self) -> None:
|
25
|
+
self._assert(get_now_local())
|
26
|
+
|
27
|
+
def test_constant(self) -> None:
|
28
|
+
self._assert(NOW_LOCAL)
|
29
|
+
|
30
|
+
def _assert(self, datetime: dt.datetime, /) -> None:
|
31
|
+
assert isinstance(datetime, dt.datetime)
|
32
|
+
ETC = ZoneInfo("Etc/UTC") # noqa: N806
|
33
|
+
assert datetime.tzinfo in {ETC, HongKong, Tokyo, UTC}
|
34
|
+
|
35
|
+
|
36
|
+
class TestGetTodayLocal:
|
37
|
+
def test_function(self) -> None:
|
38
|
+
assert isinstance(get_today_local(), dt.date)
|
39
|
+
|
40
|
+
def test_constant(self) -> None:
|
41
|
+
assert isinstance(TODAY_LOCAL, dt.date)
|
@@ -40,6 +40,7 @@ from utilities.hypothesis import (
|
|
40
40
|
timedeltas_2w,
|
41
41
|
zoned_datetimes,
|
42
42
|
)
|
43
|
+
from utilities.tzdata import HongKong
|
43
44
|
from utilities.whenever import (
|
44
45
|
MAX_SERIALIZABLE_TIMEDELTA,
|
45
46
|
MIN_SERIALIZABLE_TIMEDELTA,
|
@@ -89,11 +90,12 @@ from utilities.whenever import (
|
|
89
90
|
serialize_timedelta,
|
90
91
|
serialize_zoned_datetime,
|
91
92
|
)
|
92
|
-
from utilities.zoneinfo import UTC,
|
93
|
+
from utilities.zoneinfo import UTC, get_time_zone_name
|
93
94
|
|
94
95
|
if TYPE_CHECKING:
|
95
96
|
from utilities.types import Duration
|
96
97
|
|
98
|
+
|
97
99
|
_TIMEDELTA_MICROSECONDS = int(1e18) * MICROSECOND
|
98
100
|
_TIMEDELTA_OVERFLOW = dt.timedelta(days=106751991, seconds=14454, microseconds=775808)
|
99
101
|
|
@@ -9,11 +9,10 @@ from hypothesis.strategies import DataObject, data, datetimes, sampled_from, tim
|
|
9
9
|
from pytest import raises
|
10
10
|
|
11
11
|
from utilities.hypothesis import zoned_datetimes
|
12
|
+
from utilities.tzdata import HongKong, Tokyo
|
12
13
|
from utilities.tzlocal import get_local_time_zone
|
13
14
|
from utilities.zoneinfo import (
|
14
15
|
UTC,
|
15
|
-
HongKong,
|
16
|
-
Tokyo,
|
17
16
|
_EnsureTimeZoneInvalidTZInfoError,
|
18
17
|
_EnsureTimeZoneLocalDateTimeError,
|
19
18
|
ensure_time_zone,
|
@@ -23,13 +23,7 @@ from utilities.platform import SYSTEM
|
|
23
23
|
from utilities.sentinel import Sentinel, sentinel
|
24
24
|
from utilities.types import MaybeStr
|
25
25
|
from utilities.typing import is_instance_gen
|
26
|
-
from utilities.zoneinfo import
|
27
|
-
UTC,
|
28
|
-
HongKong,
|
29
|
-
Tokyo,
|
30
|
-
ensure_time_zone,
|
31
|
-
get_time_zone_name,
|
32
|
-
)
|
26
|
+
from utilities.zoneinfo import UTC, ensure_time_zone, get_time_zone_name
|
33
27
|
|
34
28
|
if TYPE_CHECKING:
|
35
29
|
from collections.abc import Iterator
|
@@ -525,28 +519,6 @@ def get_now(*, time_zone: TimeZoneLike = UTC) -> dt.datetime:
|
|
525
519
|
NOW_UTC = get_now(time_zone=UTC)
|
526
520
|
|
527
521
|
|
528
|
-
def get_now_hk() -> dt.datetime:
|
529
|
-
"""Get the current time in Hong Kong."""
|
530
|
-
return dt.datetime.now(tz=HongKong)
|
531
|
-
|
532
|
-
|
533
|
-
NOW_HK = get_now_hk()
|
534
|
-
|
535
|
-
|
536
|
-
def get_now_local() -> dt.datetime:
|
537
|
-
"""Get the current time in local."""
|
538
|
-
return get_now(time_zone="local")
|
539
|
-
# don't define `NOW_LOCAL` as this would require `tzlocal`
|
540
|
-
|
541
|
-
|
542
|
-
def get_now_tokyo() -> dt.datetime:
|
543
|
-
"""Get the current time in Tokyo."""
|
544
|
-
return dt.datetime.now(tz=Tokyo)
|
545
|
-
|
546
|
-
|
547
|
-
NOW_TOKYO = get_now_tokyo()
|
548
|
-
|
549
|
-
|
550
522
|
##
|
551
523
|
|
552
524
|
|
@@ -570,27 +542,6 @@ def get_today(*, time_zone: TimeZoneLike = UTC) -> dt.date:
|
|
570
542
|
TODAY_UTC = get_today(time_zone=UTC)
|
571
543
|
|
572
544
|
|
573
|
-
def get_today_hk() -> dt.date:
|
574
|
-
"""Get the current date in Hong Kong."""
|
575
|
-
return get_now_hk().date()
|
576
|
-
|
577
|
-
|
578
|
-
TODAY_HK = get_today_hk()
|
579
|
-
|
580
|
-
|
581
|
-
def get_today_local() -> dt.date:
|
582
|
-
"""Get the current, timezone-aware local date."""
|
583
|
-
return get_now_local().date()
|
584
|
-
|
585
|
-
|
586
|
-
def get_today_tokyo() -> dt.date:
|
587
|
-
"""Get the current date in Tokyo."""
|
588
|
-
return get_now_tokyo().date()
|
589
|
-
|
590
|
-
|
591
|
-
TODAY_TOKYO = get_today_tokyo()
|
592
|
-
|
593
|
-
|
594
545
|
##
|
595
546
|
|
596
547
|
|
@@ -1279,13 +1230,9 @@ __all__ = [
|
|
1279
1230
|
"MIN_DATE_TWO_DIGIT_YEAR",
|
1280
1231
|
"MIN_MONTH",
|
1281
1232
|
"MONTH",
|
1282
|
-
"NOW_HK",
|
1283
|
-
"NOW_TOKYO",
|
1284
1233
|
"NOW_UTC",
|
1285
1234
|
"QUARTER",
|
1286
1235
|
"SECOND",
|
1287
|
-
"TODAY_HK",
|
1288
|
-
"TODAY_TOKYO",
|
1289
1236
|
"TODAY_UTC",
|
1290
1237
|
"WEEK",
|
1291
1238
|
"YEAR",
|
@@ -1335,14 +1282,8 @@ __all__ = [
|
|
1335
1282
|
"get_half_years",
|
1336
1283
|
"get_months",
|
1337
1284
|
"get_now",
|
1338
|
-
"get_now_hk",
|
1339
|
-
"get_now_local",
|
1340
|
-
"get_now_tokyo",
|
1341
1285
|
"get_quarters",
|
1342
1286
|
"get_today",
|
1343
|
-
"get_today_hk",
|
1344
|
-
"get_today_local",
|
1345
|
-
"get_today_tokyo",
|
1346
1287
|
"get_years",
|
1347
1288
|
"is_integral_timedelta",
|
1348
1289
|
"is_local_datetime",
|
@@ -7,7 +7,7 @@ from fastapi import FastAPI
|
|
7
7
|
from uvicorn import Config, Server
|
8
8
|
|
9
9
|
from utilities.asyncio import AsyncService
|
10
|
-
from utilities.datetime import SECOND, datetime_duration_to_float
|
10
|
+
from utilities.datetime import SECOND, datetime_duration_to_float
|
11
11
|
|
12
12
|
if TYPE_CHECKING:
|
13
13
|
from utilities.types import Duration
|
@@ -26,6 +26,7 @@ class _PingerReceiverApp(FastAPI):
|
|
26
26
|
|
27
27
|
@self.get("/ping") # skipif-ci
|
28
28
|
def ping() -> str:
|
29
|
+
from utilities.tzlocal import get_now_local # skipif-ci
|
29
30
|
from utilities.whenever import serialize_zoned_datetime # skipif-ci
|
30
31
|
|
31
32
|
now = serialize_zoned_datetime(get_now_local()) # skipif-ci
|
@@ -6,8 +6,6 @@ from typing import TYPE_CHECKING, override
|
|
6
6
|
from fpdf import FPDF
|
7
7
|
from fpdf.enums import XPos, YPos
|
8
8
|
|
9
|
-
from utilities.datetime import get_now_local
|
10
|
-
|
11
9
|
if TYPE_CHECKING:
|
12
10
|
from collections.abc import Iterator
|
13
11
|
|
@@ -45,6 +43,8 @@ def yield_pdf(*, header: str | None = None) -> Iterator[_BasePDF]:
|
|
45
43
|
|
46
44
|
@override
|
47
45
|
def footer(self) -> None:
|
46
|
+
from utilities.tzlocal import get_now_local
|
47
|
+
|
48
48
|
self.set_y(-15)
|
49
49
|
self.set_font(family="Helvetica", style="I", size=8)
|
50
50
|
page_no, now = self.page_no(), get_now_local()
|
@@ -69,7 +69,6 @@ from utilities.datetime import (
|
|
69
69
|
date_to_month,
|
70
70
|
datetime_duration_to_float,
|
71
71
|
datetime_duration_to_timedelta,
|
72
|
-
get_now_local,
|
73
72
|
round_datetime,
|
74
73
|
)
|
75
74
|
from utilities.functions import ensure_int, ensure_str, max_nullable, min_nullable
|
@@ -1440,6 +1439,7 @@ def yield_test_redis(data: DataObject, /) -> AbstractAsyncContextManager[_TestRe
|
|
1440
1439
|
from redis.exceptions import ResponseError # skipif-ci-and-not-linux
|
1441
1440
|
|
1442
1441
|
from utilities.redis import _TestRedis, yield_redis # skipif-ci-and-not-linux
|
1442
|
+
from utilities.tzlocal import get_now_local # skipif-ci-and-not-linux
|
1443
1443
|
|
1444
1444
|
now = get_now_local() # skipif-ci-and-not-linux
|
1445
1445
|
uuid = data.draw(uuids()) # skipif-ci-and-not-linux
|
@@ -37,11 +37,9 @@ from typing import (
|
|
37
37
|
override,
|
38
38
|
)
|
39
39
|
|
40
|
-
from utilities.atomicwrites import move_many, writer
|
41
40
|
from utilities.dataclasses import replace_non_sentinel
|
42
41
|
from utilities.datetime import (
|
43
42
|
SECOND,
|
44
|
-
get_now_local,
|
45
43
|
maybe_sub_pct_y,
|
46
44
|
parse_datetime_compact,
|
47
45
|
round_datetime,
|
@@ -200,6 +198,8 @@ def _compute_rollover_actions(
|
|
200
198
|
patterns: _RolloverPatterns | None = None,
|
201
199
|
backup_count: int = 1,
|
202
200
|
) -> _RolloverActions:
|
201
|
+
from utilities.tzlocal import get_now_local # skipif-ci-and-windows
|
202
|
+
|
203
203
|
patterns = ( # skipif-ci-and-windows
|
204
204
|
_compute_rollover_patterns(stem, suffix) if patterns is None else patterns
|
205
205
|
)
|
@@ -244,6 +244,8 @@ class _RolloverActions:
|
|
244
244
|
rotations: set[_Rotation] = field(default_factory=set)
|
245
245
|
|
246
246
|
def do(self) -> None:
|
247
|
+
from utilities.atomicwrites import move_many # skipif-ci-and-windows
|
248
|
+
|
247
249
|
for deletion in self.deletions: # skipif-ci-and-windows
|
248
250
|
deletion.delete()
|
249
251
|
move_many( # skipif-ci-and-windows
|
@@ -388,6 +390,9 @@ class StandaloneFileHandler(Handler):
|
|
388
390
|
|
389
391
|
@override
|
390
392
|
def emit(self, record: LogRecord) -> None:
|
393
|
+
from utilities.atomicwrites import writer
|
394
|
+
from utilities.tzlocal import get_now_local
|
395
|
+
|
391
396
|
try:
|
392
397
|
path = (
|
393
398
|
resolve_path(path=self._path)
|