dycw-utilities 0.138.8__tar.gz → 0.138.9__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.138.8 → dycw_utilities-0.138.9}/PKG-INFO +1 -1
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/pyproject.toml +2 -2
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pathlib.py +71 -29
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pathlib.py +71 -24
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/.gitignore +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/LICENSE +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/README.md +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_aiolimiter.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_asyncio_classes/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_asyncio_classes/loopers.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_asyncio_classes/redis.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/aiolimiter.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/click.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/http.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/math.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/os.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/period.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pytest_regressions_plugin.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/random.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/re.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/string.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/text.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/types.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/version.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/zoneinfo.py +0 -0
@@ -106,7 +106,7 @@ dependencies = [
|
|
106
106
|
name = "dycw-utilities"
|
107
107
|
readme = "README.md"
|
108
108
|
requires-python = ">= 3.12"
|
109
|
-
version = "0.138.
|
109
|
+
version = "0.138.9"
|
110
110
|
|
111
111
|
[project.entry-points.pytest11]
|
112
112
|
pytest-regressions = "utilities.pytest_regressions_plugin"
|
@@ -137,7 +137,7 @@ test = [
|
|
137
137
|
# bump-my-version
|
138
138
|
[tool.bumpversion]
|
139
139
|
allow_dirty = true
|
140
|
-
current_version = "0.138.
|
140
|
+
current_version = "0.138.9"
|
141
141
|
|
142
142
|
[[tool.bumpversion.files]]
|
143
143
|
filename = "src/utilities/__init__.py"
|
@@ -6,13 +6,15 @@ from shutil import copytree
|
|
6
6
|
from typing import TYPE_CHECKING, Self
|
7
7
|
|
8
8
|
from hypothesis import HealthCheck, given, settings
|
9
|
-
from hypothesis.strategies import
|
9
|
+
from hypothesis.strategies import integers, sets
|
10
10
|
from pytest import mark, param, raises
|
11
11
|
|
12
12
|
from tests.conftest import SKIPIF_CI_AND_WINDOWS
|
13
13
|
from utilities.dataclasses import replace_non_sentinel
|
14
14
|
from utilities.hypothesis import git_repos, paths, temp_paths
|
15
15
|
from utilities.pathlib import (
|
16
|
+
GetPackageRootError,
|
17
|
+
GetRepoRootError,
|
16
18
|
GetRootError,
|
17
19
|
_GetTailDisambiguate,
|
18
20
|
_GetTailEmptyError,
|
@@ -20,7 +22,9 @@ from utilities.pathlib import (
|
|
20
22
|
_GetTailNonUniqueError,
|
21
23
|
ensure_suffix,
|
22
24
|
expand_path,
|
25
|
+
get_package_root,
|
23
26
|
get_path,
|
27
|
+
get_repo_root,
|
24
28
|
get_root,
|
25
29
|
get_tail,
|
26
30
|
is_sub_path,
|
@@ -106,71 +110,109 @@ class TestGetPath:
|
|
106
110
|
assert get_path(path=lambda: path) == path
|
107
111
|
|
108
112
|
|
109
|
-
class
|
110
|
-
@given(
|
113
|
+
class TestGetPackageRoot:
|
114
|
+
@given(tail=paths())
|
111
115
|
@settings(
|
112
116
|
max_examples=1, suppress_health_check={HealthCheck.function_scoped_fixture}
|
113
117
|
)
|
114
|
-
def
|
115
|
-
|
116
|
-
path.
|
117
|
-
|
118
|
-
expected =
|
119
|
-
assert
|
118
|
+
def test_dir(self, *, tmp_path: Path, tail: Path) -> None:
|
119
|
+
tmp_path.joinpath("pyproject.toml").touch()
|
120
|
+
path = tmp_path.joinpath(tail)
|
121
|
+
result = get_package_root(path=path)
|
122
|
+
expected = tmp_path.resolve()
|
123
|
+
assert result == expected
|
120
124
|
|
121
|
-
@given(
|
125
|
+
@given(tail=paths(min_depth=1))
|
122
126
|
@settings(
|
123
127
|
max_examples=1, suppress_health_check={HealthCheck.function_scoped_fixture}
|
124
128
|
)
|
125
|
-
def
|
126
|
-
|
129
|
+
def test_file(self, *, tmp_path: Path, tail: Path) -> None:
|
130
|
+
tmp_path.joinpath("pyproject.toml").touch()
|
131
|
+
path = tmp_path.joinpath(tail)
|
127
132
|
path.touch()
|
128
|
-
root =
|
133
|
+
root = get_package_root(path=path)
|
134
|
+
expected = tmp_path.resolve()
|
135
|
+
assert root == expected
|
136
|
+
|
137
|
+
def test_error(self, *, tmp_path: Path) -> None:
|
138
|
+
with raises(GetPackageRootError, match="Path is not part of a package: .*"):
|
139
|
+
_ = get_package_root(path=tmp_path)
|
140
|
+
|
141
|
+
|
142
|
+
class TestGetRepoRoot:
|
143
|
+
@given(repo=git_repos(), tail=paths())
|
144
|
+
@settings(max_examples=1)
|
145
|
+
def test_dir(self, *, repo: Path, tail: Path) -> None:
|
146
|
+
root = get_repo_root(path=repo.joinpath(tail))
|
147
|
+
expected = repo.resolve()
|
148
|
+
assert root == expected
|
149
|
+
|
150
|
+
@given(repo=git_repos(), tail=paths(min_depth=1))
|
151
|
+
@settings(max_examples=1)
|
152
|
+
def test_file(self, *, repo: Path, tail: Path) -> None:
|
153
|
+
path = repo.joinpath(tail)
|
154
|
+
path.touch()
|
155
|
+
root = get_repo_root(path=path)
|
156
|
+
expected = repo.resolve()
|
157
|
+
assert root == expected
|
158
|
+
|
159
|
+
def test_error(self, *, tmp_path: Path) -> None:
|
160
|
+
with raises(
|
161
|
+
GetRepoRootError, match="Path is not part of a `git` repository: .*"
|
162
|
+
):
|
163
|
+
_ = get_repo_root(path=tmp_path)
|
164
|
+
|
165
|
+
|
166
|
+
class TestGetRoot:
|
167
|
+
@given(repo=git_repos(), tail=paths())
|
168
|
+
@settings(max_examples=1)
|
169
|
+
def test_repo_only(self, *, repo: Path, tail: Path) -> None:
|
170
|
+
root = get_root(path=repo.joinpath(tail))
|
129
171
|
expected = repo.resolve()
|
130
172
|
assert root == expected
|
131
173
|
|
132
|
-
@given(
|
174
|
+
@given(tail=paths())
|
133
175
|
@settings(
|
134
176
|
max_examples=1, suppress_health_check={HealthCheck.function_scoped_fixture}
|
135
177
|
)
|
136
|
-
def
|
137
|
-
tmp_path.joinpath(".
|
138
|
-
path = tmp_path.joinpath(
|
178
|
+
def test_package_only(self, *, tmp_path: Path, tail: Path) -> None:
|
179
|
+
tmp_path.joinpath("pyproject.toml").touch()
|
180
|
+
path = tmp_path.joinpath(tail)
|
139
181
|
result = get_root(path=path)
|
140
182
|
expected = tmp_path.resolve()
|
141
183
|
assert result == expected
|
142
184
|
|
143
|
-
@given(
|
185
|
+
@given(repo=git_repos(), tail=paths())
|
144
186
|
@settings(
|
145
187
|
max_examples=1, suppress_health_check={HealthCheck.function_scoped_fixture}
|
146
188
|
)
|
147
|
-
def
|
148
|
-
repo.joinpath(".
|
149
|
-
path = repo.joinpath(
|
189
|
+
def test_repo_and_package(self, *, repo: Path, tail: Path) -> None:
|
190
|
+
repo.joinpath("pyproject.toml").touch()
|
191
|
+
path = repo.joinpath(tail)
|
150
192
|
root = get_root(path=path)
|
151
193
|
expected = repo.resolve()
|
152
194
|
assert root == expected
|
153
195
|
|
154
|
-
@given(
|
196
|
+
@given(repo=git_repos(), tail=paths(min_depth=1))
|
155
197
|
@settings(
|
156
198
|
max_examples=1, suppress_health_check={HealthCheck.function_scoped_fixture}
|
157
199
|
)
|
158
|
-
def
|
159
|
-
path = repo.joinpath(
|
200
|
+
def test_repo_with_package_inside(self, *, repo: Path, tail: Path) -> None:
|
201
|
+
path = repo.joinpath(tail)
|
160
202
|
path.mkdir(parents=True)
|
161
|
-
path.joinpath(".
|
203
|
+
path.joinpath("pyproject.toml").touch()
|
162
204
|
root = get_root(path=path)
|
163
205
|
expected = path.resolve()
|
164
206
|
assert root == expected
|
165
207
|
|
166
|
-
@given(
|
208
|
+
@given(repo=git_repos(), tail=paths(min_depth=1))
|
167
209
|
@settings(
|
168
210
|
max_examples=1, suppress_health_check={HealthCheck.function_scoped_fixture}
|
169
211
|
)
|
170
|
-
def
|
212
|
+
def test_package_with_repo_inside(self, *, repo: Path, tail: Path) -> None:
|
171
213
|
with TemporaryDirectory() as temp:
|
172
|
-
temp.joinpath(".
|
173
|
-
path = temp.joinpath(
|
214
|
+
temp.joinpath("pyproject.toml").touch()
|
215
|
+
path = temp.joinpath(tail)
|
174
216
|
_ = copytree(repo, path)
|
175
217
|
root = get_root(path=path)
|
176
218
|
expected = path.resolve()
|
@@ -71,8 +71,35 @@ def get_path(
|
|
71
71
|
##
|
72
72
|
|
73
73
|
|
74
|
-
def
|
75
|
-
"""Get the root
|
74
|
+
def get_package_root(*, path: MaybeCallablePathLike | None = None) -> Path:
|
75
|
+
"""Get the package root."""
|
76
|
+
path = get_path(path=path)
|
77
|
+
path_dir = path.parent if path.is_file() else path
|
78
|
+
all_paths = list(chain([path_dir], path_dir.parents))
|
79
|
+
try:
|
80
|
+
return next(
|
81
|
+
p.resolve()
|
82
|
+
for p in all_paths
|
83
|
+
if any(p_i.name == "pyproject.toml" for p_i in p.iterdir())
|
84
|
+
)
|
85
|
+
except StopIteration:
|
86
|
+
raise GetPackageRootError(path=path) from None
|
87
|
+
|
88
|
+
|
89
|
+
@dataclass(kw_only=True, slots=True)
|
90
|
+
class GetPackageRootError(Exception):
|
91
|
+
path: PathLike
|
92
|
+
|
93
|
+
@override
|
94
|
+
def __str__(self) -> str:
|
95
|
+
return f"Path is not part of a package: {self.path}"
|
96
|
+
|
97
|
+
|
98
|
+
##
|
99
|
+
|
100
|
+
|
101
|
+
def get_repo_root(*, path: MaybeCallablePathLike | None = None) -> Path:
|
102
|
+
"""Get the repo root."""
|
76
103
|
path = get_path(path=path)
|
77
104
|
path_dir = path.parent if path.is_file() else path
|
78
105
|
try:
|
@@ -85,36 +112,52 @@ def get_root(*, path: MaybeCallablePathLike | None = None) -> Path:
|
|
85
112
|
except CalledProcessError as error:
|
86
113
|
# newer versions of git report "Not a git repository", whilst older
|
87
114
|
# versions report "not a git repository"
|
88
|
-
if
|
89
|
-
raise
|
90
|
-
|
115
|
+
if search("fatal: not a git repository", error.stderr, flags=IGNORECASE):
|
116
|
+
raise GetRepoRootError(path=path) from None
|
117
|
+
raise # pragma: no cover
|
91
118
|
else:
|
92
|
-
|
93
|
-
|
119
|
+
return Path(output.strip("\n"))
|
120
|
+
|
121
|
+
|
122
|
+
@dataclass(kw_only=True, slots=True)
|
123
|
+
class GetRepoRootError(Exception):
|
124
|
+
path: PathLike
|
125
|
+
|
126
|
+
@override
|
127
|
+
def __str__(self) -> str:
|
128
|
+
return f"Path is not part of a `git` repository: {self.path}"
|
129
|
+
|
130
|
+
|
131
|
+
##
|
132
|
+
|
133
|
+
|
134
|
+
def get_root(*, path: MaybeCallablePathLike | None = None) -> Path:
|
135
|
+
"""Get the root of a path."""
|
136
|
+
path = get_path(path=path)
|
94
137
|
try:
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
)
|
100
|
-
except
|
101
|
-
|
102
|
-
match
|
138
|
+
repo = get_repo_root(path=path)
|
139
|
+
except GetRepoRootError:
|
140
|
+
repo = None
|
141
|
+
try:
|
142
|
+
package = get_package_root(path=path)
|
143
|
+
except GetPackageRootError:
|
144
|
+
package = None
|
145
|
+
match repo, package:
|
103
146
|
case None, None:
|
104
147
|
raise GetRootError(path=path)
|
105
148
|
case Path(), None:
|
106
|
-
return
|
149
|
+
return repo
|
107
150
|
case None, Path():
|
108
|
-
return
|
151
|
+
return package
|
109
152
|
case Path(), Path():
|
110
|
-
if
|
111
|
-
return
|
112
|
-
if is_sub_path(
|
113
|
-
return
|
114
|
-
if is_sub_path(
|
115
|
-
return
|
153
|
+
if repo == package:
|
154
|
+
return repo
|
155
|
+
if is_sub_path(repo, package, strict=True):
|
156
|
+
return repo
|
157
|
+
if is_sub_path(package, repo, strict=True):
|
158
|
+
return package
|
116
159
|
raise ImpossibleCaseError( # pragma: no cover
|
117
|
-
case=[f"{
|
160
|
+
case=[f"{repo=}", f"{package=}"]
|
118
161
|
)
|
119
162
|
case _ as never:
|
120
163
|
assert_never(never)
|
@@ -259,10 +302,14 @@ def temp_cwd(path: PathLike, /) -> Iterator[None]:
|
|
259
302
|
|
260
303
|
__all__ = [
|
261
304
|
"PWD",
|
305
|
+
"GetPackageRootError",
|
306
|
+
"GetRepoRootError",
|
262
307
|
"GetTailError",
|
263
308
|
"ensure_suffix",
|
264
309
|
"expand_path",
|
310
|
+
"get_package_root",
|
265
311
|
"get_path",
|
312
|
+
"get_repo_root",
|
266
313
|
"get_tail",
|
267
314
|
"is_sub_path",
|
268
315
|
"list_dir",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_with/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/modules/package_without/module_2.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_asyncio_classes/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/tests/test_typing_funcs/with_future.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.138.8 → dycw_utilities-0.138.9}/src/utilities/pytest_regressions_plugin.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|