dycw-utilities 0.150.0__tar.gz → 0.150.2__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.150.0 → dycw_utilities-0.150.2}/PKG-INFO +1 -1
  2. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/pyproject.toml +2 -2
  3. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_postgres.py +23 -13
  4. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/postgres.py +38 -8
  6. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/sqlalchemy.py +7 -2
  7. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/.gitignore +0 -0
  8. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/LICENSE +0 -0
  9. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/README.md +0 -0
  10. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_altair.py +0 -0
  36. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_asyncio.py +0 -0
  37. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_atomicwrites.py +0 -0
  38. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_atools.py +0 -0
  39. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_cachetools.py +0 -0
  40. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_click.py +0 -0
  41. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_concurrent.py +0 -0
  42. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_contextlib.py +0 -0
  43. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_contextvars.py +0 -0
  44. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_cryptography.py +0 -0
  45. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_cvxpy.py +0 -0
  46. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_dataclasses.py +0 -0
  47. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_dnspython.py +0 -0
  48. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_enum.py +0 -0
  49. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_errors.py +0 -0
  50. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_eventkit.py +0 -0
  51. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_fastapi.py +0 -0
  52. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_fpdf2.py +0 -0
  53. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_functions.py +0 -0
  54. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_functools.py +0 -0
  55. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_getpass.py +0 -0
  56. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_gzip.py +0 -0
  57. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_hashlib.py +0 -0
  58. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_http.py +0 -0
  59. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_hypothesis.py +0 -0
  60. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_importlib.py +0 -0
  61. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_inflect.py +0 -0
  62. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_ipython.py +0 -0
  63. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_iterables.py +0 -0
  64. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_json.py +0 -0
  65. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_jupyter.py +0 -0
  66. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_libcst.py +0 -0
  67. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_lightweight_charts.py +0 -0
  68. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_logging.py +0 -0
  69. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_math.py +0 -0
  70. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_memory_profiler.py +0 -0
  71. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_modules.py +0 -0
  72. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_more_itertools.py +0 -0
  73. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_numpy.py +0 -0
  74. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_objects/__init__.py +0 -0
  75. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_objects/objects.py +0 -0
  76. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_operator.py +0 -0
  77. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_optuna.py +0 -0
  78. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_orjson.py +0 -0
  79. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_os.py +0 -0
  80. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_parse.py +0 -0
  81. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pathlib.py +0 -0
  82. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_period.py +0 -0
  83. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pickle.py +0 -0
  84. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_platform.py +0 -0
  85. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_polars.py +0 -0
  86. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_polars_ols.py +0 -0
  87. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pottery.py +0 -0
  88. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pqdm.py +0 -0
  89. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_psutil.py +0 -0
  90. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pyinstrument.py +0 -0
  91. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pytest.py +0 -0
  92. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pytest_randomly.py +0 -0
  93. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_pytest_regressions.py +0 -0
  94. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_random.py +0 -0
  95. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_re.py +0 -0
  96. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_redis.py +0 -0
  97. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_reprlib.py +0 -0
  98. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_scipy.py +0 -0
  99. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_sentinel.py +0 -0
  100. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_shelve.py +0 -0
  101. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_slack_sdk.py +0 -0
  102. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_socket.py +0 -0
  103. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_sqlalchemy.py +0 -0
  104. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  105. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_statsmodels.py +0 -0
  106. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_string.py +0 -0
  107. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_tempfile.py +0 -0
  108. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_text.py +0 -0
  109. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_threading.py +0 -0
  110. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_timer.py +0 -0
  111. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_traceback.py +0 -0
  112. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_typed_settings.py +0 -0
  113. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_types.py +0 -0
  114. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_typing.py +0 -0
  115. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  116. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  117. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  118. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_tzdata.py +0 -0
  119. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_tzlocal.py +0 -0
  120. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_uuid.py +0 -0
  121. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_version.py +0 -0
  122. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_warnings.py +0 -0
  123. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_whenever.py +0 -0
  124. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_yield_access/__init__.py +0 -0
  125. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_yield_access/script.py +0 -0
  126. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_yield_access/script.sh +0 -0
  127. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_zipfile.py +0 -0
  128. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/tests/test_zoneinfo.py +0 -0
  129. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/altair.py +0 -0
  130. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/asyncio.py +0 -0
  131. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/atomicwrites.py +0 -0
  132. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/atools.py +0 -0
  133. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/cachetools.py +0 -0
  134. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/click.py +0 -0
  135. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/concurrent.py +0 -0
  136. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/contextlib.py +0 -0
  137. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/contextvars.py +0 -0
  138. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/cryptography.py +0 -0
  139. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/cvxpy.py +0 -0
  140. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/dataclasses.py +0 -0
  141. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/dnspython.py +0 -0
  142. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/eventkit.py +0 -0
  145. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/fastapi.py +0 -0
  146. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/fpdf2.py +0 -0
  147. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/functions.py +0 -0
  148. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/functools.py +0 -0
  149. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/getpass.py +0 -0
  150. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/hypothesis.py +0 -0
  154. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/importlib.py +0 -0
  155. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/inflect.py +0 -0
  156. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/ipython.py +0 -0
  157. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/iterables.py +0 -0
  158. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/json.py +0 -0
  159. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/jupyter.py +0 -0
  160. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/libcst.py +0 -0
  161. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/lightweight_charts.py +0 -0
  162. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/logging.py +0 -0
  163. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/operator.py +0 -0
  169. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/optuna.py +0 -0
  170. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/orjson.py +0 -0
  171. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/period.py +0 -0
  175. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pickle.py +0 -0
  176. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/platform.py +0 -0
  177. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/polars.py +0 -0
  178. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/polars_ols.py +0 -0
  179. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pottery.py +0 -0
  180. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pqdm.py +0 -0
  181. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/psutil.py +0 -0
  182. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/py.typed +0 -0
  183. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pyinstrument.py +0 -0
  184. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pytest.py +0 -0
  185. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pytest_plugins/__init__.py +0 -0
  186. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  187. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/pytest_regressions.py +0 -0
  189. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/random.py +0 -0
  190. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/re.py +0 -0
  191. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/redis.py +0 -0
  192. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/reprlib.py +0 -0
  193. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/scipy.py +0 -0
  194. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/sentinel.py +0 -0
  195. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/shelve.py +0 -0
  196. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/slack_sdk.py +0 -0
  197. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/socket.py +0 -0
  198. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/sqlalchemy_polars.py +0 -0
  199. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/statsmodels.py +0 -0
  200. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/traceback.py +0 -0
  206. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/typed_settings.py +0 -0
  207. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/types.py +0 -0
  208. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/whenever.py +0 -0
  215. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/zipfile.py +0 -0
  216. {dycw_utilities-0.150.0 → dycw_utilities-0.150.2}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.150.0
