dycw-utilities 0.109.27__tar.gz → 0.109.29__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 (229) hide show
  1. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/PKG-INFO +1 -1
  2. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/pyproject.toml +3 -2
  3. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_datetime.py +1 -1
  4. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_parse.py +138 -47
  5. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/__init__.py +1 -1
  6. dycw_utilities-0.109.29/src/utilities/parse.py +536 -0
  7. dycw_utilities-0.109.27/src/utilities/parse.py +0 -212
  8. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/.gitignore +0 -0
  9. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/LICENSE +0 -0
  10. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/README.md +0 -0
  11. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/__init__.py +0 -0
  12. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/conftest.py +0 -0
  13. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/__init__.py +0 -0
  14. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_missing/__init__.py +0 -0
  15. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_missing/module.py +0 -0
  16. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/__init__.py +0 -0
  17. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/outer_1.py +0 -0
  18. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/outer_2.py +0 -0
  19. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  20. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  21. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  22. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  23. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_without/__init__.py +0 -0
  24. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_without/module_1.py +0 -0
  25. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/package_without/module_2.py +0 -0
  26. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/standalone.py +0 -0
  27. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/modules/with_imports.py +0 -0
  28. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  29. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  30. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  31. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  32. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  33. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  34. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  35. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  36. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/__init__.py +0 -0
  37. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_async_service/__init__.py +0 -0
  38. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_async_service/__main__.py +0 -0
  39. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_async_service/run.sh +0 -0
  40. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  41. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  42. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  43. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_altair.py +0 -0
  44. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_astor.py +0 -0
  45. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_asyncio.py +0 -0
  46. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_atomicwrites.py +0 -0
  47. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_atools.py +0 -0
  48. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_cachetools.py +0 -0
  49. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_click.py +0 -0
  50. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_concurrent.py +0 -0
  51. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_contextlib.py +0 -0
  52. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_contextvars.py +0 -0
  53. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_cryptography.py +0 -0
  54. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_cvxpy.py +0 -0
  55. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_dataclasses.py +0 -0
  56. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_enum.py +0 -0
  57. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_errors.py +0 -0
  58. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_eventkit.py +0 -0
  59. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_fastapi.py +0 -0
  60. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_fpdf2.py +0 -0
  61. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_functions.py +0 -0
  62. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_functools.py +0 -0
  63. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_getpass.py +0 -0
  64. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_git.py +0 -0
  65. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_hashlib.py +0 -0
  66. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_http.py +0 -0
  67. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_hypothesis.py +0 -0
  68. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_ipython.py +0 -0
  69. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_iterables.py +0 -0
  70. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_jupyter.py +0 -0
  71. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_lightweight_charts.py +0 -0
  72. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_logging.py +0 -0
  73. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_loguru.py +0 -0
  74. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_luigi.py +0 -0
  75. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_math.py +0 -0
  76. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_memory_profiler.py +0 -0
  77. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_modules.py +0 -0
  78. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_more_itertools.py +0 -0
  79. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_numpy.py +0 -0
  80. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_operator.py +0 -0
  81. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_optuna.py +0 -0
  82. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_orjson.py +0 -0
  83. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_os.py +0 -0
  84. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pathlib.py +0 -0
  85. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_period.py +0 -0
  86. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pickle.py +0 -0
  87. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_platform.py +0 -0
  88. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_polars.py +0 -0
  89. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_polars_ols.py +0 -0
  90. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pydantic.py +0 -0
  92. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pyrsistent.py +0 -0
  94. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_rich.py +0 -0
  102. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_scipy.py +0 -0
  103. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sentinel.py +0 -0
  104. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_shelve.py +0 -0
  105. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_slack_sdk.py +0 -0
  106. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_socket.py +0 -0
  107. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sqlalchemy.py +0 -0
  108. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sqlalchemy_polars.py +0 -0
  109. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_statsmodel.py +0 -0
  110. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_streamlit.py +0 -0
  111. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_sys.py +0 -0
  112. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tempfile.py +0 -0
  113. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tenacity.py +0 -0
  114. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_text.py +0 -0
  115. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_threading.py +0 -0
  116. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_timer.py +0 -0
  117. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback.py +0 -0
  118. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/chain.py +0 -0
  120. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  121. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  122. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  123. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/many.py +0 -0
  124. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/one.py +0 -0
  125. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/recursive.py +0 -0
  126. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  127. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  128. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/two.py +0 -0
  129. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_traceback_funcs/untraced.py +0 -0
  130. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_types.py +0 -0
  131. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing.py +0 -0
  132. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing_funcs/__init__.py +0 -0
  133. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing_funcs/no_future.py +0 -0
  134. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_typing_funcs/with_future.py +0 -0
  135. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tzdata.py +0 -0
  136. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_tzlocal.py +0 -0
  137. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_uuid.py +0 -0
  138. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_version.py +0 -0
  139. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_warnings.py +0 -0
  140. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_whenever.py +0 -0
  141. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_zipfile.py +0 -0
  142. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/tests/test_zoneinfo.py +0 -0
  143. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/altair.py +0 -0
  144. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/astor.py +0 -0
  145. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/asyncio.py +0 -0
  146. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/atomicwrites.py +0 -0
  147. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/atools.py +0 -0
  148. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/cachetools.py +0 -0
  149. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/click.py +0 -0
  150. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/concurrent.py +0 -0
  151. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/contextlib.py +0 -0
  152. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/contextvars.py +0 -0
  153. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/cryptography.py +0 -0
  154. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/cvxpy.py +0 -0
  155. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/dataclasses.py +0 -0
  156. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/datetime.py +0 -0
  157. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/enum.py +0 -0
  158. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/errors.py +0 -0
  159. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/eventkit.py +0 -0
  160. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/fastapi.py +0 -0
  161. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/fpdf2.py +0 -0
  162. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/functions.py +0 -0
  163. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/functools.py +0 -0
  164. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/getpass.py +0 -0
  165. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/git.py +0 -0
  166. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/hashlib.py +0 -0
  167. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/http.py +0 -0
  168. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/hypothesis.py +0 -0
  169. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/ipython.py +0 -0
  170. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/iterables.py +0 -0
  171. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/jupyter.py +0 -0
  172. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/lightweight_charts.py +0 -0
  173. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/logging.py +0 -0
  174. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/loguru.py +0 -0
  175. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/luigi.py +0 -0
  176. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/math.py +0 -0
  177. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/memory_profiler.py +0 -0
  178. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/modules.py +0 -0
  179. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/more_itertools.py +0 -0
  180. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/numpy.py +0 -0
  181. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/operator.py +0 -0
  182. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/optuna.py +0 -0
  183. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/orjson.py +0 -0
  184. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/os.py +0 -0
  185. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pathlib.py +0 -0
  186. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/period.py +0 -0
  187. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pickle.py +0 -0
  188. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/platform.py +0 -0
  189. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/polars.py +0 -0
  190. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/polars_ols.py +0 -0
  191. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pqdm.py +0 -0
  192. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/py.typed +0 -0
  193. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pydantic.py +0 -0
  194. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pyinstrument.py +0 -0
  195. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pyrsistent.py +0 -0
  196. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pytest.py +0 -0
  197. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/pytest_regressions.py +0 -0
  198. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/python_dotenv.py +0 -0
  199. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/random.py +0 -0
  200. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/re.py +0 -0
  201. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/redis.py +0 -0
  202. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/reprlib.py +0 -0
  203. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/rich.py +0 -0
  204. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/scipy.py +0 -0
  205. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sentinel.py +0 -0
  206. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/shelve.py +0 -0
  207. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/slack_sdk.py +0 -0
  208. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/socket.py +0 -0
  209. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sqlalchemy.py +0 -0
  210. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sqlalchemy_polars.py +0 -0
  211. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/statsmodels.py +0 -0
  212. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/streamlit.py +0 -0
  213. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/sys.py +0 -0
  214. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tempfile.py +0 -0
  215. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tenacity.py +0 -0
  216. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/text.py +0 -0
  217. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/threading.py +0 -0
  218. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/timer.py +0 -0
  219. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/traceback.py +0 -0
  220. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/types.py +0 -0
  221. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/typing.py +0 -0
  222. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tzdata.py +0 -0
  223. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/tzlocal.py +0 -0
  224. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/uuid.py +0 -0
  225. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/version.py +0 -0
  226. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/warnings.py +0 -0
  227. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/whenever.py +0 -0
  228. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/zipfile.py +0 -0
  229. {dycw_utilities-0.109.27 → dycw_utilities-0.109.29}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.109.27
