dycw-utilities 0.131.14__tar.gz → 0.131.15__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 (223) hide show
  1. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/PKG-INFO +1 -1
  2. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/pyproject.toml +2 -2
  3. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_luigi.py +16 -31
  4. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/__init__.py +1 -1
  5. dycw_utilities-0.131.15/src/utilities/luigi.py +195 -0
  6. dycw_utilities-0.131.14/src/utilities/luigi.py +0 -228
  7. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/.gitignore +0 -0
  8. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/LICENSE +0 -0
  9. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/README.md +0 -0
  10. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_aiolimiter.py +0 -0
  36. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_altair.py +0 -0
  37. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_asyncio.py +0 -0
  38. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_asyncio_classes/__init__.py +0 -0
  39. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_asyncio_classes/loopers.py +0 -0
  40. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_asyncio_classes/redis.py +0 -0
  41. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_atomicwrites.py +0 -0
  42. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_atools.py +0 -0
  43. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_cachetools.py +0 -0
  44. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_click.py +0 -0
  45. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_concurrent.py +0 -0
  46. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_contextlib.py +0 -0
  47. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_contextvars.py +0 -0
  48. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_cryptography.py +0 -0
  49. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_cvxpy.py +0 -0
  50. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_dataclasses.py +0 -0
  51. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_datetime.py +0 -0
  52. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_enum.py +0 -0
  53. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_errors.py +0 -0
  54. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_eventkit.py +0 -0
  55. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_fastapi.py +0 -0
  56. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_fpdf2.py +0 -0
  57. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_functions.py +0 -0
  58. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_functools.py +0 -0
  59. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_getpass.py +0 -0
  60. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_git.py +0 -0
  61. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_hashlib.py +0 -0
  62. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_http.py +0 -0
  63. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_hypothesis.py +0 -0
  64. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_importlib.py +0 -0
  65. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_inflect.py +0 -0
  66. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_ipython.py +0 -0
  67. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_iterables.py +0 -0
  68. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_jupyter.py +0 -0
  69. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_libcst.py +0 -0
  70. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_lightweight_charts.py +0 -0
  71. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_logging.py +0 -0
  72. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_math.py +0 -0
  73. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_memory_profiler.py +0 -0
  74. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_modules.py +0 -0
  75. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_more_itertools.py +0 -0
  76. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_numpy.py +0 -0
  77. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_operator.py +0 -0
  78. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_optuna.py +0 -0
  79. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_orjson.py +0 -0
  80. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_os.py +0 -0
  81. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_parse.py +0 -0
  82. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pathlib.py +0 -0
  83. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_period.py +0 -0
  84. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pickle.py +0 -0
  85. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_platform.py +0 -0
  86. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_polars.py +0 -0
  87. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_polars_ols.py +0 -0
  88. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pottery.py +0 -0
  89. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_psutil.py +0 -0
  91. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pydantic.py +0 -0
  92. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pyrsistent.py +0 -0
  94. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_statsmodel.py +0 -0
  109. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_streamlit.py +0 -0
  110. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_string.py +0 -0
  111. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_tenacity.py +0 -0
  113. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_text.py +0 -0
  114. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_threading.py +0 -0
  115. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_timer.py +0 -0
  116. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_traceback.py +0 -0
  117. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_typed_settings.py +0 -0
  118. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_types.py +0 -0
  119. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_typing.py +0 -0
  120. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_typing_funcs/__init__.py +0 -0
  121. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_typing_funcs/no_future.py +0 -0
  122. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_typing_funcs/with_future.py +0 -0
  123. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_tzdata.py +0 -0
  124. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_tzlocal.py +0 -0
  125. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_uuid.py +0 -0
  126. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_version.py +0 -0
  127. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_warnings.py +0 -0
  128. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_whenever.py +0 -0
  129. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_whenever2.py +0 -0
  130. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_zipfile.py +0 -0
  131. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/tests/test_zoneinfo.py +0 -0
  132. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/aiolimiter.py +0 -0
  133. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/altair.py +0 -0
  134. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/asyncio.py +0 -0
  135. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/atomicwrites.py +0 -0
  136. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/atools.py +0 -0
  137. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/cachetools.py +0 -0
  138. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/click.py +0 -0
  139. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/concurrent.py +0 -0
  140. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/contextlib.py +0 -0
  141. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/contextvars.py +0 -0
  142. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/cryptography.py +0 -0
  143. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/cvxpy.py +0 -0
  144. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/dataclasses.py +0 -0
  145. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/datetime.py +0 -0
  146. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/enum.py +0 -0
  147. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/errors.py +0 -0
  148. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/eventkit.py +0 -0
  149. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/fastapi.py +0 -0
  150. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/fpdf2.py +0 -0
  151. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/functions.py +0 -0
  152. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/functools.py +0 -0
  153. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/getpass.py +0 -0
  154. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/git.py +0 -0
  155. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/hashlib.py +0 -0
  156. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/http.py +0 -0
  157. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/hypothesis.py +0 -0
  158. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/importlib.py +0 -0
  159. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/inflect.py +0 -0
  160. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/ipython.py +0 -0
  161. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/iterables.py +0 -0
  162. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/jupyter.py +0 -0
  163. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/libcst.py +0 -0
  164. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/lightweight_charts.py +0 -0
  165. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/logging.py +0 -0
  166. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/math.py +0 -0
  167. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/memory_profiler.py +0 -0
  168. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/modules.py +0 -0
  169. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/more_itertools.py +0 -0
  170. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/numpy.py +0 -0
  171. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/operator.py +0 -0
  172. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/optuna.py +0 -0
  173. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/orjson.py +0 -0
  174. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/os.py +0 -0
  175. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/parse.py +0 -0
  176. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pathlib.py +0 -0
  177. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/period.py +0 -0
  178. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pickle.py +0 -0
  179. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/platform.py +0 -0
  180. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/polars.py +0 -0
  181. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/polars_ols.py +0 -0
  182. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pottery.py +0 -0
  183. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pqdm.py +0 -0
  184. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/psutil.py +0 -0
  185. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/py.typed +0 -0
  186. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pydantic.py +0 -0
  187. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pyinstrument.py +0 -0
  188. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pyrsistent.py +0 -0
  189. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pytest.py +0 -0
  190. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/pytest_regressions.py +0 -0
  191. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/python_dotenv.py +0 -0
  192. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/random.py +0 -0
  193. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/re.py +0 -0
  194. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/redis.py +0 -0
  195. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/reprlib.py +0 -0
  196. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/scipy.py +0 -0
  197. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/sentinel.py +0 -0
  198. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/shelve.py +0 -0
  199. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/slack_sdk.py +0 -0
  200. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/socket.py +0 -0
  201. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/sqlalchemy.py +0 -0
  202. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/sqlalchemy_polars.py +0 -0
  203. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/statsmodels.py +0 -0
  204. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/streamlit.py +0 -0
  205. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/string.py +0 -0
  206. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/tempfile.py +0 -0
  207. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/tenacity.py +0 -0
  208. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/text.py +0 -0
  209. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/threading.py +0 -0
  210. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/timer.py +0 -0
  211. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/traceback.py +0 -0
  212. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/typed_settings.py +0 -0
  213. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/types.py +0 -0
  214. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/typing.py +0 -0
  215. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/tzdata.py +0 -0
  216. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/tzlocal.py +0 -0
  217. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/uuid.py +0 -0
  218. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/version.py +0 -0
  219. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/warnings.py +0 -0
  220. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/whenever.py +0 -0
  221. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/whenever2.py +0 -0
  222. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/zipfile.py +0 -0
  223. {dycw_utilities-0.131.14 → dycw_utilities-0.131.15}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.131.14