3
+ Version: 0.150.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -103,7 +103,7 @@ dependencies = [
103
103
  name = "dycw-utilities"
104
104
  readme = "README.md"
105
105
  requires-python = ">= 3.12"
106
- version = "0.150.0"
106
+ version = "0.150.2"
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.150.0"
139
+ current_version = "0.150.2"
140
140
 
141
141
  [[tool.bumpversion.files]]
142
142
  filename = "src/utilities/__init__.py"
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
- from hypothesis import given
5
+ from hypothesis import assume, given
6
6
  from hypothesis.strategies import DrawFn, booleans, composite, lists, none, sampled_from
7
7
  from pytest import raises
8
8
  from sqlalchemy import URL, Column, Integer, MetaData, Table
@@ -17,6 +17,8 @@ from utilities.postgres import (
17
17
  _ExtractURLPortError,
18
18
  _path_pg_dump,
19
19
  _PGDumpFormat,
20
+ _resolve_data_only_and_clean,
21
+ _ResolveDataOnlyAndCleanError,
20
22
  pg_dump,
21
23
  restore,
22
24
  )
@@ -63,14 +65,13 @@ class TestPGDump:
63
65
  path=temp_paths(),
64
66
  format_=sampled_from(get_literal_elements(_PGDumpFormat)),
65
67
  jobs=integers(min_value=0) | none(),
66
- data_only=booleans(),
67
- clean=booleans(),
68
68
  schema=lists(text_ascii(min_size=1)) | none(),
69
69
  schema_exc=lists(text_ascii(min_size=1)) | none(),
70
70
  table=tables() | none(),
71
71
  table_exc=tables() | none(),
72
72
  inserts=booleans(),
73
73
  on_conflict_do_nothing=booleans(),
74
+ role=text_ascii(min_size=1) | none(),
74
75
  docker=text_ascii(min_size=1) | none(),
75
76
  )
