dycw-utilities 0.166.13__tar.gz → 0.166.15__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.
Files changed (225) hide show
  1. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/PKG-INFO +2 -2
  2. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/pyproject.toml +8 -4
  3. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/conftest.py +3 -3
  4. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +5 -0
  5. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +71 -0
  6. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +5 -0
  7. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +5 -0
  8. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +5 -0
  9. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +9 -0
  10. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +74 -0
  11. dycw_utilities-0.166.15/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +71 -0
  12. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_hypothesis.py +5 -4
  13. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_iterables.py +1 -1
  14. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pydantic_settings.py +28 -6
  15. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pytest.py +4 -6
  16. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_re.py +1 -5
  17. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_redis.py +6 -6
  18. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_text.py +18 -18
  19. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/__init__.py +1 -1
  20. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/altair.py +1 -3
  21. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/click.py +4 -4
  22. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/hypothesis.py +3 -7
  23. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/libcst.py +1 -1
  24. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/polars.py +1 -1
  25. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pydantic_settings.py +8 -0
  26. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pytest.py +3 -3
  27. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/sqlalchemy.py +1 -1
  28. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/text.py +6 -6
  29. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/traceback.py +2 -2
  30. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -1
  31. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -26
  32. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -1
  33. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -1
  34. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -1
  35. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -5
  36. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -25
  37. dycw_utilities-0.166.13/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -26
  38. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/.gitignore +0 -0
  39. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/LICENSE +0 -0
  40. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/README.md +0 -0
  41. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/__init__.py +0 -0
  42. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/__init__.py +0 -0
  43. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_missing/__init__.py +0 -0
  44. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_missing/module.py +0 -0
  45. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/__init__.py +0 -0
  46. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/outer_1.py +0 -0
  47. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/outer_2.py +0 -0
  48. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  49. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  50. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  51. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  52. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_without/__init__.py +0 -0
  53. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_without/module_1.py +0 -0
  54. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/package_without/module_2.py +0 -0
  55. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/standalone.py +0 -0
  56. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/modules/with_imports.py +0 -0
  57. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_aeventkit.py +0 -0
  58. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_altair.py +0 -0
  59. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_asyncio.py +0 -0
  60. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_atomicwrites.py +0 -0
  61. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_atools.py +0 -0
  62. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_cachetools.py +0 -0
  63. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_click.py +0 -0
  64. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_concurrent.py +0 -0
  65. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_contextlib.py +0 -0
  66. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_contextvars.py +0 -0
  67. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_cryptography.py +0 -0
  68. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_cvxpy.py +0 -0
  69. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_dataclasses.py +0 -0
  70. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_enum.py +0 -0
  71. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_errors.py +0 -0
  72. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_fastapi.py +0 -0
  73. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_fpdf2.py +0 -0
  74. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_functions.py +0 -0
  75. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_functools.py +0 -0
  76. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_getpass.py +0 -0
  77. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_git.py +0 -0
  78. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_gzip.py +0 -0
  79. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_hashlib.py +0 -0
  80. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_http.py +0 -0
  81. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_importlib.py +0 -0
  82. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_inflect.py +0 -0
  83. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_ipython.py +0 -0
  84. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_json.py +0 -0
  85. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_jupyter.py +0 -0
  86. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_libcst.py +0 -0
  87. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_lightweight_charts.py +0 -0
  88. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_logging.py +0 -0
  89. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_math.py +0 -0
  90. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_memory_profiler.py +0 -0
  91. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_modules.py +0 -0
  92. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_more_itertools.py +0 -0
  93. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_numpy.py +0 -0
  94. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_objects/__init__.py +0 -0
  95. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_objects/objects.py +0 -0
  96. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_operator.py +0 -0
  97. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_optuna.py +0 -0
  98. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_orjson.py +0 -0
  99. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_os.py +0 -0
  100. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_parse.py +0 -0
  101. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pathlib.py +0 -0
  102. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pickle.py +0 -0
  103. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_platform.py +0 -0
  104. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_polars.py +0 -0
  105. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_polars_ols.py +0 -0
  106. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_postgres.py +0 -0
  107. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pottery.py +0 -0
  108. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pqdm.py +0 -0
  109. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_psutil.py +0 -0
  110. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pydantic_settings_sops.py +0 -0
  111. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pyinstrument.py +0 -0
  112. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pytest_randomly.py +0 -0
  113. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_pytest_regressions.py +0 -0
  114. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_random.py +0 -0
  115. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_reprlib.py +0 -0
  116. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_scipy.py +0 -0
  117. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_sentinel.py +0 -0
  118. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_shelve.py +0 -0
  119. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_slack_sdk.py +0 -0
  120. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_socket.py +0 -0
  121. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_sqlalchemy.py +0 -0
  122. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_sqlalchemy_polars.py +0 -0
  123. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_statsmodels.py +0 -0
  124. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_string.py +0 -0
  125. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_tempfile.py +0 -0
  126. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_testbook.py +0 -0
  127. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_threading.py +0 -0
  128. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_timer.py +0 -0
  129. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_traceback.py +0 -0
  130. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_typed_settings.py +0 -0
  131. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_types.py +0 -0
  132. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_typing.py +0 -0
  133. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_typing_funcs/__init__.py +0 -0
  134. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_typing_funcs/no_future.py +0 -0
  135. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_typing_funcs/with_future.py +0 -0
  136. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_tzdata.py +0 -0
  137. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_tzlocal.py +0 -0
  138. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_uuid.py +0 -0
  139. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_version.py +0 -0
  140. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_warnings.py +0 -0
  141. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_whenever.py +0 -0
  142. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_zipfile.py +0 -0
  143. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/tests/test_zoneinfo.py +0 -0
  144. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/aeventkit.py +0 -0
  145. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/asyncio.py +0 -0
  146. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/atomicwrites.py +0 -0
  147. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/atools.py +0 -0
  148. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/cachetools.py +0 -0
  149. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/concurrent.py +0 -0
  150. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/contextlib.py +0 -0
  151. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/contextvars.py +0 -0
  152. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/cryptography.py +0 -0
  153. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/cvxpy.py +0 -0
  154. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/dataclasses.py +0 -0
  155. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/enum.py +0 -0
  156. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/errors.py +0 -0
  157. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/fastapi.py +0 -0
  158. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/fpdf2.py +0 -0
  159. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/functions.py +0 -0
  160. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/functools.py +0 -0
  161. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/getpass.py +0 -0
  162. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/git.py +0 -0
  163. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/gzip.py +0 -0
  164. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/hashlib.py +0 -0
  165. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/http.py +0 -0
  166. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/importlib.py +0 -0
  167. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/inflect.py +0 -0
  168. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/ipython.py +0 -0
  169. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/iterables.py +0 -0
  170. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/json.py +0 -0
  171. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/jupyter.py +0 -0
  172. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/lightweight_charts.py +0 -0
  173. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/logging.py +0 -0
  174. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/math.py +0 -0
  175. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/memory_profiler.py +0 -0
  176. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/modules.py +0 -0
  177. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/more_itertools.py +0 -0
  178. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/numpy.py +0 -0
  179. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/operator.py +0 -0
  180. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/optuna.py +0 -0
  181. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/orjson.py +0 -0
  182. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/os.py +0 -0
  183. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/parse.py +0 -0
  184. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pathlib.py +0 -0
  185. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pickle.py +0 -0
  186. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/platform.py +0 -0
  187. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/polars_ols.py +0 -0
  188. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/postgres.py +0 -0
  189. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pottery.py +0 -0
  190. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pqdm.py +0 -0
  191. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/psutil.py +0 -0
  192. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/py.typed +0 -0
  193. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pydantic_settings_sops.py +0 -0
  194. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pyinstrument.py +0 -0
  195. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pytest_plugins/__init__.py +0 -0
  196. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  197. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  198. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/pytest_regressions.py +0 -0
  199. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/random.py +0 -0
  200. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/re.py +0 -0
  201. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/redis.py +0 -0
  202. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/reprlib.py +0 -0
  203. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/scipy.py +0 -0
  204. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/sentinel.py +0 -0
  205. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/shelve.py +0 -0
  206. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/slack_sdk.py +0 -0
  207. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/socket.py +0 -0
  208. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/sqlalchemy_polars.py +0 -0
  209. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/statsmodels.py +0 -0
  210. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/string.py +0 -0
  211. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/tempfile.py +0 -0
  212. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/testbook.py +0 -0
  213. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/threading.py +0 -0
  214. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/timer.py +0 -0
  215. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/typed_settings.py +0 -0
  216. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/types.py +0 -0
  217. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/typing.py +0 -0
  218. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/tzdata.py +0 -0
  219. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/tzlocal.py +0 -0
  220. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/uuid.py +0 -0
  221. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/version.py +0 -0
  222. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/warnings.py +0 -0
  223. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/whenever.py +0 -0
  224. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/zipfile.py +0 -0
  225. {dycw_utilities-0.166.13 → dycw_utilities-0.166.15}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.166.13