3
+ Version: 0.109.29
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -40,6 +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",
43
44
  "polars-lts-cpu >= 1.27.1, < 1.28",
44
45
  "polars-ols >= 0.3.5, < 0.4",
45
46
  "pqdm >= 0.2.0, < 0.3",
@@ -93,7 +94,7 @@ dependencies = [
93
94
  name = "dycw-utilities"
94
95
  readme = "README.md"
95
96
  requires-python = ">= 3.12"
96
- version = "0.109.27"
97
+ version = "0.109.29"
97
98
 
98
99
  [project.optional-dependencies]
99
100
  test = [
@@ -336,7 +337,7 @@ zzz-test-zoneinfo = [
336
337
  # bump-my-version
337
338
  [tool.bumpversion]
338
339
  allow_dirty = true
339
- current_version = "0.109.27"
340
+ current_version = "0.109.29"
340
341
 
341
342
  [[tool.bumpversion.files]]
342
343
  filename = "src/utilities/__init__.py"
@@ -995,7 +995,7 @@ class TestMonth:
995
995
  _ = Month(2000, 13)
996
996
 
997
997
 
998
- class TestParseAndSerializeMonth:
998
+ class TestSerializeAndParseMonth:
999
999
  @given(month=months())
1000
1000
  def test_main(self, *, month: Month) -> None:
1001
1001
  serialized = serialize_month(month)
@@ -5,10 +5,21 @@ from collections.abc import Iterable
5
5
  from dataclasses import dataclass
6
6
  from pathlib import Path
7
7
  from types import NoneType
8
- from typing import Literal
8
+ from typing import Final, Literal
9
9
 
10
10
  from hypothesis import given
11
- from hypothesis.strategies import booleans, dates, floats, integers, sampled_from, times
11
+ from hypothesis.strategies import (
12
+ booleans,
13
+ dates,
14
+ dictionaries,
15
+ floats,
16
+ frozensets,
17
+ integers,
18
+ lists,
19
+ sampled_from,
20
+ sets,
21
+ times,
22
+ )
12
23
  from pytest import raises
13
24
 
14
25
  from tests.test_operator import TruthEnum
@@ -38,53 +49,53 @@ from utilities.parse import (
38
49
  _ParseTextExtraNonUniqueError,
39
50
  _ParseTextParseError,
40
51
  parse_text,
52
+ to_text,
41
53
  )
42
54
  from utilities.sentinel import Sentinel, sentinel
43
55
  from utilities.types import Duration, Number
44
56
  from utilities.version import Version
45
- from utilities.whenever import (
46
- serialize_date,
47
- serialize_datetime,
48
- serialize_duration,
49
- serialize_time,
50
- serialize_timedelta,
51
- )
52
57
 
53
58
 
54
- class TestParseText:
59
+ class TestToAndParseText:
55
60
  @given(value=booleans())
56
61
  def test_bool(self, *, value: bool) -> None:
57
- text = str(value)
62
+ text = to_text(value)
58
63
  result = parse_text(bool, text)
59
64
  assert result is value
60
65
 
61
66
  @given(date=dates())
62
67
  def test_date(self, *, date: dt.date) -> None:
63
- text = serialize_date(date)
68
+ text = to_text(date)
64
69
  result = parse_text(dt.date, text)
65
70
  assert result == date
66
71
 
67
72
  @given(datetime=local_datetimes() | zoned_datetimes())
68
73
  def test_datetime(self, *, datetime: dt.datetime) -> None:
69
- text = serialize_datetime(datetime)
74
+ text = to_text(datetime)
70
75
  result = parse_text(dt.datetime, text)
71
76
  assert result == datetime
72
77
 
78
+ @given(value=dictionaries(dates(), zoned_datetimes()))
79
+ def test_dict(self, *, value: dict[dt.date, dt.datetime]) -> None:
80
+ text = to_text(value)
81
+ result = parse_text(dict[dt.date, dt.datetime], text)
82
+ assert result == value
83
+
73
84
  @given(duration=datetime_durations(two_way=True))
74
85
  def test_duration(self, *, duration: Duration) -> None:
75
- text = serialize_duration(duration)
86
+ text = to_text(duration)
76
87
  result = parse_text(Duration, text)
77
88
  assert result == duration
78
89
 
79
90
  @given(truth=sampled_from(TruthEnum))
80
91
  def test_enum(self, *, truth: TruthEnum) -> None:
81
- text = truth.name
92
+ text = to_text(truth)
82
93
  result = parse_text(TruthEnum, text)
83
94
  assert result is truth
84
95
 
85
96
  @given(value=integers())
86
97
  def test_extra_type(self, *, value: int) -> None:
87
- text = str(value)
98
+ text = to_text(value)
88
99
  result = parse_text(
89
100
  DataClassFutureInt,
90
101
  text,
@@ -95,108 +106,126 @@ class TestParseText:
95
106
 
96
107
  @given(value=floats())
97
108
  def test_float(self, *, value: float) -> None:
98
- text = str(value)
109
+ text = to_text(value)
99
110
  result = parse_text(float, text)
100
111
  assert is_equal(result, value)
101
112
 
113
+ @given(values=frozensets(dates()))
114
+ def test_frozenset(self, *, values: frozenset[dt.date]) -> None:
115
+ text = to_text(values)
116
+ result = parse_text(frozenset[dt.date], text)
117
+ assert result == values
118
+
102
119
  @given(value=integers())
103
120
  def test_int(self, *, value: int) -> None:
104
- text = str(value)
121
+ text = to_text(value)
105
122
  result = parse_text(int, text)
106
123
  assert result == value
107
124
 
125
+ @given(values=lists(dates()))
126
+ def test_list(self, *, values: list[dt.date]) -> None:
127
+ text = to_text(values)
128
+ result = parse_text(list[dt.date], text)
129
+ assert result == values
130
+
108
131
  @given(truth=sampled_from(["true", "false"]))
109
132
  def test_literal(self, *, truth: Literal["true", "false"]) -> None:
110
133
  result = parse_text(TrueOrFalseFutureLit, truth)
111
134
  assert result == truth
112
135
 
113
136
  def test_none(self) -> None:
114
- text = str(None)
137
+ text = to_text(None)
115
138
  result = parse_text(None, text)
116
139
  assert result is None
117
140
 
118
141
  def test_none_type(self) -> None:
119
- text = str(None)
142
+ text = to_text(None)
120
143
  result = parse_text(NoneType, text)
121
144
  assert result is None
122
145
 
123
146
  @given(number=numbers())
124
147
  def test_number(self, *, number: Number) -> None:
125
- text = str(number)
148
+ text = to_text(number)
126
149
  result = parse_text(Number, text)
127
150
  assert result == number
128
151
 
129
152
  @given(path=paths())
130
153
  def test_path(self, *, path: Path) -> None:
131
- text = str(path)
154
+ text = to_text(path)
132
155
  result = parse_text(Path, text)
133
156
  assert result == path
134
157
 
135
158
  @given(path=paths())
136
159
  def test_path_expanded(self, *, path: Path) -> None:
137
160
  path_use = Path("~", path)
138
- text = str(path_use)
161
+ text = to_text(path_use)
139
162
  result = ensure_path(parse_text(Path, text))
140
163
  assert result == result.expanduser()
141
164
 
142
165
  def test_nullable_number_none(self) -> None:
143
- text = str(None)
166
+ text = to_text(None)
144
167
  result = parse_text(Number | None, text)
145
168
  assert result is None
146
169
 
147
170
  @given(number=numbers())
148
171
  def test_nullable_number_number(self, *, number: Number) -> None:
149
- text = str(number)
172
+ text = to_text(number)
150
173
  result = parse_text(Number | None, text)
151
174
  assert result == number
152
175
 
153
176
  def test_nullable_duration_none(self) -> None:
154
- text = str(None)
177
+ text = to_text(None)
155
178
  result = parse_text(Duration | None, text)
156
179
  assert result is None
157
180
 
158
181
  @given(duration=datetime_durations(two_way=True))
159
182
  def test_nullable_duration_duration(self, *, duration: Duration) -> None:
160
- text = serialize_duration(duration)
183
+ text = to_text(duration)
161
184
  result = parse_text(Duration | None, text)
162
185
  assert result == duration
163
186
 
164
187
  def test_nullable_int_none(self) -> None:
165
- text = str(None)
188
+ text = to_text(None)
166
189
  result = parse_text(int | None, text)
167
190
  assert result is None
168
191
 
169
192
  @given(value=integers())
170
193
  def test_nullable_int_int(self, *, value: int) -> None:
171
- text = str(value)
194
+ text = to_text(value)
172
195
  result = parse_text(int | None, text)
173
196
  assert result == value
174
197
 
175
198
  def test_sentinel(self) -> None:
176
- text = str(sentinel)
199
+ text = to_text(sentinel)
177
200
  result = parse_text(Sentinel, text)
178
201
  assert result is sentinel
179
202
 
203
+ @given(values=sets(dates()))
204
+ def test_set(self, *, values: set[dt.date]) -> None:
205
+ text = to_text(values)
206
+ result = parse_text(set[dt.date], text)
207
+ assert result == values
208
+
180
209
  @given(text=text_ascii())
181
- def test_str(self, *, text: str) -> None:
210
+ def test_to_text(self, *, text: str) -> None:
182
211
  result = parse_text(str, text)
183
212
  assert result == text
184
213
 
185
214
  @given(time=times())
186
215
  def test_time(self, *, time: dt.time) -> None:
187
- text = serialize_time(time)
216
+ text = to_text(time)
188
217
  result = parse_text(dt.time, text)
189
218
  assert result == time
190
219
 
191
220
  @given(timedelta=timedeltas_2w())
192
221
  def test_timedelta(self, *, timedelta: dt.timedelta) -> None:
193
- text = serialize_timedelta(timedelta)
222
+ text = to_text(timedelta)
194
223
  result = parse_text(dt.timedelta, text)
195
224
  assert result == timedelta
196
225
 
197
226
  @given(x=integers(), y=integers())
198
227
  def test_tuple(self, *, x: int, y: int) -> None:
199
- text = f"({x}, {y})"
228
+ text = to_text((x, y))
200
229
  result = parse_text(tuple[int, int], text)
201
230
  assert result == (x, y)
202
231
 
@@ -217,7 +246,7 @@ class TestParseText:
217
246
  case _:
218
247
  raise ImpossibleCaseError(case=[f"{value=}"])
219
248
 
220
- text = str(value)
249
+ text = to_text(value)
221
250
  result = parse_text(
222
251
  DataClassFutureIntEvenOrOddTypeUnion,
223
252
  text,
@@ -244,7 +273,7 @@ class TestParseText:
244
273
  case _:
245
274
  raise ImpossibleCaseError(case=[f"{value=}"])
246
275
 
247
- text = str(value)
276
+ text = to_text(value)
248
277
  result = parse_text(
249
278
  DataClassFutureIntEvenOrOddUnion,
250
279
  text,
@@ -261,10 +290,12 @@ class TestParseText:
261
290
 
262
291
  @given(version=versions())
263
292
  def test_version(self, *, version: Version) -> None:
264
- text = str(version)
293
+ text = to_text(version)
265
294
  result = parse_text(Version, text)
266
295
  assert result == version
267
296
 
297
+
298
+ class TestParseText:
268
299
  def test_error_bool(self) -> None:
269
300
  with raises(
270
301
  _ParseTextParseError, match="Unable to parse <class 'bool'>; got 'invalid'"
@@ -285,6 +316,20 @@ class TestParseText:
285
316
  ):
286
317
  _ = parse_text(dt.datetime, "invalid")
287
318
 
319
+ def test_error_dict_extract_group(self) -> None:
320
+ with raises(
321
+ _ParseTextParseError,
322
+ match=r"Unable to parse dict\[int, int\]; got 'invalid'",
323
+ ):
324
+ _ = parse_text(dict[int, int], "invalid")
325
+
326
+ def test_error_dict_internal(self) -> None:
327
+ with raises(
328
+ _ParseTextParseError,
329
+ match=r"Unable to parse dict\[int, int\]; got '\{invalid=invalid\}'",
330
+ ):
331
+ _ = parse_text(dict[int, int], "{invalid=invalid}")
332
+
288
333
  def test_error_duration(self) -> None:
289
334
  with raises(
290
335
  _ParseTextParseError, match=r"Unable to parse Duration; got 'invalid'"
@@ -324,7 +369,7 @@ class TestParseText:
324
369
  ):
325
370
  _ = parse_text(
326
371
  Child,
327
- str(value),
372
+ to_text(value),
328
373
  extra={
329
374
  Parent1: lambda text: Child(x=int(text)),
330
375
  Parent2: lambda text: Child(y=int(text)),
@@ -344,12 +389,39 @@ class TestParseText:
344
389
  ):
345
390
  _ = parse_text(float, "invalid")
346
391
 
392
+ def test_error_frozenset_extract_group(self) -> None:
393
+ with raises(
394
+ _ParseTextParseError,
395
+ match=r"Unable to parse frozenset\[int\]; got 'invalid'",
396
+ ):
397
+ _ = parse_text(frozenset[int], "invalid")
398
+
399
+ def test_error_frozenset_internal(self) -> None:
400
+ with raises(
401
+ _ParseTextParseError,
402
+ match=r"Unable to parse frozenset\[int\]; got '\{invalid\}'",
403
+ ):
404
+ _ = parse_text(frozenset[int], "{invalid}")
405
+
347
406
  def test_error_int(self) -> None:
348
407
  with raises(
349
408
  _ParseTextParseError, match="Unable to parse <class 'int'>; got 'invalid'"
350
409
  ):
351
410
  _ = parse_text(int, "invalid")
352
411
 
412
+ def test_error_list_extract_group(self) -> None:
413
+ with raises(
414
+ _ParseTextParseError, match=r"Unable to parse list\[int\]; got 'invalid'"
415
+ ):
416
+ _ = parse_text(list[int], "invalid")
417
+
418
+ def test_error_list_internal(self) -> None:
419
+ with raises(
420
+ _ParseTextParseError,
421
+ match=r"Unable to parse list\[int\]; got '\[invalid\]'",
422
+ ):
423
+ _ = parse_text(list[int], "[invalid]")
424
+
353
425
  def test_error_none(self) -> None:
354
426
  with raises(_ParseTextParseError, match="Unable to parse None; got 'invalid'"):
355
427
  _ = parse_text(None, "invalid")
@@ -387,6 +459,18 @@ class TestParseText:
387
459
  ):
388
460
  _ = parse_text(Sentinel, "invalid")
389
461
 
462
+ def test_error_set_extract_group(self) -> None:
463
+ with raises(
464
+ _ParseTextParseError, match=r"Unable to parse set\[int\]; got 'invalid'"
465
+ ):
466
+ _ = parse_text(set[int], "invalid")
467
+
468
+ def test_error_set_internal(self) -> None:
469
+ with raises(
470
+ _ParseTextParseError, match=r"Unable to parse set\[int\]; got '\{invalid\}'"
471
+ ):
472
+ _ = parse_text(set[int], "{invalid}")
473
+
390
474
  def test_error_time(self) -> None:
391
475
  with raises(
392
476
  _ParseTextParseError,
@@ -401,34 +485,35 @@ class TestParseText:
401
485
  ):
402
486
  _ = parse_text(dt.timedelta, "invalid")
403
487
 
404
- def test_error_tuple_invalid_text(self) -> None:
488
+ def test_error_tuple_extract_group(self) -> None:
405
489
  with raises(
406
490
  _ParseTextParseError,
407
491
  match=r"Unable to parse tuple\[int, int\]; got 'invalid'",
408
492
  ):
409
493
  _ = parse_text(tuple[int, int], "invalid")
410
494
 
411
- def test_error_tuple_inconsistent_args_and_texts(self) -> None:
495
+ def test_error_tuple_internal(self) -> None:
412
496
  with raises(
413
497
  _ParseTextParseError,
414
- match=r"Unable to parse tuple\[int, int\]; got '\(text1, text2, text3\)'",
498
+ match=r"Unable to parse tuple\[int, int\]; got '\(invalid,invalid\)'",
415
499
  ):
416
- _ = parse_text(tuple[int, int], "(text1, text2, text3)")
500
+ _ = parse_text(tuple[int, int], "(invalid,invalid)")
417
501
 
418
- def test_error_unknown_annotation(self) -> None:
502
+ def test_error_tuple_inconsistent_args_and_texts(self) -> None:
419
503
  with raises(
420
- _ParseTextParseError, match=r"Unable to parse int \| str; got 'invalid'"
504
+ _ParseTextParseError,
505
+ match=r"Unable to parse tuple\[int, int\]; got '\(text1, text2, text3\)'",
421
506
  ):
422
- _ = parse_text(int | str, "invalid")
507
+ _ = parse_text(tuple[int, int], "(text1, text2, text3)")
423
508
 
424
- def test_error_unknown_type(self) -> None:
509
+ def test_error_type_not_implemented(self) -> None:
425
510
  with raises(
426
511
  _ParseTextParseError,
427
512
  match=r"Unable to parse <class 'tests\.test_typing_funcs\.with_future\.DataClassFutureInt'>; got 'invalid'",
428
513
  ):
429
514
  _ = parse_text(DataClassFutureInt, "invalid")
430
515
 
431
- def test_error_unknown_union_type(self) -> None:
516
+ def test_error_union_not_implemented(self) -> None:
432
517
  with raises(
433
518
  _ParseTextParseError,
434
519
  match=r"Unable to parse tests\.test_typing_funcs\.with_future\.DataClassFutureIntEven \| tests\.test_typing_funcs\.with_future\.DataClassFutureIntOdd; got 'invalid'",
@@ -441,3 +526,9 @@ class TestParseText:
441
526
  match=r"Unable to parse <class 'utilities\.version\.Version'>; got 'invalid'",
442
527
  ):
443
528
  _ = parse_text(Version, "invalid")
529
+
530
+
531
+ class TestToText:
532
+ def test_error_not_implemented(self) -> None:
533
+ with raises(NotImplementedError):
534
+ _ = to_text(Final)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.109.27"
3
+ __version__ = "0.109.29"