dycw-utilities 0.164.0__tar.gz → 0.165.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 (211) hide show
  1. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/pyproject.toml +3 -2
  3. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_hypothesis.py +32 -6
  4. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_logging.py +29 -4
  5. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_polars.py +26 -6
  6. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_polars_ols.py +4 -8
  7. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/__init__.py +1 -1
  8. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/hypothesis.py +24 -2
  9. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/logging.py +34 -1
  10. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/polars.py +54 -11
  11. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/typing.py +1 -1
  12. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/.gitignore +0 -0
  13. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/LICENSE +0 -0
  14. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/README.md +0 -0
  15. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/__init__.py +0 -0
  16. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/conftest.py +0 -0
  17. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/__init__.py +0 -0
  18. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_missing/__init__.py +0 -0
  19. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_missing/module.py +0 -0
  20. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/__init__.py +0 -0
  21. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/outer_1.py +0 -0
  22. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/outer_2.py +0 -0
  23. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  24. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  25. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  26. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  27. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/__init__.py +0 -0
  28. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/module_1.py +0 -0
  29. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/module_2.py +0 -0
  30. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/standalone.py +0 -0
  31. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/with_imports.py +0 -0
  32. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  33. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  34. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  35. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  36. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  37. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  38. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  39. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  40. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_aeventkit.py +0 -0
  41. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_asyncio.py +0 -0
  43. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_atomicwrites.py +0 -0
  44. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_atools.py +0 -0
  45. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_cachetools.py +0 -0
  46. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_click.py +0 -0
  47. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_concurrent.py +0 -0
  48. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_contextlib.py +0 -0
  49. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_contextvars.py +0 -0
  50. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_cryptography.py +0 -0
  51. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_cvxpy.py +0 -0
  52. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_dataclasses.py +0 -0
  53. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_enum.py +0 -0
  54. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_errors.py +0 -0
  55. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_fastapi.py +0 -0
  56. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_fpdf2.py +0 -0
  57. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_functions.py +0 -0
  58. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_functools.py +0 -0
  59. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_getpass.py +0 -0
  60. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_gzip.py +0 -0
  61. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_hashlib.py +0 -0
  62. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_http.py +0 -0
  63. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_importlib.py +0 -0
  64. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_inflect.py +0 -0
  65. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_ipython.py +0 -0
  66. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_iterables.py +0 -0
  67. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_json.py +0 -0
  68. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_jupyter.py +0 -0
  69. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_libcst.py +0 -0
  70. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_lightweight_charts.py +0 -0
  71. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pickle.py +0 -0
  85. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_platform.py +0 -0
  86. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_postgres.py +0 -0
  87. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pottery.py +0 -0
  88. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pqdm.py +0 -0
  89. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_psutil.py +0 -0
  90. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pyinstrument.py +0 -0
  91. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pytest.py +0 -0
  92. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pytest_randomly.py +0 -0
  93. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pytest_regressions.py +0 -0
  94. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_random.py +0 -0
  95. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_re.py +0 -0
  96. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_redis.py +0 -0
  97. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_reprlib.py +0 -0
  98. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_scipy.py +0 -0
  99. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_sentinel.py +0 -0
  100. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_shelve.py +0 -0
  101. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_slack_sdk.py +0 -0
  102. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_socket.py +0 -0
  103. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_sqlalchemy.py +0 -0
  104. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  105. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_statsmodels.py +0 -0
  106. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_string.py +0 -0
  107. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_tempfile.py +0 -0
  108. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_testbook.py +0 -0
  109. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_text.py +0 -0
  110. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_threading.py +0 -0
  111. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_timer.py +0 -0
  112. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_traceback.py +0 -0
  113. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typed_settings.py +0 -0
  114. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_types.py +0 -0
  115. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing.py +0 -0
  116. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  117. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  118. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  119. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_tzdata.py +0 -0
  120. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_tzlocal.py +0 -0
  121. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_uuid.py +0 -0
  122. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_version.py +0 -0
  123. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_warnings.py +0 -0
  124. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_whenever.py +0 -0
  125. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_zipfile.py +0 -0
  126. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_zoneinfo.py +0 -0
  127. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/aeventkit.py +0 -0
  128. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/altair.py +0 -0
  129. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/asyncio.py +0 -0
  130. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/atomicwrites.py +0 -0
  131. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/atools.py +0 -0
  132. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/cachetools.py +0 -0
  133. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/click.py +0 -0
  134. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/concurrent.py +0 -0
  135. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/contextlib.py +0 -0
  136. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/contextvars.py +0 -0
  137. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/cryptography.py +0 -0
  138. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/cvxpy.py +0 -0
  139. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/dataclasses.py +0 -0
  140. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/enum.py +0 -0
  141. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/errors.py +0 -0
  142. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/fastapi.py +0 -0
  143. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/fpdf2.py +0 -0
  144. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/functions.py +0 -0
  145. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/functools.py +0 -0
  146. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/getpass.py +0 -0
  147. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/gzip.py +0 -0
  148. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/hashlib.py +0 -0
  149. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/http.py +0 -0
  150. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/importlib.py +0 -0
  151. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/inflect.py +0 -0
  152. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/ipython.py +0 -0
  153. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/iterables.py +0 -0
  154. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/json.py +0 -0
  155. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/jupyter.py +0 -0
  156. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/libcst.py +0 -0
  157. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/lightweight_charts.py +0 -0
  158. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/math.py +0 -0
  159. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/memory_profiler.py +0 -0
  160. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/modules.py +0 -0
  161. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/more_itertools.py +0 -0
  162. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/numpy.py +0 -0
  163. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/operator.py +0 -0
  164. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/optuna.py +0 -0
  165. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/orjson.py +0 -0
  166. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/os.py +0 -0
  167. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/parse.py +0 -0
  168. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pathlib.py +0 -0
  169. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pickle.py +0 -0
  170. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/platform.py +0 -0
  171. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/polars_ols.py +0 -0
  172. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/postgres.py +0 -0
  173. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pottery.py +0 -0
  174. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pqdm.py +0 -0
  175. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/psutil.py +0 -0
  176. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/py.typed +0 -0
  177. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pyinstrument.py +0 -0
  178. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest.py +0 -0
  179. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_plugins/__init__.py +0 -0
  180. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  181. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  182. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_regressions.py +0 -0
  183. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/random.py +0 -0
  184. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/re.py +0 -0
  185. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/redis.py +0 -0
  186. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/reprlib.py +0 -0
  187. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/scipy.py +0 -0
  188. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/sentinel.py +0 -0
  189. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/shelve.py +0 -0
  190. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/slack_sdk.py +0 -0
  191. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/socket.py +0 -0
  192. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/sqlalchemy.py +0 -0
  193. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/sqlalchemy_polars.py +0 -0
  194. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/statsmodels.py +0 -0
  195. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/string.py +0 -0
  196. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/tempfile.py +0 -0
  197. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/testbook.py +0 -0
  198. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/text.py +0 -0
  199. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/threading.py +0 -0
  200. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/timer.py +0 -0
  201. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/traceback.py +0 -0
  202. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/typed_settings.py +0 -0
  203. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/types.py +0 -0
  204. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/tzdata.py +0 -0
  205. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/tzlocal.py +0 -0
  206. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/uuid.py +0 -0
  207. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/version.py +0 -0
  208. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/warnings.py +0 -0
  209. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/whenever.py +0 -0
  210. {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/zipfile.py +0 -0
  211. {dycw_utilities-0.164.0 → dycw_utilities-0.165.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.164.0
3
+ Version: 0.165.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -128,6 +128,7 @@ polars-ols-test = [
128
128
  ]
129
129
  polars-test = [
130
130
  "numpy",
131
+ "scipy",
131
132
  "statsmodels",
132
133
  ]
133
134
  pottery = [
@@ -232,7 +233,7 @@ dependencies = [
232
233
  name = "dycw-utilities"
233
234
  readme = "README.md"
234
235
  requires-python = ">= 3.12"
235
- version = "0.164.0"
236
+ version = "0.165.0"
236
237
 
237
238
  [project.entry-points.pytest11]
238
239
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -265,7 +266,7 @@ test = [
265
266
  # bump-my-version
266
267
  [tool.bumpversion]
267
268
  allow_dirty = true
268
- current_version = "0.164.0"
269
+ current_version = "0.165.0"
269
270
 
270
271
  [[tool.bumpversion.files]]
271
272
  filename = "src/utilities/__init__.py"
@@ -381,29 +381,55 @@ class TestDraw2:
381
381
 
382
382
 
383
383
  class TestFloat32s:
384
- @given(data=data())
385
- def test_main(self, *, data: DataObject) -> None:
384
+ @given(data=data(), exclude_min=booleans(), exclude_max=booleans())
385
+ def test_main(
386
+ self, *, data: DataObject, exclude_min: bool, exclude_max: bool
387
+ ) -> None:
386
388
  min_value, max_value = data.draw(pairs(float32s() | none()))
387
389
  with assume_does_not_raise(InvalidArgument):
388
- x = data.draw(float32s(min_value=min_value, max_value=max_value))
390
+ x = data.draw(
391
+ float32s(
392
+ min_value=min_value,
393
+ max_value=max_value,
394
+ exclude_min=exclude_min,
395
+ exclude_max=exclude_max,
396
+ )
397
+ )
389
398
  assert MIN_FLOAT32 <= x <= MAX_FLOAT32
390
399
  if min_value is not None:
391
400
  assert x >= min_value
401
+ if exclude_min:
402
+ assert x != min_value
392
403
  if max_value is not None:
393
404
  assert x <= max_value
405
+ if exclude_max:
406
+ assert x != max_value
394
407
 
395
408
 
396
409
  class TestFloat64s:
397
- @given(data=data())
398
- def test_main(self, *, data: DataObject) -> None:
410
+ @given(data=data(), exclude_min=booleans(), exclude_max=booleans())
411
+ def test_main(
412
+ self, *, data: DataObject, exclude_min: bool, exclude_max: bool
413
+ ) -> None:
399
414
  min_value, max_value = data.draw(pairs(float64s() | none()))
400
415
  with assume_does_not_raise(InvalidArgument):
401
- x = data.draw(float64s(min_value=min_value, max_value=max_value))
416
+ x = data.draw(
417
+ float64s(
418
+ min_value=min_value,
419
+ max_value=max_value,
420
+ exclude_min=exclude_min,
421
+ exclude_max=exclude_max,
422
+ )
423
+ )
402
424
  assert MIN_FLOAT64 <= x <= MAX_FLOAT64
403
425
  if min_value is not None:
404
426
  assert x >= min_value
405
427
  if max_value is not None:
406
428
  assert x <= max_value
429
+ if max_value is not None:
430
+ assert x <= max_value
431
+ if exclude_max:
432
+ assert x != max_value
407
433
 
408
434
 
409
435
  class TestFloatArrays:
@@ -1,14 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from asyncio import sleep
4
+ from dataclasses import dataclass, field
4
5
  from io import StringIO
5
- from logging import Formatter, StreamHandler, getLogger
6
+ from logging import Formatter, LoggerAdapter, StreamHandler, getLogger
6
7
  from pathlib import Path
7
8
  from re import search
8
9
  from typing import TYPE_CHECKING, Any, cast
9
10
 
10
11
  from hypothesis import given
11
- from hypothesis.strategies import booleans, integers
12
+ from hypothesis.strategies import integers
12
13
  from pytest import LogCaptureFixture, mark, param, raises
13
14
 
14
15
  from tests.conftest import SKIPIF_CI_AND_WINDOWS
@@ -20,6 +21,7 @@ from utilities.logging import (
20
21
  _compute_rollover_actions,
21
22
  _FieldStyleKeys,
22
23
  _RotatingLogFile,
24
+ add_adapter,
23
25
  add_filters,
24
26
  basic_config,
25
27
  get_format_str,
@@ -41,14 +43,37 @@ if TYPE_CHECKING:
41
43
  from whenever import ZonedDateTime
42
44
 
43
45
 
46
+ class TestAddAdapter:
47
+ def test_main(self, *, caplog: LogCaptureFixture) -> None:
48
+ logger = getLogger(name := unique_str())
49
+ logger.setLevel("DEBUG")
50
+
51
+ def process(msg: str, x: int, /) -> str:
52
+ return f"x={x}: {msg}"
53
+
54
+ @dataclass
55
+ class Example:
56
+ x: int = 0
57
+ logger: LoggerAdapter = field(init=False)
58
+
59
+ def __post_init__(self) -> None:
60
+ self.logger = add_adapter(logger, process, self.x)
61
+ self.logger.info("Initializing...")
62
+
63
+ _ = Example()
64
+ record = one(r for r in caplog.records if r.name == name)
65
+ assert record.message == "x=0: Initializing..."
66
+
67
+
44
68
  class TestAddFilters:
45
- @given(expected=booleans())
69
+ @mark.parametrize("expected", [param(True), param(False)])
46
70
  def test_main(self, *, expected: bool) -> None:
47
71
  logger = getLogger(unique_str())
48
72
  logger.addHandler(handler := StreamHandler(buffer := StringIO()))
73
+ logger.setLevel("DEBUG")
49
74
  add_filters(handler, lambda _: expected)
50
75
  assert len(handler.filters) == 1
51
- logger.warning("message")
76
+ logger.info("message")
52
77
  result = buffer.getvalue() != ""
53
78
  assert result is expected
54
79
 
@@ -16,7 +16,7 @@ import hypothesis.strategies
16
16
  import numpy as np
17
17
  import polars as pl
18
18
  import whenever
19
- from hypothesis import given
19
+ from hypothesis import assume, given
20
20
  from hypothesis.strategies import (
21
21
  DataObject,
22
22
  SearchStrategy,
@@ -57,11 +57,13 @@ from polars._typing import IntoExprColumn, SchemaDict
57
57
  from polars.schema import Schema
58
58
  from polars.testing import assert_frame_equal, assert_series_equal
59
59
  from pytest import mark, param, raises
60
+ from scipy.stats import norm
60
61
  from whenever import DateDelta, DateTimeDelta, PlainDateTime, TimeDelta, ZonedDateTime
61
62
 
62
63
  import tests.test_math
63
64
  import utilities.polars
64
65
  from utilities.hypothesis import (
66
+ assume_does_not_raise,
65
67
  date_deltas,
66
68
  date_periods,
67
69
  date_time_deltas,
@@ -180,7 +182,8 @@ from utilities.polars import (
180
182
  map_over_columns,
181
183
  nan_sum_agg,
182
184
  nan_sum_horizontal,
183
- normal,
185
+ normal_pdf,
186
+ normal_rv,
184
187
  number_of_decimals,
185
188
  offset_datetime,
186
189
  one_column,
@@ -2195,22 +2198,39 @@ class TestNanSumHorizontal:
2195
2198
  assert result.item() == expected
2196
2199
 
2197
2200
 
2198
- class TestNormal:
2201
+ class TestNormalPDF:
2202
+ @given(
2203
+ xs=lists(float64s(), max_size=10),
2204
+ loc=float64s(),
2205
+ scale=float64s(min_value=0.0, exclude_min=True),
2206
+ )
2207
+ def test_main(self, *, xs: list[float], loc: float, scale: float) -> None:
2208
+ x = Series(name="x", values=xs, dtype=Float64)
2209
+ series = normal_pdf(x, loc=loc, scale=scale)
2210
+ _ = assume(series.is_finite().all())
2211
+ with assume_does_not_raise(
2212
+ RuntimeWarning, match="overflow encountered in (subtract|square|divide)"
2213
+ ):
2214
+ expected = norm.pdf(xs, loc=loc, scale=scale)
2215
+ assert allclose(series, expected)
2216
+
2217
+
2218
+ class TestNormalRV:
2199
2219
  @given(length=hypothesis.strategies.integers(0, 10))
2200
2220
  def test_int(self, *, length: int) -> None:
2201
- series = normal(length)
2221
+ series = normal_rv(length)
2202
2222
  self._assert(series, length)
2203
2223
 
2204
2224
  @given(length=hypothesis.strategies.integers(0, 10))
2205
2225
  def test_series(self, *, length: int) -> None:
2206
2226
  orig = int_range(end=length, eager=True)
2207
- series = normal(orig)
2227
+ series = normal_rv(orig)
2208
2228
  self._assert(series, length)
2209
2229
 
2210
2230
  @given(length=hypothesis.strategies.integers(0, 10))
2211
2231
  def test_dataframe(self, *, length: int) -> None:
2212
2232
  df = int_range(end=length, eager=True).to_frame()
2213
- series = normal(df)
2233
+ series = normal_rv(df)
2214
2234
  self._assert(series, length)
2215
2235
 
2216
2236
  def _assert(self, series: Series, length: int, /) -> None:
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  from hypothesis import given
4
4
  from hypothesis.strategies import sampled_from
5
5
  from numpy import isclose
6
- from polars import DataFrame, Float64, Series, Struct, col
6
+ from polars import DataFrame, Float64, Series, col, mean_horizontal
7
7
  from polars.testing import assert_frame_equal
8
8
  from sklearn.linear_model import LinearRegression
9
9
 
10
- from utilities.polars import concat_series, integers, normal
10
+ from utilities.polars import concat_series, integers, normal_rv, struct_dtype
11
11
  from utilities.polars_ols import compute_rolling_ols
12
12
 
13
13
 
@@ -77,7 +77,7 @@ class TestComputeRollingOLS:
77
77
  integers(n, -100, high=100, seed=0).alias("x1"),
78
78
  integers(n, -100, high=100, seed=1).alias("x2"),
79
79
  ).with_columns(
80
- ((col("x1") + 2 * col("x2") + normal(n, scale=10.0, seed=2)) / 3).alias("y")
80
+ y=mean_horizontal("x1", 2 * col.x2, normal_rv(n, scale=10.0, seed=2))
81
81
  )
82
82
 
83
83
  def _assert_series(self, series: Series, /) -> None:
@@ -100,11 +100,7 @@ class TestComputeRollingOLS:
100
100
  expected = DataFrame(
101
101
  data=data,
102
102
  schema={
103
- "coefficients": Struct({
104
- "x1": Float64,
105
- "x2": Float64,
106
- "const": Float64,
107
- }),
103
+ "coefficients": struct_dtype(x1=Float64, x2=Float64, const=Float64),
108
104
  "predictions": Float64,
109
105
  "residuals": Float64,
110
106
  "R2": Float64,
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.164.0"
3
+ __version__ = "0.165.0"
@@ -412,6 +412,8 @@ def float32s(
412
412
  *,
413
413
  min_value: MaybeSearchStrategy[float | None] = None,
414
414
  max_value: MaybeSearchStrategy[float | None] = None,
415
+ exclude_min: MaybeSearchStrategy[bool] = False,
416
+ exclude_max: MaybeSearchStrategy[bool] = False,
415
417
  ) -> float:
416
418
  """Strategy for generating float32s."""
417
419
  min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
@@ -419,7 +421,16 @@ def float32s(
419
421
  max_value_ = min_nullable([max_value_, MAX_FLOAT32])
420
422
  if is_zero(min_value_) and is_zero(max_value_):
421
423
  min_value_ = max_value_ = 0.0
422
- return draw(floats(min_value_, max_value_, width=32))
424
+ exclude_min_, exclude_max_ = [draw2(draw, e) for e in [exclude_min, exclude_max]]
425
+ return draw(
426
+ floats(
427
+ min_value_,
428
+ max_value_,
429
+ width=32,
430
+ exclude_min=exclude_min_,
431
+ exclude_max=exclude_max_,
432
+ )
433
+ )
423
434
 
424
435
 
425
436
  @composite
@@ -429,6 +440,8 @@ def float64s(
429
440
  *,
430
441
  min_value: MaybeSearchStrategy[float | None] = None,
431
442
  max_value: MaybeSearchStrategy[float | None] = None,
443
+ exclude_min: MaybeSearchStrategy[bool] = False,
444
+ exclude_max: MaybeSearchStrategy[bool] = False,
432
445
  ) -> float:
433
446
  """Strategy for generating float64s."""
434
447
  min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
@@ -436,7 +449,16 @@ def float64s(
436
449
  max_value_ = min_nullable([max_value_, MAX_FLOAT64])
437
450
  if is_zero(min_value_) and is_zero(max_value_):
438
451
  min_value_ = max_value_ = 0.0
439
- return draw(floats(min_value_, max_value_, width=64))
452
+ exclude_min_, exclude_max_ = [draw2(draw, e) for e in [exclude_min, exclude_max]]
453
+ return draw(
454
+ floats(
455
+ min_value_,
456
+ max_value_,
457
+ width=64,
458
+ exclude_min=exclude_min_,
459
+ exclude_max=exclude_max_,
460
+ )
461
+ )
440
462
 
441
463
 
442
464
  ##
@@ -8,6 +8,7 @@ from logging import (
8
8
  Formatter,
9
9
  Handler,
10
10
  Logger,
11
+ LoggerAdapter,
11
12
  LogRecord,
12
13
  StreamHandler,
13
14
  basicConfig,
@@ -22,6 +23,7 @@ from socket import gethostname
22
23
  from typing import (
23
24
  TYPE_CHECKING,
24
25
  Any,
26
+ Concatenate,
25
27
  Literal,
26
28
  NotRequired,
27
29
  Self,
@@ -53,7 +55,7 @@ from utilities.whenever import (
53
55
  )
54
56
 
55
57
  if TYPE_CHECKING:
56
- from collections.abc import Iterable, Mapping
58
+ from collections.abc import Callable, Iterable, Mapping, MutableMapping
57
59
  from datetime import time
58
60
  from logging import _FilterType
59
61
 
@@ -63,6 +65,7 @@ if TYPE_CHECKING:
63
65
  MaybeCallablePathLike,
64
66
  MaybeIterable,
65
67
  PathLike,
68
+ StrMapping,
66
69
  )
67
70
 
68
71
 
@@ -75,6 +78,35 @@ _DEFAULT_WHEN: _When = "D"
75
78
  ##
76
79
 
77
80
 
81
+ def add_adapter[**P](
82
+ logger: Logger,
83
+ process: Callable[Concatenate[str, P], str],
84
+ /,
85
+ *args: P.args,
86
+ **kwargs: P.kwargs,
87
+ ) -> LoggerAdapter:
88
+ """Add an adapter to a logger."""
89
+
90
+ class CustomAdapter(LoggerAdapter):
91
+ @override
92
+ def process(
93
+ self, msg: str, kwargs: MutableMapping[str, Any]
94
+ ) -> tuple[str, MutableMapping[str, Any]]:
95
+ extra = cast("_ArgsAndKwargs", self.extra)
96
+ new_msg = process(msg, *extra["args"], **extra["kwargs"])
97
+ return new_msg, kwargs
98
+
99
+ return CustomAdapter(logger, extra=_ArgsAndKwargs(args=args, kwargs=kwargs))
100
+
101
+
102
+ class _ArgsAndKwargs(TypedDict):
103
+ args: tuple[Any, ...]
104
+ kwargs: StrMapping
105
+
106
+
107
+ ##
108
+
109
+
78
110
  def add_filters(handler: Handler, /, *filters: _FilterType) -> None:
79
111
  """Add a set of filters to a handler."""
80
112
  for filter_i in filters:
@@ -589,6 +621,7 @@ def to_logger(logger: LoggerLike | None = None, /) -> Logger:
589
621
  __all__ = [
590
622
  "GetLoggingLevelNumberError",
591
623
  "SizeAndTimeRotatingFileHandler",
624
+ "add_adapter",
592
625
  "add_filters",
593
626
  "basic_config",
594
627
  "get_format_str",
@@ -6,7 +6,7 @@ from collections.abc import Set as AbstractSet
6
6
  from dataclasses import asdict, dataclass
7
7
  from functools import partial, reduce
8
8
  from itertools import chain, pairwise, product
9
- from math import ceil, log
9
+ from math import ceil, log, pi, sqrt
10
10
  from pathlib import Path
11
11
  from typing import TYPE_CHECKING, Any, Literal, assert_never, cast, overload, override
12
12
  from uuid import UUID
@@ -1929,7 +1929,49 @@ def nan_sum_horizontal(*columns: IntoExprColumn) -> ExprOrSeries:
1929
1929
  ##
1930
1930
 
1931
1931
 
1932
- def normal(
1932
+ @overload
1933
+ def normal_pdf(
1934
+ x: ExprLike,
1935
+ /,
1936
+ *,
1937
+ loc: float | IntoExprColumn = 0.0,
1938
+ scale: float | IntoExprColumn = 1.0,
1939
+ ) -> Expr: ...
1940
+ @overload
1941
+ def normal_pdf(
1942
+ x: Series,
1943
+ /,
1944
+ *,
1945
+ loc: float | IntoExprColumn = 0.0,
1946
+ scale: float | IntoExprColumn = 1.0,
1947
+ ) -> Series: ...
1948
+ @overload
1949
+ def normal_pdf(
1950
+ x: IntoExprColumn,
1951
+ /,
1952
+ *,
1953
+ loc: float | IntoExprColumn = 0.0,
1954
+ scale: float | IntoExprColumn = 1.0,
1955
+ ) -> ExprOrSeries: ...
1956
+ def normal_pdf(
1957
+ x: IntoExprColumn,
1958
+ /,
1959
+ *,
1960
+ loc: float | IntoExprColumn = 0.0,
1961
+ scale: float | IntoExprColumn = 1.0,
1962
+ ) -> ExprOrSeries:
1963
+ """Compute the PDF of a normal distribution."""
1964
+ x = ensure_expr_or_series(x)
1965
+ loc = loc if isinstance(loc, int | float) else ensure_expr_or_series(loc)
1966
+ scale = scale if isinstance(scale, int | float) else ensure_expr_or_series(scale)
1967
+ expr = (1 / (scale * sqrt(2 * pi))) * (-(1 / 2) * ((x - loc) / scale) ** 2).exp()
1968
+ return try_reify_expr(expr, x)
1969
+
1970
+
1971
+ ##
1972
+
1973
+
1974
+ def normal_rv(
1933
1975
  obj: int | Series | DataFrame,
1934
1976
  /,
1935
1977
  *,
@@ -1948,11 +1990,11 @@ def normal(
1948
1990
  values = rng.normal(loc=loc, scale=scale, size=height)
1949
1991
  return Series(name=name, values=values, dtype=dtype)
1950
1992
  case Series() as series:
1951
- return normal(
1993
+ return normal_rv(
1952
1994
  series.len(), loc=loc, scale=scale, seed=seed, name=name, dtype=dtype
1953
1995
  )
1954
1996
  case DataFrame() as df:
1955
- return normal(
1997
+ return normal_rv(
1956
1998
  df.height, loc=loc, scale=scale, seed=seed, name=name, dtype=dtype
1957
1999
  )
1958
2000
  case never:
@@ -1964,22 +2006,22 @@ def normal(
1964
2006
 
1965
2007
  @overload
1966
2008
  def number_of_decimals(
1967
- series: ExprLike, /, *, max_decimals: int = MAX_DECIMALS
2009
+ column: ExprLike, /, *, max_decimals: int = MAX_DECIMALS
1968
2010
  ) -> Expr: ...
1969
2011
  @overload
1970
2012
  def number_of_decimals(
1971
- series: Series, /, *, max_decimals: int = MAX_DECIMALS
2013
+ column: Series, /, *, max_decimals: int = MAX_DECIMALS
1972
2014
  ) -> Series: ...
1973
2015
  @overload
1974
2016
  def number_of_decimals(
1975
- series: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
2017
+ column: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
1976
2018
  ) -> ExprOrSeries: ...
1977
2019
  def number_of_decimals(
1978
- series: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
2020
+ column: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
1979
2021
  ) -> ExprOrSeries:
1980
2022
  """Get the number of decimals."""
1981
- series = ensure_expr_or_series(series)
1982
- frac = series - series.floor()
2023
+ column = ensure_expr_or_series(column)
2024
+ frac = column - column.floor()
1983
2025
  results = (
1984
2026
  _number_of_decimals_check_scale(frac, s) for s in range(max_decimals + 1)
1985
2027
  )
@@ -2697,7 +2739,8 @@ __all__ = [
2697
2739
  "map_over_columns",
2698
2740
  "nan_sum_agg",
2699
2741
  "nan_sum_horizontal",
2700
- "normal",
2742
+ "normal_pdf",
2743
+ "normal_rv",
2701
2744
  "number_of_decimals",
2702
2745
  "offset_datetime",
2703
2746
  "one_column",
@@ -333,7 +333,7 @@ def is_instance_gen(
333
333
  warn_name_errors=warn_name_errors,
334
334
  )
335
335
  for t in type_
336
- ) # skipif-ci-and-not-windows
336
+ )
337
337
  if is_literal_type(type_):
338
338
  return obj in get_args(type_)
339
339
  if is_union_type(type_):