76
77
  def test_build(
@@ -80,14 +81,13 @@ class TestPGDump:
80
81
  path: Path,
81
82
  format_: _PGDumpFormat,
82
83
  jobs: int | None,
83
- data_only: bool,
84
- clean: bool,
85
84
  schema: list[str] | None,
86
85
  schema_exc: list[str] | None,
87
86
  table: list[Table | str] | None,
88
87
  table_exc: list[Table | str] | None,
89
88
  inserts: bool,
90
89
  on_conflict_do_nothing: bool,
90
+ role: str | None,
91
91
  docker: str | None,
92
92
  ) -> None:
93
93
  _ = _build_pg_dump(
@@ -95,14 +95,13 @@ class TestPGDump:
95
95
  path,
96
96
  format_=format_,
97
97
  jobs=jobs,
98
- data_only=data_only,
99
- clean=clean,
100
98
  schema=schema,
101
99
  schema_exc=schema_exc,
102
100
  table=table,
103
101
  table_exc=table_exc,
104
102
  inserts=inserts,
105
103
  on_conflict_do_nothing=on_conflict_do_nothing,
104
+ role=role,
106
105
  docker=docker,
107
106
  )
108
107
 
@@ -112,6 +111,20 @@ class TestPGDump:
112
111
  assert path.suffix in [".sql", ".pgdump", "", ".tar"]
113
112
 
114
113
 
114
+ class TestResolveDataOnlyAndClean:
115
+ @given(data_only=booleans(), clean=booleans())
116
+ def test_main(self, *, data_only: bool, clean: bool) -> None:
117
+ _ = assume(not (data_only and clean))
118
+ _ = _resolve_data_only_and_clean(data_only=data_only, clean=clean)
119
+
120
+ def test_erorr(self) -> None:
121
+ with raises(
122
+ _ResolveDataOnlyAndCleanError,
123
+ match="Cannot use '--data-only' and '--clean' together",
124
+ ):
125
+ _ = _resolve_data_only_and_clean(data_only=True, clean=True)
126
+
127
+
115
128
  class TestRestore:
116
129
  @given(url=urls(), path=temp_paths(), logger=text_ascii(min_size=1) | none())
117
130
  async def test_main(self, *, url: URL, path: Path, logger: str | None) -> None:
@@ -122,12 +135,11 @@ class TestRestore:
122
135
  path=temp_paths(),
123
136
  psql=booleans(),
124
137
  database=text_ascii(min_size=1) | none(),
125
- data_only=booleans(),
126
- clean=booleans(),
127
138
  jobs=integers(min_value=0) | none(),
128
139
  schema=lists(text_ascii(min_size=1)) | none(),
129
140
  schema_exc=lists(text_ascii(min_size=1)) | none(),
130
141
  table=tables() | none(),
142
+ role=text_ascii(min_size=1) | none(),
131
143
  docker=text_ascii(min_size=1) | none(),
132
144
  )
133
145
  def test_build(
@@ -137,12 +149,11 @@ class TestRestore:
137
149
  path: Path,
138
150
  psql: bool,
139
151
  database: str | None,
140
- data_only: bool,
141
- clean: bool,
142
152
  jobs: int | None,
143
153
  schema: list[str] | None,
144
154
  schema_exc: list[str] | None,
145
155
  table: list[Table | str] | None,
156
+ role: str | None,
146
157
  docker: str | None,
147
158
  ) -> None:
