dycw-utilities 0.168.7__tar.gz → 0.168.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.

Potentially problematic release.


This version of dycw-utilities might be problematic. Click here for more details.

Files changed (225) hide show
  1. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/PKG-INFO +1 -1
  2. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/pyproject.toml +8 -8
  3. dycw_utilities-0.168.9/src/tests/test_grp.py +24 -0
  4. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_os.py +21 -0
  5. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pathlib.py +25 -1
  6. dycw_utilities-0.168.9/src/tests/test_pwd.py +24 -0
  7. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/__init__.py +1 -1
  8. dycw_utilities-0.168.9/src/utilities/grp.py +28 -0
  9. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/os.py +38 -0
  10. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pathlib.py +17 -0
  11. dycw_utilities-0.168.9/src/utilities/pwd.py +28 -0
  12. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/.gitignore +0 -0
  13. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/LICENSE +0 -0
  14. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/README.md +0 -0
  15. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/__init__.py +0 -0
  16. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/conftest.py +0 -0
  17. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/__init__.py +0 -0
  18. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_missing/__init__.py +0 -0
  19. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_missing/module.py +0 -0
  20. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/__init__.py +0 -0
  21. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/outer_1.py +0 -0
  22. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/outer_2.py +0 -0
  23. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  24. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  25. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  26. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  27. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_without/__init__.py +0 -0
  28. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_without/module_1.py +0 -0
  29. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/package_without/module_2.py +0 -0
  30. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/standalone.py +0 -0
  31. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/modules/with_imports.py +0 -0
  32. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  33. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  34. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  35. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  36. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  37. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  38. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  39. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  40. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_aeventkit.py +0 -0
  41. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_asyncio.py +0 -0
  43. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_atomicwrites.py +0 -0
  44. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_atools.py +0 -0
  45. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_cachetools.py +0 -0
  46. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_click.py +0 -0
  47. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_concurrent.py +0 -0
  48. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_contextlib.py +0 -0
  49. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_contextvars.py +0 -0
  50. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_cryptography.py +0 -0
  51. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_cvxpy.py +0 -0
  52. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_dataclasses.py +0 -0
  53. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_docker.py +0 -0
  54. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_enum.py +0 -0
  55. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_errors.py +0 -0
  56. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_fastapi.py +0 -0
  57. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_fpdf2.py +0 -0
  58. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_functions.py +0 -0
  59. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_functools.py +0 -0
  60. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_getpass.py +0 -0
  61. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_git.py +0 -0
  62. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_gzip.py +0 -0
  63. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_hashlib.py +0 -0
  64. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_http.py +0 -0
  65. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_hypothesis.py +0 -0
  66. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_importlib.py +0 -0
  67. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_inflect.py +0 -0
  68. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_ipython.py +0 -0
  69. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_iterables.py +0 -0
  70. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_jinja2.py +0 -0
  71. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_json.py +0 -0
  72. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_jupyter.py +0 -0
  73. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_libcst.py +0 -0
  74. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_lightweight_charts.py +0 -0
  75. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_logging.py +0 -0
  76. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_math.py +0 -0
  77. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_memory_profiler.py +0 -0
  78. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_modules.py +0 -0
  79. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_more_itertools.py +0 -0
  80. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_numpy.py +0 -0
  81. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_objects/__init__.py +0 -0
  82. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_objects/objects.py +0 -0
  83. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_operator.py +0 -0
  84. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_optuna.py +0 -0
  85. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_orjson.py +0 -0
  86. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_parse.py +0 -0
  87. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_polars.py +0 -0
  90. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_polars_ols.py +0 -0
  91. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_postgres.py +0 -0
  92. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pottery.py +0 -0
  93. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pqdm.py +0 -0
  94. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_psutil.py +0 -0
  95. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pydantic.py +0 -0
  96. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pydantic_settings.py +0 -0
  97. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pydantic_settings_sops.py +0 -0
  98. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pyinstrument.py +0 -0
  99. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pytest.py +0 -0
  100. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pytest_randomly.py +0 -0
  101. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_pytest_regressions.py +0 -0
  102. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_random.py +0 -0
  103. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_re.py +0 -0
  104. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_redis.py +0 -0
  105. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_reprlib.py +0 -0
  106. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_scipy.py +0 -0
  107. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_sentinel.py +0 -0
  108. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_shelve.py +0 -0
  109. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_slack_sdk.py +0 -0
  110. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_socket.py +0 -0
  111. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_sqlalchemy.py +0 -0
  112. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_sqlalchemy_polars.py +0 -0
  113. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_statsmodels.py +0 -0
  114. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_string.py +0 -0
  115. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_tempfile.py +0 -0
  116. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_testbook.py +0 -0
  117. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_text.py +0 -0
  118. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_threading.py +0 -0
  119. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_timer.py +0 -0
  120. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_traceback.py +0 -0
  121. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_types.py +0 -0
  122. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_typing.py +0 -0
  123. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_typing_funcs/__init__.py +0 -0
  124. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_typing_funcs/no_future.py +0 -0
  125. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_typing_funcs/with_future.py +0 -0
  126. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_tzdata.py +0 -0
  127. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_tzlocal.py +0 -0
  128. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_uuid.py +0 -0
  129. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_version.py +0 -0
  130. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_warnings.py +0 -0
  131. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_whenever.py +0 -0
  132. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_zipfile.py +0 -0
  133. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/tests/test_zoneinfo.py +0 -0
  134. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/aeventkit.py +0 -0
  135. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/altair.py +0 -0
  136. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/asyncio.py +0 -0
  137. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/atomicwrites.py +0 -0
  138. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/atools.py +0 -0
  139. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/cachetools.py +0 -0
  140. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/click.py +0 -0
  141. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/concurrent.py +0 -0
  142. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/contextlib.py +0 -0
  143. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/contextvars.py +0 -0
  144. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/cryptography.py +0 -0
  145. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/cvxpy.py +0 -0
  146. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/dataclasses.py +0 -0
  147. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/docker.py +0 -0
  148. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/enum.py +0 -0
  149. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/errors.py +0 -0
  150. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/fastapi.py +0 -0
  151. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/fpdf2.py +0 -0
  152. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/functions.py +0 -0
  153. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/functools.py +0 -0
  154. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/getpass.py +0 -0
  155. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/git.py +0 -0
  156. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/gzip.py +0 -0
  157. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/hashlib.py +0 -0
  158. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/http.py +0 -0
  159. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/hypothesis.py +0 -0
  160. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/importlib.py +0 -0
  161. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/inflect.py +0 -0
  162. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/ipython.py +0 -0
  163. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/iterables.py +0 -0
  164. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/jinja2.py +0 -0
  165. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/json.py +0 -0
  166. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/jupyter.py +0 -0
  167. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/libcst.py +0 -0
  168. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/lightweight_charts.py +0 -0
  169. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/logging.py +0 -0
  170. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/math.py +0 -0
  171. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/memory_profiler.py +0 -0
  172. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/modules.py +0 -0
  173. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/more_itertools.py +0 -0
  174. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/numpy.py +0 -0
  175. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/operator.py +0 -0
  176. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/optuna.py +0 -0
  177. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/orjson.py +0 -0
  178. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/parse.py +0 -0
  179. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pickle.py +0 -0
  180. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/platform.py +0 -0
  181. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/polars.py +0 -0
  182. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/polars_ols.py +0 -0
  183. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/postgres.py +0 -0
  184. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pottery.py +0 -0
  185. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pqdm.py +0 -0
  186. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/psutil.py +0 -0
  187. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/py.typed +0 -0
  188. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pydantic.py +0 -0
  189. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pydantic_settings.py +0 -0
  190. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pydantic_settings_sops.py +0 -0
  191. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pyinstrument.py +0 -0
  192. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pytest.py +0 -0
  193. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pytest_plugins/__init__.py +0 -0
  194. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  195. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  196. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/pytest_regressions.py +0 -0
  197. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/random.py +0 -0
  198. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/re.py +0 -0
  199. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/redis.py +0 -0
  200. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/reprlib.py +0 -0
  201. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/scipy.py +0 -0
  202. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/sentinel.py +0 -0
  203. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/shelve.py +0 -0
  204. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/slack_sdk.py +0 -0
  205. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/socket.py +0 -0
  206. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/sqlalchemy.py +0 -0
  207. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/sqlalchemy_polars.py +0 -0
  208. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/statsmodels.py +0 -0
  209. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/string.py +0 -0
  210. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/tempfile.py +0 -0
  211. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/testbook.py +0 -0
  212. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/text.py +0 -0
  213. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/threading.py +0 -0
  214. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/timer.py +0 -0
  215. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/traceback.py +0 -0
  216. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/types.py +0 -0
  217. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/typing.py +0 -0
  218. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/tzdata.py +0 -0
  219. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/tzlocal.py +0 -0
  220. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/uuid.py +0 -0
  221. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/version.py +0 -0
  222. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/warnings.py +0 -0
  223. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/whenever.py +0 -0
  224. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/zipfile.py +0 -0
  225. {dycw_utilities-0.168.7 → dycw_utilities-0.168.9}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.168.7