3
+ Version: 0.166.15
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -20,7 +20,7 @@ Requires-Dist: pytest-lazy-fixtures<1.4,>=1.3.4; extra == 'test'
20
20
  Requires-Dist: pytest-randomly<3.17,>=3.16.0; extra == 'test'
21
21
  Requires-Dist: pytest-regressions<2.9,>=2.8.2; extra == 'test'
22
22
  Requires-Dist: pytest-repeat<0.10,>=0.9.4; extra == 'test'
23
- Requires-Dist: pytest-rerunfailures<16,>=15.1; extra == 'test'
23
+ Requires-Dist: pytest-rerunfailures<16.1,>=16.0.1; extra == 'test'
24
24
  Requires-Dist: pytest-rng<1.1,>=1.0.0; extra == 'test'
25
25
  Requires-Dist: pytest-timeout<2.5,>=2.4.0; extra == 'test'
26
26
  Requires-Dist: pytest-xdist<3.9,>=3.8.0; extra == 'test'
@@ -103,7 +103,7 @@ memory-profiler = [
103
103
  "memory-profiler >=0.61.0, <0.62",
104
104
  ]
105
105
  more-itertools = [
106
- "more-itertools >=10.7.0, <10.8",
106
+ "more-itertools >=10.8.0, <10.9",
107
107
  ]
