dycw-utilities 0.149.10__tar.gz → 0.150.0__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 (216) hide show
  1. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/pyproject.toml +3 -3
  3. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/conftest.py +67 -17
  4. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pottery.py +19 -5
  5. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_sqlalchemy.py +150 -101
  6. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_sqlalchemy_polars.py +45 -38
  7. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/__init__.py +1 -1
  8. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pottery.py +9 -1
  9. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/sqlalchemy.py +81 -8
  10. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/.gitignore +0 -0
  11. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/LICENSE +0 -0
  12. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/README.md +0 -0
  13. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/__init__.py +0 -0
  14. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/__init__.py +0 -0
  15. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_missing/__init__.py +0 -0
  16. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_missing/module.py +0 -0
  17. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/__init__.py +0 -0
  18. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/outer_1.py +0 -0
  19. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/outer_2.py +0 -0
  20. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  21. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  22. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  23. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  24. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_without/__init__.py +0 -0
  25. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_without/module_1.py +0 -0
  26. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/package_without/module_2.py +0 -0
  27. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/standalone.py +0 -0
  28. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/modules/with_imports.py +0 -0
  29. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  30. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  31. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  32. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  33. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  34. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  35. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  36. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  37. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_altair.py +0 -0
  38. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_asyncio.py +0 -0
  39. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_dnspython.py +0 -0
  50. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_eventkit.py +0 -0
  53. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_fastapi.py +0 -0
  54. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_fpdf2.py +0 -0
  55. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_functions.py +0 -0
  56. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_functools.py +0 -0
  57. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_getpass.py +0 -0
  58. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_gzip.py +0 -0
  59. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_hashlib.py +0 -0
  60. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_http.py +0 -0
  61. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_hypothesis.py +0 -0
  62. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_inflect.py +0 -0
  64. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_ipython.py +0 -0
  65. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_iterables.py +0 -0
  66. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_json.py +0 -0
  67. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_jupyter.py +0 -0
  68. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_libcst.py +0 -0
  69. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_lightweight_charts.py +0 -0
  70. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_logging.py +0 -0
  71. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_period.py +0 -0
  85. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pickle.py +0 -0
  86. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_platform.py +0 -0
  87. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_polars.py +0 -0
  88. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_polars_ols.py +0 -0
  89. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_postgres.py +0 -0
  90. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_psutil.py +0 -0
  92. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pytest.py +0 -0
  94. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pytest_randomly.py +0 -0
  95. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_random.py +0 -0
  97. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_re.py +0 -0
  98. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_redis.py +0 -0
  99. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_reprlib.py +0 -0
  100. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_scipy.py +0 -0
  101. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_sentinel.py +0 -0
  102. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_shelve.py +0 -0
  103. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_slack_sdk.py +0 -0
  104. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_socket.py +0 -0
  105. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_statsmodels.py +0 -0
  106. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_string.py +0 -0
  107. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_tempfile.py +0 -0
  108. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_text.py +0 -0
  109. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_threading.py +0 -0
  110. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_timer.py +0 -0
  111. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_traceback.py +0 -0
  112. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_typed_settings.py +0 -0
  113. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_types.py +0 -0
  114. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_typing.py +0 -0
  115. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  116. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  117. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  118. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_tzdata.py +0 -0
  119. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_tzlocal.py +0 -0
  120. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_uuid.py +0 -0
  121. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_version.py +0 -0
  122. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_warnings.py +0 -0
  123. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_whenever.py +0 -0
  124. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_yield_access/__init__.py +0 -0
  125. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_yield_access/script.py +0 -0
  126. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_yield_access/script.sh +0 -0
  127. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_zipfile.py +0 -0
  128. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/tests/test_zoneinfo.py +0 -0
  129. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/altair.py +0 -0
  130. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/asyncio.py +0 -0
  131. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/atomicwrites.py +0 -0
  132. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/atools.py +0 -0
  133. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/cachetools.py +0 -0
  134. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/click.py +0 -0
  135. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/concurrent.py +0 -0
  136. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/contextlib.py +0 -0
  137. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/contextvars.py +0 -0
  138. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/cryptography.py +0 -0
  139. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/cvxpy.py +0 -0
  140. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/dataclasses.py +0 -0
  141. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/dnspython.py +0 -0
  142. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/eventkit.py +0 -0
  145. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/fastapi.py +0 -0
  146. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/fpdf2.py +0 -0
  147. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/functions.py +0 -0
  148. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/functools.py +0 -0
  149. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/getpass.py +0 -0
  150. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/hypothesis.py +0 -0
  154. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/importlib.py +0 -0
  155. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/inflect.py +0 -0
  156. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/ipython.py +0 -0
  157. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/iterables.py +0 -0
  158. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/json.py +0 -0
  159. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/jupyter.py +0 -0
  160. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/libcst.py +0 -0
  161. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/lightweight_charts.py +0 -0
  162. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/logging.py +0 -0
  163. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/operator.py +0 -0
  169. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/optuna.py +0 -0
  170. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/orjson.py +0 -0
  171. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/period.py +0 -0
  175. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pickle.py +0 -0
  176. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/platform.py +0 -0
  177. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/polars.py +0 -0
  178. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/polars_ols.py +0 -0
  179. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/postgres.py +0 -0
  180. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pqdm.py +0 -0
  181. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/psutil.py +0 -0
  182. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/py.typed +0 -0
  183. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pyinstrument.py +0 -0
  184. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pytest.py +0 -0
  185. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pytest_plugins/__init__.py +0 -0
  186. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  187. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/pytest_regressions.py +0 -0
  189. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/random.py +0 -0
  190. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/re.py +0 -0
  191. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/redis.py +0 -0
  192. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/reprlib.py +0 -0
  193. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/scipy.py +0 -0
  194. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/sentinel.py +0 -0
  195. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/shelve.py +0 -0
  196. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/slack_sdk.py +0 -0
  197. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/socket.py +0 -0
  198. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/sqlalchemy_polars.py +0 -0
  199. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/statsmodels.py +0 -0
  200. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/traceback.py +0 -0
  206. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/typed_settings.py +0 -0
  207. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/types.py +0 -0
  208. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/whenever.py +0 -0
  215. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/zipfile.py +0 -0
  216. {dycw_utilities-0.149.10 → dycw_utilities-0.150.0}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.149.10