3
+ Version: 0.168.9
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -52,14 +52,14 @@ dev = [
52
52
  "pytest-timeout >=2.4.0, <2.5",
53
53
  ]
54
54
  fastapi = [
55
- "fastapi >=0.118.0, <0.119",
55
+ "fastapi >=0.118.2, <0.119",
56
56
  ]
57
57
  fastapi-test = [
58
58
  "httpx",
59
59
  "uvicorn",
60
60
  ]
61
61
  fpdf2 = [
62
- "fpdf2 >=2.8.3, <2.9",
62
+ "fpdf2 >=2.8.4, <2.9",
63
63
  ]
64
64
  gitpython = [
65
65
  "gitpython >=3.1.45, <3.2",
@@ -109,7 +109,7 @@ more-itertools = [
109
109
  "more-itertools >=10.8.0, <10.9",
110
110
  ]
111
111
  numpy = [
112
- "numpy >=2.3.2, <2.4",
112
+ "numpy >=2.3.3, <2.4",
113
113
  ]
114
114
  operator = [
115
115
  "polars",
@@ -163,7 +163,7 @@ pydantic-settings-test = [
163
163
  "tomlkit",
164
164
  ]
165
165
  pyinstrument = [
166
- "pyinstrument >=5.1.0, <5.2",
166
+ "pyinstrument >=5.1.1, <5.2",
167
167
  ]
168
168
  pytest = [
169
169
  "pytest >=8.4.2, <8.5",
@@ -207,7 +207,7 @@ slack-sdk-test = [
207
207
  "aiohttp",
208
208
  ]
209
209
  sqlalchemy = [
210
- "sqlalchemy >=2.0.42, <2.1",
210
+ "sqlalchemy >=2.0.43, <2.1",
211
211
  "psycopg",
212
212
  ]
213
213
  sqlalchemy-polars = [
@@ -225,7 +225,7 @@ sqlalchemy-test = [
225
225
  "greenlet",
226
226
  ]
227
227
  statsmodels = [
228
- "statsmodels >=0.14.4, <0.15",
228
+ "statsmodels >=0.14.5, <0.15",
229
229
  ]
230
230
  testbook = [
231
231
  "testbook >=0.4.2, <0.5",
@@ -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.7"
252
+ version = "0.168.9"
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.7"
285
+ current_version = "0.168.9"
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)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.168.7"
3
+ __version__ = "0.168.9"
@@ -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"]