108
108
  numpy = [
109
109
  "numpy >=2.3.1, <2.4",
@@ -152,6 +152,10 @@ pydantic-settings = [
152
152
  pydantic-settings-sops = [
153
153
  "pydantic-settings-sops",
154
154
  ]
155
+ pydantic-settings-test = [
156
+ "pyyaml",
157
+ "tomlkit",
158
+ ]
155
159
  pyinstrument = [
156
160
  "pyinstrument >=5.1.0, <5.2",
157
161
  ]
@@ -242,7 +246,7 @@ dependencies = [
242
246
  name = "dycw-utilities"
243
247
  readme = "README.md"
244
248
  requires-python = ">= 3.12"
245
- version = "0.166.13"
249
+ version = "0.166.15"
246
250
 
247
251
  [project.entry-points.pytest11]
248
252
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -263,7 +267,7 @@ test = [
263
267
  "pytest-randomly >=3.16.0, <3.17",
264
268
  "pytest-regressions >=2.8.2, <2.9",
265
269
  "pytest-repeat >=0.9.4, <0.10",
266
- "pytest-rerunfailures >=15.1, <16",
270
+ "pytest-rerunfailures >=16.0.1, <16.1",
267
271
  "pytest-rng >=1.0.0, <1.1",
268
272
  "pytest-timeout >=2.4.0, <2.5",
269
273
  "pytest-xdist >=3.8.0, <3.9",
@@ -275,7 +279,7 @@ test = [
275
279
  # bump-my-version
276
280
  [tool.bumpversion]
277
281
  allow_dirty = true
278
- current_version = "0.166.13"
282
+ current_version = "0.166.15"
279
283
 
280
284
  [[tool.bumpversion.files]]
281
285
  filename = "src/utilities/__init__.py"
@@ -15,7 +15,7 @@ from utilities.re import ExtractGroupError, extract_group
15
15
  from utilities.whenever import MINUTE, get_now_local_plain
16
16
 
17
17
  if TYPE_CHECKING:
18
- from collections.abc import AsyncIterator, Iterator, Sequence
18
+ from collections.abc import AsyncIterator, Iterator
19
19
  from pathlib import Path
20
20
 
21
21
  from _pytest.fixtures import SubRequest
@@ -99,7 +99,7 @@ def test_engine(*, request: SubRequest, tmp_path: Path) -> Engine:
99
99
  )
100
100
  try:
101
101
  with engine.begin() as conn:
102
- tables: Sequence[str] = (
102
+ tables: list[str] = list(
103
103
  conn.execute(_select_tables()).scalars().all()
104
104
  )
105
105
  except OperationalError:
@@ -157,7 +157,7 @@ async def test_async_postgres_engine() -> AsyncEngine:
157
157
  )
158
158
  try:
159
159
  async with engine.begin() as conn:
160
- tables: Sequence[str] = (
160
+ tables: list[str] = list(
161
161
  (await conn.execute(_select_tables())).scalars().all()
162
162
  )
163
163
  except InvalidCatalogNameError:
@@ -0,0 +1,71 @@
1
+ {
2
+ "describe": [
3
+ {
4
+ "statistic": "count",
5
+ "value": 10.0
6
+ },
7
+ {
8
+ "statistic": "null_count",
9
+ "value": 0.0
10
+ },
11
+ {
12
+ "statistic": "mean",
13
+ "value": 4.5
14
+ },
15
+ {
16
+ "statistic": "std",
17
+ "value": 3.0276503540974917
18
+ },
19
+ {
20
+ "statistic": "min",
21
+ "value": 0.0
22
+ },
23
+ {
24
+ "statistic": "10%",
25
+ "value": 1.0
26
+ },
27
+ {
28
+ "statistic": "20%",
29
+ "value": 2.0
30
+ },
31
+ {
32
+ "statistic": "30%",
33
+ "value": 3.0
34
+ },
35
+ {
36
+ "statistic": "40%",
37
+ "value": 4.0
38
+ },
39
+ {
40
+ "statistic": "50%",
41
+ "value": 5.0
42
+ },
43
+ {
44
+ "statistic": "60%",
45
+ "value": 5.0
46
+ },
47
+ {
48
+ "statistic": "70%",
49
+ "value": 6.0
50
+ },
51
+ {
52
+ "statistic": "80%",
53
+ "value": 7.0
54
+ },
55
+ {
56
+ "statistic": "90%",
57
+ "value": 8.0
58
+ },
59
+ {
60
+ "statistic": "max",
61
+ "value": 9.0
62
+ }
63
+ ],
64
+ "estimated_size": 80,
65
+ "has_nulls": false,
66
+ "is_empty": false,
67
+ "is_sorted": true,
68
+ "len": 10,
69
+ "n_unique": 10,
70
+ "null_count": 0
71
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "[dc|DataClassFutureNestedOuterFirstOuter]": {
3
+ "inner": {
4
+ "[dc|DataClassFutureNestedOuterFirstInner]": {
5
+ "int_": 0
6
+ }
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "approx_n_unique": {
3
+ "value": 10
4
+ },
5
+ "describe": [
6
+ {
7
+ "statistic": "count",
8
+ "value": 10.0
9
+ },
10
+ {
11
+ "statistic": "null_count",
12
+ "value": 0.0
13
+ },
14
+ {
15
+ "statistic": "mean",
16
+ "value": 4.5
17
+ },
18
+ {
19
+ "statistic": "std",
20
+ "value": 3.0276503540974917
21
+ },
22
+ {
23
+ "statistic": "min",
24
+ "value": 0.0
25
+ },
26
+ {
27
+ "statistic": "10%",
28
+ "value": 1.0
29
+ },
30
+ {
31
+ "statistic": "20%",
32
+ "value": 2.0
33
+ },
34
+ {
35
+ "statistic": "30%",
36
+ "value": 3.0
37
+ },
38
+ {
39
+ "statistic": "40%",
40
+ "value": 4.0
41
+ },
42
+ {
43
+ "statistic": "50%",
44
+ "value": 5.0
45
+ },
46
+ {
47
+ "statistic": "60%",
48
+ "value": 5.0
49
+ },
50
+ {
51
+ "statistic": "70%",
52
+ "value": 6.0
53
+ },
54
+ {
55
+ "statistic": "80%",
56
+ "value": 7.0
57
+ },
58
+ {
59
+ "statistic": "90%",
60
+ "value": 8.0
61
+ },
62
+ {
63
+ "statistic": "max",
64
+ "value": 9.0
65
+ }
66
+ ],
67
+ "estimated_size": 80,
68
+ "glimpse": "Rows: 10\nColumns: 1\n$ value <i64> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\n",
69
+ "is_empty": false,
70
+ "n_unique": 10,
71
+ "null_count": {
72
+ "value": 0
73
+ }
74
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "describe": [
3
+ {
4
+ "statistic": "count",
5
+ "value": 10.0
6
+ },
7
+ {
8
+ "statistic": "null_count",
9
+ "value": 0.0
10
+ },
11
+ {
12
+ "statistic": "mean",
13
+ "value": 4.5
14
+ },
15
+ {
16
+ "statistic": "std",
17
+ "value": 3.0276503540974917
18
+ },
19
+ {
20
+ "statistic": "min",
21
+ "value": 0.0
22
+ },
23
+ {
24
+ "statistic": "10%",
25
+ "value": 1.0
26
+ },
27
+ {
28
+ "statistic": "20%",
29
+ "value": 2.0
30
+ },
31
+ {
32
+ "statistic": "30%",
33
+ "value": 3.0
34
+ },
35
+ {
36
+ "statistic": "40%",
37
+ "value": 4.0
38
+ },
39
+ {
40
+ "statistic": "50%",
41
+ "value": 5.0
42
+ },
43
+ {
44
+ "statistic": "60%",
45
+ "value": 5.0
46
+ },
47
+ {
48
+ "statistic": "70%",
49
+ "value": 6.0
50
+ },
51
+ {
52
+ "statistic": "80%",
53
+ "value": 7.0
54
+ },
55
+ {
56
+ "statistic": "90%",
57
+ "value": 8.0
58
+ },
59
+ {
60
+ "statistic": "max",
61
+ "value": 9.0
62
+ }
63
+ ],
64
+ "estimated_size": 80,
65
+ "has_nulls": false,
66
+ "is_empty": false,
67
+ "is_sorted": true,
68
+ "len": 10,
69
+ "n_unique": 10,
70
+ "null_count": 0
71
+ }
@@ -760,10 +760,11 @@ class TestPairs:
760
760
 
761
761
 
762
762
  class TestPaths:
763
- @given(data=data())
764
- def test_main(self, *, data: DataObject) -> None:
765
- min_depth = data.draw(integers(0, 3) | none())
766
- max_depth = data.draw(integers(0, 3) | none())
763
+ @given(data=data(), depths=pairs(integers(0, 3) | none()))
764
+ def test_main(
765
+ self, *, data: DataObject, depths: tuple[int | None, int | None]
766
+ ) -> None:
767
+ min_depth, max_depth = depths
767
768
  with assume_does_not_raise(InvalidArgument):
768
769
  path = data.draw(paths(min_depth=min_depth, max_depth=max_depth))
769
770
  assert isinstance(path, Path)
@@ -575,7 +575,7 @@ class TestChunked:
575
575
  ],
576
576
  )
577
577
  def test_main(
578
- self, *, iterable: Iterable[str], expected: Sequence[Sequence[str]]
578
+ self, *, iterable: Iterable[str], expected: Sequence[list[str]]
579
579
  ) -> None:
580
580
  result = list(chunked(iterable, 3))
581
581
  assert result == expected
@@ -1,8 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
- from json import dumps
3
+ import json
4
4
  from typing import TYPE_CHECKING, ClassVar
5
5
 
6
+ import tomlkit
7
+ import yaml
6
8
  from pydantic_settings import BaseSettings, SettingsConfigDict
7
9
 
8
10
  from utilities.os import temp_environ
@@ -15,18 +17,38 @@ if TYPE_CHECKING:
15
17
 
16
18
 
17
19
  class TestCustomBaseSettings:
18
- def test_main(self, *, tmp_path: Path) -> None:
19
- file = tmp_path.joinpath("settings.toml")
20
- _ = file.write_text(dumps({"x": 1, "y": 2}))
20
+ def test_json(self, *, tmp_path: Path) -> None:
21
+ file = tmp_path.joinpath("settings.json")
22
+ _ = file.write_text(json.dumps({"x": 1}))
21
23
 
22
24
  class Settings(CustomBaseSettings):
23
25
  json_files: ClassVar[MaybeIterable[PathLike]] = file
24
26
  x: int
25
- y: int
26
27
 
27
28
  settings = load_settings(Settings)
28
29
  assert settings.x == 1
29
- assert settings.y == 2
30
+
31
+ def test_toml(self, *, tmp_path: Path) -> None:
32
+ file = tmp_path.joinpath("settings.toml")
33
+ _ = file.write_text(tomlkit.dumps({"x": 1}))
34
+
35
+ class Settings(CustomBaseSettings):
36
+ toml_files: ClassVar[MaybeIterable[PathLike]] = file
37
+ x: int
38
+
39
+ settings = load_settings(Settings)
40
+ assert settings.x == 1
41
+
42
+ def test_yaml(self, *, tmp_path: Path) -> None:
43
+ file = tmp_path.joinpath("settings.yaml")
44
+ _ = file.write_text(yaml.dump({"x": 1}))
45
+
46
+ class Settings(CustomBaseSettings):
47
+ yaml_files: ClassVar[MaybeIterable[PathLike]] = file
48
+ x: int
49
+
50
+ settings = load_settings(Settings)
51
+ assert settings.x == 1
30
52
 
31
53
  def test_env_var(self) -> None:
32
54
  class Settings(CustomBaseSettings):
@@ -12,8 +12,6 @@ from utilities.os import temp_environ
12
12
  from utilities.pytest import NodeIdToPathError, node_id_path, throttle
13
13
 
14
14
  if TYPE_CHECKING:
15
- from collections.abc import Sequence
16
-
17
15
  from _pytest.legacypath import Testdir
18
16
 
19
17
 
@@ -117,10 +115,10 @@ class TestPytestOptions:
117
115
  self,
118
116
  *,
119
117
  testdir: Testdir,
120
- case: Sequence[str],
118
+ case: list[str],
121
119
  passed: int,
122
120
  skipped: int,
123
- matches: Sequence[str],
121
+ matches: list[str],
124
122
  ) -> None:
125
123
  _ = testdir.makeconftest(
126
124
  """
@@ -183,10 +181,10 @@ class TestPytestOptions:
183
181
  self,
184
182
  *,
185
183
  testdir: Testdir,
186
- case: Sequence[str],
184
+ case: list[str],
187
185
  passed: int,
188
186
  skipped: int,
189
- matches: Sequence[str],
187
+ matches: list[str],
190
188
  ) -> None:
191
189
  _ = testdir.makeconftest(
192
190
  """
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  from re import DOTALL
5
- from typing import TYPE_CHECKING
6
5
 
7
6
  from pytest import mark, param, raises
8
7
 
@@ -19,9 +18,6 @@ from utilities.re import (
19
18
  extract_groups,
20
19
  )
21
20
 
22
- if TYPE_CHECKING:
23
- from collections.abc import Sequence
24
-
25
21
 
26
22
  class TestEnsurePattern:
27
23
  def test_pattern(self) -> None:
@@ -81,7 +77,7 @@ class TestExtractGroups:
81
77
  ("pattern", "text", "expected"),
82
78
  [param(r"(\d)", "A0A", ["0"]), param(r"(\d)(\w)", "A0A0", ["0", "A"])],
83
79
  )
84
- def test_main(self, *, pattern: str, text: str, expected: Sequence[str]) -> None:
80
+ def test_main(self, *, pattern: str, text: str, expected: list[str]) -> None:
85
81
  assert extract_groups(pattern, text) == expected
86
82
 
87
83
  def test_with_flags(self) -> None:
@@ -246,7 +246,7 @@ class TestPublish:
246
246
  phases={Phase.generate},
247
247
  suppress_health_check={HealthCheck.function_scoped_fixture},
248
248
  )
249
- async def test_text(self, *, test_redis: Redis, messages: Sequence[str]) -> None:
249
+ async def test_text(self, *, test_redis: Redis, messages: list[str]) -> None:
250
250
  channel = f"test_{unique_str()}"
251
251
  queue: Queue[str] = Queue()
252
252
  async with subscribe(test_redis, channel, queue):
@@ -291,7 +291,7 @@ class TestPublishMany:
291
291
  phases={Phase.generate},
292
292
  suppress_health_check={HealthCheck.function_scoped_fixture},
293
293
  )
294
- async def test_timeout(self, *, test_redis: Redis, messages: Sequence[str]) -> None:
294
+ async def test_timeout(self, *, test_redis: Redis, messages: list[str]) -> None:
295
295
  result = await publish_many(
296
296
  test_redis, unique_str(), messages, timeout=MICROSECOND
297
297
  )
@@ -687,8 +687,8 @@ class TestSubscribe:
687
687
  *,
688
688
  test_redis: Redis,
689
689
  data: DataObject,
690
- short_messages: Sequence[str],
691
- long_messages: Sequence[str],
690
+ short_messages: list[str],
691
+ long_messages: list[str],
692
692
  ) -> None:
693
693
  channel = unique_str()
694
694
  messages = data.draw(permutations(list(chain(short_messages, long_messages))))
@@ -713,7 +713,7 @@ class TestSubscribe:
713
713
  phases={Phase.generate},
714
714
  suppress_health_check={HealthCheck.function_scoped_fixture},
715
715
  )
