dycw-utilities 0.133.6__tar.gz → 0.133.7__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 (218) hide show
  1. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/PKG-INFO +1 -1
  2. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/pyproject.toml +2 -2
  3. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_click.py +196 -103
  4. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/click.py +34 -8
  6. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/.gitignore +0 -0
  7. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/LICENSE +0 -0
  8. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/README.md +0 -0
  9. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_aiolimiter.py +0 -0
  35. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_altair.py +0 -0
  36. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_arq.py +0 -0
  37. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_asyncio.py +0 -0
  38. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_asyncio_classes/__init__.py +0 -0
  39. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_asyncio_classes/loopers.py +0 -0
  40. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_asyncio_classes/redis.py +0 -0
  41. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_atomicwrites.py +0 -0
  42. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_atools.py +0 -0
  43. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_cachetools.py +0 -0
  44. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_concurrent.py +0 -0
  45. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_contextlib.py +0 -0
  46. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_contextvars.py +0 -0
  47. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_cryptography.py +0 -0
  48. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_cvxpy.py +0 -0
  49. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_dataclasses.py +0 -0
  50. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_eventkit.py +0 -0
  53. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_fastapi.py +0 -0
  54. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_fpdf2.py +0 -0
  55. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_functions.py +0 -0
  56. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_functools.py +0 -0
  57. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_getpass.py +0 -0
  58. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_git.py +0 -0
  59. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_hashlib.py +0 -0
  60. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_http.py +0 -0
  61. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_hypothesis.py +0 -0
  62. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_inflect.py +0 -0
  64. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_ipython.py +0 -0
  65. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_iterables.py +0 -0
  66. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_jupyter.py +0 -0
  67. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_libcst.py +0 -0
  68. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_lightweight_charts.py +0 -0
  69. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_logging.py +0 -0
  70. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_luigi.py +0 -0
  71. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_period.py +0 -0
  85. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pickle.py +0 -0
  86. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_platform.py +0 -0
  87. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_polars.py +0 -0
  88. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_polars_ols.py +0 -0
  89. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pottery.py +0 -0
  90. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_psutil.py +0 -0
  92. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pydantic.py +0 -0
  93. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pyinstrument.py +0 -0
  94. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_statsmodels.py +0 -0
  109. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_streamlit.py +0 -0
  110. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_string.py +0 -0
  111. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_text.py +0 -0
  113. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_threading.py +0 -0
  114. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_timer.py +0 -0
  115. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_traceback.py +0 -0
  116. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_typed_settings.py +0 -0
  117. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_types.py +0 -0
  118. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_typing.py +0 -0
  119. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_typing_funcs/__init__.py +0 -0
  120. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_typing_funcs/no_future.py +0 -0
  121. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_typing_funcs/with_future.py +0 -0
  122. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_tzdata.py +0 -0
  123. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_tzlocal.py +0 -0
  124. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_uuid.py +0 -0
  125. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_version.py +0 -0
  126. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_warnings.py +0 -0
  127. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_whenever.py +0 -0
  128. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_zipfile.py +0 -0
  129. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/tests/test_zoneinfo.py +0 -0
  130. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/aiolimiter.py +0 -0
  131. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/altair.py +0 -0
  132. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/arq.py +0 -0
  133. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/asyncio.py +0 -0
  134. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/atomicwrites.py +0 -0
  135. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/atools.py +0 -0
  136. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/cachetools.py +0 -0
  137. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/concurrent.py +0 -0
  138. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/contextlib.py +0 -0
  139. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/contextvars.py +0 -0
  140. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/cryptography.py +0 -0
  141. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/cvxpy.py +0 -0
  142. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/dataclasses.py +0 -0
  143. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/enum.py +0 -0
  144. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/errors.py +0 -0
  145. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/eventkit.py +0 -0
  146. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/fastapi.py +0 -0
  147. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/fpdf2.py +0 -0
  148. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/functions.py +0 -0
  149. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/functools.py +0 -0
  150. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/getpass.py +0 -0
  151. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/git.py +0 -0
  152. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/hashlib.py +0 -0
  153. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/http.py +0 -0
  154. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/hypothesis.py +0 -0
  155. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/importlib.py +0 -0
  156. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/inflect.py +0 -0
  157. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/ipython.py +0 -0
  158. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/iterables.py +0 -0
  159. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/jupyter.py +0 -0
  160. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/libcst.py +0 -0
  161. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/lightweight_charts.py +0 -0
  162. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/logging.py +0 -0
  163. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/luigi.py +0 -0
  164. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/math.py +0 -0
  165. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/memory_profiler.py +0 -0
  166. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/modules.py +0 -0
  167. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/more_itertools.py +0 -0
  168. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/numpy.py +0 -0
  169. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/operator.py +0 -0
  170. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/optuna.py +0 -0
  171. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/orjson.py +0 -0
  172. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/os.py +0 -0
  173. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/parse.py +0 -0
  174. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pathlib.py +0 -0
  175. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/period.py +0 -0
  176. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pickle.py +0 -0
  177. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/platform.py +0 -0
  178. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/polars.py +0 -0
  179. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/polars_ols.py +0 -0
  180. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pottery.py +0 -0
  181. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pqdm.py +0 -0
  182. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/psutil.py +0 -0
  183. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/py.typed +0 -0
  184. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pydantic.py +0 -0
  185. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pyinstrument.py +0 -0
  186. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pytest.py +0 -0
  187. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/python_dotenv.py +0 -0
  189. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/random.py +0 -0
  190. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/re.py +0 -0
  191. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/redis.py +0 -0
  192. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/reprlib.py +0 -0
  193. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/scipy.py +0 -0
  194. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/sentinel.py +0 -0
  195. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/shelve.py +0 -0
  196. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/slack_sdk.py +0 -0
  197. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/socket.py +0 -0
  198. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/sqlalchemy.py +0 -0
  199. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/sqlalchemy_polars.py +0 -0
  200. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/statsmodels.py +0 -0
  201. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/streamlit.py +0 -0
  202. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/string.py +0 -0
  203. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/tempfile.py +0 -0
  204. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/text.py +0 -0
  205. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/threading.py +0 -0
  206. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/timer.py +0 -0
  207. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/traceback.py +0 -0
  208. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/typed_settings.py +0 -0
  209. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/types.py +0 -0
  210. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/typing.py +0 -0
  211. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/tzdata.py +0 -0
  212. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/tzlocal.py +0 -0
  213. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/uuid.py +0 -0
  214. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/version.py +0 -0
  215. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/warnings.py +0 -0
  216. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/whenever.py +0 -0
  217. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/zipfile.py +0 -0
  218. {dycw_utilities-0.133.6 → dycw_utilities-0.133.7}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.133.6