3
+ Version: 0.131.15
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -95,7 +95,7 @@ dependencies = [
95
95
  name = "dycw-utilities"
96
96
  readme = "README.md"
97
97
  requires-python = ">= 3.12"
98
- version = "0.131.14"
98
+ version = "0.131.15"
99
99
 
100
100
  [project.optional-dependencies]
101
101
  logging = [
@@ -122,7 +122,7 @@ test = [
122
122
  # bump-my-version
123
123
  [tool.bumpversion]
124
124
  allow_dirty = true
125
- current_version = "0.131.14"
125
+ current_version = "0.131.15"
126
126
 
127
127
  [[tool.bumpversion.files]]
128
128
  filename = "src/utilities/__init__.py"
@@ -1,28 +1,25 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
- from typing import TYPE_CHECKING, Any, cast, override
4
+ from typing import TYPE_CHECKING, Any, Literal, cast, override
5
5
 
6
6
  from hypothesis import given
7
- from hypothesis.strategies import DataObject, booleans, data, sampled_from, times
8
- from luigi import BoolParameter, Parameter, Task
7
+ from hypothesis.strategies import booleans
8
+ from luigi import BoolParameter, Task
9
+ from pytest import mark, param
9
10
 
10
- from utilities.hypothesis import namespace_mixins, temp_paths, zoned_datetimes
11
+ from utilities.hypothesis import namespace_mixins, temp_paths, zoned_datetimes_whenever
11
12
  from utilities.luigi import (
12
- DateHourParameter,
13
- DateMinuteParameter,
14
- DateSecondParameter,
15
13
  ExternalFile,
16
14
  ExternalTask,
17
15
  PathTarget,
18
- TimeParameter,
16
+ ZonedDateTimeParameter,
19
17
  _ExternalTaskDummyTarget,
20
18
  build,
21
19
  )
22
- from utilities.whenever import serialize_time, serialize_zoned_datetime
23
20
 
24
21
  if TYPE_CHECKING:
25
- import datetime as dt
22
+ from whenever import ZonedDateTime
26
23
 
27
24
 
28
25
  class TestBuild:
@@ -34,20 +31,17 @@ class TestBuild:
34
31
 
35
32
 
36
33
  class TestDateTimeParameter:
37
- @given(
38
- data=data(),
39
- param_cls=sampled_from([
40
- DateHourParameter,
41
- DateMinuteParameter,
42
- DateSecondParameter,
43
- ]),
44
- datetime=zoned_datetimes(),
45
- )
34
+ @given(datetime=zoned_datetimes_whenever())
35
+ @mark.parametrize("type_", [param("datetime"), param("str")])
46
36
  def test_main(
47
- self, *, data: DataObject, param_cls: type[Parameter], datetime: dt.datetime
37
+ self, *, datetime: ZonedDateTime, type_: Literal["datetime", "str"]
48
38
  ) -> None:
49
- param = param_cls()
50
- input_ = data.draw(sampled_from([datetime, serialize_zoned_datetime(datetime)]))
39
+ param = ZonedDateTimeParameter()
40
+ match type_:
41
+ case "datetime":
42
+ input_ = datetime
43
+ case "str":
44
+ input_ = datetime.format_common_iso()
51
45
  norm = param.normalize(input_)
52
46
  assert param.parse(param.serialize(norm)) == norm
53
47
 
@@ -90,12 +84,3 @@ class TestPathTarget:
90
84
  assert not target.exists()
91
85
  path.touch()
92
86
  assert target.exists()
93
-
94
-
95
- class TestTimeParameter:
96
- @given(data=data(), time=times())
97
- def test_main(self, *, data: DataObject, time: dt.time) -> None:
98
- param = TimeParameter()
99
- input_ = data.draw(sampled_from([time, serialize_time(time)]))
100
- norm = param.normalize(input_)
101
- assert param.parse(param.serialize(norm)) == time
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.131.14"
3
+ __version__ = "0.131.15"
@@ -0,0 +1,195 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from pathlib import Path
5
+ from typing import (
6
+ TYPE_CHECKING,
7
+ Any,
8
+ Literal,
9
+ TypeVar,
10
+ assert_never,
11
+ cast,
12
+ overload,
13
+ override,
14
+ )
15
+
16
+ import luigi
17
+ from luigi import Parameter, PathParameter, Target, Task
18
+ from luigi import build as _build
19
+ from luigi.parameter import ParameterVisibility, _no_value
20
+ from whenever import ZonedDateTime
21
+
22
+ if TYPE_CHECKING:
23
+ from collections.abc import Callable, Iterable
24
+
25
+ from luigi.execution_summary import LuigiRunResult
26
+
27
+ from utilities.types import DateTimeRoundUnit, LogLevel, PathLike, ZonedDateTimeLike
28
+
29
+
30
+ _T = TypeVar("_T")
31
+
32
+
33
+ # parameters
34
+
35
+
36
+ class ZonedDateTimeParameter(Parameter):
37
+ """A parameter which takes the value of a zoned datetime."""
38
+
39
+ _unit: DateTimeRoundUnit
40
+ _increment: int
41
+
42
+ @override
43
+ def __init__(
44
+ self,
45
+ default: Any = _no_value,
46
+ is_global: bool = False,
47
+ significant: bool = True,
48
+ description: str | None = None,
49
+ config_path: None = None,
50
+ positional: bool = True,
51
+ always_in_help: bool = False,
52
+ batch_method: Callable[[Iterable[_T]], _T] | None = None,
53
+ visibility: ParameterVisibility = ParameterVisibility.PUBLIC,
54
+ *,
55
+ unit: DateTimeRoundUnit = "second",
56
+ increment: int = 1,
57
+ ) -> None:
58
+ super().__init__(
59
+ default,
60
+ is_global,
61
+ significant,
62
+ description,
63
+ config_path,
64
+ positional,
65
+ always_in_help,
66
+ batch_method,
67
+ visibility,
68
+ )
69
+ self._unit = unit
70
+ self._increment = increment
71
+
72
+ @override
73
+ def normalize(self, x: ZonedDateTimeLike) -> ZonedDateTime:
74
+ match x:
75
+ case ZonedDateTime() as date_time:
76
+ ...
77
+ case str() as text:
78
+ date_time = ZonedDateTime.parse_common_iso(text)
79
+ case _ as never:
80
+ assert_never(never)
81
+ return date_time.round(self._unit, increment=self._increment, mode="floor")
82
+
83
+ @override
84
+ def parse(self, x: str) -> ZonedDateTime:
85
+ return ZonedDateTime.parse_common_iso(x)
86
+
87
+ @override
88
+ def serialize(self, x: ZonedDateTime) -> str:
89
+ return x.format_common_iso()
90
+
91
+
92
+ # targets
93
+
94
+
95
+ class PathTarget(Target):
96
+ """A local target whose `path` attribute is a Pathlib instance."""
97
+
98
+ def __init__(self, path: PathLike, /) -> None:
99
+ super().__init__()
100
+ self.path = Path(path)
101
+
102
+ @override
103
+ def exists(self) -> bool: # pyright: ignore[reportIncompatibleMethodOverride]
104
+ """Check if the target exists."""
105
+ return self.path.exists()
106
+
107
+
108
+ # tasks
109
+
110
+
111
+ class ExternalTask(ABC, luigi.ExternalTask):
112
+ """An external task with `exists()` defined here."""
113
+
114
+ @abstractmethod
115
+ def exists(self) -> bool:
116
+ """Predicate on which the external task is deemed to exist."""
117
+ msg = f"{self=}" # pragma: no cover
118
+ raise NotImplementedError(msg) # pragma: no cover
119
+
120
+ @override
121
+ def output(self) -> _ExternalTaskDummyTarget: # pyright: ignore[reportIncompatibleMethodOverride]
122
+ return _ExternalTaskDummyTarget(self)
123
+
124
+
125
+ class _ExternalTaskDummyTarget(Target):
126
+ """Dummy target for `ExternalTask`."""
127
+
128
+ def __init__(self, task: ExternalTask, /) -> None:
129
+ super().__init__()
130
+ self._task = task
131
+
132
+ @override
133
+ def exists(self) -> bool: # pyright: ignore[reportIncompatibleMethodOverride]
134
+ return self._task.exists()
135
+
136
+
137
+ class ExternalFile(ExternalTask):
138
+ """Await an external file on the local disk."""
139
+
140
+ path: Path = cast("Any", PathParameter())
141
+
142
+ @override
143
+ def exists(self) -> bool:
144
+ return self.path.exists()
145
+
146
+
147
+ # functions
148
+
149
+
150
+ @overload
151
+ def build(
152
+ task: Iterable[Task],
153
+ /,
154
+ *,
155
+ detailed_summary: Literal[False] = False,
156
+ local_scheduler: bool = False,
157
+ log_level: LogLevel | None = None,
158
+ workers: int | None = None,
159
+ ) -> bool: ...
160
+ @overload
161
+ def build(
162
+ task: Iterable[Task],
163
+ /,
164
+ *,
165
+ detailed_summary: Literal[True],
166
+ local_scheduler: bool = False,
167
+ log_level: LogLevel | None = None,
168
+ workers: int | None = None,
169
+ ) -> LuigiRunResult: ...
170
+ def build(
171
+ task: Iterable[Task],
172
+ /,
173
+ *,
174
+ detailed_summary: bool = False,
175
+ local_scheduler: bool = False,
176
+ log_level: LogLevel | None = None,
177
+ workers: int | None = None,
178
+ ) -> bool | LuigiRunResult:
179
+ """Build a set of tasks."""
180
+ return _build(
181
+ task,
182
+ detailed_summary=detailed_summary,
183
+ local_scheduler=local_scheduler,
184
+ **({} if log_level is None else {"log_level": log_level}),
185
+ **({} if workers is None else {"workers": workers}),
186
+ )
187
+
188
+
189
+ __all__ = [
190
+ "ExternalFile",
191
+ "ExternalTask",
192
+ "PathTarget",
193
+ "ZonedDateTimeParameter",
194
+ "build",
195
+ ]
@@ -1,228 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC, abstractmethod
4
- from pathlib import Path
5
- from typing import TYPE_CHECKING, Any, Literal, cast, overload, override
6
-
7
- import luigi
8
- from luigi import Parameter, PathParameter, Target, Task
9
- from luigi import build as _build
10
-
11
- from utilities.datetime import EPOCH_UTC
12
-
13
- if TYPE_CHECKING:
14
- import datetime as dt
15
- from collections.abc import Iterable
16
-
17
- from luigi.execution_summary import LuigiRunResult
18
-
19
- from utilities.types import LogLevel, MaybeStr, PathLike
20
-
21
-
22
- # parameters
23
-
24
-
25
- class DateHourParameter(luigi.DateHourParameter):
26
- """A parameter which takes the value of an hourly `dt.datetime`."""
27
-
28
- def __init__(self, interval: int = 1, **kwargs: Any) -> None:
29
- super().__init__(interval, EPOCH_UTC, **kwargs)
30
-
31
- @override
32
- def normalize(self, dt: MaybeStr[dt.datetime]) -> dt.datetime:
33
- from utilities.whenever import ensure_zoned_datetime
34
-
35
- return ensure_zoned_datetime(dt)
36
-
37
- @override
38
- def parse(self, s: str) -> dt.datetime:
39
- from utilities.whenever import parse_zoned_datetime
40
-
41
- return parse_zoned_datetime(s)
42
-
43
- @override
44
- def serialize(self, dt: dt.datetime) -> str:
45
- from utilities.whenever import serialize_zoned_datetime
46
-
47
- return serialize_zoned_datetime(dt)
48
-
49
-
50
- class DateMinuteParameter(luigi.DateMinuteParameter):
51
- """A parameter which takes the value of a minutely `dt.datetime`."""
52
-
53
- def __init__(self, interval: int = 1, **kwargs: Any) -> None:
54
- super().__init__(interval=interval, start=EPOCH_UTC, **kwargs)
55
-
56
- @override
57
- def normalize(self, dt: MaybeStr[dt.datetime]) -> dt.datetime:
58
- from utilities.whenever import ensure_zoned_datetime
59
-
60
- return ensure_zoned_datetime(dt)
61
-
62
- @override
63
- def parse(self, s: str) -> dt.datetime:
64
- from utilities.whenever import parse_zoned_datetime
65
-
66
- return parse_zoned_datetime(s)
67
-
68
- @override
69
- def serialize(self, dt: dt.datetime) -> str:
70
- from utilities.whenever import serialize_zoned_datetime
71
-
72
- return serialize_zoned_datetime(dt)
73
-
74
-
75
- class DateSecondParameter(luigi.DateSecondParameter):
76
- """A parameter which takes the value of a secondly `dt.datetime`."""
77
-
78
- def __init__(self, interval: int = 1, **kwargs: Any) -> None:
79
- super().__init__(interval, EPOCH_UTC, **kwargs)
80
-
81
- @override
82
- def normalize(self, dt: MaybeStr[dt.datetime]) -> dt.datetime:
83
- from utilities.whenever import ensure_zoned_datetime
84
-
85
- return ensure_zoned_datetime(dt)
86
-
87
- @override
88
- def parse(self, s: str) -> dt.datetime:
89
- from utilities.whenever import parse_zoned_datetime
90
-
91
- return parse_zoned_datetime(s)
92
-
93
- @override
94
- def serialize(self, dt: dt.datetime) -> str:
95
- from utilities.whenever import serialize_zoned_datetime
96
-
97
- return serialize_zoned_datetime(dt)
98
-
99
-
100
- class TimeParameter(Parameter):
101
- """A parameter which takes the value of a `dt.time`."""
102
-
103
- @override
104
- def normalize(self, x: MaybeStr[dt.time]) -> dt.time:
105
- from utilities.whenever import ensure_time
106
-
107
- return ensure_time(x)
108
-
109
- @override
110
- def parse(self, x: str) -> dt.time:
111
- from utilities.whenever import parse_time
112
-
113
- return parse_time(x)
114
-
115
- @override
116
- def serialize(self, x: dt.time) -> str:
117
- from utilities.whenever import serialize_time
118
-
119
- return serialize_time(x)
120
-
121
-
122
- # targets
123
-
124
-
125
- class PathTarget(Target):
126
- """A local target whose `path` attribute is a Pathlib instance."""
127
-
128
- def __init__(self, path: PathLike, /) -> None:
129
- super().__init__()
130
- self.path = Path(path)
131
-
132
- @override
133
- def exists(self) -> bool: # pyright: ignore[reportIncompatibleMethodOverride]
134
- """Check if the target exists."""
135
- return self.path.exists()
136
-
137
-
138
- # tasks
139
-
140
-
141
- class ExternalTask(ABC, luigi.ExternalTask):
142
- """An external task with `exists()` defined here."""
143
-
144
- @abstractmethod
145
- def exists(self) -> bool:
146
- """Predicate on which the external task is deemed to exist."""
147
- msg = f"{self=}" # pragma: no cover
148
- raise NotImplementedError(msg) # pragma: no cover
149
-
150
- @override
151
- def output(self) -> _ExternalTaskDummyTarget: # pyright: ignore[reportIncompatibleMethodOverride]
152
- return _ExternalTaskDummyTarget(self)
153
-
154
-
155
- class _ExternalTaskDummyTarget(Target):
156
- """Dummy target for `ExternalTask`."""
157
-
158
- def __init__(self, task: ExternalTask, /) -> None:
159
- super().__init__()
160
- self._task = task
161
-
162
- @override
163
- def exists(self) -> bool: # pyright: ignore[reportIncompatibleMethodOverride]
164
- return self._task.exists()
165
-
166
-
167
- class ExternalFile(ExternalTask):
168
- """Await an external file on the local disk."""
169
-
170
- path: Path = cast("Any", PathParameter())
171
-
172
- @override
173
- def exists(self) -> bool:
174
- return self.path.exists()
175
-
176
-
177
- # functions
178
-
179
-
180
- @overload
181
- def build(
182
- task: Iterable[Task],
183
- /,
184
- *,
185
- detailed_summary: Literal[False] = False,
186
- local_scheduler: bool = False,
187
- log_level: LogLevel | None = None,
188
- workers: int | None = None,
189
- ) -> bool: ...
190
- @overload
191
- def build(
192
- task: Iterable[Task],
193
- /,
194
- *,
195
- detailed_summary: Literal[True],
196
- local_scheduler: bool = False,
197
- log_level: LogLevel | None = None,
198
- workers: int | None = None,
199
- ) -> LuigiRunResult: ...
200
- def build(
201
- task: Iterable[Task],
202
- /,
203
- *,
204
- detailed_summary: bool = False,
205
- local_scheduler: bool = False,
206
- log_level: LogLevel | None = None,
207
- workers: int | None = None,
208
- ) -> bool | LuigiRunResult:
209
- """Build a set of tasks."""
210
- return _build(
211
- task,
212
- detailed_summary=detailed_summary,
213
- local_scheduler=local_scheduler,
214
- **({} if log_level is None else {"log_level": log_level}),
215
- **({} if workers is None else {"workers": workers}),
216
- )
217
-
218
-
219
- __all__ = [
220
- "DateHourParameter",
221
- "DateMinuteParameter",
222
- "DateSecondParameter",
223
- "ExternalFile",
224
- "ExternalTask",
225
- "PathTarget",
226
- "TimeParameter",
227
- "build",
228
- ]