dycw-utilities 0.108.4__tar.gz → 0.109.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/pyproject.toml +2 -2
  3. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_dataclasses.py +23 -12
  4. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_operator.py +22 -0
  5. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_orjson.py +20 -0
  6. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_parse.py +10 -1
  7. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_polars.py +0 -184
  8. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_python_dotenv.py +17 -1
  9. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing.py +27 -13
  10. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/no_future.py +4 -0
  11. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/with_future.py +7 -7
  12. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/__init__.py +1 -1
  13. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/parse.py +2 -2
  14. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/polars.py +0 -99
  15. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/.gitignore +0 -0
  16. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/LICENSE +0 -0
  17. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/README.md +0 -0
  18. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/__init__.py +0 -0
  19. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/conftest.py +0 -0
  20. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/__init__.py +0 -0
  21. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_missing/__init__.py +0 -0
  22. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_missing/module.py +0 -0
  23. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/__init__.py +0 -0
  24. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/outer_1.py +0 -0
  25. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/outer_2.py +0 -0
  26. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  27. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  28. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  29. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  30. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_without/__init__.py +0 -0
  31. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_without/module_1.py +0 -0
  32. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/package_without/module_2.py +0 -0
  33. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/standalone.py +0 -0
  34. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/modules/with_imports.py +0 -0
  35. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  36. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  37. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  38. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  39. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  40. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  41. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  42. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  43. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/__init__.py +0 -0
  44. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/__init__.py +0 -0
  45. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/__main__.py +0 -0
  46. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_async_service/run.sh +0 -0
  47. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  48. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  49. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  50. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_altair.py +0 -0
  51. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_astor.py +0 -0
  52. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_asyncio.py +0 -0
  53. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_atomicwrites.py +0 -0
  54. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_atools.py +0 -0
  55. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_cachetools.py +0 -0
  56. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_click.py +0 -0
  57. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_concurrent.py +0 -0
  58. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_contextlib.py +0 -0
  59. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_contextvars.py +0 -0
  60. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_cryptography.py +0 -0
  61. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_cvxpy.py +0 -0
  62. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_datetime.py +0 -0
  63. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_enum.py +0 -0
  64. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_errors.py +0 -0
  65. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_eventkit.py +0 -0
  66. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_fastapi.py +0 -0
  67. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_fpdf2.py +0 -0
  68. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_functions.py +0 -0
  69. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_functools.py +0 -0
  70. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_getpass.py +0 -0
  71. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_git.py +0 -0
  72. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_hashlib.py +0 -0
  73. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_http.py +0 -0
  74. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_hypothesis.py +0 -0
  75. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_ipython.py +0 -0
  76. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_iterables.py +0 -0
  77. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_jupyter.py +0 -0
  78. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_logging.py +0 -0
  79. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_loguru.py +0 -0
  80. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_luigi.py +0 -0
  81. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_math.py +0 -0
  82. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_memory_profiler.py +0 -0
  83. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_modules.py +0 -0
  84. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_more_itertools.py +0 -0
  85. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_numpy.py +0 -0
  86. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_optuna.py +0 -0
  87. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_os.py +0 -0
  88. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pathlib.py +0 -0
  89. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_period.py +0 -0
  90. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pickle.py +0 -0
  91. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_platform.py +0 -0
  92. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pqdm.py +0 -0
  93. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pydantic.py +0 -0
  94. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pyinstrument.py +0 -0
  95. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pyrsistent.py +0 -0
  96. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pytest.py +0 -0
  97. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_pytest_regressions.py +0 -0
  98. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_random.py +0 -0
  99. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_re.py +0 -0
  100. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_redis.py +0 -0
  101. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_reprlib.py +0 -0
  102. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_rich.py +0 -0
  103. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_scipy.py +0 -0
  104. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sentinel.py +0 -0
  105. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_shelve.py +0 -0
  106. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_slack_sdk.py +0 -0
  107. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_socket.py +0 -0
  108. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sqlalchemy.py +0 -0
  109. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  110. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_streamlit.py +0 -0
  111. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_sys.py +0 -0
  112. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tempfile.py +0 -0
  113. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tenacity.py +0 -0
  114. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_text.py +0 -0
  115. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_threading.py +0 -0
  116. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_timer.py +0 -0
  117. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback.py +0 -0
  118. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/chain.py +0 -0
  120. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  121. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  122. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  123. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/many.py +0 -0
  124. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/one.py +0 -0
  125. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
  126. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  127. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  128. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/two.py +0 -0
  129. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
  130. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_types.py +0 -0
  131. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  132. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tzdata.py +0 -0
  133. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_tzlocal.py +0 -0
  134. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_uuid.py +0 -0
  135. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_version.py +0 -0
  136. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_warnings.py +0 -0
  137. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_whenever.py +0 -0
  138. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_zipfile.py +0 -0
  139. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/tests/test_zoneinfo.py +0 -0
  140. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/altair.py +0 -0
  141. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/astor.py +0 -0
  142. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/asyncio.py +0 -0
  143. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/atomicwrites.py +0 -0
  144. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/atools.py +0 -0
  145. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/cachetools.py +0 -0
  146. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/click.py +0 -0
  147. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/concurrent.py +0 -0
  148. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/contextlib.py +0 -0
  149. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/contextvars.py +0 -0
  150. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/cryptography.py +0 -0
  151. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/cvxpy.py +0 -0
  152. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/dataclasses.py +0 -0
  153. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/datetime.py +0 -0
  154. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/enum.py +0 -0
  155. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/errors.py +0 -0
  156. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/eventkit.py +0 -0
  157. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/fastapi.py +0 -0
  158. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/fpdf2.py +0 -0
  159. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/functions.py +0 -0
  160. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/functools.py +0 -0
  161. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/getpass.py +0 -0
  162. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/git.py +0 -0
  163. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/hashlib.py +0 -0
  164. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/http.py +0 -0
  165. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/hypothesis.py +0 -0
  166. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/ipython.py +0 -0
  167. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/iterables.py +0 -0
  168. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/jupyter.py +0 -0
  169. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/logging.py +0 -0
  170. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/loguru.py +0 -0
  171. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/luigi.py +0 -0
  172. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/math.py +0 -0
  173. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/memory_profiler.py +0 -0
  174. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/modules.py +0 -0
  175. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/more_itertools.py +0 -0
  176. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/numpy.py +0 -0
  177. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/operator.py +0 -0
  178. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/optuna.py +0 -0
  179. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/orjson.py +0 -0
  180. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/os.py +0 -0
  181. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pathlib.py +0 -0
  182. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/period.py +0 -0
  183. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pickle.py +0 -0
  184. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/platform.py +0 -0
  185. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pqdm.py +0 -0
  186. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/py.typed +0 -0
  187. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pydantic.py +0 -0
  188. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pyinstrument.py +0 -0
  189. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pyrsistent.py +0 -0
  190. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pytest.py +0 -0
  191. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/pytest_regressions.py +0 -0
  192. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/python_dotenv.py +0 -0
  193. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/random.py +0 -0
  194. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/re.py +0 -0
  195. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/redis.py +0 -0
  196. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/reprlib.py +0 -0
  197. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/rich.py +0 -0
  198. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/scipy.py +0 -0
  199. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sentinel.py +0 -0
  200. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/shelve.py +0 -0
  201. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/slack_sdk.py +0 -0
  202. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/socket.py +0 -0
  203. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sqlalchemy.py +0 -0
  204. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sqlalchemy_polars.py +0 -0
  205. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/streamlit.py +0 -0
  206. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/sys.py +0 -0
  207. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tempfile.py +0 -0
  208. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tenacity.py +0 -0
  209. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/text.py +0 -0
  210. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/threading.py +0 -0
  211. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/timer.py +0 -0
  212. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/traceback.py +0 -0
  213. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/types.py +0 -0
  214. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/typing.py +0 -0
  215. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tzdata.py +0 -0
  216. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/tzlocal.py +0 -0
  217. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/uuid.py +0 -0
  218. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/version.py +0 -0
  219. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/warnings.py +0 -0
  220. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/whenever.py +0 -0
  221. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/zipfile.py +0 -0
  222. {dycw_utilities-0.108.4 → dycw_utilities-0.109.0}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.108.4
