dycw-utilities 0.168.7__tar.gz → 0.168.8__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.
Potentially problematic release.
This version of dycw-utilities might be problematic. Click here for more details.
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/PKG-INFO +1 -1
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/pyproject.toml +3 -3
- dycw_utilities-0.168.8/src/tests/test_grp.py +24 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_os.py +21 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pathlib.py +25 -1
- dycw_utilities-0.168.8/src/tests/test_pwd.py +24 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/__init__.py +1 -1
- dycw_utilities-0.168.8/src/utilities/grp.py +28 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/os.py +38 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pathlib.py +17 -0
- dycw_utilities-0.168.8/src/utilities/pwd.py +28 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/.gitignore +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/LICENSE +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/README.md +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_aeventkit.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_docker.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_jinja2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_polars.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pydantic_settings.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pydantic_settings_sops.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_testbook.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/aeventkit.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/click.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/docker.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/git.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/http.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/jinja2.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/json.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/math.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/polars.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pydantic_settings.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pydantic_settings_sops.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/random.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/re.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/string.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/testbook.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/text.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/types.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/version.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/utilities/zoneinfo.py +0 -0
|
@@ -52,7 +52,7 @@ dev = [
|
|
|
52
52
|
"pytest-timeout >=2.4.0, <2.5",
|
|
53
53
|
]
|
|
54
54
|
fastapi = [
|
|
55
|
-
"fastapi >=0.118.
|
|
55
|
+
"fastapi >=0.118.2, <0.119",
|
|
56
56
|
]
|
|
57
57
|
fastapi-test = [
|
|
58
58
|
"httpx",
|
|
@@ -249,7 +249,7 @@ dependencies = [
|
|
|
249
249
|
name = "dycw-utilities"
|
|
250
250
|
readme = "README.md"
|
|
251
251
|
requires-python = ">= 3.12"
|
|
252
|
-
version = "0.168.
|
|
252
|
+
version = "0.168.8"
|
|
253
253
|
|
|
254
254
|
[project.entry-points.pytest11]
|
|
255
255
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
|
@@ -282,7 +282,7 @@ test = [
|
|
|
282
282
|
# bump-my-version
|
|
283
283
|
[tool.bumpversion]
|
|
284
284
|
allow_dirty = true
|
|
285
|
-
current_version = "0.168.
|
|
285
|
+
current_version = "0.168.8"
|
|
286
286
|
|
|
287
287
|
[[tool.bumpversion.files]]
|
|
288
288
|
filename = "src/utilities/__init__.py"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import assert_never
|
|
4
|
+
|
|
5
|
+
from pytest import mark, param
|
|
6
|
+
|
|
7
|
+
from utilities.grp import EFFECTIVE_GROUP_NAME, ROOT_GROUP_NAME, get_gid_name
|
|
8
|
+
from utilities.platform import SYSTEM
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestGroupName:
|
|
12
|
+
def test_function(self) -> None:
|
|
13
|
+
group = get_gid_name(0)
|
|
14
|
+
assert isinstance(group, str) or (group is None)
|
|
15
|
+
|
|
16
|
+
@mark.parametrize("group", [param(ROOT_GROUP_NAME), param(EFFECTIVE_GROUP_NAME)])
|
|
17
|
+
def test_constant(self, *, group: str | None) -> None:
|
|
18
|
+
match SYSTEM:
|
|
19
|
+
case "windows":
|
|
20
|
+
assert group is None
|
|
21
|
+
case "mac" | "linux":
|
|
22
|
+
assert isinstance(group, str)
|
|
23
|
+
case never:
|
|
24
|
+
assert_never(never)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from os import getenv
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
4
5
|
|
|
5
6
|
from hypothesis import given
|
|
6
7
|
from hypothesis.strategies import (
|
|
@@ -16,10 +17,14 @@ from pytest import mark, param, raises
|
|
|
16
17
|
from utilities.hypothesis import text_ascii
|
|
17
18
|
from utilities.os import (
|
|
18
19
|
CPU_COUNT,
|
|
20
|
+
EFFECTIVE_GROUP_ID,
|
|
21
|
+
EFFECTIVE_USER_ID,
|
|
19
22
|
GetCPUUseError,
|
|
20
23
|
GetEnvVarError,
|
|
21
24
|
get_cpu_count,
|
|
22
25
|
get_cpu_use,
|
|
26
|
+
get_effective_group_id,
|
|
27
|
+
get_effective_user_id,
|
|
23
28
|
get_env_var,
|
|
24
29
|
is_debug,
|
|
25
30
|
is_pytest,
|
|
@@ -27,6 +32,9 @@ from utilities.os import (
|
|
|
27
32
|
)
|
|
28
33
|
from utilities.pytest import skipif_windows
|
|
29
34
|
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from collections.abc import Callable
|
|
37
|
+
|
|
30
38
|
text = text_ascii(min_size=1, max_size=10)
|
|
31
39
|
|
|
32
40
|
|
|
@@ -59,6 +67,19 @@ class TestGetCPUUse:
|
|
|
59
67
|
_ = get_cpu_use(n=n)
|
|
60
68
|
|
|
61
69
|
|
|
70
|
+
class TestGetEffectiveIDs:
|
|
71
|
+
@mark.parametrize(
|
|
72
|
+
"func", [param(get_effective_user_id), param(get_effective_group_id)]
|
|
73
|
+
)
|
|
74
|
+
def test_function(self, *, func: Callable[[], int | None]) -> None:
|
|
75
|
+
id_ = func()
|
|
76
|
+
assert isinstance(id_, int) or (id_ is None)
|
|
77
|
+
|
|
78
|
+
@mark.parametrize("id_", [param(EFFECTIVE_USER_ID), param(EFFECTIVE_GROUP_ID)])
|
|
79
|
+
def test_constant(self, *, id_: int | None) -> None:
|
|
80
|
+
assert isinstance(id_, int) or (id_ is None)
|
|
81
|
+
|
|
82
|
+
|
|
62
83
|
class TestGetEnvVar:
|
|
63
84
|
@given(
|
|
64
85
|
key=text.map(_prefix), value=text, default=text | none(), nullable=booleans()
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from shutil import copytree
|
|
6
|
-
from typing import TYPE_CHECKING, Self
|
|
6
|
+
from typing import TYPE_CHECKING, Self, assert_never
|
|
7
7
|
|
|
8
8
|
from hypothesis import HealthCheck, given, settings
|
|
9
9
|
from hypothesis.strategies import integers, sets
|
|
@@ -22,6 +22,8 @@ from utilities.pathlib import (
|
|
|
22
22
|
_GetTailNonUniqueError,
|
|
23
23
|
ensure_suffix,
|
|
24
24
|
expand_path,
|
|
25
|
+
get_file_group,
|
|
26
|
+
get_file_owner,
|
|
25
27
|
get_package_root,
|
|
26
28
|
get_repo_root,
|
|
27
29
|
get_root,
|
|
@@ -32,6 +34,7 @@ from utilities.pathlib import (
|
|
|
32
34
|
temp_cwd,
|
|
33
35
|
to_path,
|
|
34
36
|
)
|
|
37
|
+
from utilities.platform import SYSTEM
|
|
35
38
|
from utilities.sentinel import Sentinel, sentinel
|
|
36
39
|
from utilities.tempfile import TemporaryDirectory
|
|
37
40
|
|
|
@@ -77,6 +80,27 @@ class TestExpandPath:
|
|
|
77
80
|
assert result == expected
|
|
78
81
|
|
|
79
82
|
|
|
83
|
+
class TestFileOwnerAndGroup:
|
|
84
|
+
def test_owner(self, *, tmp_path: Path) -> None:
|
|
85
|
+
path = tmp_path.joinpath("file.txt")
|
|
86
|
+
path.touch()
|
|
87
|
+
self._assert(get_file_owner(path))
|
|
88
|
+
|
|
89
|
+
def test_group(self, *, tmp_path: Path) -> None:
|
|
90
|
+
path = tmp_path.joinpath("file.txt")
|
|
91
|
+
path.touch()
|
|
92
|
+
self._assert(get_file_group(path))
|
|
93
|
+
|
|
94
|
+
def _assert(self, value: str | None, /) -> None:
|
|
95
|
+
match SYSTEM:
|
|
96
|
+
case "windows":
|
|
97
|
+
assert value is None
|
|
98
|
+
case "mac" | "linux":
|
|
99
|
+
assert isinstance(value, str)
|
|
100
|
+
case never:
|
|
101
|
+
assert_never(never)
|
|
102
|
+
|
|
103
|
+
|
|
80
104
|
class TestGetPackageRoot:
|
|
81
105
|
@given(tail=paths())
|
|
82
106
|
@settings(
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import assert_never
|
|
4
|
+
|
|
5
|
+
from pytest import mark, param
|
|
6
|
+
|
|
7
|
+
from utilities.platform import SYSTEM
|
|
8
|
+
from utilities.pwd import EFFECTIVE_USER_NAME, ROOT_USER_NAME, get_uid_name
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestUserName:
|
|
12
|
+
def test_function(self) -> None:
|
|
13
|
+
user = get_uid_name(0)
|
|
14
|
+
assert isinstance(user, str) or (user is None)
|
|
15
|
+
|
|
16
|
+
@mark.parametrize("user", [param(ROOT_USER_NAME), param(EFFECTIVE_USER_NAME)])
|
|
17
|
+
def test_constant(self, *, user: str | None) -> None:
|
|
18
|
+
match SYSTEM:
|
|
19
|
+
case "windows":
|
|
20
|
+
assert user is None
|
|
21
|
+
case "mac" | "linux":
|
|
22
|
+
assert isinstance(user, str)
|
|
23
|
+
case never:
|
|
24
|
+
assert_never(never)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import assert_never
|
|
4
|
+
|
|
5
|
+
from utilities.os import EFFECTIVE_GROUP_ID
|
|
6
|
+
from utilities.platform import SYSTEM
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_gid_name(gid: int, /) -> str | None:
|
|
10
|
+
"""Get the name of a group."""
|
|
11
|
+
match SYSTEM:
|
|
12
|
+
case "windows": # skipif-not-windows
|
|
13
|
+
return None
|
|
14
|
+
case "mac" | "linux": # skipif-windows
|
|
15
|
+
from grp import getgrgid
|
|
16
|
+
|
|
17
|
+
return getgrgid(gid).gr_name
|
|
18
|
+
case never:
|
|
19
|
+
assert_never(never)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
ROOT_GROUP_NAME = get_gid_name(0)
|
|
23
|
+
EFFECTIVE_GROUP_NAME = (
|
|
24
|
+
None if EFFECTIVE_GROUP_ID is None else get_gid_name(EFFECTIVE_GROUP_ID)
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
__all__ = ["EFFECTIVE_GROUP_NAME", "ROOT_GROUP_NAME", "get_gid_name"]
|
|
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Literal, assert_never, overload, override
|
|
|
7
7
|
|
|
8
8
|
from utilities.contextlib import enhanced_context_manager
|
|
9
9
|
from utilities.iterables import OneStrEmptyError, one_str
|
|
10
|
+
from utilities.platform import SYSTEM
|
|
10
11
|
|
|
11
12
|
if TYPE_CHECKING:
|
|
12
13
|
from collections.abc import Iterator, Mapping
|
|
@@ -124,6 +125,39 @@ class GetEnvVarError(Exception):
|
|
|
124
125
|
##
|
|
125
126
|
|
|
126
127
|
|
|
128
|
+
def get_effective_group_id() -> int | None:
|
|
129
|
+
"""Get the effective group ID."""
|
|
130
|
+
match SYSTEM:
|
|
131
|
+
case "windows": # skipif-not-windows
|
|
132
|
+
return None
|
|
133
|
+
case "mac" | "linux": # skipif-windows
|
|
134
|
+
from os import getegid
|
|
135
|
+
|
|
136
|
+
return getegid()
|
|
137
|
+
case never:
|
|
138
|
+
assert_never(never)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def get_effective_user_id() -> int | None:
|
|
142
|
+
"""Get the effective user ID."""
|
|
143
|
+
match SYSTEM:
|
|
144
|
+
case "windows": # skipif-not-windows
|
|
145
|
+
return None
|
|
146
|
+
case "mac" | "linux": # skipif-windows
|
|
147
|
+
from os import geteuid
|
|
148
|
+
|
|
149
|
+
return geteuid()
|
|
150
|
+
case never:
|
|
151
|
+
assert_never(never)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
EFFECTIVE_USER_ID = get_effective_user_id()
|
|
155
|
+
EFFECTIVE_GROUP_ID = get_effective_group_id()
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
##
|
|
159
|
+
|
|
160
|
+
|
|
127
161
|
def is_debug() -> bool:
|
|
128
162
|
"""Check if we are in `DEBUG` mode."""
|
|
129
163
|
return get_env_var("DEBUG", nullable=True) is not None
|
|
@@ -165,11 +199,15 @@ def temp_environ(
|
|
|
165
199
|
|
|
166
200
|
__all__ = [
|
|
167
201
|
"CPU_COUNT",
|
|
202
|
+
"EFFECTIVE_GROUP_ID",
|
|
203
|
+
"EFFECTIVE_USER_ID",
|
|
168
204
|
"GetCPUCountError",
|
|
169
205
|
"GetCPUUseError",
|
|
170
206
|
"IntOrAll",
|
|
171
207
|
"get_cpu_count",
|
|
172
208
|
"get_cpu_use",
|
|
209
|
+
"get_effective_group_id",
|
|
210
|
+
"get_effective_user_id",
|
|
173
211
|
"get_env_var",
|
|
174
212
|
"is_debug",
|
|
175
213
|
"is_pytest",
|
|
@@ -12,6 +12,8 @@ from typing import TYPE_CHECKING, Literal, assert_never, overload, override
|
|
|
12
12
|
|
|
13
13
|
from utilities.contextlib import enhanced_context_manager
|
|
14
14
|
from utilities.errors import ImpossibleCaseError
|
|
15
|
+
from utilities.grp import get_gid_name
|
|
16
|
+
from utilities.pwd import get_uid_name
|
|
15
17
|
from utilities.sentinel import Sentinel
|
|
16
18
|
|
|
17
19
|
if TYPE_CHECKING:
|
|
@@ -52,6 +54,19 @@ def expand_path(path: PathLike, /) -> Path:
|
|
|
52
54
|
##
|
|
53
55
|
|
|
54
56
|
|
|
57
|
+
def get_file_group(path: PathLike, /) -> str | None:
|
|
58
|
+
"""Get the group of a file."""
|
|
59
|
+
return get_gid_name(to_path(path).stat().st_gid)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_file_owner(path: PathLike, /) -> str | None:
|
|
63
|
+
"""Get the owner of a file."""
|
|
64
|
+
return get_uid_name(to_path(path).stat().st_uid)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
|
|
69
|
+
|
|
55
70
|
def get_package_root(path: MaybeCallablePathLike = Path.cwd, /) -> Path:
|
|
56
71
|
"""Get the package root."""
|
|
57
72
|
path = to_path(path)
|
|
@@ -327,6 +342,8 @@ __all__ = [
|
|
|
327
342
|
"GetTailError",
|
|
328
343
|
"ensure_suffix",
|
|
329
344
|
"expand_path",
|
|
345
|
+
"get_file_group",
|
|
346
|
+
"get_file_owner",
|
|
330
347
|
"get_package_root",
|
|
331
348
|
"get_repo_root",
|
|
332
349
|
"get_tail",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import assert_never
|
|
4
|
+
|
|
5
|
+
from utilities.os import EFFECTIVE_USER_ID
|
|
6
|
+
from utilities.platform import SYSTEM
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_uid_name(uid: int, /) -> str | None:
|
|
10
|
+
"""Get the name of a user ID."""
|
|
11
|
+
match SYSTEM:
|
|
12
|
+
case "windows": # skipif-not-windows
|
|
13
|
+
return None
|
|
14
|
+
case "mac" | "linux": # skipif-windows
|
|
15
|
+
from pwd import getpwuid
|
|
16
|
+
|
|
17
|
+
return getpwuid(uid).pw_name
|
|
18
|
+
case never:
|
|
19
|
+
assert_never(never)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
ROOT_USER_NAME = get_uid_name(0)
|
|
23
|
+
EFFECTIVE_USER_NAME = (
|
|
24
|
+
None if EFFECTIVE_USER_ID is None else get_uid_name(EFFECTIVE_USER_ID)
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
__all__ = ["EFFECTIVE_USER_NAME", "ROOT_USER_NAME", "get_uid_name"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_missing/__init__.py
RENAMED
|
File without changes
|
{dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_missing/module.py
RENAMED
|
File without changes
|
{dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/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.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_without/__init__.py
RENAMED
|
File without changes
|
{dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/src/tests/modules/package_without/module_1.py
RENAMED
|
File without changes
|
{dycw_utilities-0.168.7 → dycw_utilities-0.168.8}/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
|
|
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
|