3
+ Version: 0.133.7
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -104,7 +104,7 @@ dependencies = [
104
104
  name = "dycw-utilities"
105
105
  readme = "README.md"
106
106
  requires-python = ">= 3.12"
107
- version = "0.133.6"
107
+ version = "0.133.7"
108
108
 
109
109
  [project.optional-dependencies]
110
110
  logging = [
@@ -131,7 +131,7 @@ test = [
131
131
  # bump-my-version
132
132
  [tool.bumpversion]
133
133
  allow_dirty = true
134
- current_version = "0.133.6"
134
+ current_version = "0.133.7"
135
135
 
136
136
  [[tool.bumpversion.files]]
137
137
  filename = "src/utilities/__init__.py"
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import enum
4
+ from dataclasses import dataclass
4
5
  from enum import auto
5
6
  from operator import attrgetter
6
7
  from re import search
7
- from typing import TYPE_CHECKING, Any, TypeVar
8
+ from typing import TYPE_CHECKING, Any, ClassVar, Generic, TypeVar
8
9
 
9
10
  import whenever
10
11
  from click import ParamType, argument, command, echo, option
@@ -13,7 +14,6 @@ from hypothesis import given
13
14
  from hypothesis.strategies import (
14
15
  DataObject,
15
16
  SearchStrategy,
16
- booleans,
17
17
  data,
18
18
  frozensets,
19
19
  ip_addresses,
@@ -40,6 +40,7 @@ from utilities.click import (
40
40
  FrozenSetStrs,
41
41
  IPv4Address,
42
42
  IPv6Address,
43
+ ListChoices,
43
44
  ListEnums,
44
45
  ListStrs,
45
46
  Month,
@@ -54,7 +55,6 @@ from utilities.hypothesis import (
54
55
  dates,
55
56
  freqs,
56
57
  months,
57
- pairs,
58
58
  plain_datetimes,
59
59
  text_ascii,
60
60
  time_deltas,
@@ -184,124 +184,217 @@ def _lift_serializer(
184
184
  return wrapped
185
185
 
186
186
 
187
+ @dataclass(kw_only=True, slots=True)
188
+ class _Case(Generic[_T]):
189
+ param: ParamType
190
+ name: str
191
+ repr: str | None = None
192
+ strategy: SearchStrategy[_T]
193
+ serialize: Callable[[_T], str]
194
+ failable: bool = False
195
+
196
+
187
197
  class TestParameters:
188
- @given(data=data(), use_value=booleans())
198
+ cases: ClassVar[list[_Case]] = [
199
+ _Case(
200
+ param=Date(),
201
+ name="date",
202
+ strategy=dates(),
203
+ serialize=whenever.Date.format_common_iso,
204
+ failable=True,
205
+ ),
206
+ _Case(
207
+ param=DateDelta(),
208
+ name="date delta",
209
+ strategy=date_deltas(parsable=True),
210
+ serialize=whenever.DateDelta.format_common_iso,
211
+ failable=True,
212
+ ),
213
+ _Case(
214
+ param=DateTimeDelta(),
215
+ name="date-time delta",
216
+ strategy=date_time_deltas(parsable=True),
217
+ serialize=whenever.DateTimeDelta.format_common_iso,
218
+ failable=True,
219
+ ),
220
+ _Case(
221
+ param=Enum(_ExampleEnum),
222
+ name="enum[_ExampleEnum]",
223
+ repr="ENUM[_ExampleEnum]",
224
+ strategy=sampled_from(_ExampleEnum),
225
+ serialize=attrgetter("name"),
226
+ failable=True,
227
+ ),
228
+ _Case(
229
+ param=Freq(),
230
+ name="freq",
231
+ strategy=freqs(),
232
+ serialize=utilities.whenever.Freq.serialize,
233
+ failable=True,
234
+ ),
235
+ _Case(
236
+ param=FrozenSetChoices(["a", "b", "c"]),
237
+ name="frozenset[choice]",
238
+ repr="FROZENSET[Choice(['a', 'b', 'c'])]",
239
+ strategy=frozensets(sampled_from(["a", "b", "c"])),
240
+ serialize=_lift_serializer(str, sort=True),
241
+ failable=True,
242
+ ),
243
+ _Case(
244
+ param=FrozenSetEnums(_ExampleEnum),
245
+ name="frozenset[enum[_ExampleEnum]]",
246
+ repr="FROZENSET[ENUM[_ExampleEnum]]",
247
+ strategy=frozensets(sampled_from(_ExampleEnum)),
248
+ serialize=_lift_serializer(attrgetter("name"), sort=True),
249
+ failable=True,
250
+ ),
251
+ _Case(
252
+ param=FrozenSetStrs(),
253
+ name="frozenset[text]",
254
+ repr="FROZENSET[STRING]",
255
+ strategy=frozensets(text_ascii()),
256
+ serialize=_lift_serializer(str, sort=True),
257
+ ),
258
+ _Case(
259
+ param=IPv4Address(),
260
+ name="ipv4 address",
261
+ strategy=ip_addresses(v=4),
262
+ serialize=str,
263
+ failable=True,
264
+ ),
265
+ _Case(
266
+ param=IPv6Address(),
267
+ name="ipv6 address",
268
+ strategy=ip_addresses(v=6),
269
+ serialize=str,
270
+ failable=True,
271
+ ),
272
+ _Case(
273
+ param=ListChoices(["a", "b", "c"]),
274
+ name="list[choice]",
275
+ repr="LIST[Choice(['a', 'b', 'c'])]",
276
+ strategy=frozensets(sampled_from(["a", "b", "c"])),
277
+ serialize=_lift_serializer(str, sort=True),
278
+ failable=True,
279
+ ),
280
+ _Case(
281
+ param=ListEnums(_ExampleEnum),
282
+ name="list[enum[_ExampleEnum]]",
283
+ repr="LIST[ENUM[_ExampleEnum]]",
284
+ strategy=lists(sampled_from(_ExampleEnum)),
285
+ serialize=_lift_serializer(attrgetter("name")),
286
+ failable=True,
287
+ ),
288
+ _Case(
289
+ param=Month(),
290
+ name="month",
291
+ strategy=months(),
292
+ serialize=utilities.whenever.Month.format_common_iso,
293
+ failable=True,
294
+ ),
295
+ _Case(
296
+ param=PlainDateTime(),
297
+ name="plain date-time",
298
+ strategy=plain_datetimes(),
299
+ serialize=whenever.PlainDateTime.format_common_iso,
300
+ failable=True,
301
+ ),
302
+ _Case(
303
+ param=Time(),
304
+ name="time",
305
+ strategy=times(),
306
+ serialize=whenever.Time.format_common_iso,
307
+ failable=True,
308
+ ),
309
+ _Case(
310
+ param=TimeDelta(),
311
+ name="time-delta",
312
+ strategy=time_deltas(),
313
+ serialize=whenever.TimeDelta.format_common_iso,
314
+ failable=True,
315
+ ),
316
+ _Case(
317
+ param=ZonedDateTime(),
318
+ name="zoned date-time",
319
+ strategy=zoned_datetimes(),
320
+ serialize=whenever.ZonedDateTime.format_common_iso,
321
+ failable=True,
322
+ ),
323
+ ]
324
+
325
+ @given(data=data())
189
326
  @mark.parametrize(
190
- ("param", "exp_repr", "strategy", "serialize", "failable"),
191
- [
192
- param(Date(), "DATE", dates(), whenever.Date.format_common_iso, True),
193
- param(
194
- DateDelta(),
195
- "DATE DELTA",
196
- date_deltas(parsable=True),
197
- whenever.DateDelta.format_common_iso,
198
- True,
199
- ),
200
- param(
201
- DateTimeDelta(),
202
- "DATE-TIME DELTA",
203
- date_time_deltas(parsable=True),
204
- whenever.DateTimeDelta.format_common_iso,
205
- True,
206
- ),
207
- param(
208
- Enum(_ExampleEnum),
209
- "ENUM[_ExampleEnum]",
210
- sampled_from(_ExampleEnum),
211
- attrgetter("name"),
212
- True,
213
- ),
214
- param(Freq(), "FREQ", freqs(), utilities.whenever.Freq.serialize, True),
215
- param(
216
- FrozenSetChoices(["a", "b", "c"]),
217
- "FROZENSET[Choice(['a', 'b', 'c'])]",
218
- frozensets(sampled_from(["a", "b", "c"])),
219
- _lift_serializer(str, sort=True),
220
- True,
221
- ),
222
- param(
223
- FrozenSetEnums(_ExampleEnum),
224
- "FROZENSET[ENUM[_ExampleEnum]]",
225
- frozensets(sampled_from(_ExampleEnum)),
226
- _lift_serializer(attrgetter("name"), sort=True),
227
- True,
228
- ),
229
- param(
230
- FrozenSetStrs(),
231
- "FROZENSET[STRING]",
232
- frozensets(text_ascii()),
233
- _lift_serializer(str, sort=True),
234
- False,
235
- ),
236
- param(IPv4Address(), "IPV4 ADDRESS", ip_addresses(v=4), str, True),
237
- param(IPv6Address(), "IPV6 ADDRESS", ip_addresses(v=6), str, True),
238
- param(
239
- ListEnums(_ExampleEnum),
240
- "LIST[ENUM[_ExampleEnum]]",
241
- lists(sampled_from(_ExampleEnum)),
242
- _lift_serializer(attrgetter("name")),
243
- True,
244
- ),
245
- param(
246
- Month(),
247
- "MONTH",
248
- months(),
249
- utilities.whenever.Month.format_common_iso,
250
- True,
251
- ),
252
- param(
253
- PlainDateTime(),
254
- "PLAIN DATE-TIME",
255
- plain_datetimes(),
256
- whenever.PlainDateTime.format_common_iso,
257
- True,
258
- ),
259
- param(Time(), "TIME", times(), whenever.Time.format_common_iso, True),
260
- param(
261
- TimeDelta(),
262
- "TIME-DELTA",
263
- time_deltas(),
264
- whenever.TimeDelta.format_common_iso,
265
- True,
266
- ),
267
- param(
268
- ZonedDateTime(),
269
- "ZONED DATE-TIME",
270
- zoned_datetimes(),
271
- whenever.ZonedDateTime.format_common_iso,
272
- True,
273
- ),
274
- ],
327
+ ("param", "strategy", "serialize"),
328
+ [param(c.param, c.strategy, c.serialize) for c in cases],
275
329
  )
276
- def test_main(
330
+ def test_default(
277
331
  self,
278
332
  *,
279
333
  data: DataObject,
280
334
  param: ParamType,
281
- exp_repr: str,
282
335
  strategy: SearchStrategy[Any],
283
336
  serialize: Callable[[Any], str],
284
- use_value: bool,
285
- failable: bool,
286
337
  ) -> None:
287
- assert repr(param) == exp_repr
288
-
289
- default, value = data.draw(pairs(strategy))
338
+ default = data.draw(strategy)
290
339
 
291
340
  @command()
292
341
  @option("--value", type=param, default=default)
293
342
  def cli(*, value: Any) -> None:
294
343
  echo(f"value = {serialize(value)}")
295
344
 
296
- args = [f"--value={serialize(value)}"] if use_value else None
297
- result = CliRunner().invoke(cli, args=args)
345
+ result = CliRunner().invoke(cli, args=[])
346
+ assert result.exit_code == 0
347
+ assert result.stdout == f"value = {serialize(default)}\n"
348
+
349
+ @given(data=data())
350
+ @mark.parametrize(
351
+ ("param", "strategy", "serialize"),
352
+ [param(c.param, c.strategy, c.serialize) for c in cases],
353
+ )
354
+ def test_cli_value(
355
+ self,
356
+ *,
357
+ data: DataObject,
358
+ param: ParamType,
359
+ strategy: SearchStrategy[Any],
360
+ serialize: Callable[[Any], str],
361
+ ) -> None:
362
+ @command()
363
+ @option("--value", type=param)
364
+ def cli(*, value: Any) -> None:
365
+ echo(f"value = {serialize(value)}")
366
+
367
+ value = data.draw(strategy)
368
+ ser = serialize(value)
369
+ result = CliRunner().invoke(cli, args=[f"--value={ser}"])
298
370
  assert result.exit_code == 0
299
- expected_str = serialize(value if use_value else default)
300
- assert result.stdout == f"value = {expected_str}\n"
371
+ assert result.stdout == f"value = {ser}\n"
301
372
 
302
- result = CliRunner().invoke(cli, ["--value=error"])
303
- expected = 2 if failable else 0
304
- assert result.exit_code == expected
373
+ @mark.parametrize(
374
+ ("param", "serialize"),
375
+ [param(c.param, c.serialize) for c in cases if c.failable],
376
+ )
377
+ def test_cli_fail(
378
+ self, *, param: ParamType, serialize: Callable[[Any], str]
379
+ ) -> None:
380
+ @command()
381
+ @option("--value", type=param)
382
+ def cli(*, value: Any) -> None:
383
+ echo(f"value = {serialize(value)}")
384
+
385
+ result = CliRunner().invoke(cli, args=["--value=invalid"])
386
+ assert result.exit_code == 2
387
+
388
+ @mark.parametrize(("param", "name"), [param(c.param, c.name) for c in cases])
389
+ def test_name(self, *, param: ParamType, name: str) -> None:
390
+ assert param.name == name
391
+
392
+ @mark.parametrize(
393
+ ("param", "repr_", "name"), [param(c.param, c.repr, c.name) for c in cases]
394
+ )
395
+ def test_repr(self, *, param: ParamType, repr_: str | None, name: str) -> None:
396
+ expected = name.upper() if repr_ is None else repr_
397
+ assert repr(param) == expected
305
398
 
306
399
  @mark.parametrize(
307
400
  "param",
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.133.6"
3
+ __version__ = "0.133.7"
@@ -148,9 +148,10 @@ class DateTimeDelta(ParamType):
148
148
  class Enum(ParamType, Generic[TEnum]):
149
149
  """An enum-valued parameter."""
150
150
 
151
+ @override
151
152
  def __init__(self, enum: type[TEnum], /, *, case_sensitive: bool = False) -> None:
152
153
  cls = get_class_name(enum)
153
- self.name = f"ENUM[{cls}]"
154
+ self.name = f"enum[{cls}]"
154
155
  self._enum = enum
155
156
  self._case_sensitive = case_sensitive
156
157
  super().__init__()
@@ -180,9 +181,11 @@ class Enum(ParamType, Generic[TEnum]):
180
181
  class Freq(ParamType):
181
182
  """An frequency-valued parameter."""
182
183
 
184
+ name = "freq"
185
+
183
186
  @override
184
187
  def __repr__(self) -> str:
185
- return "FREQ"
188
+ return self.name.upper()
186
189
 
187
190
  @override
188
191
  def convert(
@@ -383,16 +386,16 @@ class ZonedDateTime(ParamType):
383
386
  class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
384
387
  """A frozenset-valued parameter."""
385
388
 
389
+ @override
386
390
  def __init__(self, param: _TParam, /, *, separator: str = ",") -> None:
387
- self.name = f"FROZENSET[{param.name}]"
391
+ self.name = f"frozenset[{param.name}]"
388
392
  self._param = param
389
393
  self._separator = separator
390
394
  super().__init__()
391
395
 
392
396
  @override
393
397
  def __repr__(self) -> str:
394
- desc = repr(self._param)
395
- return f"FROZENSET[{desc}]"
398
+ return f"FROZENSET[{self._param!r}]"
396
399
 
397
400
  @override
398
401
  def convert(
@@ -425,6 +428,7 @@ class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
425
428
  class FrozenSetChoices(FrozenSetParameter[Choice, str]):
426
429
  """A frozenset-of-choices-valued parameter."""
427
430
 
431
+ @override
428
432
  def __init__(
429
433
  self,
430
434
  choices: Sequence[str],
@@ -441,6 +445,7 @@ class FrozenSetChoices(FrozenSetParameter[Choice, str]):
441
445
  class FrozenSetEnums(FrozenSetParameter[Enum[TEnum], TEnum]):
442
446
  """A frozenset-of-enums-valued parameter."""
443
447
 
448
+ @override
444
449
  def __init__(
445
450
  self,
446
451
  enum: type[TEnum],
@@ -455,6 +460,7 @@ class FrozenSetEnums(FrozenSetParameter[Enum[TEnum], TEnum]):
455
460
  class FrozenSetStrs(FrozenSetParameter[StringParamType, str]):
456
461
  """A frozenset-of-strs-valued parameter."""
457
462
 
463
+ @override
458
464
  def __init__(self, *, separator: str = ",") -> None:
459
465
  super().__init__(StringParamType(), separator=separator)
460
466
 
@@ -465,16 +471,16 @@ class FrozenSetStrs(FrozenSetParameter[StringParamType, str]):
465
471
  class ListParameter(ParamType, Generic[_TParam, _T]):
466
472
  """A list-valued parameter."""
467
473
 
474
+ @override
468
475
  def __init__(self, param: _TParam, /, *, separator: str = ",") -> None:
469
- self.name = f"LIST[{param.name}]"
476
+ self.name = f"list[{param.name}]"
470
477
  self._param = param
471
478
  self._separator = separator
472
479
  super().__init__()
473
480
 
474
481
  @override
475
482
  def __repr__(self) -> str:
476
- desc = repr(self._param)
477
- return f"LIST[{desc}]"
483
+ return f"LIST[{self._param!r}]"
478
484
 
479
485
  @override
480
486
  def convert(
@@ -504,9 +510,27 @@ class ListParameter(ParamType, Generic[_TParam, _T]):
504
510
  return _make_metavar(param, desc)
505
511
 
506
512
 
513
+ class ListChoices(ListParameter[Choice, str]):
514
+ """A frozenset-of-choices-valued parameter."""
515
+
516
+ @override
517
+ def __init__(
518
+ self,
519
+ choices: Sequence[str],
520
+ /,
521
+ *,
522
+ case_sensitive: bool = False,
523
+ separator: str = ",",
524
+ ) -> None:
525
+ super().__init__(
526
+ Choice(choices, case_sensitive=case_sensitive), separator=separator
527
+ )
528
+
529
+
507
530
  class ListEnums(ListParameter[Enum[TEnum], TEnum]):
508
531
  """A list-of-enums-valued parameter."""
509
532
 
533
+ @override
510
534
  def __init__(
511
535
  self,
512
536
  enum: type[TEnum],
@@ -521,6 +545,7 @@ class ListEnums(ListParameter[Enum[TEnum], TEnum]):
521
545
  class ListStrs(ListParameter[StringParamType, str]):
522
546
  """A list-of-strs-valued parameter."""
523
547
 
548
+ @override
524
549
  def __init__(self, *, separator: str = ",") -> None:
525
550
  super().__init__(StringParamType(), separator=separator)
526
551
 
@@ -550,6 +575,7 @@ __all__ = [
550
575
  "FrozenSetStrs",
551
576
  "IPv4Address",
552
577
  "IPv6Address",
578
+ "ListChoices",
553
579
  "ListEnums",
554
580
  "ListParameter",
555
581
  "ListStrs",