716
- async def test_raw(self, *, test_redis: Redis, messages: Sequence[str]) -> None:
716
+ async def test_raw(self, *, test_redis: Redis, messages: list[str]) -> None:
717
717
  channel = f"test_{unique_str()}"
718
718
  queue: Queue[_RedisMessage] = Queue()
719
719
  async with subscribe(test_redis, channel, queue, output="raw"):
@@ -737,7 +737,7 @@ class TestSubscribe:
737
737
  phases={Phase.generate},
738
738
  suppress_health_check={HealthCheck.function_scoped_fixture},
739
739
  )
740
- async def test_text(self, *, test_redis: Redis, messages: Sequence[str]) -> None:
740
+ async def test_text(self, *, test_redis: Redis, messages: list[str]) -> None:
741
741
  channel = f"test_{unique_str()}"
742
742
  queue: Queue[_RedisMessage] = Queue()
743
743
  async with subscribe(test_redis, channel, queue, output="raw"):
@@ -241,15 +241,15 @@ class TestSplitAndJoinStr:
241
241
  @mark.parametrize(
242
242
  ("text", "n", "expected"),
243
243
  [
244
- param("", 0, []),
245
- param(r"\,", 1, [""]),
246
- param(",", 2, ["", ""]),
247
- param(",,", 3, ["", "", ""]),
248
- param("1", 1, ["1"]),
249
- param("1,22", 2, ["1", "22"]),
250
- param("1,22,333", 3, ["1", "22", "333"]),
251
- param("1,,333", 3, ["1", "", "333"]),
252
- param("1,(22,22,22),333", 5, ["1", "(22", "22", "22)", "333"]),
244
+ param("", 0, ()),
245
+ param(r"\,", 1, ("",)),
246
+ param(",", 2, ("", "")),
247
+ param(",,", 3, ("", "", "")),
248
+ param("1", 1, ("1",)),
249
+ param("1,22", 2, ("1", "22")),
250
+ param("1,22,333", 3, ("1", "22", "333")),
251
+ param("1,,333", 3, ("1", "", "333")),
252
+ param("1,(22,22,22),333", 5, ("1", "(22", "22", "22)", "333")),
253
253
  ],
254
254
  )