148
159
  _ = _build_pg_restore_or_psql(
@@ -150,12 +161,11 @@ class TestRestore:
150
161
  path,
151
162
  psql=psql,
152
163
  database=database,
153
- data_only=data_only,
154
- clean=clean,
155
164
  jobs=jobs,
156
165
  schema=schema,
157
166
  schema_exc=schema_exc,
158
167
  table=table,
168
+ role=role,
159
169
  docker=docker,
160
170
  )
161
171
 
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.150.0"
3
+ __version__ = "0.150.2"
@@ -42,6 +42,7 @@ async def pg_dump(
42
42
  table_exc: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
43
43
  inserts: bool = False,
44
44
  on_conflict_do_nothing: bool = False,
45
+ role: str | None = None,
45
46
  docker: str | None = None,
46
47
  dry_run: bool = False,
47
48
  logger: LoggerOrName | None = None,
@@ -62,6 +63,7 @@ async def pg_dump(
62
63
  table_exc=table_exc,
63
64
  inserts=inserts,
64
65
  on_conflict_do_nothing=on_conflict_do_nothing,
66
+ role=role,
65
67
  docker=docker,
66
68
  )
67
69
  if dry_run:
@@ -110,6 +112,7 @@ def _build_pg_dump(
110
112
  table_exc: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
111
113
  inserts: bool = False,
112
114
  on_conflict_do_nothing: bool = False,
115
+ role: str | None = None,
113
116
  docker: str | None = None,
114
117
  ) -> str:
115
118
  database, host, port = _extract_url(url)
@@ -122,6 +125,7 @@ def _build_pg_dump(
122
125
  f"--format={format_}",
123
126
  "--verbose",
124
127
  # output options
128
+ *_resolve_data_only_and_clean(data_only=data_only, clean=clean),
125
129
  "--large-objects",
126
130
  "--create",
127
131
  "--no-owner",
@@ -133,10 +137,6 @@ def _build_pg_dump(
133
137
  ]
134
138
  if (format_ == "directory") and (jobs is not None):
135
139
  parts.append(f"--jobs={jobs}")
136
- if data_only:
137
- parts.append("--data-only")
138
- if clean:
139
- parts.extend(["--clean", "--if-exists"])
140
140
  if schema is not None:
141
141
  parts.extend([f"--schema={s}" for s in always_iterable(schema)])
142
142
  if schema_exc is not None:
@@ -153,6 +153,8 @@ def _build_pg_dump(
153
153
  parts.append("--on-conflict-do-nothing")
154
154
  if url.username is not None:
155
155
  parts.append(f"--username={url.username}")
156
+ if role is not None:
157
+ parts.append(f"--role={role}")
156
158
  if docker is not None:
157
159
  parts = _wrap_docker(parts, docker)
158
160
  return " ".join(parts)
@@ -192,6 +194,7 @@ async def restore(
192
194
  schema: MaybeListStr | None = None,
193
195
  schema_exc: MaybeListStr | None = None,
194
196
  table: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
197
+ role: str | None = None,
195
198
  docker: str | None = None,
196
199
  dry_run: bool = False,
197
200
  logger: LoggerOrName | None = None,
@@ -208,6 +211,7 @@ async def restore(
208
211
  schema=schema,
209
212
  schema_exc=schema_exc,
210
213
  table=table,
214
+ role=role,
211
215
  docker=docker,
212
216
  )
213
217
  if dry_run:
@@ -255,6 +259,7 @@ def _build_pg_restore_or_psql(
255
259
  schema: MaybeListStr | None = None,
256
260
  schema_exc: MaybeListStr | None = None,
257
261
  table: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
262
+ role: str | None = None,
258
263
  docker: str | None = None,
259
264
  ) -> str:
260
265
  path = Path(path)
@@ -270,6 +275,7 @@ def _build_pg_restore_or_psql(
270
275
  schemas=schema,
271
276
  schemas_exc=schema_exc,
272
277
  tables=table,
278
+ role=role,
273
279
  docker=docker,
274
280
  )
275
281
 
@@ -286,6 +292,7 @@ def _build_pg_restore(
286
292
  schemas: MaybeListStr | None = None,
287
293
  schemas_exc: MaybeListStr | None = None,
288
294
  tables: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
295
+ role: str | None = None,
289
296
  docker: str | None = None,
290
297
  ) -> str:
291
298
  """Run `pg_restore`."""
@@ -297,6 +304,8 @@ def _build_pg_restore(
297
304
  f"--dbname={database_use}",
298
305
  "--verbose",
299
306
  # restore options
307
+ *_resolve_data_only_and_clean(data_only=data_only, clean=clean),
308
+ "--create",
300
309
  "--exit-on-error",
301
310
  "--no-owner",
302
311
  "--no-privileges",
@@ -305,10 +314,6 @@ def _build_pg_restore(
305
314
  f"--port={port}",
306
315
  "--no-password",
307
316
  ]
308
- if data_only:
309
- parts.append("--data-only")
310
- if clean:
311
- parts.extend(["--clean", "--if-exists"])
312
317
  if jobs is not None:
313
318
  parts.append(f"--jobs={jobs}")
314
319
  if schemas is not None:
@@ -319,6 +324,8 @@ def _build_pg_restore(
319
324
  parts.extend([f"--table={_get_table_name(t)}" for t in always_iterable(tables)])
320
325
  if url.username is not None:
321
326
  parts.append(f"--username={url.username}")
327
+ if role is not None:
328
+ parts.append(f"--role={role}")
322
329
  if docker is not None:
323
330
  parts = _wrap_docker(parts, docker)
324
331
  parts.append(str(path))
@@ -402,6 +409,29 @@ def _get_table_name(obj: TableOrORMInstOrClass | str, /) -> str:
402
409
  assert_never(never)
403
410
 
404
411
 
412
+ def _resolve_data_only_and_clean(
413
+ *, data_only: bool = False, clean: bool = False
414
+ ) -> list[str]:
415
+ match data_only, clean:
416
+ case False, False:
417
+ return []
418
+ case True, False:
419
+ return ["--data-only"]
420
+ case False, True:
421
+ return ["--clean", "--if-exists"]
422
+ case True, True:
423
+ raise _ResolveDataOnlyAndCleanError
424
+ case _ as never:
425
+ assert_never(never)
426
+
427
+
428
+ @dataclass(kw_only=True, slots=True)
429
+ class _ResolveDataOnlyAndCleanError(Exception):
430
+ @override
431
+ def __str__(self) -> str:
432
+ return "Cannot use '--data-only' and '--clean' together"
433
+
434
+
405
435
  def _wrap_docker(parts: list[str], container: str, /) -> list[str]:
406
436
  return ["docker", "exec", "-it", container, *parts]
407
437
 
@@ -57,7 +57,12 @@ from sqlalchemy.dialects.postgresql.psycopg import PGDialect_psycopg
57
57
  from sqlalchemy.dialects.sqlite import Insert as sqlite_Insert
58
58
  from sqlalchemy.dialects.sqlite import dialect as sqlite_dialect
59
59
  from sqlalchemy.dialects.sqlite import insert as sqlite_insert
60
- from sqlalchemy.exc import ArgumentError, DatabaseError, OperationalError
60
+ from sqlalchemy.exc import (
61
+ ArgumentError,
62
+ DatabaseError,
63
+ OperationalError,
64
+ ProgrammingError,
65
+ )
61
66
  from sqlalchemy.ext.asyncio import AsyncConnection, AsyncEngine
62
67
  from sqlalchemy.orm import (
63
68
  DeclarativeBase,
@@ -115,7 +120,7 @@ def check_connect(engine: Engine, /) -> bool:
115
120
  try:
116
121
  with engine.connect() as conn:
117
122
  return bool(conn.execute(text("SELECT 1")).scalar_one())
118
- except OperationalError:
123
+ except (OperationalError, ProgrammingError):
119
124
  return False
120
125
 
121
126