dycw-utilities 0.148.1__tar.gz → 0.148.3__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 (214) hide show
  1. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/PKG-INFO +1 -1
  2. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/pyproject.toml +2 -2
  3. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_postgres.py +20 -5
  4. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/postgres.py +38 -7
  6. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/traceback.py +2 -3
  7. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/.gitignore +0 -0
  8. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/LICENSE +0 -0
  9. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/README.md +0 -0
  10. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_altair.py +0 -0
  36. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_asyncio.py +0 -0
  37. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_atomicwrites.py +0 -0
  38. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_atools.py +0 -0
  39. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_cachetools.py +0 -0
  40. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_click.py +0 -0
  41. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_concurrent.py +0 -0
  42. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_contextlib.py +0 -0
  43. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_contextvars.py +0 -0
  44. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_cryptography.py +0 -0
  45. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_cvxpy.py +0 -0
  46. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_dataclasses.py +0 -0
  47. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_enum.py +0 -0
  48. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_errors.py +0 -0
  49. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_eventkit.py +0 -0
  50. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_fastapi.py +0 -0
  51. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_fpdf2.py +0 -0
  52. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_functions.py +0 -0
  53. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_functools.py +0 -0
  54. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_getpass.py +0 -0
  55. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_gzip.py +0 -0
  56. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_hashlib.py +0 -0
  57. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_http.py +0 -0
  58. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_hypothesis.py +0 -0
  59. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_importlib.py +0 -0
  60. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_inflect.py +0 -0
  61. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_ipython.py +0 -0
  62. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_iterables.py +0 -0
  63. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_json.py +0 -0
  64. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_jupyter.py +0 -0
  65. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_libcst.py +0 -0
  66. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_lightweight_charts.py +0 -0
  67. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_logging.py +0 -0
  68. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_math.py +0 -0
  69. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_memory_profiler.py +0 -0
  70. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_modules.py +0 -0
  71. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_more_itertools.py +0 -0
  72. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_numpy.py +0 -0
  73. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_objects/__init__.py +0 -0
  74. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_objects/objects.py +0 -0
  75. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_operator.py +0 -0
  76. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_optuna.py +0 -0
  77. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_orjson.py +0 -0
  78. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_os.py +0 -0
  79. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_parse.py +0 -0
  80. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pathlib.py +0 -0
  81. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_period.py +0 -0
  82. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pickle.py +0 -0
  83. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_platform.py +0 -0
  84. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_polars.py +0 -0
  85. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_polars_ols.py +0 -0
  86. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pottery.py +0 -0
  87. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pqdm.py +0 -0
  88. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_psutil.py +0 -0
  89. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pyinstrument.py +0 -0
  90. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pytest.py +0 -0
  91. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pytest_randomly.py +0 -0
  92. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_pytest_regressions.py +0 -0
  93. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_random.py +0 -0
  94. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_re.py +0 -0
  95. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_redis.py +0 -0
  96. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_reprlib.py +0 -0
  97. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_scipy.py +0 -0
  98. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_sentinel.py +0 -0
  99. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_shelve.py +0 -0
  100. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_slack_sdk.py +0 -0
  101. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_socket.py +0 -0
  102. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_sqlalchemy.py +0 -0
  103. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_sqlalchemy_polars.py +0 -0
  104. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_statsmodels.py +0 -0
  105. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_string.py +0 -0
  106. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_tempfile.py +0 -0
  107. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_text.py +0 -0
  108. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_threading.py +0 -0
  109. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_timer.py +0 -0
  110. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_traceback.py +0 -0
  111. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_typed_settings.py +0 -0
  112. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_types.py +0 -0
  113. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_typing.py +0 -0
  114. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_typing_funcs/__init__.py +0 -0
  115. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_typing_funcs/no_future.py +0 -0
  116. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_typing_funcs/with_future.py +0 -0
  117. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_tzdata.py +0 -0
  118. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_tzlocal.py +0 -0
  119. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_uuid.py +0 -0
  120. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_version.py +0 -0
  121. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_warnings.py +0 -0
  122. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_whenever.py +0 -0
  123. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_yield_access/__init__.py +0 -0
  124. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_yield_access/script.py +0 -0
  125. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_yield_access/script.sh +0 -0
  126. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_zipfile.py +0 -0
  127. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/tests/test_zoneinfo.py +0 -0
  128. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/altair.py +0 -0
  129. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/asyncio.py +0 -0
  130. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/atomicwrites.py +0 -0
  131. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/atools.py +0 -0
  132. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/cachetools.py +0 -0
  133. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/click.py +0 -0
  134. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/concurrent.py +0 -0
  135. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/contextlib.py +0 -0
  136. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/contextvars.py +0 -0
  137. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/cryptography.py +0 -0
  138. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/cvxpy.py +0 -0
  139. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/dataclasses.py +0 -0
  140. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/enum.py +0 -0
  141. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/errors.py +0 -0
  142. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/eventkit.py +0 -0
  143. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/fastapi.py +0 -0
  144. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/fpdf2.py +0 -0
  145. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/functions.py +0 -0
  146. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/functools.py +0 -0
  147. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/getpass.py +0 -0
  148. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/gzip.py +0 -0
  149. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/hashlib.py +0 -0
  150. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/http.py +0 -0
  151. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/hypothesis.py +0 -0
  152. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/importlib.py +0 -0
  153. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/inflect.py +0 -0
  154. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/ipython.py +0 -0
  155. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/iterables.py +0 -0
  156. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/json.py +0 -0
  157. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/jupyter.py +0 -0
  158. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/libcst.py +0 -0
  159. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/lightweight_charts.py +0 -0
  160. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/logging.py +0 -0
  161. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/math.py +0 -0
  162. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/memory_profiler.py +0 -0
  163. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/modules.py +0 -0
  164. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/more_itertools.py +0 -0
  165. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/numpy.py +0 -0
  166. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/operator.py +0 -0
  167. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/optuna.py +0 -0
  168. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/orjson.py +0 -0
  169. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/os.py +0 -0
  170. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/parse.py +0 -0
  171. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pathlib.py +0 -0
  172. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/period.py +0 -0
  173. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pickle.py +0 -0
  174. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/platform.py +0 -0
  175. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/polars.py +0 -0
  176. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pottery.py +0 -0
  178. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pqdm.py +0 -0
  179. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/psutil.py +0 -0
  180. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/py.typed +0 -0
  181. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pyinstrument.py +0 -0
  182. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pytest.py +0 -0
  183. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pytest_plugins/__init__.py +0 -0
  184. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  185. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  186. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/pytest_regressions.py +0 -0
  187. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/random.py +0 -0
  188. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/re.py +0 -0
  189. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/redis.py +0 -0
  190. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/reprlib.py +0 -0
  191. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/scipy.py +0 -0
  192. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/sentinel.py +0 -0
  193. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/shelve.py +0 -0
  194. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/slack_sdk.py +0 -0
  195. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/socket.py +0 -0
  196. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/sqlalchemy.py +0 -0
  197. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/sqlalchemy_polars.py +0 -0
  198. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/statsmodels.py +0 -0
  199. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/string.py +0 -0
  200. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/tempfile.py +0 -0
  201. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/text.py +0 -0
  202. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/threading.py +0 -0
  203. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/timer.py +0 -0
  204. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/typed_settings.py +0 -0
  205. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/types.py +0 -0
  206. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/typing.py +0 -0
  207. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/tzdata.py +0 -0
  208. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/tzlocal.py +0 -0
  209. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/uuid.py +0 -0
  210. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/version.py +0 -0
  211. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/warnings.py +0 -0
  212. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/whenever.py +0 -0
  213. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/zipfile.py +0 -0
  214. {dycw_utilities-0.148.1 → dycw_utilities-0.148.3}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.148.1
