dycw-utilities 0.112.2__tar.gz → 0.112.4__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 (228) hide show
  1. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/PKG-INFO +12 -12
  2. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/pyproject.toml +14 -15
  3. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_typing.py +82 -23
  4. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/typing.py +52 -35
  6. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/.gitignore +0 -0
  7. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/LICENSE +0 -0
  8. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/README.md +0 -0
  9. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/__init__.py +0 -0
  35. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/test_async_service/__init__.py +0 -0
  36. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/test_async_service/__main__.py +0 -0
  37. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/test_async_service/run.sh +0 -0
  38. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  39. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  40. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  41. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_astor.py +0 -0
  43. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_asyncio.py +0 -0
  44. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_atomicwrites.py +0 -0
  45. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_atools.py +0 -0
  46. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_cachetools.py +0 -0
  47. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_click.py +0 -0
  48. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_concurrent.py +0 -0
  49. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_contextlib.py +0 -0
  50. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_contextvars.py +0 -0
  51. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_cryptography.py +0 -0
  52. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_cvxpy.py +0 -0
  53. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_dataclasses.py +0 -0
  54. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_datetime.py +0 -0
  55. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_enum.py +0 -0
  56. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_errors.py +0 -0
  57. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_eventkit.py +0 -0
  58. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_fastapi.py +0 -0
  59. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_fpdf2.py +0 -0
  60. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_functions.py +0 -0
  61. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_functools.py +0 -0
  62. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_getpass.py +0 -0
  63. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_git.py +0 -0
  64. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_hashlib.py +0 -0
  65. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_http.py +0 -0
  66. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_hypothesis.py +0 -0
  67. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_ipython.py +0 -0
  68. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_iterables.py +0 -0
  69. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_jupyter.py +0 -0
  70. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_lightweight_charts.py +0 -0
  71. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_logging.py +0 -0
  72. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_loguru.py +0 -0
  73. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_luigi.py +0 -0
  74. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_math.py +0 -0
  75. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_memory_profiler.py +0 -0
  76. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_modules.py +0 -0
  77. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_more_itertools.py +0 -0
  78. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_numpy.py +0 -0
  79. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_operator.py +0 -0
  80. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_optuna.py +0 -0
  81. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_orjson.py +0 -0
  82. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_os.py +0 -0
  83. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_parse.py +0 -0
  84. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pathlib.py +0 -0
  85. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_period.py +0 -0
  86. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pickle.py +0 -0
  87. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_platform.py +0 -0
  88. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_polars.py +0 -0
  89. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_polars_ols.py +0 -0
  90. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pydantic.py +0 -0
  92. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pyrsistent.py +0 -0
  94. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_rich.py +0 -0
  102. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_scipy.py +0 -0
  103. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_sentinel.py +0 -0
  104. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_shelve.py +0 -0
  105. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_slack_sdk.py +0 -0
  106. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_socket.py +0 -0
  107. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_sqlalchemy.py +0 -0
  108. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_sqlalchemy_polars.py +0 -0
  109. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_statsmodel.py +0 -0
  110. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_streamlit.py +0 -0
  111. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_sys.py +0 -0
  112. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_tempfile.py +0 -0
  113. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_tenacity.py +0 -0
  114. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_text.py +0 -0
  115. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_threading.py +0 -0
  116. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_timer.py +0 -0
  117. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback.py +0 -0
  118. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/chain.py +0 -0
  120. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  121. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  122. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  123. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/many.py +0 -0
  124. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/one.py +0 -0
  125. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/recursive.py +0 -0
  126. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  127. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  128. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/two.py +0 -0
  129. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_traceback_funcs/untraced.py +0 -0
  130. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_types.py +0 -0
  131. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_typing_funcs/__init__.py +0 -0
  132. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_typing_funcs/no_future.py +0 -0
  133. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_typing_funcs/with_future.py +0 -0
  134. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_tzdata.py +0 -0
  135. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_tzlocal.py +0 -0
  136. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_uuid.py +0 -0
  137. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_version.py +0 -0
  138. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_warnings.py +0 -0
  139. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_whenever.py +0 -0
  140. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_zipfile.py +0 -0
  141. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/tests/test_zoneinfo.py +0 -0
  142. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/altair.py +0 -0
  143. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/astor.py +0 -0
  144. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/asyncio.py +0 -0
  145. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/atomicwrites.py +0 -0
  146. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/atools.py +0 -0
  147. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/cachetools.py +0 -0
  148. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/click.py +0 -0
  149. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/concurrent.py +0 -0
  150. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/contextlib.py +0 -0
  151. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/contextvars.py +0 -0
  152. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/cryptography.py +0 -0
  153. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/cvxpy.py +0 -0
  154. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/dataclasses.py +0 -0
  155. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/datetime.py +0 -0
  156. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/enum.py +0 -0
  157. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/errors.py +0 -0
  158. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/eventkit.py +0 -0
  159. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/fastapi.py +0 -0
  160. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/fpdf2.py +0 -0
  161. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/functions.py +0 -0
  162. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/functools.py +0 -0
  163. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/getpass.py +0 -0
  164. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/git.py +0 -0
  165. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/hashlib.py +0 -0
  166. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/http.py +0 -0
  167. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/hypothesis.py +0 -0
  168. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/ipython.py +0 -0
  169. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/iterables.py +0 -0
  170. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/jupyter.py +0 -0
  171. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/lightweight_charts.py +0 -0
  172. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/logging.py +0 -0
  173. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/loguru.py +0 -0
  174. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/luigi.py +0 -0
  175. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/math.py +0 -0
  176. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/memory_profiler.py +0 -0
  177. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/modules.py +0 -0
  178. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/more_itertools.py +0 -0
  179. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/numpy.py +0 -0
  180. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/operator.py +0 -0
  181. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/optuna.py +0 -0
  182. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/orjson.py +0 -0
  183. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/os.py +0 -0
  184. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/parse.py +0 -0
  185. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pathlib.py +0 -0
  186. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/period.py +0 -0
  187. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pickle.py +0 -0
  188. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/platform.py +0 -0
  189. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/polars.py +0 -0
  190. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/polars_ols.py +0 -0
  191. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pqdm.py +0 -0
  192. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/py.typed +0 -0
  193. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pydantic.py +0 -0
  194. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pyinstrument.py +0 -0
  195. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pyrsistent.py +0 -0
  196. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pytest.py +0 -0
  197. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/pytest_regressions.py +0 -0
  198. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/python_dotenv.py +0 -0
  199. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/random.py +0 -0
  200. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/re.py +0 -0
  201. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/redis.py +0 -0
  202. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/reprlib.py +0 -0
  203. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/rich.py +0 -0
  204. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/scipy.py +0 -0
  205. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/sentinel.py +0 -0
  206. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/shelve.py +0 -0
  207. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/slack_sdk.py +0 -0
  208. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/socket.py +0 -0
  209. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/sqlalchemy.py +0 -0
  210. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/sqlalchemy_polars.py +0 -0
  211. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/statsmodels.py +0 -0
  212. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/streamlit.py +0 -0
  213. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/sys.py +0 -0
  214. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/tempfile.py +0 -0
  215. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/tenacity.py +0 -0
  216. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/text.py +0 -0
  217. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/threading.py +0 -0
  218. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/timer.py +0 -0
  219. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/traceback.py +0 -0
  220. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/types.py +0 -0
  221. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.112.2 → dycw_utilities-0.112.4}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.112.2