3
+ Version: 0.109.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -89,7 +89,7 @@ dependencies = [
89
89
  name = "dycw-utilities"
90
90
  readme = "README.md"
91
91
  requires-python = ">= 3.12"
92
- version = "0.108.4"
92
+ version = "0.109.0"
93
93
 
94
94
  [project.optional-dependencies]
95
95
  test = [
@@ -332,7 +332,7 @@ zzz-test-zoneinfo = [
332
332
  # bump-my-version
333
333
  [tool.bumpversion]
334
334
  allow_dirty = true
335
- current_version = "0.108.4"
335
+ current_version = "0.109.0"
336
336
 
337
337
  [[tool.bumpversion.files]]
338
338
  filename = "src/utilities/__init__.py"
@@ -5,7 +5,7 @@ from dataclasses import dataclass, field
5
5
  from pathlib import Path
6
6
  from re import DOTALL
7
7
  from types import NoneType
8
- from typing import Any, Literal, cast, override
8
+ from typing import Any, cast, override
9
9
 
10
10
  from hypothesis import given
11
11
  from hypothesis.strategies import (
@@ -40,6 +40,8 @@ from tests.test_typing_funcs.with_future import (
40
40
  DataClassFutureStr,
41
41
  DataClassFutureTypeLiteral,
42
42
  DataClassFutureTypeLiteralNullable,
43
+ TrueOrFalseFutureLit,
44
+ TrueOrFalseFutureTypeLit,
43
45
  )
44
46
  from utilities.dataclasses import (
45
47
  YieldFieldsError,
@@ -67,8 +69,6 @@ from utilities.sentinel import sentinel
67
69
  from utilities.types import Dataclass, StrMapping
68
70
  from utilities.typing import get_args, is_list_type, is_literal_type, is_optional_type
69
71
 
70
- TruthLit = Literal["true", "false"] # in 3.12, use type TruthLit = ...
71
-
72
72
 
73
73
  class TestDataClassRepr:
74
74
  def test_overriding_repr(self) -> None:
@@ -462,21 +462,23 @@ class TestYieldFields:
462
462
  assert get_args(result.type_) == (int,)
463
463
 
464
464
  def test_class_future_literal(self) -> None:
465
- result = one(yield_fields(DataClassFutureLiteral))
466
- expected = _YieldFieldsClass(name="truth", type_=TruthLit, kw_only=True)
465
+ result = one(yield_fields(DataClassFutureLiteral, globalns=globals()))
466
+ expected = _YieldFieldsClass(
467
+ name="truth", type_=TrueOrFalseFutureLit, kw_only=True
468
+ )
467
469
  assert result == expected
468
470
  assert is_literal_type(result.type_)
469
471
  assert get_args(result.type_) == ("true", "false")
470
472
 
471
473
  def test_class_future_literal_nullable(self) -> None:
472
- result = one(yield_fields(DataClassFutureLiteralNullable))
474
+ result = one(yield_fields(DataClassFutureLiteralNullable, globalns=globals()))
473
475
  expected = _YieldFieldsClass(
474
- name="truth", type_=TruthLit | None, default=None, kw_only=True
476
+ name="truth", type_=TrueOrFalseFutureLit | None, default=None, kw_only=True
475
477
  )
476
478
  assert result == expected
477
479
  assert is_optional_type(result.type_)
478
480
  args = get_args(result.type_)
479
- assert args == (Literal["true", "false"],)
481
+ assert args == (TrueOrFalseFutureLit,)
480
482
  arg = one(args)
481
483
  assert get_args(arg) == ("true", "false")
482
484
 
@@ -491,8 +493,14 @@ class TestYieldFields:
491
493
  assert result.type_ is DataClassFutureNestedOuterFirstInner
492
494
 
493
495
  def test_class_future_type_literal(self) -> None:
494
- result = one(yield_fields(DataClassFutureTypeLiteral, globalns=globals()))
495
- expected = _YieldFieldsClass(name="truth", type_=TruthLit, kw_only=True)
496
+ result = one(
497
+ yield_fields(
498
+ DataClassFutureTypeLiteral, globalns=globals(), localns=locals()
499
+ )
500
+ )
501
+ expected = _YieldFieldsClass(
502
+ name="truth", type_=TrueOrFalseFutureTypeLit, kw_only=True
503
+ )
496
504
  assert result == expected
497
505
  assert is_literal_type(result.type_)
498
506
  assert get_args(result.type_) == ("true", "false")
@@ -502,12 +510,15 @@ class TestYieldFields:
502
510
  yield_fields(DataClassFutureTypeLiteralNullable, globalns=globals())
503
511
  )
504
512
  expected = _YieldFieldsClass(
505
- name="truth", type_=TruthLit | None, default=None, kw_only=True
513
+ name="truth",
514
+ type_=TrueOrFalseFutureTypeLit | None,
515
+ default=None,
516
+ kw_only=True,
506
517
  )
507
518
  assert result == expected
508
519
  assert is_optional_type(result.type_)
509
520
  args = get_args(result.type_)
510
- assert args == (Literal["true", "false"],)
521
+ assert args == (TrueOrFalseFutureTypeLit,)
511
522
  arg = one(args)
512
523
  assert get_args(arg) == ("true", "false")
513
524
 
@@ -43,6 +43,8 @@ from tests.test_typing_funcs.with_future import (
43
43
  DataClassFutureNestedInnerFirstOuter,
44
44
  DataClassFutureNestedOuterFirstOuter,
45
45
  DataClassFutureNone,
46
+ DataClassFutureTypeLiteral,
47
+ DataClassFutureTypeLiteralNullable,
46
48
  )
47
49
  from utilities.hypothesis import (
48
50
  assume_does_not_raise,
@@ -76,6 +78,8 @@ def base_objects(
76
78
  dataclass_literal_nullable: bool = False,
77
79
  dataclass_nested: bool = False,
78
80
  dataclass_none: bool = False,
81
+ dataclass_type_literal: bool = False,
82
+ dataclass_type_literal_nullable: bool = False,
79
83
  enum: bool = False,
80
84
  exception_class: bool = False,
81
85
  exception_instance: bool = False,
@@ -132,6 +136,15 @@ def base_objects(
132
136
  )
133
137
  if dataclass_none:
134
138
  base |= builds(DataClassFutureNone)
139
+ if dataclass_type_literal:
140
+ base |= builds(
141
+ DataClassFutureTypeLiteral, truth=sampled_from(["true", "false"])
142
+ )
143
+ if dataclass_type_literal_nullable:
144
+ base |= builds(
145
+ DataClassFutureTypeLiteralNullable,
146
+ truth=sampled_from(["true", "false"]) | none(),
147
+ )
135
148
  if enum:
136
149
  base |= sampled_from(TruthEnum)
137
150
  if exception_class:
@@ -151,6 +164,8 @@ def make_objects(
151
164
  dataclass_literal_nullable: bool = False,
152
165
  dataclass_nested: bool = False,
153
166
  dataclass_none: bool = False,
167
+ dataclass_type_literal: bool = False,
168
+ dataclass_type_literal_nullable: bool = False,
154
169
  enum: bool = False,
155
170
  exception_class: bool = False,
156
171
  exception_instance: bool = False,
@@ -173,6 +188,8 @@ def make_objects(
173
188
  dataclass_literal_nullable=dataclass_literal_nullable,
174
189
  dataclass_nested=dataclass_nested,
175
190
  dataclass_none=dataclass_none,
191
+ dataclass_type_literal=dataclass_type_literal,
192
+ dataclass_type_literal_nullable=dataclass_type_literal_nullable,
176
193
  enum=enum,
177
194
  exception_class=exception_class,
178
195
  exception_instance=exception_instance,
@@ -272,6 +289,8 @@ class TestIsEqual:
272
289
  dataclass_literal_nullable=True,
273
290
  dataclass_nested=True,
274
291
  dataclass_none=True,
292
+ dataclass_type_literal=True,
293
+ dataclass_type_literal_nullable=True,
275
294
  enum=True,
276
295
  sub_frozenset=True,
277
296
  sub_list=True,
@@ -287,12 +306,15 @@ class TestIsEqual:
287
306
  objs=pairs(
288
307
  make_objects(
289
308
  dataclass_custom_equality=True,
309
+ dataclass_default_in_init_child=True,
290
310
  dataclass_int=True,
291
311
  dataclass_int_default=True,
292
312
  dataclass_literal=True,
293
313
  dataclass_literal_nullable=True,
294
314
  dataclass_nested=True,
295
315
  dataclass_none=True,
316
+ dataclass_type_literal=True,
317
+ dataclass_type_literal_nullable=True,
296
318
  enum=True,
297
319
  sub_frozenset=True,
298
320
  sub_list=True,
@@ -48,6 +48,8 @@ from tests.test_typing_funcs.with_future import (
48
48
  DataClassFutureNestedOuterFirstInner,
49
49
  DataClassFutureNestedOuterFirstOuter,
50
50
  DataClassFutureNone,
51
+ DataClassFutureTypeLiteral,
52
+ DataClassFutureTypeLiteralNullable,
51
53
  )
52
54
  from utilities.datetime import MINUTE, SECOND, get_now, get_now_local
53
55
  from utilities.functions import is_sequence_of
@@ -435,12 +437,15 @@ class TestSerializeAndDeserialize:
435
437
  @given(
436
438
  obj=make_objects(
437
439
  dataclass_custom_equality=True,
440
+ dataclass_default_in_init_child=False,
438
441
  dataclass_int=True,
439
442
  dataclass_int_default=True,
440
443
  dataclass_literal=True,
441
444
  dataclass_literal_nullable=True,
442
445
  dataclass_nested=True,
443
446
  dataclass_none=True,
447
+ dataclass_type_literal=True,
448
+ dataclass_type_literal_nullable=True,
444
449
  enum=True,
445
450
  exception_class=True,
446
451
  exception_instance=True,
@@ -467,6 +472,8 @@ class TestSerializeAndDeserialize:
467
472
  DataClassFutureNestedOuterFirstInner,
468
473
  DataClassFutureNestedOuterFirstOuter,
469
474
  DataClassFutureNone,
475
+ DataClassFutureTypeLiteral,
476
+ DataClassFutureTypeLiteralNullable,
470
477
  SubFrozenSet,
471
478
  SubList,
472
479
  SubSet,
@@ -559,6 +566,19 @@ class TestSerializeAndDeserialize:
559
566
  result = deserialize(ser, objects={DataClassFutureNone})
560
567
  assert is_equal(result, obj)
561
568
 
569
+ @given(obj=make_objects(dataclass_type_literal=True))
570
+ def test_dataclass_type_literal(self, *, obj: Any) -> None:
571
+ result = deserialize(serialize(obj), objects={DataClassFutureTypeLiteral})
572
+ assert is_equal(result, obj)
573
+
574
+ @given(obj=make_objects(dataclass_type_literal_nullable=True))
575
+ def test_dataclass_type_literal_nullable(self, *, obj: Any) -> None:
576
+ result = deserialize(
577
+ serialize(obj), objects={DataClassFutureTypeLiteralNullable}
578
+ )
579
+ with assume_does_not_raise(IsEqualError):
580
+ assert is_equal(result, obj)
581
+
562
582
  @given(obj=builds(DataClassFutureNone))
563
583
  def test_dataclass_no_objects_error(self, *, obj: DataClassFutureNone) -> None:
564
584
  ser = serialize(obj)
@@ -12,6 +12,10 @@ from hypothesis.strategies import booleans, dates, floats, integers, sampled_fro
12
12
  from pytest import raises
13
13
 
14
14
  from tests.test_operator import TruthEnum
15
+ from tests.test_typing_funcs.with_future import (
16
+ TrueOrFalseFutureLit,
17
+ TrueOrFalseFutureTypeLit,
18
+ )
15
19
  from utilities.functions import ensure_path
16
20
  from utilities.hypothesis import (
17
21
  local_datetimes,
@@ -72,7 +76,7 @@ class TestParseText:
72
76
 
73
77
  @given(truth=sampled_from(["true", "false"]))
74
78
  def test_literal(self, *, truth: Literal["true", "false"]) -> None:
75
- result = parse_text(Literal["true", "false"], truth)
79
+ result = parse_text(TrueOrFalseFutureLit, truth)
76
80
  assert result == truth
77
81
 
78
82
  def test_nullable_int_none(self) -> None:
@@ -131,6 +135,11 @@ class TestParseText:
131
135
  result = parse_text(dt.timedelta, text)
132
136
  assert result == timedelta
133
137
 
138
+ @given(truth=sampled_from(["true", "false"]))
139
+ def test_type_literal(self, *, truth: Literal["true", "false"]) -> None:
140
+ result = parse_text(TrueOrFalseFutureTypeLit, truth)
141
+ assert result == truth
142
+
134
143
  @given(version=versions())
135
144
  def test_version(self, *, version: Version) -> None:
136
145
  text = str(version)
@@ -102,8 +102,6 @@ from utilities.polars import (
102
102
  _InsertBetweenMissingColumnsError,
103
103
  _InsertBetweenNonConsecutiveError,
104
104
  _yield_struct_series_element_remove_nulls,
105
- _YieldRowsAsDataClassesColumnsSuperSetError,
106
- _YieldRowsAsDataClassesWrongTypeError,
107
105
  append_dataclass,
108
106
  are_frames_equal,
109
107
  ceil_datetime,
@@ -138,7 +136,6 @@ from utilities.polars import (
138
136
  touch,
139
137
  unique_element,
140
138
  week_num,
141
- yield_rows_as_dataclasses,
142
139
  yield_struct_series_dataclasses,
143
140
  yield_struct_series_elements,
144
141
  zoned_datetime,
@@ -161,9 +158,6 @@ if TYPE_CHECKING:
161
158
  from utilities.types import MaybeType, StrMapping, WeekDay
162
159
 
163
160
 
164
- TruthLit = Literal["true", "false"] # in 3.12, use type TruthLit = ...
165
-
166
-
167
161
  class TestAppendDataClass:
168
162
  @given(
169
163
  data=fixed_dictionaries({
@@ -1809,184 +1803,6 @@ class TestWeekNum:
1809
1803
  assert_series_equal(result, expected)
1810
1804
 
1811
1805
 
1812
- class TestYieldRowsAsDataclasses:
1813
- @given(check_types=sampled_from(["none", "first", "all"]))
1814
- def test_main(self, *, check_types: Literal["none", "first", "all"]) -> None:
1815
- df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
1816
-
1817
- @dataclass(kw_only=True, slots=True)
1818
- class Row:
1819
- x: int
1820
-
1821
- result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1822
- expected = [Row(x=1), Row(x=2), Row(x=3)]
1823
- assert result == expected
1824
-
1825
- def test_none(self) -> None:
1826
- df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": int}, orient="row")
1827
-
1828
- @dataclass(kw_only=True, slots=True)
1829
- class Row:
1830
- x: str
1831
-
1832
- result = list(yield_rows_as_dataclasses(df, Row, check_types="none"))
1833
- expected = [Row(x=cast("Any", 1)), Row(x=cast("Any", 2)), Row(x=cast("Any", 3))]
1834
- assert result == expected
1835
-
1836
- def test_first(self) -> None:
1837
- df = DataFrame(data=[(1,), (None,), (None,)], schema={"x": int}, orient="row")
1838
-
1839
- @dataclass(kw_only=True, slots=True)
1840
- class Row:
1841
- x: int
1842
-
1843
- result = list(yield_rows_as_dataclasses(df, Row, check_types="first"))
1844
- expected = [Row(x=1), Row(x=cast("Any", None)), Row(x=cast("Any", None))]
1845
- assert result == expected
1846
-
1847
- @given(check_types=sampled_from(["none", "first", "all"]))
1848
- def test_missing_columns_for_fields_with_defaults(
1849
- self, *, check_types: Literal["none", "first", "all"]
1850
- ) -> None:
1851
- df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
1852
-
1853
- @dataclass(kw_only=True, slots=True)
1854
- class Row:
1855
- x: int
1856
- y: int | None = None
1857
-
1858
- result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1859
- expected = [Row(x=1), Row(x=2), Row(x=3)]
1860
- assert result == expected
1861
-
1862
- @given(check_types=sampled_from(["none", "first", "all"]))
1863
- def test_literal(self, *, check_types: Literal["none", "first", "all"]) -> None:
1864
- df = DataFrame(
1865
- data=[("true",), ("false",), ("true",)], schema={"x": String}, orient="row"
1866
- )
1867
-
1868
- @dataclass(kw_only=True, slots=True)
1869
- class Row:
1870
- x: Literal["true", "false"]
1871
-
1872
- result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1873
- expected = [Row(x="true"), Row(x="false"), Row(x="true")]
1874
- assert result == expected
1875
-
1876
- @given(check_types=sampled_from(["none", "first", "all"]))
1877
- def test_literal_nullable(
1878
- self, *, check_types: Literal["none", "first", "all"]
1879
- ) -> None:
1880
- df = DataFrame(
1881
- data=[("true",), ("false",), (None,)], schema={"x": String}, orient="row"
1882
- )
1883
-
1884
- @dataclass(kw_only=True, slots=True)
1885
- class Row:
1886
- x: Literal["true", "false"] | None = None
1887
-
1888
- result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1889
- expected = [Row(x="true"), Row(x="false"), Row()]
1890
- assert result == expected
1891
-
1892
- @given(check_types=sampled_from(["none", "first", "all"]))
1893
- def test_literal_type(
1894
- self, *, check_types: Literal["none", "first", "all"]
1895
- ) -> None:
1896
- df = DataFrame(
1897
- data=[("true",), ("false",), ("true",)], schema={"x": String}, orient="row"
1898
- )
1899
-
1900
- @dataclass(kw_only=True, slots=True)
1901
- class Row:
1902
- x: TruthLit
1903
-
1904
- result = list(
1905
- yield_rows_as_dataclasses(
1906
- df, Row, check_types=check_types, globalns=globals()
1907
- )
1908
- )
1909
- expected = [Row(x="true"), Row(x="false"), Row(x="true")]
1910
- assert result == expected
1911
-
1912
- @given(check_types=sampled_from(["none", "first", "all"]))
1913
- def test_literal_type_nullable(
1914
- self, *, check_types: Literal["none", "first", "all"]
1915
- ) -> None:
1916
- df = DataFrame(
1917
- data=[("true",), ("false",), (None,)], schema={"x": String}, orient="row"
1918
- )
1919
-
1920
- @dataclass(kw_only=True, slots=True)
1921
- class Row:
1922
- x: TruthLit | None = None
1923
-
1924
- result = list(
1925
- yield_rows_as_dataclasses(
1926
- df, Row, globalns=globals(), check_types=check_types
1927
- )
1928
- )
1929
- expected = [Row(x="true"), Row(x="false"), Row()]
1930
- assert result == expected
1931
-
1932
- @given(check_types=sampled_from(["none", "first", "all"]))
1933
- def test_empty(self, *, check_types: Literal["none", "first", "all"]) -> None:
1934
- df = DataFrame(data=[], schema={"x": Int64}, orient="row")
1935
-
1936
- @dataclass(kw_only=True, slots=True)
1937
- class Row:
1938
- x: int
1939
-
1940
- result = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1941
- expected = []
1942
- assert result == expected
1943
-
1944
- @given(check_types=sampled_from(["none", "first", "all"]))
1945
- def test_error_superset(
1946
- self, *, check_types: Literal["none", "first", "all"]
1947
- ) -> None:
1948
- df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
1949
-
1950
- @dataclass(kw_only=True, slots=True)
1951
- class Row:
1952
- y: int
1953
-
1954
- with raises(
1955
- _YieldRowsAsDataClassesColumnsSuperSetError,
1956
- match="DataFrame columns .* must be a superset of dataclass fields .*; dataclass had extra fields .*",
1957
- ):
1958
- _ = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1959
-
1960
- @given(check_types=sampled_from(["first", "all"]))
1961
- def test_error_first_or_all_wrong_type(
1962
- self, *, check_types: Literal["first", "all"]
1963
- ) -> None:
1964
- df = DataFrame(data=[(1,), (2,), (3,)], schema={"x": Int64}, orient="row")
1965
-
1966
- @dataclass(kw_only=True, slots=True)
1967
- class Row:
1968
- x: str
1969
-
1970
- with raises(
1971
- _YieldRowsAsDataClassesWrongTypeError,
1972
- match='wrong value type for field "x" - should be "str" instead of value "1" of type "int"',
1973
- ):
1974
- _ = list(yield_rows_as_dataclasses(df, Row, check_types=check_types))
1975
-
1976
- def test_error_all_wrong_type(self) -> None:
1977
- df = DataFrame(data=[(1,), (None,), (3,)], schema={"x": Int64}, orient="row")
1978
-
1979
- @dataclass(kw_only=True, slots=True)
1980
- class Row:
1981
- x: int
1982
-
1983
- with raises(
1984
- _YieldRowsAsDataClassesWrongTypeError,
1985
- match='wrong value type for field "x" - should be "int" instead of value "None" of type "NoneType"',
1986
- ):
1987
- _ = list(yield_rows_as_dataclasses(df, Row, check_types="all"))
1988
-
1989
-
1990
1806
  class TestYieldStructSeriesDataclasses:
1991
1807
  def test_main(self) -> None:
1992
1808
  @dataclass(kw_only=True, slots=True)
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import re
4
4
  from dataclasses import dataclass
5
5
  from re import DOTALL
6
- from typing import TYPE_CHECKING
6
+ from typing import TYPE_CHECKING, Literal
7
7
 
8
8
  from hypothesis import given
9
9
  from hypothesis.strategies import DataObject, booleans, data, integers, sampled_from
@@ -87,6 +87,22 @@ class TestLoadSettings:
87
87
  expected = Settings(key=value)
88
88
  assert settings == expected
89
89
 
90
+ @given(root=git_repos(), value=sampled_from(["true", "false"]))
91
+ @settings_with_reduced_examples()
92
+ def test_literal_value(
93
+ self, *, root: Path, value: Literal["true", "false"]
94
+ ) -> None:
95
+ @dataclass(kw_only=True, slots=True)
96
+ class Settings:
97
+ key: Literal["true", "false"]
98
+
99
+ with root.joinpath(".env").open(mode="w") as fh:
100
+ _ = fh.write(f"key = {value}\n")
101
+
102
+ settings = load_settings(Settings, cwd=root)
103
+ expected = Settings(key=value)
104
+ assert settings == expected
105
+
90
106
  @given(root=git_repos())
91
107
  @settings_with_reduced_examples()
92
108
  def test_error_file_not_found(self, *, root: Path) -> None:
@@ -33,7 +33,10 @@ from tests.test_typing_funcs.with_future import (
33
33
  DataClassFutureSentinel,
34
34
  DataClassFutureStr,
35
35
  DataClassFutureTimeDelta,
36
+ DataClassFutureTypeLiteral,
36
37
  DataClassFutureUUID,
38
+ TrueOrFalseFutureLit,
39
+ TrueOrFalseFutureTypeLit,
37
40
  )
38
41
  from utilities.sentinel import Sentinel
39
42
  from utilities.types import LogLevel, Parallelism
@@ -163,6 +166,18 @@ class TestGetTypeHints:
163
166
  expected = {"ints": list[int]}
164
167
  assert hints == expected
165
168
 
169
+ @given(data=data())
170
+ def test_literal(self, *, data: DataObject) -> None:
171
+ @dataclass(kw_only=True, slots=True)
172
+ class Example:
173
+ truth: TrueOrFalseFutureLit
174
+
175
+ cls = data.draw(sampled_from([Example, DataClassFutureLiteral]))
176
+ localns = data.draw(just(locals()) | none())
177
+ hints = get_type_hints(cls, globalns=globals(), localns=localns)
178
+ expected = {"truth": TrueOrFalseFutureLit}
179
+ assert hints == expected
180
+
166
181
  def test_nested_local(self) -> None:
167
182
  @dataclass(kw_only=True, slots=True)
168
183
  class Outer:
@@ -200,19 +215,6 @@ class TestGetTypeHints:
200
215
  expected = {"inner": DataClassFutureNestedOuterFirstInner}
201
216
  assert hints == expected
202
217
 
203
- @given(data=data())
204
- def test_literal(self, *, data: DataObject) -> None:
205
- @dataclass(kw_only=True, slots=True)
206
- class Example:
207
- truth: Literal["true", "false"]
208
-
209
- cls = data.draw(sampled_from([Example, DataClassFutureLiteral]))
210
- globalns = data.draw(just(globals()) | none())
211
- localns = data.draw(just(locals()) | none())
212
- hints = get_type_hints(cls, globalns=globalns, localns=localns)
213
- expected = {"truth": Literal["true", "false"]}
214
- assert hints == expected
215
-
216
218
  @given(data=data())
217
219
  def test_none(self, *, data: DataObject) -> None:
218
220
  @dataclass(kw_only=True, slots=True)
@@ -278,6 +280,18 @@ class TestGetTypeHints:
278
280
  expected = {"timedelta": dt.timedelta}
279
281
  assert hints == expected
280
282
 
283
+ @given(data=data())
284
+ def test_type_literal(self, *, data: DataObject) -> None:
285
+ @dataclass(kw_only=True, slots=True)
286
+ class Example:
287
+ truth: TrueOrFalseFutureTypeLit
288
+
289
+ cls = data.draw(sampled_from([Example, DataClassFutureTypeLiteral]))
290
+ localns = data.draw(just(locals()) | none())
291
+ hints = get_type_hints(cls, globalns=globals(), localns=localns)
292
+ expected = {"truth": TrueOrFalseFutureTypeLit}
293
+ assert hints == expected
294
+
281
295
  @given(data=data())
282
296
  def test_uuid(self, *, data: DataObject) -> None:
283
297
  @dataclass(kw_only=True, slots=True)
@@ -1,4 +1,8 @@
1
1
  from dataclasses import dataclass
2
+ from typing import Literal
3
+
4
+ TrueOrFalseNoFutureLit = Literal["true", "false"]
5
+ type TrueOrFalseNoFutureTypeLit = Literal["true", "false"]
2
6
 
3
7
 
4
8
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
@@ -1,18 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import TYPE_CHECKING, override
4
+ from typing import TYPE_CHECKING, Literal, override
5
5
 
6
6
  if TYPE_CHECKING:
7
7
  import datetime as dt
8
8
  from pathlib import Path
9
- from typing import Literal
10
9
  from uuid import UUID
11
10
 
12
11
  from utilities.sentinel import Sentinel
13
12
 
14
13
 
15
- type TruthLit = Literal["true", "false"]
14
+ TrueOrFalseFutureLit = Literal["true", "false"]
15
+ type TrueOrFalseFutureTypeLit = Literal["true", "false"]
16
16
 
17
17
 
18
18
  @dataclass(order=True, kw_only=True)
@@ -71,12 +71,12 @@ class DataClassFutureListIntsDefault:
71
71
 
72
72
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
73
73
  class DataClassFutureLiteral:
74
- truth: Literal["true", "false"]
74
+ truth: TrueOrFalseFutureLit
75
75
 
76
76
 
77
77
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
78
78
  class DataClassFutureLiteralNullable:
79
- truth: Literal["true", "false"] | None = None
79
+ truth: TrueOrFalseFutureLit | None = None
80
80
 
81
81
 
82
82
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
@@ -131,12 +131,12 @@ class DataClassFutureTimeDelta:
131
131
 
132
132
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
133
133
  class DataClassFutureTypeLiteral:
134
- truth: TruthLit
134
+ truth: TrueOrFalseFutureTypeLit
135
135
 
136
136
 
137
137
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
138
138
  class DataClassFutureTypeLiteralNullable:
139
- truth: TruthLit | None = None
139
+ truth: TrueOrFalseFutureTypeLit | None = None
140
140
 
141
141
 
142
142
  @dataclass(order=True, unsafe_hash=True, kw_only=True)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.108.4"
3
+ __version__ = "0.109.0"
@@ -6,7 +6,7 @@ from dataclasses import dataclass
6
6
  from enum import Enum
7
7
  from pathlib import Path
8
8
  from types import NoneType
9
- from typing import Any, get_args, override
9
+ from typing import Any, override
10
10
 
11
11
  from utilities.datetime import is_subclass_date_not_datetime
12
12
  from utilities.enum import ParseEnumError, parse_enum
@@ -14,7 +14,7 @@ from utilities.functions import is_subclass_int_not_bool
14
14
  from utilities.iterables import one, one_str
15
15
  from utilities.sentinel import ParseSentinelError, Sentinel, parse_sentinel
16
16
  from utilities.text import ParseBoolError, ParseNoneError, parse_bool, parse_none
17
- from utilities.typing import is_literal_type, is_optional_type
17
+ from utilities.typing import get_args, is_literal_type, is_optional_type
18
18
  from utilities.version import ParseVersionError, Version, parse_version
19
19
 
20
20