3
+ Version: 0.150.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -83,7 +83,7 @@ scipy = ["scipy >= 1.16.0, < 1.17"]
83
83
  sklearn = ["scikit-learn >= 1.7.0, < 1.8"]
84
84
  slack-sdk = ["slack-sdk >= 3.36.0, < 3.37"]
85
85
  slack-sdk-test = ["aiohttp"]
86
- sqlalchemy = ["sqlalchemy >= 2.0.41, < 2.1"]
86
+ sqlalchemy = ["sqlalchemy >= 2.0.41, < 2.1", "psycopg"]
87
87
  sqlalchemy-polars = ["sqlalchemy", "polars"]
88
88
  sqlalchemy-polars-test = ["aiosqlite", "asyncpg", "greenlet"]
89
89
  sqlalchemy-test = ["aiosqlite", "asyncpg", "greenlet"]
@@ -103,7 +103,7 @@ dependencies = [
103
103
  name = "dycw-utilities"
104
104
  readme = "README.md"
105
105
  requires-python = ">= 3.12"
106
- version = "0.149.10"
106
+ version = "0.150.0"
107
107
 
108
108
  [project.entry-points.pytest11]
109
109
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -136,7 +136,7 @@ test = [
136
136
  # bump-my-version
137
137
  [tool.bumpversion]
138
138
  allow_dirty = true
139
- current_version = "0.149.10"
139
+ current_version = "0.150.0"
140
140
 
141
141
  [[tool.bumpversion.files]]
142
142
  filename = "src/utilities/__init__.py"
@@ -1,10 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
- from asyncio import sleep
4
3
  from contextlib import AbstractContextManager, suppress
5
4
  from logging import LogRecord, setLogRecordFactory
6
5
  from os import environ
7
- from typing import TYPE_CHECKING, Any
6
+ from typing import TYPE_CHECKING
8
7
 
9
8
  from hypothesis import HealthCheck
10
9
  from pytest import fixture, mark, param, skip
@@ -22,6 +21,8 @@ if TYPE_CHECKING:
22
21
 
23
22
  from _pytest.fixtures import SubRequest
24
23
  from redis.asyncio import Redis
24
+ from sqlalchemy import Engine, TextClause
25
+ from sqlalchemy.ext.asyncio import AsyncEngine
25
26
 
26
27
 
27
28
  FLAKY = mark.flaky(reruns=5, reruns_delay=1)
@@ -81,31 +82,68 @@ async def test_redis() -> AsyncIterator[Redis]:
81
82
 
82
83
 
83
84
  @fixture(params=[param("sqlite"), param("postgresql", marks=SKIPIF_CI)])
84
- async def test_engine(*, request: SubRequest, tmp_path: Path) -> Any:
85
- from sqlalchemy import text
85
+ def test_engine(*, request: SubRequest, tmp_path: Path) -> Engine:
86
+ from sqlalchemy.exc import OperationalError
86
87
 
87
- from utilities.sqlalchemy import create_async_engine
88
+ from utilities.sqlalchemy import create_engine
88
89
 
89
90
  dialect = request.param
90
91
  match dialect:
91
92
  case "sqlite":
92
93
  db_path = tmp_path / "db.sqlite"
93
- return create_async_engine("sqlite+aiosqlite", database=str(db_path))
94
+ return create_engine("sqlite", database=str(db_path))
94
95
  case "postgresql":
95
- engine = create_async_engine(
96
- "postgresql+asyncpg", host="localhost", port=5432, database="testing"
96
+ engine = create_engine(
97
+ "postgresql+psycopg", host="localhost", port=5432, database="testing"
97
98
  )
98
- query = text("SELECT tablename FROM pg_tables")
99
- async with engine.begin() as conn:
100
- tables: Sequence[str] = (await conn.execute(query)).scalars().all()
101
- for table in tables:
102
- if _is_to_drop(table):
99
+ try:
100
+ with engine.begin() as conn:
101
+ tables: Sequence[str] = (
102
+ conn.execute(_select_tables()).scalars().all()
103
+ )
104
+ except OperationalError:
105
+ ...
106
+ else:
107
+ for table in filter(_is_to_drop, tables):
108
+ with engine.begin() as conn, suppress(Exception):
109
+ _ = conn.execute(_drop_table(table))
110
+ return engine
111
+ case _:
112
+ msg = f"Unsupported dialect: {dialect}"
113
+ raise NotImplementedError(msg)
114
+
115
+
116
+ @fixture(params=[param("sqlite"), param("postgresql", marks=SKIPIF_CI)])
117
+ async def test_async_engine(*, request: SubRequest, tmp_path: Path) -> AsyncEngine:
118
+ from utilities.sqlalchemy import create_engine
119
+
120
+ dialect = request.param
121
+ match dialect:
122
+ case "sqlite":
123
+ db_path = tmp_path / "db.sqlite"
124
+ return create_engine("sqlite+aiosqlite", database=str(db_path), async_=True)
125
+ case "postgresql":
126
+ from asyncpg.exceptions import InvalidCatalogNameError
127
+
128
+ engine = create_engine(
129
+ "postgresql+asyncpg",
130
+ host="localhost",
131
+ port=5432,
132
+ database="testing",
133
+ async_=True,
134
+ )
135
+ try:
136
+ async with engine.begin() as conn:
137
+ tables: Sequence[str] = (
138
+ (await conn.execute(_select_tables())).scalars().all()
139
+ )
140
+ except InvalidCatalogNameError:
141
+ ...
142
+ else:
143
+ for table in filter(_is_to_drop, tables):
103
144
  async with engine.begin() as conn:
104
145
  with suppress(Exception):
105
- _ = await conn.execute(
106
- text(f'DROP TABLE IF EXISTS "{table}" CASCADE')
107
- )
108
- await sleep(0.01)
146
+ _ = await conn.execute(_drop_table(table))
109
147
  return engine
110
148
  case _:
111
149
  msg = f"Unsupported dialect: {dialect}"
@@ -122,3 +160,15 @@ def _is_to_drop(table: str, /) -> bool:
122
160
  )
123
161
  now = get_now()
124
162
  return (now - datetime) >= MINUTE
163
+
164
+
165
+ def _select_tables() -> TextClause:
166
+ from sqlalchemy import text
167
+
168
+ return text("SELECT tablename FROM pg_tables")
169
+
170
+
171
+ def _drop_table(table: str, /) -> TextClause:
172
+ from sqlalchemy import text
173
+
174
+ return text(f'DROP TABLE IF EXISTS "{table}" CASCADE')
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from asyncio import TaskGroup
4
+ from contextvars import ContextVar
4
5
  from typing import TYPE_CHECKING, ClassVar
5
6
 
6
7
  from pottery import AIORedlock
@@ -39,16 +40,27 @@ class TestTryYieldCoroutineLooper:
39
40
  delta: ClassVar[TimeDelta] = 0.1 * SECOND
40
41
 
41
42
  @mark.parametrize("use_logger", [param(True), param(False)])
43
+ @mark.parametrize("use_context", [param(True), param(False)])
42
44
  async def test_main(
43
- self, *, caplog: LogCaptureFixture, use_logger: bool, test_redis: Redis
45
+ self,
46
+ *,
47
+ caplog: LogCaptureFixture,
48
+ use_logger: bool,
49
+ use_context: bool,
50
+ test_redis: Redis,
44
51
  ) -> None:
45
52
  caplog.set_level("DEBUG", logger=(name := unique_str()))
46
53
  lst: list[None] = []
47
54
  logger = name if use_logger else None
55
+ context = ContextVar(unique_str(), default=False) if use_context else None
48
56
 
49
57
  async with TaskGroup() as tg:
50
- _ = tg.create_task(self.now(test_redis, name, lst, logger=logger))
51
- _ = tg.create_task(self.delayed(test_redis, name, lst, logger=logger))
58
+ _ = tg.create_task(
59
+ self.now(test_redis, name, lst, logger=logger, context=context)
60
+ )
61
+ _ = tg.create_task(
62
+ self.delayed(test_redis, name, lst, logger=logger, context=context)
63
+ )
52
64
 
53
65
  assert len(lst) == 1
54
66
  if use_logger:
@@ -68,9 +80,10 @@ class TestTryYieldCoroutineLooper:
68
80
  /,
69
81
  *,
70
82
  logger: LoggerOrName | None = None,
83
+ context: ContextVar[bool] | None = None,
71
84
  ) -> None:
72
85
  async with try_yield_coroutine_looper(
73
- redis, key, timeout_acquire=self.delta, logger=logger
86
+ redis, key, timeout_acquire=self.delta, logger=logger, context=context
74
87
  ) as looper:
75
88
  if looper is not None:
76
89
  assert await looper(self.func_main, lst)
@@ -83,9 +96,10 @@ class TestTryYieldCoroutineLooper:
83
96
  /,
84
97
  *,
85
98
  logger: LoggerOrName | None = None,
99
+ context: ContextVar[bool] | None = None,
86
100
  ) -> None:
87
101
  await sleep_td(self.delta)
88
- await self.now(redis, key, lst, logger=logger)
102
+ await self.now(redis, key, lst, logger=logger, context=context)
89
103
 
90
104
  @mark.parametrize("use_logger", [param(True), param(False)])
91
105
  async def test_error(