3
+ Version: 0.112.4
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -24,7 +24,7 @@ Provides-Extra: zzz-test-altair
24
24
  Requires-Dist: altair<5.6,>=5.5.0; extra == 'zzz-test-altair'
25
25
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-altair'
26
26
  Requires-Dist: img2pdf<0.7,>=0.6.0; extra == 'zzz-test-altair'
27
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-altair'
27
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-altair'
28
28
  Requires-Dist: vl-convert-python<1.8,>=1.7.0; extra == 'zzz-test-altair'
29
29
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-altair'
30
30
  Provides-Extra: zzz-test-astor
@@ -48,7 +48,7 @@ Provides-Extra: zzz-test-cvxpy
48
48
  Requires-Dist: cvxpy<1.7,>=1.6.5; extra == 'zzz-test-cvxpy'
49
49
  Provides-Extra: zzz-test-dataclasses
50
50
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-dataclasses'
51
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-dataclasses'
51
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-dataclasses'
52
52
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-dataclasses'
53
53
  Provides-Extra: zzz-test-datetime
54
54
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-datetime'
@@ -70,7 +70,7 @@ Provides-Extra: zzz-test-getpass
70
70
  Provides-Extra: zzz-test-git
71
71
  Provides-Extra: zzz-test-hashlib
72
72
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-hashlib'
73
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-hashlib'
73
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-hashlib'
74
74
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-hashlib'
75
75
  Provides-Extra: zzz-test-http