255
255
  def test_main(
@@ -267,12 +267,12 @@ class TestSplitAndJoinStr:
267
267
  @mark.parametrize(
268
268
  ("text", "n", "expected"),
269
269
  [
270
- param("1", 1, ["1"]),
271
- param("1,22", 2, ["1", "22"]),
272
- param("1,22,333", 3, ["1", "22", "333"]),
273
- param("1,(22),333", 3, ["1", "(22)", "333"]),
274
- param("1,(22,22),333", 3, ["1", "(22,22)", "333"]),
275
- param("1,(22,22,22),333", 3, ["1", "(22,22,22)", "333"]),
270
+ param("1", 1, ("1",)),
271
+ param("1,22", 2, ("1", "22")),
272
+ param("1,22,333", 3, ("1", "22", "333")),
273
+ param("1,(22),333", 3, ("1", "(22)", "333")),
274
+ param("1,(22,22),333", 3, ("1", "(22,22)", "333")),
275
+ param("1,(22,22,22),333", 3, ("1", "(22,22,22)", "333")),
276
276
  ],
277
277
  )
278
278
  def test_brackets(
@@ -286,13 +286,13 @@ class TestSplitAndJoinStr:
286
286
  assert result == tuple(expected)
287
287
  assert join_strs(result) == text
288
288
 
289
- @given(texts=lists(text_ascii()))
290
- def test_generic(self, *, texts: list[str]) -> None:
289
+ @given(texts=lists(text_ascii()).map(tuple))
290
+ def test_generic(self, *, texts: tuple[str, ...]) -> None:
291
291
  assert split_str(join_strs(texts)) == texts
292
292
 
293
293
  @given(texts=sets(text_ascii()))
294
294
  def test_sort(self, *, texts: set[str]) -> None:
295
- assert split_str(join_strs(texts, sort=True)) == sorted(texts)
295
+ assert split_str(join_strs(texts, sort=True)) == tuple(sorted(texts))
296
296
 
297
297
  def test_error_closing_bracket_mismatched(self) -> None:
298
298
  with raises(
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.166.13"
3
+ __version__ = "0.166.15"
@@ -29,8 +29,6 @@ from utilities.iterables import always_iterable
29
29
  from utilities.tempfile import TemporaryDirectory
30
30
 
31
31
  if TYPE_CHECKING:
32
- from collections.abc import Sequence
33
-
34
32
  from polars import DataFrame
35
33
 
36
34
  from utilities.types import PathLike
@@ -43,7 +41,7 @@ _WIDTH = 800
43
41
 
44
42
  @dataclass(kw_only=True, slots=True)
45
43
  class _PlotDataFramesSpec:
46
- y: Sequence[str]
44
+ y: list[str]
47
45
  height: int = _HEIGHT
48
46
 
49
47
 
@@ -17,7 +17,7 @@ from utilities.parse import ParseObjectError, parse_object
17
17
  from utilities.text import split_str
18
18
 
19
19
  if TYPE_CHECKING:
20
- from collections.abc import Iterable, Sequence
20
+ from collections.abc import Iterable
21
21
 
22
22
  from utilities.types import (
23
23
  DateDeltaLike,
@@ -38,7 +38,7 @@ if TYPE_CHECKING:
38
38
 
39
39
 
40
40
  class _HelpOptionNames(TypedDict):
41
- help_option_names: Sequence[str]
41
+ help_option_names: list[str]
42
42
 
43
43
 
44
44
  class _ContextSettings(TypedDict):
@@ -469,7 +469,7 @@ class FrozenSetChoices(FrozenSetParameter[Choice, str]):
469
469
  @override
470
470
  def __init__(
471
471
  self,
472
- choices: Sequence[str],
472
+ choices: list[str],
473
473
  /,
474
474
  *,
475
475
  case_sensitive: bool = False,
@@ -554,7 +554,7 @@ class ListChoices(ListParameter[Choice, str]):
554
554
  @override
555
555
  def __init__(
556
556
  self,
557
- choices: Sequence[str],
557
+ choices: list[str],
558
558
  /,
559
559
  *,
560
560
  case_sensitive: bool = False,