dycw-utilities 0.111.0__tar.gz → 0.111.1__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.111.0 → dycw_utilities-0.111.1}/PKG-INFO +1 -1
  2. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/pyproject.toml +2 -2
  3. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_parse.py +63 -0
  4. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/parse.py +25 -37
  6. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/.gitignore +0 -0
  7. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/LICENSE +0 -0
  8. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/README.md +0 -0
  9. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/__init__.py +0 -0
  35. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/test_async_service/__init__.py +0 -0
  36. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/test_async_service/__main__.py +0 -0
  37. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/test_async_service/run.sh +0 -0
  38. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  39. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  40. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  41. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_astor.py +0 -0
  43. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_asyncio.py +0 -0
  44. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_atomicwrites.py +0 -0
  45. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_atools.py +0 -0
  46. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_cachetools.py +0 -0
  47. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_click.py +0 -0
  48. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_concurrent.py +0 -0
  49. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_contextlib.py +0 -0
  50. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_contextvars.py +0 -0
  51. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_cryptography.py +0 -0
  52. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_cvxpy.py +0 -0
  53. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_dataclasses.py +0 -0
  54. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_datetime.py +0 -0
  55. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_enum.py +0 -0
  56. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_errors.py +0 -0
  57. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_eventkit.py +0 -0
  58. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_fastapi.py +0 -0
  59. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_fpdf2.py +0 -0
  60. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_functions.py +0 -0
  61. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_functools.py +0 -0
  62. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_getpass.py +0 -0
  63. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_git.py +0 -0
  64. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_hashlib.py +0 -0
  65. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_http.py +0 -0
  66. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_hypothesis.py +0 -0
  67. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_ipython.py +0 -0
  68. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_iterables.py +0 -0
  69. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_jupyter.py +0 -0
  70. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_lightweight_charts.py +0 -0
  71. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_logging.py +0 -0
  72. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_loguru.py +0 -0
  73. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_luigi.py +0 -0
  74. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_math.py +0 -0
  75. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_memory_profiler.py +0 -0
  76. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_modules.py +0 -0
  77. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_more_itertools.py +0 -0
  78. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_numpy.py +0 -0
  79. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_operator.py +0 -0
  80. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_optuna.py +0 -0
  81. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_orjson.py +0 -0
  82. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_os.py +0 -0
  83. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_period.py +0 -0
  85. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pickle.py +0 -0
  86. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_platform.py +0 -0
  87. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_polars.py +0 -0
  88. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_polars_ols.py +0 -0
  89. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pydantic.py +0 -0
  91. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pyinstrument.py +0 -0
  92. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pyrsistent.py +0 -0
  93. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pytest.py +0 -0
  94. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_pytest_regressions.py +0 -0
  95. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_python_dotenv.py +0 -0
  96. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_random.py +0 -0
  97. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_re.py +0 -0
  98. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_redis.py +0 -0
  99. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_reprlib.py +0 -0
  100. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_rich.py +0 -0
  101. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_statsmodel.py +0 -0
  109. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_streamlit.py +0 -0
  110. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_sys.py +0 -0
  111. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_tenacity.py +0 -0
  113. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_text.py +0 -0
  114. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_threading.py +0 -0
  115. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_timer.py +0 -0
  116. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback.py +0 -0
  117. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/__init__.py +0 -0
  118. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/chain.py +0 -0
  119. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  120. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  121. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  122. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/many.py +0 -0
  123. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/one.py +0 -0
  124. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/recursive.py +0 -0
  125. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  126. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  127. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/two.py +0 -0
  128. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_traceback_funcs/untraced.py +0 -0
  129. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_types.py +0 -0
  130. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_typing.py +0 -0
  131. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_typing_funcs/__init__.py +0 -0
  132. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_typing_funcs/no_future.py +0 -0
  133. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_typing_funcs/with_future.py +0 -0
  134. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_tzdata.py +0 -0
  135. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_tzlocal.py +0 -0
  136. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_uuid.py +0 -0
  137. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_version.py +0 -0
  138. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_warnings.py +0 -0
  139. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_whenever.py +0 -0
  140. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_zipfile.py +0 -0
  141. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/tests/test_zoneinfo.py +0 -0
  142. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/altair.py +0 -0
  143. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/astor.py +0 -0
  144. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/asyncio.py +0 -0
  145. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/atomicwrites.py +0 -0
  146. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/atools.py +0 -0
  147. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/cachetools.py +0 -0
  148. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/click.py +0 -0
  149. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/concurrent.py +0 -0
  150. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/contextlib.py +0 -0
  151. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/contextvars.py +0 -0
  152. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/cryptography.py +0 -0
  153. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/cvxpy.py +0 -0
  154. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/dataclasses.py +0 -0
  155. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/datetime.py +0 -0
  156. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/enum.py +0 -0
  157. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/errors.py +0 -0
  158. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/eventkit.py +0 -0
  159. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/fastapi.py +0 -0
  160. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/fpdf2.py +0 -0
  161. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/functions.py +0 -0
  162. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/functools.py +0 -0
  163. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/getpass.py +0 -0
  164. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/git.py +0 -0
  165. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/hashlib.py +0 -0
  166. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/http.py +0 -0
  167. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/hypothesis.py +0 -0
  168. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/ipython.py +0 -0
  169. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/iterables.py +0 -0
  170. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/jupyter.py +0 -0
  171. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/lightweight_charts.py +0 -0
  172. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/logging.py +0 -0
  173. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/loguru.py +0 -0
  174. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/luigi.py +0 -0
  175. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/math.py +0 -0
  176. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/memory_profiler.py +0 -0
  177. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/modules.py +0 -0
  178. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/more_itertools.py +0 -0
  179. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/numpy.py +0 -0
  180. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/operator.py +0 -0
  181. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/optuna.py +0 -0
  182. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/orjson.py +0 -0
  183. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/os.py +0 -0
  184. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pathlib.py +0 -0
  185. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/period.py +0 -0
  186. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pickle.py +0 -0
  187. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/platform.py +0 -0
  188. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/polars.py +0 -0
  189. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/polars_ols.py +0 -0
  190. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pqdm.py +0 -0
  191. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/py.typed +0 -0
  192. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pydantic.py +0 -0
  193. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pyinstrument.py +0 -0
  194. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pyrsistent.py +0 -0
  195. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pytest.py +0 -0
  196. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/pytest_regressions.py +0 -0
  197. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/python_dotenv.py +0 -0
  198. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/random.py +0 -0
  199. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/re.py +0 -0
  200. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/redis.py +0 -0
  201. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/reprlib.py +0 -0
  202. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/rich.py +0 -0
  203. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/scipy.py +0 -0
  204. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/sentinel.py +0 -0
  205. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/shelve.py +0 -0
  206. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/slack_sdk.py +0 -0
  207. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/socket.py +0 -0
  208. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/sqlalchemy.py +0 -0
  209. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/sqlalchemy_polars.py +0 -0
  210. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/statsmodels.py +0 -0
  211. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/streamlit.py +0 -0
  212. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/sys.py +0 -0
  213. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/tempfile.py +0 -0
  214. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/tenacity.py +0 -0
  215. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/text.py +0 -0
  216. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/threading.py +0 -0
  217. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/timer.py +0 -0
  218. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/traceback.py +0 -0
  219. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/types.py +0 -0
  220. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/typing.py +0 -0
  221. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.111.0 → dycw_utilities-0.111.1}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.111.0