76
76
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-http'
@@ -92,12 +92,12 @@ Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-hypothesis'
92
92
  Provides-Extra: zzz-test-ipython
93
93
  Requires-Dist: ipython<9.1,>=9.0.1; extra == 'zzz-test-ipython'
94
94
  Provides-Extra: zzz-test-iterables
95
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-iterables'
95
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-iterables'
96
96
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-iterables'
97
97
  Provides-Extra: zzz-test-jupyter
98
98
  Requires-Dist: jupyterlab<4.3,>=4.2.0; extra == 'zzz-test-jupyter'
99
99
  Requires-Dist: pandas<2.3,>=2.2.2; extra == 'zzz-test-jupyter'
100
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-jupyter'
100
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-jupyter'
101
101
  Provides-Extra: zzz-test-logging
102
102
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-logging'
103
103
  Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'zzz-test-logging'
@@ -121,13 +121,13 @@ Requires-Dist: more-itertools<10.8,>=10.7.0; extra == 'zzz-test-more-itertools'
121
121
  Provides-Extra: zzz-test-numpy
122
122
  Requires-Dist: numpy<2.3,>=2.2.5; extra == 'zzz-test-numpy'
123
123
  Provides-Extra: zzz-test-operator
124
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-operator'
124
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-operator'
125
125
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-operator'
126
126
  Provides-Extra: zzz-test-optuna
127
127
  Requires-Dist: optuna<4.4,>=4.3.0; extra == 'zzz-test-optuna'
128
128
  Provides-Extra: zzz-test-orjson
129
129
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-orjson'
130
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-orjson'
130
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-orjson'
131
131
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-orjson'
132
132
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-orjson'
133
133
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-orjson'
@@ -138,7 +138,7 @@ Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pickle'
138
138
  Provides-Extra: zzz-test-platform
139
139
  Provides-Extra: zzz-test-polars
140
140
  Requires-Dist: dacite<1.10,>=1.9.2; extra == 'zzz-test-polars'
141
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-polars'
141
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-polars'
142
142
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-polars'
143
143
  Provides-Extra: zzz-test-pqdm
144
144
  Requires-Dist: pqdm<0.3,>=0.2.0; extra == 'zzz-test-pqdm'
@@ -164,7 +164,7 @@ Provides-Extra: zzz-test-random
164
164
  Provides-Extra: zzz-test-re
165
165
  Provides-Extra: zzz-test-redis
166
166
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-redis'
167
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-redis'
167
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-redis'
168
168
  Requires-Dist: redis<5.3,>=5.2.1; extra == 'zzz-test-redis'
169
169
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-redis'
170
170
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-redis'
@@ -192,7 +192,7 @@ Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-sqlalchemy-polars'
192
192
  Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-sqlalchemy-polars'
193
193
  Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-sqlalchemy-polars'
194
194
  Requires-Dist: nest-asyncio<1.7,>=1.6.0; extra == 'zzz-test-sqlalchemy-polars'
195
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-sqlalchemy-polars'
195
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-sqlalchemy-polars'
196
196
  Requires-Dist: sqlalchemy<2.1,>=2.0.40; extra == 'zzz-test-sqlalchemy-polars'
197
197
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-sqlalchemy-polars'
198
198
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-sqlalchemy-polars'
@@ -217,7 +217,7 @@ Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-traceback'
217
217
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-traceback'
218
218
  Provides-Extra: zzz-test-types
219
219
  Provides-Extra: zzz-test-typing
220
- Requires-Dist: polars-lts-cpu<1.28,>=1.27.1; extra == 'zzz-test-typing'
220
+ Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-typing'
221
221
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-typing'
222
222
  Provides-Extra: zzz-test-tzlocal