3
+ Version: 0.148.3
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -102,7 +102,7 @@ dependencies = [
102
102
  name = "dycw-utilities"
103
103
  readme = "README.md"
104
104
  requires-python = ">= 3.12"
105
- version = "0.148.1"
105
+ version = "0.148.3"
106
106
 
107
107
  [project.entry-points.pytest11]
108
108
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -135,7 +135,7 @@ test = [
135
135
  # bump-my-version
136
136
  [tool.bumpversion]
137
137
  allow_dirty = true
138
- current_version = "0.148.1"
138
+ current_version = "0.148.3"
139
139
 
140
140
  [[tool.bumpversion.files]]
141
141
  filename = "src/utilities/__init__.py"
@@ -26,10 +26,13 @@ if TYPE_CHECKING:
26
26
 
27
27
 
28
28
  @composite
29
- def tables(draw: DrawFn, /) -> list[Table]:
29
+ def tables(draw: DrawFn, /) -> list[Table | str]:
30
30
  metadata = MetaData()
31
- tables = draw(lists(text_ascii(min_size=1), max_size=5, unique=True))
32
- return [Table(t, metadata, Column("id", Integer, primary_key=True)) for t in tables]
31
+ names = draw(lists(text_ascii(min_size=1), max_size=5, unique=True))
32
+ tables = [
33
+ Table(n, metadata, Column("id", Integer, primary_key=True)) for n in names
34
+ ]
35
+ return [draw(sampled_from([n, t])) for n, t in zip(names, tables, strict=True)]
33
36
 
34
37
 
35
38
  @composite
@@ -57,7 +60,10 @@ class TestPGDump:
57
60
  format_=sampled_from(get_literal_elements(_PGDumpFormat)),
58
61
  jobs=integers(min_value=0) | none(),
59
62
  schemas=lists(text_ascii(min_size=1)) | none(),
63
+ schemas_exc=lists(text_ascii(min_size=1)) | none(),
60
64
  tables=tables() | none(),
65
+ tables_exc=tables() | none(),
66
+ inserts=booleans(),
61
67
  logger=text_ascii(min_size=1) | none(),
62
68
  )
63
69
  async def test_main(
@@ -69,7 +75,10 @@ class TestPGDump:
69
75
  format_: _PGDumpFormat,
70
76
  jobs: int | None,
71
77
  schemas: list[str] | None,
72
- tables: list[Table] | None,
78
+ schemas_exc: list[str] | None,
79
+ tables: list[Table | str] | None,
80
+ tables_exc: list[Table | str] | None,
81
+ inserts: bool,
73
82
  logger: str | None,
74
83
  ) -> None:
75
84
  _ = await pg_dump(
@@ -79,7 +88,10 @@ class TestPGDump:
79
88
  format_=format_,
80
89
  jobs=jobs,
81
90
  schemas=schemas,
91
+ schemas_exc=schemas_exc,
82
92
  tables=tables,
93
+ tables_exc=tables_exc,
94
+ inserts=inserts,
83
95
  logger=logger,
84
96
  dry_run=True,
85
97
  )
@@ -111,6 +123,7 @@ class TestPGRestore:
111
123
  data_only=booleans(),
112
124
  jobs=integers(min_value=0) | none(),
113
125
  schemas=lists(text_ascii(min_size=1)) | none(),
126
+ schemas_exc=lists(text_ascii(min_size=1)) | none(),
114
127
  tables=tables() | none(),
115
128
  logger=text_ascii(min_size=1) | none(),
116
129
  )