3
+ Version: 0.111.1
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.111.0"
97
+ version = "0.111.1"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  test = [
@@ -337,7 +337,7 @@ zzz-test-zoneinfo = [
337
337
  # bump-my-version
338
338
  [tool.bumpversion]
339
339
  allow_dirty = true
340
- current_version = "0.111.0"
340
+ current_version = "0.111.1"
341
341
 
342
342
  [[tool.bumpversion.files]]
343
343
  filename = "src/utilities/__init__.py"
@@ -300,6 +300,43 @@ class TestSerializeAndParseObject:
300
300
 
301
301
 
302
302
  class TestParseObject:
303
+ @given(text=sampled_from(["F_a_l_s_e", "T_r_u_e"]))
304
+ def test_bool_custom(self, *, text: str) -> None:
305
+ def parser(text: str, /) -> bool:
306
+ match text:
307
+ case "F_a_l_s_e":
308
+ return False
309
+ case "T_r_u_e":
310
+ return True
311
+ case _:
312
+ raise ImpossibleCaseError(case=[f"{text=}"])
313
+
314
+ bool_ = parse_object(bool, text, extra={bool: parser})
315
+ match text:
316
+ case "F_a_l_s_e":
317
+ expected = False
318
+ case "T_r_u_e":
319
+ expected = True
320
+ case _:
321
+ raise ImpossibleCaseError(case=[f"{text=}"])
322
+ assert bool_ is expected
323
+
324
+ @given(text=sampled_from(["F_a_l_s_e", "T_r_u_e"]))
325
+ def test_bool_extra_not_used(self, *, text: str) -> None:
326
+ def parser(text: str, /) -> bool:
327
+ match text:
328
+ case "F_a_l_s_e":
329
+ return False
330
+ case "T_r_u_e":
331
+ return True
332
+ case _:
333
+ raise ImpossibleCaseError(case=[f"{text=}"])
334
+
335
+ with raises(
336
+ _ParseObjectParseError, match="Unable to parse <class 'bool'>; got '.*'"
337
+ ):
338
+ _ = parse_object(bool, text, extra={int: parser})
339
+
303
340
  def test_error_bool(self) -> None:
304
341
  with raises(
305
342
  _ParseObjectParseError,
@@ -531,6 +568,32 @@ class TestParseObject:
531
568
 
532
569
 
533
570
  class TestSerializeObject:
571
+ @given(bool_=booleans())
572
+ def test_bool_custom(self, *, bool_: bool) -> None:
573
+ def serializer(bool_: bool, /) -> str: # noqa: FBT001
574
+ match bool_:
575
+ case True:
576
+ return "1"
577
+ case False:
578
+ return "0"
579
+
580
+ serialized = serialize_object(bool_, extra={bool: serializer})
581
+ match bool_:
582
+ case True:
583
+ expected = "1"
584
+ case False:
585
+ expected = "0"
586
+ assert serialized == expected
587
+
588
+ @given(bool_=booleans())
589
+ def test_bool_extra_not_used(self, *, bool_: bool) -> None:
590
+ def serializer(int_: int, /) -> str:
591
+ return f"({int_})"
592
+
593
+ serialized = serialize_object(bool_, extra={int: serializer})
594
+ expected = str(bool_)
595
+ assert serialized == expected
596
+
534
597
  @given(int_=integers())
535
598
  def test_type_with_extra(self, *, int_: int) -> None:
536
599
  obj = DataClassFutureInt(int_=int_)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.111.0"
3
+ __version__ = "0.111.1"
@@ -60,15 +60,15 @@ def parse_object(
60
60
  extra: ParseObjectExtra | None = None,
61
61
  ) -> Any:
62
62
  """Parse text."""
63
+ if extra is not None:
64
+ return _parse_object_extra(type_, text, extra)
63
65
  if type_ is None:
64
66
  try:
65
67
  return parse_none(text)
66
68
  except ParseNoneError:
67
69
  raise _ParseObjectParseError(type_=type_, text=text) from None
68
70
  if isinstance(type_, type):
69
- return _parse_object_type(
70
- type_, text, case_sensitive=case_sensitive, extra=extra
71
- )
71
+ return _parse_object_type(type_, text, case_sensitive=case_sensitive)
72
72
  if is_dict_type(type_):
73
73
  return _parse_object_dict_type(
74
74
  type_,
@@ -146,17 +146,12 @@ def parse_object(
146
146
  extra=extra,
147
147
  )
148
148
  if is_union_type(type_):
149
- return _parse_object_union_type(type_, text, extra=extra)
149
+ return _parse_object_union_type(type_, text)
150
150
  raise _ParseObjectParseError(type_=type_, text=text) from None
151
151
 
152
152
 
153
153
  def _parse_object_type(
154
- cls: type[Any],
155
- text: str,
156
- /,
157
- *,
158
- case_sensitive: bool = False,
159
- extra: ParseObjectExtra | None = None,
154
+ cls: type[Any], text: str, /, *, case_sensitive: bool = False
160
155
  ) -> Any:
161
156
  """Parse text."""
162
157
  if issubclass(cls, NoneType):
@@ -226,17 +221,6 @@ def _parse_object_type(
226
221
  return parse_timedelta(text)
227
222
  except ParseTimedeltaError:
228
223
  raise _ParseObjectParseError(type_=cls, text=text) from None
229
- if extra is not None:
230
- try:
231
- parser = one(p for c, p in extra.items() if issubclass(cls, c))
232
- except OneEmptyError:
233
- pass
234
- except OneNonUniqueError as error:
235
- raise _ParseObjectExtraNonUniqueError(
236
- type_=cls, text=text, first=error.first, second=error.second
237
- ) from None
238
- else:
239
- return parser(text)
240
224
  raise _ParseObjectParseError(type_=cls, text=text)
241
225
 
242
226
 
@@ -296,6 +280,21 @@ def _parse_object_dict_type(
296
280
  raise _ParseObjectParseError(type_=type_, text=text) from None
297
281
 
298
282
 
283
+ def _parse_object_extra(cls: Any, text: str, extra: ParseObjectExtra, /) -> Any:
284
+ try:
285
+ parser = one(
286
+ p for c, p in extra.items() if (cls is c) or is_subclass_gen(cls, c)
287
+ )
288
+ except OneEmptyError:
289
+ raise _ParseObjectParseError(type_=cls, text=text) from None
290
+ except OneNonUniqueError as error:
291
+ raise _ParseObjectExtraNonUniqueError(
292
+ type_=cls, text=text, first=error.first, second=error.second
293
+ ) from None
294
+ else:
295
+ return parser(text)
296
+
297
+
299
298
  def _parse_object_list_type(
300
299
  type_: Any,
301
300
  text: str,
@@ -368,9 +367,7 @@ def _parse_object_set_type(
368
367
  raise _ParseObjectParseError(type_=type_, text=text) from None
369
368
 
370
369
 
371
- def _parse_object_union_type(
372
- type_: Any, text: str, /, *, extra: ParseObjectExtra | None = None
373
- ) -> Any:
370
+ def _parse_object_union_type(type_: Any, text: str, /) -> Any:
374
371
  if type_ is Number:
375
372
  try:
376
373
  return parse_number(text)
@@ -383,13 +380,6 @@ def _parse_object_union_type(
383
380
  return parse_duration(text)
384
381
  except ParseDurationError:
385
382
  raise _ParseObjectParseError(type_=type_, text=text) from None
386
- if extra is not None:
387
- try:
388
- parser = one(p for c, p in extra.items() if c is type_)
389
- except OneEmptyError:
390
- pass
391
- else:
392
- return parser(text)
393
383
  raise _ParseObjectParseError(type_=type_, text=text) from None
394
384
 
395
385
 
@@ -466,6 +456,9 @@ def serialize_object(
466
456
  extra: SerializeObjectExtra | None = None,
467
457
  ) -> str:
468
458
  """Convert an object to text."""
459
+ if extra is not None:
460
+ with suppress(_SerializeObjectSerializeError):
461
+ return _serialize_object_extra(obj, extra)
469
462
  if (obj is None) or isinstance(
470
463
  obj, bool | int | float | str | Path | Sentinel | Version
471
464
  ):
@@ -504,8 +497,6 @@ def serialize_object(
504
497
  return _serialize_object_set(
505
498
  obj, list_separator=list_separator, pair_separator=pair_separator
506
499
  )
507
- if extra is not None:
508
- return _serialize_object_extra(obj, extra)
509
500
  raise _SerializeObjectSerializeError(obj=obj)
510
501
 
511
502
 
@@ -537,10 +528,7 @@ def _serialize_object_dict(
537
528
  def _serialize_object_extra(obj: Any, extra: SerializeObjectExtra, /) -> str:
538
529
  try:
539
530
  serializer = one(
540
- s
541
- for c, s in extra.items()
542
- if (isinstance(c, type) and isinstance(obj, c))
543
- or isinstance(obj, get_args(c))
531
+ s for c, s in extra.items() if (obj is c) or is_instance_gen(obj, c)
544
532
  )
545
533
  except OneEmptyError:
546
534
  raise _SerializeObjectSerializeError(obj=obj) from None