223
223
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-tzlocal'
@@ -40,8 +40,7 @@ dev = [
40
40
  "optuna >= 4.3.0, < 4.4",
41
41
  "orjson >= 3.10.16, < 3.11",
42
42
  "pathvalidate >= 3.2.3, < 3.3",
43
- "polars >= 1.27.1, < 1.28",
44
- "polars-lts-cpu >= 1.27.1, < 1.28",
43
+ "polars-lts-cpu >= 1.28.1, < 1.29",
45
44
  "polars-ols >= 0.3.5, < 0.4",
46
45
  "pqdm >= 0.2.0, < 0.3",
47
46
  "psycopg2-binary >= 2.9.10, < 2.10", # for sqlalchemy
@@ -94,7 +93,7 @@ dependencies = [
94
93
  name = "dycw-utilities"
95
94
  readme = "README.md"
96
95
  requires-python = ">= 3.12"
97
- version = "0.112.2"
96
+ version = "0.112.4"
98
97
 
99
98
  [project.optional-dependencies]
100
99
  test = [
@@ -117,7 +116,7 @@ zzz-test-altair = [
117
116
  "altair >= 5.5.0, < 5.6",
118
117
  "atomicwrites >= 1.4.1, < 1.5",
119
118
  "img2pdf >= 0.6.0, < 0.7",
120
- "polars-lts-cpu >= 1.27.1, < 1.28",
119
+ "polars-lts-cpu >= 1.28.1, < 1.29",
121
120
  "vl-convert-python >= 1.7.0, < 1.8",
122
121
  "whenever >= 0.7.3, < 0.8",
123
122
  ]
@@ -139,7 +138,7 @@ zzz-test-cryptography = ["cryptography >= 44.0.2, < 44.1"]
139
138
  zzz-test-cvxpy = ["cvxpy >= 1.6.5, < 1.7"]
140
139
  zzz-test-dataclasses = [
141
140
  "orjson >= 3.10.15, < 3.11",
142
- "polars-lts-cpu >= 1.27.1, < 1.28",
141
+ "polars-lts-cpu >= 1.28.1, < 1.29",
143
142
  "whenever >= 0.7.3, < 0.8",
144
143
  ]
145
144
  zzz-test-datetime = [
@@ -163,7 +162,7 @@ zzz-test-functools = []
163
162
  zzz-test-getpass = []
164
163
  zzz-test-git = []
165
164
  zzz-test-hashlib = [
166
- "polars-lts-cpu >= 1.27.1, < 1.28",
165
+ "polars-lts-cpu >= 1.28.1, < 1.29",
167
166
  "orjson >= 3.10.15, < 3.11",
168
167
  "whenever >= 0.7.3, < 0.8",
169
168
  ]
@@ -188,13 +187,13 @@ zzz-test-hypothesis = [
188
187
  ]
189
188
  zzz-test-ipython = ["ipython >= 9.0.1, < 9.1"]
190
189
  zzz-test-iterables = [
191
- "polars-lts-cpu >= 1.27.1, < 1.28",
190
+ "polars-lts-cpu >= 1.28.1, < 1.29",
192
191
  "whenever >= 0.7.3, < 0.8",
193
192
  ]
194
193
  zzz-test-jupyter = [
195
194
  "jupyterlab >= 4.2.0, < 4.3",
196
195
  "pandas >= 2.2.2, < 2.3",
197
- "polars-lts-cpu >= 1.27.1, < 1.28",
196
+ "polars-lts-cpu >= 1.28.1, < 1.29",
198
197
  ]
199
198
  zzz-test-logging = [
200
199
  "atomicwrites >= 1.4.1, < 1.5",
@@ -216,13 +215,13 @@ zzz-test-modules = []
216
215
  zzz-test-more-itertools = ["more-itertools >= 10.7.0, < 10.8"]
217
216
  zzz-test-numpy = ["numpy >= 2.2.5, < 2.3"]
218
217
  zzz-test-operator = [
219
- "polars-lts-cpu >= 1.27.1, < 1.28",
218
+ "polars-lts-cpu >= 1.28.1, < 1.29",
220
219
  "whenever >= 0.7.3, < 0.8",
221
220
  ]
222
221
  zzz-test-optuna = ["optuna >= 4.3.0, < 4.4"]
223
222
  zzz-test-orjson = [
224
223
  "orjson >= 3.10.15, < 3.11",
225
- "polars-lts-cpu >= 1.27.1, < 1.28",
224
+ "polars-lts-cpu >= 1.28.1, < 1.29",
226
225
  "rich >= 14.0.0, < 14.1",
227
226
  "tzlocal >= 5.3.1, < 5.4",
228
227
  "whenever >= 0.7.3, < 0.8",
@@ -233,7 +232,7 @@ zzz-test-pickle = ["atomicwrites >= 1.4.1, < 1.5"]
233
232
  zzz-test-platform = []
234
233
  zzz-test-polars = [
235
234
  "dacite >= 1.9.2, < 1.10",
236
- "polars-lts-cpu >= 1.27.1, < 1.28",
235
+ "polars-lts-cpu >= 1.28.1, < 1.29",
237
236
  "whenever >= 0.7.3, < 0.8",
238
237
  ]
239
238
  zzz-test-pqdm = ["pqdm >= 0.2.0, < 0.3"]
@@ -261,7 +260,7 @@ zzz-test-random = []
261
260
  zzz-test-re = []
262
261
  zzz-test-redis = [
263
262
  "orjson >= 3.10.15, < 3.11",
264
- "polars-lts-cpu >= 1.27.1, < 1.28",
263
+ "polars-lts-cpu >= 1.28.1, < 1.29",
265
264
  "redis >= 5.2.1, < 5.3",
266
265
  "rich >= 14.0.0, < 14.1",
267
266
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
@@ -290,7 +289,7 @@ zzz-test-sqlalchemy-polars = [
290
289
  "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
291
290
  "greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
292
291
  "nest-asyncio >= 1.6.0, < 1.7", # for sqlalchemy async
293
- "polars-lts-cpu >= 1.27.1, < 1.28",
292
+ "polars-lts-cpu >= 1.28.1, < 1.29",
294
293
  "sqlalchemy >= 2.0.40, < 2.1",
295
294
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
296
295
  "whenever >= 0.7.3, < 0.8",
@@ -318,7 +317,7 @@ zzz-test-traceback = [
318
317
  ]
319
318
  zzz-test-types = []
320
319
  zzz-test-typing = [
321
- "polars-lts-cpu >= 1.27.1, < 1.28",
320
+ "polars-lts-cpu >= 1.28.1, < 1.29",
322
321
  "whenever >= 0.7.3, < 0.8",
323
322
  ]
324
323
  zzz-test-tzlocal = ["tzlocal >= 5.3.1, < 5.4"]
@@ -337,7 +336,7 @@ zzz-test-zoneinfo = [
337
336
  # bump-my-version
338
337
  [tool.bumpversion]
339
338
  allow_dirty = true
340
- current_version = "0.112.2"
339
+ current_version = "0.112.4"
341
340
 
342
341
  [[tool.bumpversion.files]]
343
342
  filename = "src/utilities/__init__.py"
@@ -6,7 +6,7 @@ from dataclasses import dataclass
6
6
  from pathlib import Path
7
7
  from random import Random
8
8
  from types import NoneType
9
- from typing import TYPE_CHECKING, Any, Literal, NamedTuple, Self
9
+ from typing import TYPE_CHECKING, Any, Final, Literal, NamedTuple, Self
10
10
  from uuid import UUID
11
11
 
12
12
  from hypothesis import given
@@ -56,6 +56,7 @@ from tests.test_typing_funcs.with_future import (
56
56
  from utilities.sentinel import Sentinel
57
57
  from utilities.types import Duration, LogLevel, Number, Parallelism, Seed
58
58
  from utilities.typing import (
59
+ IsInstanceGenError,
59
60
  IsSubclassGenError,
60
61
  _GetTypeClassesTupleError,
61
62
  _GetTypeClassesTypeError,
@@ -500,34 +501,57 @@ class TestIsInstanceGen:
500
501
  @given(
501
502
  data=data(),
502
503
  case=sampled_from([
504
+ # types - bool/int
503
505
  (booleans(), bool, None, True),
504
506
  (booleans(), int, None, False),
505
507
  (integers(), bool, None, False),
506
508
  (integers(), int, None, True),
507
509
  (booleans(), (bool, int), None, True),
508
510
  (integers(), (bool, int), None, True),
511
+ # types - datetime/date
509
512
  (dates(), dt.date, None, True),
510
513
  (dates(), dt.datetime, None, False),
511
514
  (datetimes(), dt.date, None, False),
512
515
  (datetimes(), dt.datetime, None, True),
516
+ # parent union
513
517
  (booleans(), Number, None, False),
514
518
  (integers(), Number, None, True),
515
519
  (floats(), Number, None, True),
516
- (tuples(booleans()), (bool,), None, True),
517
- (tuples(booleans()), (int,), None, False),
518
- (tuples(integers()), (bool,), None, False),
519
- (tuples(integers()), (int,), None, True),
520
- (tuples(integers()), (int, int), None, False),
521
- (integers(), int | None, None, True),
522
- (integers() | none(), int, None, False),
523
- (integers() | none(), int | None, None, True),
520
+ # child tuple/union - skip
521
+ # literals
524
522
  (sampled_from([1, 2]), Literal[1, 2, 3], 2, True),
525
523
  (sampled_from([1, 2, 3]), Literal[1, 2, 3], 3, True),
526
524
  (sampled_from([1, 2, 3]), Literal[1, 2], 3, False),
527
- (booleans(), Literal[1, 2, 3], None, False),
525
+ (sampled_from([1, 2, 3]), int, 3, True),
528
526
  (sampled_from([1, 2, 3]), bool, 3, False),
529
- (tuples(booleans()), Literal[1, 2, 3], None, False),
530
- (sampled_from([1, 2, 3]), (bool,), 3, False),
527
+ (sampled_from(["1", "2", "3"]), str, 3, True),
528
+ (sampled_from(["1", "2", "3"]), bool, 3, False),
529
+ (sampled_from([1, "2", 3]), int | str, 3, True),
530
+ (sampled_from([1, "2", 3]), int, 3, False),
531
+ (sampled_from([1, "2", 3]), str, 3, False),
532
+ (booleans(), Literal[1, 2, 3], None, False),
533
+ # tuple types
534
+ (tuples(booleans()), tuple[bool], None, True),
535
+ (tuples(booleans()), tuple[int], None, False),
536
+ (tuples(integers()), tuple[bool], None, False),
537
+ (tuples(integers()), tuple[int], None, True),
538
+ (tuples(booleans()), tuple[Number], None, False),
539
+ (tuples(integers()), tuple[Number], None, True),
540
+ (tuples(floats()), tuple[Number], None, True),
541
+ (tuples(booleans()), bool, None, False),
542
+ (tuples(just("a"), booleans()), tuple[Literal["a"], bool], None, True),
543
+ (tuples(just("a"), booleans()), tuple[Literal["a"], int], None, False),
544
+ (tuples(just("a"), integers()), tuple[Literal["a"], bool], None, False),
545
+ (tuples(just("a"), integers()), tuple[Literal["a"], int], None, True),
546
+ (tuples(just("a"), booleans()), tuple[Literal["a", "b"], bool], None, True),
547
+ (tuples(just("a"), booleans()), tuple[Literal["a", "b"], int], None, False),
548
+ (
549
+ tuples(just("a"), integers()),
550
+ tuple[Literal["a", "b"], bool],
551
+ None,
552
+ False,
553
+ ),
554
+ (tuples(just("a"), integers()), tuple[Literal["a", "b"], int], None, True),
531
555
  ]),
532
556
  )
533
557
  def test_main(
@@ -560,6 +584,12 @@ class TestIsInstanceGen:
560
584
  assert not is_instance_gen(int_, MyInt)
561
585
  assert is_instance_gen(MyInt(int_), MyInt)
562
586
 
587
+ def test_error(self) -> None:
588
+ with raises(
589
+ IsInstanceGenError, match=r"Invalid arguments; got None and typing\.Final"
590
+ ):
591
+ _ = is_instance_gen(None, Final)
592
+
563
593
 
564
594
  class TestIsNamedTuple:
565
595
  def test_main(self) -> None:
@@ -581,34 +611,63 @@ class TestIsNamedTuple:
581
611
  class TestIsSubclassGen:
582
612
  @given(
583
613
  case=sampled_from([
614
+ # types - bool/int
584
615
  (bool, bool, True),
585
616
  (bool, int, False),
586
617
  (int, bool, False),
587
618
  (int, int, True),
588
619
  (bool, (bool, int), True),
589
620
  (int, (bool, int), True),
621
+ # types - datetime/date
590
622
  (dt.date, dt.date, True),
591
623
  (dt.date, dt.datetime, False),
592
624
  (dt.datetime, dt.date, False),
593
625
  (dt.datetime, dt.datetime, True),
626
+ # parent union
594
627
  (bool, Number, False),
595
628
  (int, Number, True),
596
629
  (float, Number, True),
597
- ((bool,), (bool,), True),
598
- ((bool,), (int,), False),
599
- ((int,), (bool,), False),
600
- ((int,), (int,), True),
601
- ((int,), (int, int), False),
602
- (int, int | None, True),
603
- (int | None, int, False),
604
- (int | None, int | None, True),
630
+ # child tuple
631
+ ((bool,), bool, True),
632
+ ((bool,), int, False),
633
+ ((int,), bool, False),
634
+ ((int,), int, True),
635
+ ((bool, int), int, False),
636
+ ((bool, int), (bool, int), True),
637
+ ((bool, int), (bool, int, float), True),
638
+ # child union
639
+ (bool, bool | None, True),
640
+ (bool | None, bool, False),
641
+ (bool | None, bool | None, True),
642
+ # literals
605
643
  (Literal[1, 2], Literal[1, 2, 3], True),
606
644
  (Literal[1, 2, 3], Literal[1, 2, 3], True),
607
645
  (Literal[1, 2, 3], Literal[1, 2], False),
608
- (bool, Literal[1, 2, 3], False),
646
+ (Literal[1, 2, 3], int, True),
609
647
  (Literal[1, 2, 3], bool, False),
610
- ((bool,), Literal[1, 2, 3], False),
611
- (Literal[1, 2, 3], (bool,), False),
648
+ (Literal["1", "2", "3"], str, True),
649
+ (Literal["1", "2", "3"], bool, False),
650
+ (Literal[1, "2", 3], int | str, True),
651
+ (Literal[1, "2", 3], int, False),
652
+ (Literal[1, "2", 3], str, False),
653
+ (bool, Literal[1, 2, 3], False),
654
+ # tuple types
655
+ (tuple[bool], tuple[bool], True),
656
+ (tuple[bool], tuple[int], False),
657
+ (tuple[int], tuple[bool], False),
658
+ (tuple[int], tuple[int], True),
659
+ (tuple[bool], tuple[Number], False),
660
+ (tuple[int], tuple[Number], True),
661
+ (tuple[float], tuple[Number], True),
662
+ (tuple[bool], bool, False),
663
+ (tuple[Literal["a"], bool], tuple[Literal["a"], bool], True),
664
+ (tuple[Literal["a"], bool], tuple[Literal["a"], int], False),
665
+ (tuple[Literal["a"], int], tuple[Literal["a"], bool], False),
666
+ (tuple[Literal["a"], int], tuple[Literal["a"], int], True),
667
+ (tuple[Literal["a"], bool], tuple[Literal["a", "b"], bool], True),
668
+ (tuple[Literal["a"], bool], tuple[Literal["a", "b"], int], False),
669
+ (tuple[Literal["a"], int], tuple[Literal["a", "b"], bool], False),
670
+ (tuple[Literal["a"], int], tuple[Literal["a", "b"], int], True),
612
671
  ])
613
672
  )
614
673
  def test_main(self, *, case: tuple[type[Any], Any, bool]) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.112.2"
3
+ __version__ = "0.112.4"
@@ -230,21 +230,23 @@ def is_instance_gen(
230
230
  def is_instance_gen(obj: Any, type_: Any, /) -> bool: ...
231
231
  def is_instance_gen(obj: Any, type_: Any, /) -> bool:
232
232
  """Check if an instance relationship holds, except bool<int."""
233
- if isinstance(obj, tuple) and isinstance(type_, tuple):
234
- return _is_instance_gen_tuple(obj, type_)
233
+ # parent
234
+ if isinstance(type_, tuple):
235
+ return any(is_instance_gen(obj, t) for t in type_)
235
236
  if is_literal_type(type_):
236
- return _is_instance_gen_literal(obj, type_)
237
- return any(_is_instance_gen_type(obj, t) for t in get_type_classes(type_))
238
-
239
-
240
- def _is_instance_gen_tuple(obj: tuple[Any, ...], type_: tuple[Any, ...], /) -> bool:
241
- return (len(obj) == len(type_)) and all(
242
- is_instance_gen(o, t) for o, t in zip(obj, type_, strict=True)
243
- )
244
-
245
-
246
- def _is_instance_gen_literal(obj: Any, type_: type[_T], /) -> TypeGuard[_T]:
247
- return obj in get_args(type_)
237
+ return obj in get_args(type_)
238
+ if is_union_type(type_):
239
+ return any(is_instance_gen(obj, t) for t in get_args(type_))
240
+ # tuple vs tuple
241
+ if isinstance(obj, tuple) and is_tuple_type(type_):
242
+ type_args = get_args(type_)
243
+ return (len(obj) == len(type_args)) and all(
244
+ is_instance_gen(o, t) for o, t in zip(obj, type_args, strict=True)
245
+ )
246
+ # basic
247
+ if isinstance(type_, type):
248
+ return any(_is_instance_gen_type(obj, t) for t in get_type_classes(type_))
249
+ raise IsInstanceGenError(obj=obj, type_=type_)
248
250
 
249
251
 
250
252
  def _is_instance_gen_type(obj: Any, type_: type[_T], /) -> TypeGuard[_T]:
@@ -263,6 +265,16 @@ def _is_instance_gen_type(obj: Any, type_: type[_T], /) -> TypeGuard[_T]:
263
265
  )
264
266
 
265
267
 
268
+ @dataclass(kw_only=True, slots=True)
269
+ class IsInstanceGenError(Exception):
270
+ obj: Any
271
+ type_: Any
272
+
273
+ @override
274
+ def __str__(self) -> str:
275
+ return f"Invalid arguments; got {self.obj!r} and {self.type_!r}"
276
+
277
+
266
278
  ##
267
279
 
268
280
 
@@ -367,14 +379,32 @@ def is_subclass_gen(
367
379
  def is_subclass_gen(cls: Any, parent: Any, /) -> bool: ...
368
380
  def is_subclass_gen(cls: Any, parent: Any, /) -> bool:
369
381
  """Generalized `issubclass`."""
370
- if isinstance(cls, tuple) and isinstance(parent, tuple):
371
- return _is_subclass_gen_tuple(cls, parent)
372
- if is_literal_type(cls) and is_literal_type(parent):
373
- return _is_subclass_gen_literal(cls, parent)
374
- if is_literal_type(cls) is not is_literal_type(parent):
375
- return False
382
+ # child
383
+ if isinstance(cls, tuple):
384
+ return all(is_subclass_gen(c, parent) for c in cls)
385
+ if is_literal_type(cls):
386
+ types = tuple(map(type, get_args(cls)))
387
+ return (
388
+ is_literal_type(parent) and set(get_args(cls)).issubset(get_args(parent))
389
+ ) or is_subclass_gen(types, parent)
376
390
  if is_union_type(cls):
377
- return _is_subclass_gen_union(cls, parent)
391
+ return all(is_subclass_gen(c, parent) for c in get_args(cls))
392
+ # parent
393
+ if isinstance(parent, tuple):
394
+ return any(is_subclass_gen(cls, p) for p in parent)
395
+ if is_literal_type(parent):
396
+ return is_literal_type(cls) and set(get_args(cls)).issubset(get_args(parent))
397
+ if is_union_type(parent):
398
+ return any(is_subclass_gen(cls, p) for p in get_args(parent))
399
+ # tuple vs tuple
400
+ if is_tuple_type(cls) and is_tuple_type(parent):
401
+ cls_args, parent_args = get_args(cls), get_args(parent)
402
+ return (len(cls_args) == len(parent_args)) and all(
403
+ is_subclass_gen(c, p) for c, p in zip(cls_args, parent_args, strict=True)
404
+ )
405
+ if is_tuple_type(cls) is not is_tuple_type(parent):
406
+ return False
407
+ # basic
378
408
  if isinstance(cls, type):
379
409
  return any(_is_subclass_gen_type(cls, p) for p in get_type_classes(parent))
380
410
  raise IsSubclassGenError(cls=cls)
@@ -396,20 +426,6 @@ def _is_subclass_gen_type(cls: type[Any], parent: type[_T], /) -> TypeGuard[type
396
426
  )
397
427
 
398
428
 
399
- def _is_subclass_gen_tuple(cls: tuple[Any, ...], parent: tuple[Any, ...], /) -> bool:
400
- return (len(cls) == len(parent)) and all(
401
- is_subclass_gen(c, p) for c, p in zip(cls, parent, strict=True)
402
- )
403
-
404
-
405
- def _is_subclass_gen_literal(cls: Any, parent: Any, /) -> bool:
406
- return set(get_args(cls)).issubset(get_args(parent))
407
-
408
-
409
- def _is_subclass_gen_union(cls: Any, parent: Any, /) -> bool:
410
- return all(is_subclass_gen(a, parent) for a in get_args(cls))
411
-
412
-
413
429
  @dataclass(kw_only=True, slots=True)
414
430
  class IsSubclassGenError(Exception):
415
431
  cls: Any
@@ -449,6 +465,7 @@ def _is_annotation_of_type(obj: Any, origin: Any, /) -> bool:
449
465
  __all__ = [
450
466
  "GetTypeClassesError",
451
467
  "GetUnionTypeClassesError",
468
+ "IsInstanceGenError",
452
469
  "IsSubclassGenError",
453
470
  "contains_self",
454
471
  "get_literal_elements",