dycw-utilities 0.131.17__tar.gz → 0.131.18__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 (224) hide show
  1. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/PKG-INFO +1 -1
  2. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/pyproject.toml +2 -2
  3. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/conftest.py +8 -3
  4. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_datetime.py +0 -300
  5. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_hashlib.py +2 -2
  6. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_iterables.py +5 -22
  7. dycw_utilities-0.131.18/src/tests/test_objects/__init__.py +1 -0
  8. dycw_utilities-0.131.18/src/tests/test_objects/objects.py +212 -0
  9. dycw_utilities-0.131.18/src/tests/test_operator.py +129 -0
  10. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_orjson.py +30 -46
  11. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_parse.py +89 -78
  12. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_redis.py +12 -12
  13. dycw_utilities-0.131.18/src/tests/test_whenever.py +180 -0
  14. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/__init__.py +1 -1
  15. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/datetime.py +2 -279
  16. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/iterables.py +1 -30
  17. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/operator.py +21 -15
  18. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/orjson.py +67 -84
  19. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/parse.py +24 -53
  20. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/whenever.py +2 -216
  21. dycw_utilities-0.131.17/src/tests/test_operator.py +0 -409
  22. dycw_utilities-0.131.17/src/tests/test_whenever.py +0 -372
  23. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/.gitignore +0 -0
  24. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/LICENSE +0 -0
  25. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/README.md +0 -0
  26. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/__init__.py +0 -0
  27. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/__init__.py +0 -0
  28. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_missing/__init__.py +0 -0
  29. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_missing/module.py +0 -0
  30. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/__init__.py +0 -0
  31. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/outer_1.py +0 -0
  32. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/outer_2.py +0 -0
  33. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  34. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  35. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  36. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  37. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_without/__init__.py +0 -0
  38. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_without/module_1.py +0 -0
  39. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/package_without/module_2.py +0 -0
  40. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/standalone.py +0 -0
  41. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/modules/with_imports.py +0 -0
  42. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  43. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  44. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  45. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  46. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  47. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  48. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  49. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  50. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_aiolimiter.py +0 -0
  51. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_altair.py +0 -0
  52. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio.py +0 -0
  53. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio_classes/__init__.py +0 -0
  54. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio_classes/loopers.py +0 -0
  55. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_asyncio_classes/redis.py +0 -0
  56. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_atomicwrites.py +0 -0
  57. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_atools.py +0 -0
  58. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_cachetools.py +0 -0
  59. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_click.py +0 -0
  60. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_concurrent.py +0 -0
  61. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_contextlib.py +0 -0
  62. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_contextvars.py +0 -0
  63. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_cryptography.py +0 -0
  64. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_cvxpy.py +0 -0
  65. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_dataclasses.py +0 -0
  66. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_enum.py +0 -0
  67. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_errors.py +0 -0
  68. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_eventkit.py +0 -0
  69. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_fastapi.py +0 -0
  70. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_fpdf2.py +0 -0
  71. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_functions.py +0 -0
  72. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_functools.py +0 -0
  73. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_getpass.py +0 -0
  74. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_git.py +0 -0
  75. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_http.py +0 -0
  76. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_hypothesis.py +0 -0
  77. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_importlib.py +0 -0
  78. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_inflect.py +0 -0
  79. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_ipython.py +0 -0
  80. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_jupyter.py +0 -0
  81. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_libcst.py +0 -0
  82. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_lightweight_charts.py +0 -0
  83. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_logging.py +0 -0
  84. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_luigi.py +0 -0
  85. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_math.py +0 -0
  86. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_memory_profiler.py +0 -0
  87. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_modules.py +0 -0
  88. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_more_itertools.py +0 -0
  89. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_numpy.py +0 -0
  90. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_optuna.py +0 -0
  91. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_os.py +0 -0
  92. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pathlib.py +0 -0
  93. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_period.py +0 -0
  94. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pickle.py +0 -0
  95. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_platform.py +0 -0
  96. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_polars.py +0 -0
  97. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_polars_ols.py +0 -0
  98. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pottery.py +0 -0
  99. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pqdm.py +0 -0
  100. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_psutil.py +0 -0
  101. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pydantic.py +0 -0
  102. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pyinstrument.py +0 -0
  103. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pyrsistent.py +0 -0
  104. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pytest.py +0 -0
  105. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_pytest_regressions.py +0 -0
  106. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_python_dotenv.py +0 -0
  107. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_random.py +0 -0
  108. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_re.py +0 -0
  109. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_reprlib.py +0 -0
  110. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_scipy.py +0 -0
  111. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_sentinel.py +0 -0
  112. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_shelve.py +0 -0
  113. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_slack_sdk.py +0 -0
  114. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_socket.py +0 -0
  115. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_sqlalchemy.py +0 -0
  116. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_sqlalchemy_polars.py +0 -0
  117. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_statsmodel.py +0 -0
  118. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_streamlit.py +0 -0
  119. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_string.py +0 -0
  120. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_tempfile.py +0 -0
  121. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_text.py +0 -0
  122. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_threading.py +0 -0
  123. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_timer.py +0 -0
  124. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_traceback.py +0 -0
  125. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typed_settings.py +0 -0
  126. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_types.py +0 -0
  127. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing.py +0 -0
  128. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing_funcs/__init__.py +0 -0
  129. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing_funcs/no_future.py +0 -0
  130. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_typing_funcs/with_future.py +0 -0
  131. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_tzdata.py +0 -0
  132. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_tzlocal.py +0 -0
  133. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_uuid.py +0 -0
  134. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_version.py +0 -0
  135. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_warnings.py +0 -0
  136. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_whenever2.py +0 -0
  137. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_zipfile.py +0 -0
  138. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/tests/test_zoneinfo.py +0 -0
  139. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/aiolimiter.py +0 -0
  140. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/altair.py +0 -0
  141. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/asyncio.py +0 -0
  142. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/atomicwrites.py +0 -0
  143. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/atools.py +0 -0
  144. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/cachetools.py +0 -0
  145. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/click.py +0 -0
  146. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/concurrent.py +0 -0
  147. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/contextlib.py +0 -0
  148. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/contextvars.py +0 -0
  149. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/cryptography.py +0 -0
  150. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/cvxpy.py +0 -0
  151. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/dataclasses.py +0 -0
  152. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/enum.py +0 -0
  153. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/errors.py +0 -0
  154. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/eventkit.py +0 -0
  155. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/fastapi.py +0 -0
  156. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/fpdf2.py +0 -0
  157. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/functions.py +0 -0
  158. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/functools.py +0 -0
  159. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/getpass.py +0 -0
  160. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/git.py +0 -0
  161. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/hashlib.py +0 -0
  162. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/http.py +0 -0
  163. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/hypothesis.py +0 -0
  164. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/importlib.py +0 -0
  165. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/inflect.py +0 -0
  166. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/ipython.py +0 -0
  167. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/jupyter.py +0 -0
  168. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/libcst.py +0 -0
  169. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/lightweight_charts.py +0 -0
  170. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/logging.py +0 -0
  171. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/luigi.py +0 -0
  172. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/math.py +0 -0
  173. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/memory_profiler.py +0 -0
  174. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/modules.py +0 -0
  175. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/more_itertools.py +0 -0
  176. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/numpy.py +0 -0
  177. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/optuna.py +0 -0
  178. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/os.py +0 -0
  179. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pathlib.py +0 -0
  180. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/period.py +0 -0
  181. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pickle.py +0 -0
  182. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/platform.py +0 -0
  183. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/polars.py +0 -0
  184. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/polars_ols.py +0 -0
  185. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pottery.py +0 -0
  186. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pqdm.py +0 -0
  187. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/psutil.py +0 -0
  188. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/py.typed +0 -0
  189. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pydantic.py +0 -0
  190. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pyinstrument.py +0 -0
  191. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pyrsistent.py +0 -0
  192. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pytest.py +0 -0
  193. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/pytest_regressions.py +0 -0
  194. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/python_dotenv.py +0 -0
  195. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/random.py +0 -0
  196. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/re.py +0 -0
  197. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/redis.py +0 -0
  198. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/reprlib.py +0 -0
  199. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/scipy.py +0 -0
  200. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/sentinel.py +0 -0
  201. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/shelve.py +0 -0
  202. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/slack_sdk.py +0 -0
  203. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/socket.py +0 -0
  204. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/sqlalchemy.py +0 -0
  205. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/sqlalchemy_polars.py +0 -0
  206. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/statsmodels.py +0 -0
  207. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/streamlit.py +0 -0
  208. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/string.py +0 -0
  209. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/tempfile.py +0 -0
  210. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/text.py +0 -0
  211. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/threading.py +0 -0
  212. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/timer.py +0 -0
  213. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/traceback.py +0 -0
  214. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/typed_settings.py +0 -0
  215. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/types.py +0 -0
  216. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/typing.py +0 -0
  217. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/tzdata.py +0 -0
  218. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/tzlocal.py +0 -0
  219. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/uuid.py +0 -0
  220. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/version.py +0 -0
  221. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/warnings.py +0 -0
  222. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/whenever2.py +0 -0
  223. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/zipfile.py +0 -0
  224. {dycw_utilities-0.131.17 → dycw_utilities-0.131.18}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.131.17