@@ -124,7 +137,8 @@ class TestPGRestore:
124
137
  data_only: bool,
125
138
  jobs: int | None,
126
139
  schemas: list[str] | None,
127
- tables: list[Table] | None,
140
+ schemas_exc: list[str] | None,
141
+ tables: list[Table | str] | None,
128
142
  logger: str | None,
129
143
  ) -> None:
130
144
  _ = await pg_restore(
@@ -135,6 +149,7 @@ class TestPGRestore:
135
149
  data_only=data_only,
136
150
  jobs=jobs,
137
151
  schemas=schemas,
152
+ schemas_exc=schemas_exc,
138
153
  tables=tables,
139
154
  logger=logger,
140
155
  dry_run=True,
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.148.1"
3
+ __version__ = "0.148.3"
@@ -5,17 +5,21 @@ from pathlib import Path
5
5
  from shutil import rmtree
6
6
  from typing import TYPE_CHECKING, Literal, assert_never, override
7
7
 
8
+ from sqlalchemy import Table
9
+ from sqlalchemy.orm import DeclarativeBase
10
+
8
11
  from utilities.asyncio import stream_command
9
12
  from utilities.iterables import always_iterable
10
13
  from utilities.logging import get_logger
11
14
  from utilities.os import temp_environ
12
- from utilities.sqlalchemy import TableOrORMInstOrClass, get_table_name
15
+ from utilities.sqlalchemy import get_table_name
13
16
  from utilities.timer import Timer
14
17
  from utilities.types import PathLike
15
18
 
16
19
  if TYPE_CHECKING:
17
20
  from sqlalchemy import URL
18
21
 
22
+ from utilities.sqlalchemy import TableOrORMInstOrClass
19
23
  from utilities.types import LoggerOrName, MaybeListStr, MaybeSequence, PathLike
20
24
 
21
25
 
@@ -31,7 +35,10 @@ async def pg_dump(
31
35
  format_: _PGDumpFormat = "plain",
32
36
  jobs: int | None = None,
33
37
  schemas: MaybeListStr | None = None,
34
- tables: MaybeSequence[TableOrORMInstOrClass] | None = None,
38
+ schemas_exc: MaybeListStr | None = None,
39
+ tables: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
40
+ tables_exc: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
41
+ inserts: bool = False,
35
42
  logger: LoggerOrName | None = None,
36
43
  dry_run: bool = False,
37
44
  ) -> None:
@@ -69,8 +76,16 @@ async def pg_dump(
69
76
  parts.append(f"--jobs={jobs}")
70
77
  if schemas is not None:
71
78
  parts.extend([f"--schema={s}" for s in always_iterable(schemas)])
79
+ if schemas_exc is not None:
80
+ parts.extend([f"--exclude-schema={s}" for s in always_iterable(schemas_exc)])
72
81
  if tables is not None:
73
- parts.extend([f"--table={get_table_name(t)}" for t in always_iterable(tables)])
82
+ parts.extend([f"--table={_get_table_name(t)}" for t in always_iterable(tables)])
83
+ if tables_exc is not None:
84
+ parts.extend([
85
+ f"--exclude-table={_get_table_name(t)}" for t in always_iterable(tables_exc)
86
+ ])
87
+ if inserts:
88
+ parts.append("--inserts")
74
89
  if url.username is not None:
75
90
  parts.append(f"--username={url.username}")
76
91
  cmd = " ".join(parts)
@@ -144,7 +159,8 @@ async def pg_restore(
144
159
  data_only: bool = False,
145
160
  jobs: int | None = None,
146
161
  schemas: MaybeListStr | None = None,
147
- tables: MaybeSequence[TableOrORMInstOrClass] | None = None,
162
+ schemas_exc: MaybeListStr | None = None,
163
+ tables: MaybeSequence[TableOrORMInstOrClass | str] | None = None,
148
164
  logger: LoggerOrName | None = None,
149
165
  dry_run: bool = False,
150
166
  ) -> None:
@@ -174,7 +190,6 @@ async def pg_restore(
174
190
  "--exit-on-error",
175
191
  "--no-owner",
176
192
  "--no-privileges",
177
- "--if-exists",
178
193
  # connection options
179
194
  f"--host={url.host}",
180
195
  f"--port={url.port}",
@@ -183,13 +198,15 @@ async def pg_restore(
183
198
  if data_only:
184
199
  parts.append("--data-only")
185
200
  else:
186
- parts.append("--clean")
201
+ parts.extend(["--clean", "--if-exists"])
187
202
  if jobs is not None:
188
203
  parts.append(f"--jobs={jobs}")
189
204
  if schemas is not None:
190
205
  parts.extend([f"--schema={s}" for s in always_iterable(schemas)])
206
+ if schemas_exc is not None:
207
+ parts.extend([f"--exclude-schema={s}" for s in always_iterable(schemas_exc)])
191
208
  if tables is not None:
192
- parts.extend([f"--table={get_table_name(t)}" for t in always_iterable(tables)])
209
+ parts.extend([f"--table={_get_table_name(t)}" for t in always_iterable(tables)])
193
210
  if url.username is not None:
194
211
  parts.append(f"--username={url.username}")
195
212
  parts.append(str(path))
@@ -249,4 +266,18 @@ class _PGRestorePortError(PGRestoreError):
249
266
  return f"Expected URL to contain a 'port'; got {self.url}"
250
267
 
251
268
 
269
+ ##
270
+
271
+
272
+ def _get_table_name(obj: TableOrORMInstOrClass | str, /) -> str:
273
+ """Get the table name from a Table or mapped class."""
274
+ match obj:
275
+ case Table() | DeclarativeBase() | type() as table_or_orm:
276
+ return get_table_name(table_or_orm)
277
+ case str() as name:
278
+ return name
279
+ case _ as never:
280
+ assert_never(never)
281
+
282
+
252
283
  __all__ = ["PGDumpError", "PGRestoreError", "pg_dump", "pg_restore"]
@@ -6,10 +6,10 @@ from dataclasses import dataclass
6
6
  from functools import partial
7
7
  from getpass import getuser
8
8
  from itertools import repeat
9
- from logging import exception
10
9
  from os import getpid
11
10
  from pathlib import Path
12
11
  from socket import gethostname
12
+ from sys import stderr
13
13
  from traceback import TracebackException
14
14
  from typing import TYPE_CHECKING, override
15
15
 
@@ -287,8 +287,7 @@ def _make_except_hook_inner(
287
287
  try:
288
288
  send_to_slack(slack_url, f"```{slim}```")
289
289
  except SendToSlackError as error:
290
- msg = str(error)
291
- exception(msg) # noqa: LOG015
290
+ _ = stderr.write(f"{error}\n")
292
291
 
293
292
  if to_bool(bool_=pudb): # pragma: no cover
294
293
  from pudb import post_mortem