3
+ Version: 0.131.18
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -94,7 +94,7 @@ dependencies = [
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.131.17"
97
+ version = "0.131.18"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  logging = [
@@ -121,7 +121,7 @@ test = [
121
121
  # bump-my-version
122
122
  [tool.bumpversion]
123
123
  allow_dirty = true
124
- current_version = "0.131.17"
124
+ current_version = "0.131.18"
125
125
 
126
126
  [[tool.bumpversion.files]]
127
127
  filename = "src/utilities/__init__.py"
@@ -8,13 +8,16 @@ from os import environ
8
8
  from re import MULTILINE, Pattern
9
9
  from typing import TYPE_CHECKING, Any
10
10
 
11
+ from hypothesis import HealthCheck
11
12
  from pytest import fixture, mark, param
12
13
  from sqlalchemy import text
14
+ from whenever import PlainDateTime
13
15
 
14
- from utilities.datetime import MINUTE, get_now, parse_datetime_compact
15
16
  from utilities.platform import IS_NOT_LINUX, IS_WINDOWS
16
17
  from utilities.re import ExtractGroupError, extract_group
17
18
  from utilities.text import strip_and_dedent
19
+ from utilities.tzlocal import LOCAL_TIME_ZONE_NAME
20
+ from utilities.whenever2 import MINUTE, get_now
18
21
 
19
22
  if TYPE_CHECKING:
20
23
  from collections.abc import Iterator, Sequence
@@ -41,7 +44,7 @@ try:
41
44
  except ModuleNotFoundError:
42
45
  pass
43
46
  else:
44
- setup_hypothesis_profiles()
47
+ setup_hypothesis_profiles(suppress_health_check={HealthCheck.differing_executors})
45
48
 
46
49
 
47
50
  # fixture - logging
@@ -97,7 +100,9 @@ def _is_to_drop(table: str, /) -> bool:
97
100
  datetime_str = extract_group(r"^(\d{8}T\d{6})_", table)
98
101
  except ExtractGroupError:
99
102
  return True
100
- datetime = parse_datetime_compact(datetime_str)
103
+ datetime = PlainDateTime.parse_common_iso(datetime_str).assume_tz(
104
+ LOCAL_TIME_ZONE_NAME
105
+ )
101
106
  now = get_now()
102
107
  return (now - datetime) >= MINUTE
103
108
 
@@ -10,7 +10,6 @@ from typing import TYPE_CHECKING, Any, Self
10
10
  from hypothesis import HealthCheck, assume, given, settings
11
11
  from hypothesis.strategies import (
12
12
  DataObject,
13
- booleans,
14
13
  data,
15
14
  dates,
16
15
  datetimes,
@@ -26,7 +25,6 @@ from pytest import mark, param, raises
26
25
 
27
26
  from utilities.dataclasses import replace_non_sentinel
28
27
  from utilities.datetime import (
29
- _MICROSECONDS_PER_MILLISECOND,
30
28
  DAY,
31
29
  EPOCH_DATE,
32
30
  EPOCH_NAIVE,
@@ -46,22 +44,16 @@ from utilities.datetime import (
46
44
  ZERO_TIME,
47
45
  AddDurationError,
48
46
  AddWeekdaysError,
49
- AreEqualDatesOrDateTimesError,
50
47
  AreEqualDateTimesError,
51
48
  CheckDateNotDateTimeError,
52
49
  EnsureMonthError,
53
50
  GetMinMaxDateError,
54
51
  MeanDateTimeError,
55
52
  MeanTimeDeltaError,
56
- MillisecondsSinceEpochError,
57
53
  Month,
58
54
  MonthError,
59
- ParseDateCompactError,
60
- ParseDateTimeCompactError,
61
55
  ParseMonthError,
62
- SerializeCompactError,
63
56
  SubDurationError,
64
- TimedeltaToMillisecondsError,
65
57
  YieldDaysError,
66
58
  YieldWeekdaysError,
67
59
  _DateDurationToIntFloatError,
@@ -77,25 +69,16 @@ from utilities.datetime import (
77
69
  _ParseTwoDigitYearInvalidStringError,
78
70
  add_duration,
79
71
  add_weekdays,
80
- are_equal_date_durations,
81
- are_equal_dates_or_datetimes,
82
- are_equal_datetime_durations,
83
72
  are_equal_datetimes,
84
- are_equal_months,
85
73
  check_date_not_datetime,
86
74
  date_duration_to_int,
87
75
  date_duration_to_timedelta,
88
- date_to_datetime,
89
76
  date_to_month,
90
77
  datetime_duration_to_float,
91
78
  datetime_duration_to_microseconds,
92
- datetime_duration_to_milliseconds,
93
79
  datetime_duration_to_timedelta,
94
80
  datetime_utc,
95
- days_since_epoch,
96
- days_since_epoch_to_date,
97
81
  ensure_month,
98
- format_datetime_local_and_utc,
99
82
  get_date,
100
83
  get_datetime,
101
84
  get_half_years,
@@ -106,27 +89,19 @@ from utilities.datetime import (
106
89
  get_today,
107
90
  get_years,
108
91
  is_integral_timedelta,
109
- is_plain_datetime,
110
92
  is_weekday,
111
93
  is_zero_time,
112
- is_zoned_datetime,
113
94
  maybe_sub_pct_y,
114
95
  mean_datetime,
115
96
  mean_timedelta,
116
97
  microseconds_since_epoch,
117
98
  microseconds_since_epoch_to_datetime,
118
99
  microseconds_to_timedelta,
119
- milliseconds_since_epoch,
120
- milliseconds_since_epoch_to_datetime,
121
- milliseconds_to_timedelta,
122
- parse_date_compact,
123
- parse_datetime_compact,
124
100
  parse_month,
125
101
  parse_two_digit_year,
126
102
  round_datetime,
127
103
  round_to_next_weekday,
128
104
  round_to_prev_weekday,
129
- serialize_compact,
130
105
  serialize_month,
131
106
  sub_duration,
132
107
  timedelta_since_epoch,
@@ -146,7 +121,6 @@ from utilities.hypothesis import (
146
121
  )
147
122
  from utilities.math import MAX_INT32, MIN_INT32, is_integral, round_to_float
148
123
  from utilities.sentinel import Sentinel, sentinel
149
- from utilities.tzdata import HongKong
150
124
  from utilities.zoneinfo import UTC
151
125
 
152
126
  if TYPE_CHECKING:
@@ -253,83 +227,6 @@ class TestAddWeekdays:
253
227
  assert result is expected
254
228
 
255
229
 
256
- class TestAreEqualDateDurations:
257
- @given(x=integers(), y=integers())
258
- def test_ints(self, *, x: int, y: int) -> None:
259
- with assume_does_not_raise(OverflowError):
260
- result = are_equal_date_durations(x, y)
261
- expected = x == y
262
- assert result is expected
263
-
264
- @given(x=integers(), y=integers())
265
- def test_timedeltas(self, *, x: int, y: int) -> None:
266
- with assume_does_not_raise(OverflowError):
267
- x_timedelta, y_timedelta = dt.timedelta(days=x), dt.timedelta(days=y)
268
- result = are_equal_date_durations(x_timedelta, y_timedelta)
269
- expected = x == y
270
- assert result is expected
271
-
272
- @given(data=data(), x=integers(), y=integers())
273
- def test_int_vs_timedelta(self, *, data: DataObject, x: int, y: int) -> None:
274
- with assume_does_not_raise(OverflowError):
275
- y_timedelta = dt.timedelta(days=y)
276
- left, right = data.draw(permutations([x, y_timedelta]))
277
- with assume_does_not_raise(OverflowError):
278
- result = are_equal_date_durations(left, right)
279
- expected = x == y
280
- assert result is expected
281
-
282
-
283
- class TestAreEqualDateOrDateTimes:
284
- @given(x=dates(), y=dates())
285
- def test_dates(self, *, x: dt.date, y: dt.date) -> None:
286
- result = are_equal_dates_or_datetimes(x, y)
287
- expected = x == y
288
- assert result is expected
289
-
290
- @given(x=datetimes(), y=datetimes())
291
- def test_datetimes(self, *, x: dt.datetime, y: dt.datetime) -> None:
292
- result = are_equal_dates_or_datetimes(x, y)
293
- expected = x == y
294
- assert result is expected
295
-
296
- @given(data=data(), x=dates(), y=datetimes())
297
- def test_date_vs_datetime(
298
- self, *, data: DataObject, x: dt.date, y: dt.datetime
299
- ) -> None:
300
- left, right = data.draw(permutations([x, y]))
301
- with raises(
302
- AreEqualDatesOrDateTimesError,
303
- match=r"Cannot compare date and datetime \(.*, .*\)",
304
- ):
305
- _ = are_equal_dates_or_datetimes(left, right)
306
-
307
-
308
- class TestAreEqualDateTimeDurations:
309
- @given(x=integers(), y=integers())
310
- def test_ints(self, *, x: int, y: int) -> None:
311
- with assume_does_not_raise(OverflowError):
312
- result = are_equal_datetime_durations(x, y)
313
- expected = x == y
314
- assert result is expected
315
-
316
- @given(x=timedeltas(), y=timedeltas())
317
- def test_timedeltas(self, *, x: dt.timedelta, y: dt.timedelta) -> None:
318
- result = are_equal_datetime_durations(x, y)
319
- expected = x == y
320
- assert result is expected
321
-
322
- @given(data=data(), x=integers(), y=timedeltas())
323
- def test_int_vs_timedelta(
324
- self, *, data: DataObject, x: int, y: dt.timedelta
325
- ) -> None:
326
- left, right = data.draw(permutations([x, y]))
327
- with assume_does_not_raise(OverflowError):
328
- result = are_equal_datetime_durations(left, right)
329
- expected = x == datetime_duration_to_float(y)
330
- assert result is expected
331
-
332
-
333
230
  class TestAreEqualDateTimes:
334
231
  @given(x=datetimes(), y=datetimes())
335
232
  def test_local(self, *, x: dt.datetime, y: dt.datetime) -> None:
@@ -379,27 +276,6 @@ class TestAreEqualDateTimes:
379
276
  _ = are_equal_datetimes(left, right)
380
277
 
381
278
 
382
- class TestAreEqualMonths:
383
- @given(x=dates(), y=dates())
384
- def test_dates(self, *, x: dt.date, y: dt.date) -> None:
385
- result = are_equal_months(x, y)
386
- expected = (x.year == y.year) and (x.month == y.month)
387
- assert result is expected
388
-
389
- @given(x=months(), y=months())
390
- def test_months(self, *, x: Month, y: Month) -> None:
391
- result = are_equal_months(x, y)
392
- expected = x == y
393
- assert result is expected
394
-
395
- @given(data=data(), x=dates(), y=months())
396
- def test_date_vs_month(self, *, data: DataObject, x: dt.date, y: Month) -> None:
397
- left, right = data.draw(permutations([x, y]))
398
- result = are_equal_months(left, right)
399
- expected = (x.year == y.year) and (x.month == y.month)
400
- assert result is expected
401
-
402
-
403
279
  class TestCheckDateNotDateTime:
404
280
  @given(date=dates())
405
281
  def test_main(self, *, date: dt.date) -> None:
@@ -534,45 +410,6 @@ class TestDateTimeDurationToMicrosecondsOrMilliseconds:
534
410
  result = datetime_duration_to_microseconds(timedelta)
535
411
  assert result == microseconds
536
412
 
537
- @given(timedelta=timedeltas(), strict=booleans())
538
- @settings(suppress_health_check={HealthCheck.filter_too_much})
539
- def test_timedelta_to_milliseconds_exact(
540
- self, *, timedelta: dt.timedelta, strict: bool
541
- ) -> None:
542
- _, remainder = divmod(timedelta.microseconds, _MICROSECONDS_PER_MILLISECOND)
543
- _ = assume(remainder == 0)
544
- milliseconds = datetime_duration_to_milliseconds(timedelta, strict=strict)
545
- assert isinstance(milliseconds, int)
546
- result = milliseconds_to_timedelta(milliseconds)
547
- assert result == timedelta
548
-
549
- @given(timedelta=timedeltas())
550
- def test_timedelta_to_milliseconds_inexact(
551
- self, *, timedelta: dt.timedelta
552
- ) -> None:
553
- _, remainder = divmod(timedelta.microseconds, _MICROSECONDS_PER_MILLISECOND)
554
- _ = assume(remainder != 0)
555
- milliseconds = datetime_duration_to_milliseconds(timedelta)
556
- result = milliseconds_to_timedelta(round(milliseconds))
557
- assert abs(result - timedelta) <= SECOND
558
-
559
- @given(timedelta=timedeltas())
560
- def test_timedelta_to_milliseconds_error(self, *, timedelta: dt.timedelta) -> None:
561
- _, microseconds = divmod(timedelta.microseconds, _MICROSECONDS_PER_MILLISECOND)
562
- _ = assume(microseconds != 0)
563
- with raises(
564
- TimedeltaToMillisecondsError,
565
- match=r"Unable to convert .* to milliseconds; got .* microsecond\(s\)",
566
- ):
567
- _ = datetime_duration_to_milliseconds(timedelta, strict=True)
568
-
569
- @given(milliseconds=int32s())
570
- def test_milliseconds_to_timedelta(self, *, milliseconds: int) -> None:
571
- with assume_does_not_raise(OverflowError):
572
- timedelta = milliseconds_to_timedelta(milliseconds)
573
- result = datetime_duration_to_milliseconds(timedelta)
574
- assert result == milliseconds
575
-
576
413
 
577
414
  class TestDateTimeDurationToTimeDelta:
578
415
  @given(n=int32s())
@@ -593,13 +430,6 @@ class TestDateTimeDurationToTimeDelta:
593
430
  assert result == duration
594
431
 
595
432
 
596
- class TestDateToDateTime:
597
- @given(date=dates())
598
- def test_main(self, *, date: dt.date) -> None:
599
- result = date_to_datetime(date).date()
600
- assert result == date
601
-
602
-
603
433
  class TestDateToMonth:
604
434
  @given(date=dates())
605
435
  def test_main(self, *, date: dt.date) -> None:
@@ -622,14 +452,6 @@ class TestDatetimeUTC:
622
452
  assert result == datetime
623
453
 
624
454
 
625
- class TestDaysSinceEpoch:
626
- @given(date=dates())
627
- def test_main(self, *, date: dt.date) -> None:
628
- days = days_since_epoch(date)
629
- result = days_since_epoch_to_date(days)
630
- assert result == date
631
-
632
-
633
455
  class TestEpoch:
634
456
  def test_date(self) -> None:
635
457
  assert isinstance(EPOCH_DATE, dt.date)
@@ -643,37 +465,6 @@ class TestEpoch:
643
465
  assert epoch.tzinfo is time_zone
644
466
 
645
467
 
646
- class TestFormatDateTimeLocalAndUTC:
647
- @mark.parametrize(
648
- ("datetime", "expected"),
649
- [
650
- param(
651
- dt.datetime(2000, 1, 1, 2, 3, 4, tzinfo=UTC),
652
- "2000-01-01 02:03:04 (Sat, UTC)",
653
- ),
654
- param(
655
- dt.datetime(2000, 1, 1, 2, 3, 4, tzinfo=HongKong),
656
- "2000-01-01 02:03:04 (Sat, Asia/Hong_Kong, 1999-12-31 18:03:04 UTC)",
657
- ),
658
- param(
659
- dt.datetime(2000, 2, 1, 2, 3, 4, tzinfo=HongKong),
660
- "2000-02-01 02:03:04 (Tue, Asia/Hong_Kong, 01-31 18:03:04 UTC)",
661
- ),
662
- param(
663
- dt.datetime(2000, 2, 2, 2, 3, 4, tzinfo=HongKong),
664
- "2000-02-02 02:03:04 (Wed, Asia/Hong_Kong, 02-01 18:03:04 UTC)",
665
- ),
666
- param(
667
- dt.datetime(2000, 2, 2, 14, 3, 4, tzinfo=HongKong),
668
- "2000-02-02 14:03:04 (Wed, Asia/Hong_Kong, 06:03:04 UTC)",
669
- ),
670
- ],
671
- )
672
- def test_main(self, *, datetime: dt.datetime, expected: str) -> None:
673
- result = format_datetime_local_and_utc(datetime)
674
- assert result == expected
675
-
676
-
677
468
  class TestGetDate:
678
469
  @given(date=dates())
679
470
  def test_date(self, *, date: dt.date) -> None:
@@ -875,20 +666,6 @@ class TestIsIntegralTimeDelta:
875
666
  assert not is_integral_timedelta(timedelta)
876
667
 
877
668
 
878
- class TestIsPlainDateTime:
879
- @mark.parametrize(
880
- ("obj", "expected"),
881
- [
882
- param(None, False),
883
- param(dt.datetime(2000, 1, 1, tzinfo=UTC).replace(tzinfo=None), True),
884
- param(dt.datetime(2000, 1, 1, tzinfo=UTC), False),
885
- ],
886
- )
887
- def test_main(self, *, obj: Any, expected: bool) -> None:
888
- result = is_plain_datetime(obj)
889
- assert result is expected
890
-
891
-
892
669
  class TestIsWeekday:
893
670
  @given(date=dates())
894
671
  def test_main(self, *, date: dt.date) -> None:
@@ -906,20 +683,6 @@ class TestIsZeroTime:
906
683
  assert result is expected
907
684
 
908
685
 
909
- class TestIsZonedDateTime:
910
- @mark.parametrize(
911
- ("obj", "expected"),
912
- [
913
- param(None, False),
914
- param(dt.datetime(2000, 1, 1, tzinfo=UTC).replace(tzinfo=None), False),
915
- param(dt.datetime(2000, 1, 1, tzinfo=UTC), True),
916
- ],
917
- )
918
- def test_main(self, *, obj: Any, expected: bool) -> None:
919
- result = is_zoned_datetime(obj)
920
- assert result is expected
921
-
922
-
923
686
  class TestMaybeSubPctY:
924
687
  @given(text=text_clean())
925
688
  def test_main(self, *, text: str) -> None:
@@ -978,40 +741,6 @@ class TestMicrosecondsOrMillisecondsSinceEpoch:
978
741
  result = microseconds_since_epoch(datetime)
979
742
  assert result == microseconds
980
743
 
981
- @given(datetime=datetimes() | zoned_datetimes())
982
- @mark.parametrize("strict", [param(True), param(False)]) # use mark.parametrize
983
- @settings(suppress_health_check={HealthCheck.filter_too_much})
984
- def test_datetime_to_milliseconds_exact(
985
- self, *, datetime: dt.datetime, strict: bool
986
- ) -> None:
987
- _ = assume(datetime.microsecond == 0)
988
- milliseconds = milliseconds_since_epoch(datetime, strict=strict)
989
- if strict:
990
- assert isinstance(milliseconds, int)
991
- else:
992
- assert milliseconds == round(milliseconds)
993
- result = milliseconds_since_epoch_to_datetime(
994
- round(milliseconds), time_zone=datetime.tzinfo
995
- )
996
- assert result == datetime
997
-
998
- @given(datetime=datetimes() | zoned_datetimes())
999
- def test_datetime_to_milliseconds_error(self, *, datetime: dt.datetime) -> None:
1000
- _, microseconds = divmod(datetime.microsecond, _MICROSECONDS_PER_MILLISECOND)
1001
- _ = assume(microseconds != 0)
1002
- with raises(
1003
- MillisecondsSinceEpochError,
1004
- match=r"Unable to convert .* to milliseconds since epoch; got .* microsecond\(s\)",
1005
- ):
1006
- _ = milliseconds_since_epoch(datetime, strict=True)
1007
-
1008
- @given(milliseconds=integers())
1009
- def test_milliseconds_to_datetime(self, *, milliseconds: int) -> None:
1010
- with assume_does_not_raise(OverflowError):
1011
- datetime = milliseconds_since_epoch_to_datetime(milliseconds)
1012
- result = milliseconds_since_epoch(datetime)
1013
- assert result == milliseconds
1014
-
1015
744
 
1016
745
  class TestMonth:
1017
746
  @mark.parametrize(
@@ -1176,35 +905,6 @@ class TestRoundToWeekday:
1176
905
  assert operator(result, date)
1177
906
 
1178
907
 
1179
- class TestSerializeAndParseCompact:
1180
- @given(date=dates())
1181
- def test_dates(self, *, date: dt.date) -> None:
1182
- result = parse_date_compact(serialize_compact(date))
1183
- assert result == date
1184
-
1185
- @given(datetime=zoned_datetimes(round_="standard", timedelta=SECOND))
1186
- def test_datetimes(self, *, datetime: dt.datetime) -> None:
1187
- result = parse_datetime_compact(serialize_compact(datetime))
1188
- assert result == datetime
1189
-
1190
- @given(datetime=datetimes())
1191
- def test_error_serialize(self, *, datetime: dt.datetime) -> None:
1192
- with raises(
1193
- SerializeCompactError, match="Unable to serialize plain datetime .*"
1194
- ):
1195
- _ = serialize_compact(datetime)
1196
-
1197
- def test_error_parse_date(self) -> None:
1198
- with raises(ParseDateCompactError, match="Unable to parse '.*' into a date"):
1199
- _ = parse_date_compact("invalid")
1200
-
1201
- def test_error_parse_datetime(self) -> None:
1202
- with raises(
1203
- ParseDateTimeCompactError, match="Unable to parse '.*' into a datetime"
1204
- ):
1205
- _ = parse_datetime_compact("invalid")
1206
-
1207
-
1208
908
  class TestSubDuration:
1209
909
  @given(date=dates(), n=integers())
1210
910
  def test_date(self, *, date: dt.date, n: int) -> None:
@@ -4,11 +4,11 @@ from typing import Any
4
4
 
5
5
  from hypothesis import given
6
6
 
7
- from tests.test_operator import make_objects
7
+ from tests.test_objects.objects import objects
8
8
  from utilities.hashlib import md5_hash
9
9
 
10
10
 
11
11
  class TestMD5Hash:
12
- @given(obj=make_objects())
12
+ @given(obj=objects(parsable=True))
13
13
  def test_main(self, *, obj: Any) -> None:
14
14
  _ = md5_hash(obj)
@@ -16,7 +16,6 @@ from hypothesis.strategies import (
16
16
  binary,
17
17
  booleans,
18
18
  data,
19
- datetimes,
20
19
  dictionaries,
21
20
  floats,
22
21
  frozensets,
@@ -32,14 +31,9 @@ from hypothesis.strategies import (
32
31
  )
33
32
  from pytest import mark, param, raises
34
33
 
35
- from tests.test_operator import make_objects
34
+ from tests.test_objects.objects import objects
36
35
  from utilities.functions import is_sequence_of
37
- from utilities.hypothesis import (
38
- sentinels,
39
- sets_fixed_length,
40
- text_ascii,
41
- zoned_datetimes,
42
- )
36
+ from utilities.hypothesis import pairs, sentinels, sets_fixed_length, text_ascii
43
37
  from utilities.iterables import (
44
38
  CheckBijectionError,
45
39
  CheckDuplicatesError,
@@ -72,7 +66,6 @@ from utilities.iterables import (
72
66
  _RangePartitionsNumError,
73
67
  _RangePartitionsStopError,
74
68
  _RangePartitionsTotalError,
75
- _sort_iterable_cmp_datetimes,
76
69
  _sort_iterable_cmp_floats,
77
70
  always_iterable,
78
71
  always_iterable_hashable,
@@ -130,7 +123,6 @@ from utilities.iterables import (
130
123
  from utilities.sentinel import Sentinel, sentinel
131
124
 
132
125
  if TYPE_CHECKING:
133
- import datetime as dt
134
126
  from collections.abc import Iterable, Iterator, Mapping, Sequence
135
127
 
136
128
  from utilities.types import MaybeIterable, StrMapping
@@ -1213,10 +1205,9 @@ class TestResolveIncludeAndExclude:
1213
1205
 
1214
1206
 
1215
1207
  class TestSortIterable:
1216
- @given(
1217
- x=make_objects(floats_allow_nan=False), y=make_objects(floats_allow_nan=False)
1218
- )
1219
- def test_main(self, *, x: Any, y: Any) -> None:
1208
+ @given(objs=pairs(objects(floats_allow_nan=False, sortable=True)))
1209
+ def test_main(self, *, objs: tuple[Any, Any]) -> None:
1210
+ x, y = objs
1220
1211
  result1 = sort_iterable([x, y])
1221
1212
  result2 = sort_iterable([y, x])
1222
1213
  assert result1 == result2
@@ -1263,14 +1254,6 @@ class TestSortIterable:
1263
1254
  _ = sort_iterable([sentinel, sentinel])
1264
1255
 
1265
1256
 
1266
- class TestSortIterablesCmpDateTimes:
1267
- @given(x=datetimes() | zoned_datetimes(), y=datetimes() | zoned_datetimes())
1268
- def test_main(self, *, x: dt.datetime, y: dt.datetime) -> None:
1269
- result1 = _sort_iterable_cmp_datetimes(x, y)
1270
- result2 = _sort_iterable_cmp_datetimes(y, x)
1271
- assert result1 == -result2
1272
-
1273
-
1274
1257
  class TestSortIterablesCmpFloats:
1275
1258
  @given(x=floats(), y=floats())
1276
1259
  def test_main(self, *, x: float, y: float) -> None:
@@ -0,0 +1 @@
1
+ from __future__ import annotations