datachain 0.32.1__tar.gz → 0.32.3__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.

Potentially problematic release.


This version of datachain might be problematic. Click here for more details.

Files changed (431) hide show
  1. {datachain-0.32.1 → datachain-0.32.3}/.pre-commit-config.yaml +1 -1
  2. {datachain-0.32.1 → datachain-0.32.3}/PKG-INFO +2 -2
  3. {datachain-0.32.1 → datachain-0.32.3}/docs/studio/webhooks.md +12 -1
  4. {datachain-0.32.1 → datachain-0.32.3}/pyproject.toml +1 -1
  5. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/metastore.py +16 -24
  6. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/dataset.py +2 -2
  7. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/parquet.py +20 -5
  8. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/storage.py +12 -6
  9. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/storage_pattern.py +50 -99
  10. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/file.py +14 -6
  11. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/namespaces.py +1 -1
  12. {datachain-0.32.1 → datachain-0.32.3}/src/datachain.egg-info/PKG-INFO +2 -2
  13. {datachain-0.32.1 → datachain-0.32.3}/src/datachain.egg-info/requires.txt +1 -1
  14. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_metastore.py +1 -1
  15. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_storage_pattern.py +61 -5
  16. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_audio.py +1 -1
  17. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_datachain.py +5 -5
  18. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_namespace.py +7 -0
  19. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_storage_pattern.py +88 -22
  20. {datachain-0.32.1 → datachain-0.32.3}/.cruft.json +0 -0
  21. {datachain-0.32.1 → datachain-0.32.3}/.gitattributes +0 -0
  22. {datachain-0.32.1 → datachain-0.32.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  23. {datachain-0.32.1 → datachain-0.32.3}/.github/ISSUE_TEMPLATE/empty_issue.md +0 -0
  24. {datachain-0.32.1 → datachain-0.32.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  25. {datachain-0.32.1 → datachain-0.32.3}/.github/codecov.yaml +0 -0
  26. {datachain-0.32.1 → datachain-0.32.3}/.github/dependabot.yml +0 -0
  27. {datachain-0.32.1 → datachain-0.32.3}/.github/workflows/benchmarks.yml +0 -0
  28. {datachain-0.32.1 → datachain-0.32.3}/.github/workflows/release.yml +0 -0
  29. {datachain-0.32.1 → datachain-0.32.3}/.github/workflows/tests-studio.yml +0 -0
  30. {datachain-0.32.1 → datachain-0.32.3}/.github/workflows/tests.yml +0 -0
  31. {datachain-0.32.1 → datachain-0.32.3}/.github/workflows/update-template.yaml +0 -0
  32. {datachain-0.32.1 → datachain-0.32.3}/.gitignore +0 -0
  33. {datachain-0.32.1 → datachain-0.32.3}/CODE_OF_CONDUCT.rst +0 -0
  34. {datachain-0.32.1 → datachain-0.32.3}/LICENSE +0 -0
  35. {datachain-0.32.1 → datachain-0.32.3}/README.rst +0 -0
  36. {datachain-0.32.1 → datachain-0.32.3}/docs/api_hooks.py +0 -0
  37. {datachain-0.32.1 → datachain-0.32.3}/docs/assets/captioned_cartoons.png +0 -0
  38. {datachain-0.32.1 → datachain-0.32.3}/docs/assets/datachain-white.svg +0 -0
  39. {datachain-0.32.1 → datachain-0.32.3}/docs/assets/datachain.svg +0 -0
  40. {datachain-0.32.1 → datachain-0.32.3}/docs/assets/webhook_dialog.png +0 -0
  41. {datachain-0.32.1 → datachain-0.32.3}/docs/assets/webhook_list.png +0 -0
  42. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/auth/login.md +0 -0
  43. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/auth/logout.md +0 -0
  44. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/auth/team.md +0 -0
  45. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/auth/token.md +0 -0
  46. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/index.md +0 -0
  47. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/job/cancel.md +0 -0
  48. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/job/clusters.md +0 -0
  49. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/job/logs.md +0 -0
  50. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/job/ls.md +0 -0
  51. {datachain-0.32.1 → datachain-0.32.3}/docs/commands/job/run.md +0 -0
  52. {datachain-0.32.1 → datachain-0.32.3}/docs/contributing.md +0 -0
  53. {datachain-0.32.1 → datachain-0.32.3}/docs/css/github-permalink-style.css +0 -0
  54. {datachain-0.32.1 → datachain-0.32.3}/docs/examples.md +0 -0
  55. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/db_migrations.md +0 -0
  56. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/delta.md +0 -0
  57. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/env.md +0 -0
  58. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/index.md +0 -0
  59. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/namespaces.md +0 -0
  60. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/processing.md +0 -0
  61. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/remotes.md +0 -0
  62. {datachain-0.32.1 → datachain-0.32.3}/docs/guide/retry.md +0 -0
  63. {datachain-0.32.1 → datachain-0.32.3}/docs/index.md +0 -0
  64. {datachain-0.32.1 → datachain-0.32.3}/docs/overrides/main.html +0 -0
  65. {datachain-0.32.1 → datachain-0.32.3}/docs/quick-start.md +0 -0
  66. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/arrowrow.md +0 -0
  67. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/bbox.md +0 -0
  68. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/file.md +0 -0
  69. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/imagefile.md +0 -0
  70. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/index.md +0 -0
  71. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/pose.md +0 -0
  72. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/segment.md +0 -0
  73. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/tarvfile.md +0 -0
  74. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/textfile.md +0 -0
  75. {datachain-0.32.1 → datachain-0.32.3}/docs/references/data-types/videofile.md +0 -0
  76. {datachain-0.32.1 → datachain-0.32.3}/docs/references/datachain.md +0 -0
  77. {datachain-0.32.1 → datachain-0.32.3}/docs/references/func.md +0 -0
  78. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/aggregate.md +0 -0
  79. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/array.md +0 -0
  80. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/conditional.md +0 -0
  81. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/numeric.md +0 -0
  82. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/path.md +0 -0
  83. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/random.md +0 -0
  84. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/string.md +0 -0
  85. {datachain-0.32.1 → datachain-0.32.3}/docs/references/functions/window.md +0 -0
  86. {datachain-0.32.1 → datachain-0.32.3}/docs/references/index.md +0 -0
  87. {datachain-0.32.1 → datachain-0.32.3}/docs/references/toolkit.md +0 -0
  88. {datachain-0.32.1 → datachain-0.32.3}/docs/references/torch.md +0 -0
  89. {datachain-0.32.1 → datachain-0.32.3}/docs/references/udf.md +0 -0
  90. {datachain-0.32.1 → datachain-0.32.3}/docs/studio/api/.gitkeep +0 -0
  91. {datachain-0.32.1 → datachain-0.32.3}/docs/templates/main.dot +0 -0
  92. {datachain-0.32.1 → datachain-0.32.3}/docs/templates/operation.dot +0 -0
  93. {datachain-0.32.1 → datachain-0.32.3}/docs/templates/responses.def +0 -0
  94. {datachain-0.32.1 → datachain-0.32.3}/docs/tutorials.md +0 -0
  95. {datachain-0.32.1 → datachain-0.32.3}/examples/computer_vision/iptc_exif_xmp_lib.py +0 -0
  96. {datachain-0.32.1 → datachain-0.32.3}/examples/computer_vision/llava2_image_desc_lib.py +0 -0
  97. {datachain-0.32.1 → datachain-0.32.3}/examples/computer_vision/openimage-detect.py +0 -0
  98. {datachain-0.32.1 → datachain-0.32.3}/examples/computer_vision/ultralytics-bbox.py +0 -0
  99. {datachain-0.32.1 → datachain-0.32.3}/examples/computer_vision/ultralytics-pose.py +0 -0
  100. {datachain-0.32.1 → datachain-0.32.3}/examples/computer_vision/ultralytics-segment.py +0 -0
  101. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/common_sql_functions.py +0 -0
  102. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/json-csv-reader.py +0 -0
  103. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/nested_datamodel.py +0 -0
  104. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/torch-loader.py +0 -0
  105. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/udfs/parallel.py +0 -0
  106. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/udfs/simple.py +0 -0
  107. {datachain-0.32.1 → datachain-0.32.3}/examples/get_started/udfs/stateful.py +0 -0
  108. {datachain-0.32.1 → datachain-0.32.3}/examples/incremental_processing/delta.py +0 -0
  109. {datachain-0.32.1 → datachain-0.32.3}/examples/incremental_processing/retry.py +0 -0
  110. {datachain-0.32.1 → datachain-0.32.3}/examples/incremental_processing/utils.py +0 -0
  111. {datachain-0.32.1 → datachain-0.32.3}/examples/llm_and_nlp/claude-query.py +0 -0
  112. {datachain-0.32.1 → datachain-0.32.3}/examples/llm_and_nlp/hf-dataset-llm-eval.py +0 -0
  113. {datachain-0.32.1 → datachain-0.32.3}/examples/multimodal/audio-to-text.py +0 -0
  114. {datachain-0.32.1 → datachain-0.32.3}/examples/multimodal/clip_inference.py +0 -0
  115. {datachain-0.32.1 → datachain-0.32.3}/examples/multimodal/hf_pipeline.py +0 -0
  116. {datachain-0.32.1 → datachain-0.32.3}/examples/multimodal/openai_image_desc_lib.py +0 -0
  117. {datachain-0.32.1 → datachain-0.32.3}/examples/multimodal/wds.py +0 -0
  118. {datachain-0.32.1 → datachain-0.32.3}/examples/multimodal/wds_filtered.py +0 -0
  119. {datachain-0.32.1 → datachain-0.32.3}/mkdocs.yml +0 -0
  120. {datachain-0.32.1 → datachain-0.32.3}/noxfile.py +0 -0
  121. {datachain-0.32.1 → datachain-0.32.3}/setup.cfg +0 -0
  122. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/__init__.py +0 -0
  123. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/__main__.py +0 -0
  124. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/asyn.py +0 -0
  125. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cache.py +0 -0
  126. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/catalog/__init__.py +0 -0
  127. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/catalog/catalog.py +0 -0
  128. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/catalog/datasource.py +0 -0
  129. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/catalog/loader.py +0 -0
  130. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/__init__.py +0 -0
  131. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/__init__.py +0 -0
  132. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/datasets.py +0 -0
  133. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/du.py +0 -0
  134. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/index.py +0 -0
  135. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/ls.py +0 -0
  136. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/misc.py +0 -0
  137. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/query.py +0 -0
  138. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/commands/show.py +0 -0
  139. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/parser/__init__.py +0 -0
  140. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/parser/job.py +0 -0
  141. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/parser/studio.py +0 -0
  142. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/parser/utils.py +0 -0
  143. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/cli/utils.py +0 -0
  144. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/__init__.py +0 -0
  145. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/azure.py +0 -0
  146. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/fileslice.py +0 -0
  147. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/fsspec.py +0 -0
  148. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/gcs.py +0 -0
  149. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/hf.py +0 -0
  150. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/local.py +0 -0
  151. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/client/s3.py +0 -0
  152. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/config.py +0 -0
  153. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/__init__.py +0 -0
  154. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/db_engine.py +0 -0
  155. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/job.py +0 -0
  156. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/schema.py +0 -0
  157. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/serializer.py +0 -0
  158. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/sqlite.py +0 -0
  159. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/data_storage/warehouse.py +0 -0
  160. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/delta.py +0 -0
  161. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/diff/__init__.py +0 -0
  162. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/error.py +0 -0
  163. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/fs/__init__.py +0 -0
  164. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/fs/reference.py +0 -0
  165. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/fs/utils.py +0 -0
  166. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/__init__.py +0 -0
  167. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/aggregate.py +0 -0
  168. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/array.py +0 -0
  169. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/base.py +0 -0
  170. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/conditional.py +0 -0
  171. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/func.py +0 -0
  172. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/numeric.py +0 -0
  173. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/path.py +0 -0
  174. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/random.py +0 -0
  175. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/string.py +0 -0
  176. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/func/window.py +0 -0
  177. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/job.py +0 -0
  178. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/__init__.py +0 -0
  179. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/arrow.py +0 -0
  180. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/audio.py +0 -0
  181. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/clip.py +0 -0
  182. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/convert/__init__.py +0 -0
  183. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/convert/flatten.py +0 -0
  184. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/convert/python_to_sql.py +0 -0
  185. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/convert/sql_to_python.py +0 -0
  186. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/convert/unflatten.py +0 -0
  187. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/convert/values_to_tuples.py +0 -0
  188. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/data_model.py +0 -0
  189. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dataset_info.py +0 -0
  190. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/__init__.py +0 -0
  191. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/csv.py +0 -0
  192. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/database.py +0 -0
  193. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/datachain.py +0 -0
  194. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/datasets.py +0 -0
  195. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/hf.py +0 -0
  196. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/json.py +0 -0
  197. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/listings.py +0 -0
  198. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/pandas.py +0 -0
  199. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/records.py +0 -0
  200. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/utils.py +0 -0
  201. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/dc/values.py +0 -0
  202. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/hf.py +0 -0
  203. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/image.py +0 -0
  204. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/listing.py +0 -0
  205. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/listing_info.py +0 -0
  206. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/meta_formats.py +0 -0
  207. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/model_store.py +0 -0
  208. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/projects.py +0 -0
  209. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/pytorch.py +0 -0
  210. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/settings.py +0 -0
  211. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/signal_schema.py +0 -0
  212. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/tar.py +0 -0
  213. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/text.py +0 -0
  214. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/udf.py +0 -0
  215. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/udf_signature.py +0 -0
  216. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/utils.py +0 -0
  217. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/video.py +0 -0
  218. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/webdataset.py +0 -0
  219. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/lib/webdataset_laion.py +0 -0
  220. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/listing.py +0 -0
  221. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/__init__.py +0 -0
  222. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/bbox.py +0 -0
  223. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/pose.py +0 -0
  224. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/segment.py +0 -0
  225. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/ultralytics/__init__.py +0 -0
  226. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/ultralytics/bbox.py +0 -0
  227. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/ultralytics/pose.py +0 -0
  228. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/ultralytics/segment.py +0 -0
  229. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/model/utils.py +0 -0
  230. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/namespace.py +0 -0
  231. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/node.py +0 -0
  232. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/nodes_fetcher.py +0 -0
  233. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/nodes_thread_pool.py +0 -0
  234. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/progress.py +0 -0
  235. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/project.py +0 -0
  236. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/py.typed +0 -0
  237. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/__init__.py +0 -0
  238. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/batch.py +0 -0
  239. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/dataset.py +0 -0
  240. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/dispatch.py +0 -0
  241. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/metrics.py +0 -0
  242. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/params.py +0 -0
  243. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/queue.py +0 -0
  244. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/schema.py +0 -0
  245. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/session.py +0 -0
  246. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/udf.py +0 -0
  247. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/query/utils.py +0 -0
  248. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/remote/__init__.py +0 -0
  249. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/remote/studio.py +0 -0
  250. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/script_meta.py +0 -0
  251. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/semver.py +0 -0
  252. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/__init__.py +0 -0
  253. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/default/__init__.py +0 -0
  254. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/default/base.py +0 -0
  255. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/__init__.py +0 -0
  256. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/aggregate.py +0 -0
  257. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/array.py +0 -0
  258. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/conditional.py +0 -0
  259. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/numeric.py +0 -0
  260. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/path.py +0 -0
  261. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/random.py +0 -0
  262. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/functions/string.py +0 -0
  263. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/postgresql_dialect.py +0 -0
  264. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/postgresql_types.py +0 -0
  265. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/selectable.py +0 -0
  266. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/sqlite/__init__.py +0 -0
  267. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/sqlite/base.py +0 -0
  268. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/sqlite/types.py +0 -0
  269. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/sqlite/vector.py +0 -0
  270. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/types.py +0 -0
  271. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/sql/utils.py +0 -0
  272. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/studio.py +0 -0
  273. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/telemetry.py +0 -0
  274. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/toolkit/__init__.py +0 -0
  275. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/toolkit/split.py +0 -0
  276. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/torch/__init__.py +0 -0
  277. {datachain-0.32.1 → datachain-0.32.3}/src/datachain/utils.py +0 -0
  278. {datachain-0.32.1 → datachain-0.32.3}/src/datachain.egg-info/SOURCES.txt +0 -0
  279. {datachain-0.32.1 → datachain-0.32.3}/src/datachain.egg-info/dependency_links.txt +0 -0
  280. {datachain-0.32.1 → datachain-0.32.3}/src/datachain.egg-info/entry_points.txt +0 -0
  281. {datachain-0.32.1 → datachain-0.32.3}/src/datachain.egg-info/top_level.txt +0 -0
  282. {datachain-0.32.1 → datachain-0.32.3}/tests/__init__.py +0 -0
  283. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/__init__.py +0 -0
  284. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/conftest.py +0 -0
  285. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/datasets/.dvc/.gitignore +0 -0
  286. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/datasets/.dvc/config +0 -0
  287. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/datasets/.gitignore +0 -0
  288. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/datasets/laion-tiny.npz.dvc +0 -0
  289. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/test_datachain.py +0 -0
  290. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/test_ls.py +0 -0
  291. {datachain-0.32.1 → datachain-0.32.3}/tests/benchmarks/test_version.py +0 -0
  292. {datachain-0.32.1 → datachain-0.32.3}/tests/conftest.py +0 -0
  293. {datachain-0.32.1 → datachain-0.32.3}/tests/data.py +0 -0
  294. {datachain-0.32.1 → datachain-0.32.3}/tests/examples/__init__.py +0 -0
  295. {datachain-0.32.1 → datachain-0.32.3}/tests/examples/test_examples.py +0 -0
  296. {datachain-0.32.1 → datachain-0.32.3}/tests/examples/test_wds_e2e.py +0 -0
  297. {datachain-0.32.1 → datachain-0.32.3}/tests/examples/wds_data.py +0 -0
  298. {datachain-0.32.1 → datachain-0.32.3}/tests/func/__init__.py +0 -0
  299. {datachain-0.32.1 → datachain-0.32.3}/tests/func/data/Big_Buck_Bunny_360_10s_1MB.mp4 +0 -0
  300. {datachain-0.32.1 → datachain-0.32.3}/tests/func/data/lena.jpg +0 -0
  301. {datachain-0.32.1 → datachain-0.32.3}/tests/func/fake-service-account-credentials.json +0 -0
  302. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/__init__.py +0 -0
  303. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_aggregate.py +0 -0
  304. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_array.py +0 -0
  305. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_conditional.py +0 -0
  306. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_numeric.py +0 -0
  307. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_path.py +0 -0
  308. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_random.py +0 -0
  309. {datachain-0.32.1 → datachain-0.32.3}/tests/func/functions/test_string.py +0 -0
  310. {datachain-0.32.1 → datachain-0.32.3}/tests/func/model/__init__.py +0 -0
  311. {datachain-0.32.1 → datachain-0.32.3}/tests/func/model/data/running-mask0.png +0 -0
  312. {datachain-0.32.1 → datachain-0.32.3}/tests/func/model/data/running-mask1.png +0 -0
  313. {datachain-0.32.1 → datachain-0.32.3}/tests/func/model/data/running.jpg +0 -0
  314. {datachain-0.32.1 → datachain-0.32.3}/tests/func/model/data/ships.jpg +0 -0
  315. {datachain-0.32.1 → datachain-0.32.3}/tests/func/model/test_yolo.py +0 -0
  316. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_audio.py +0 -0
  317. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_batching.py +0 -0
  318. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_catalog.py +0 -0
  319. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_client.py +0 -0
  320. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_cloud_transfer.py +0 -0
  321. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_data_storage.py +0 -0
  322. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_datachain.py +0 -0
  323. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_datachain_merge.py +0 -0
  324. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_dataset_query.py +0 -0
  325. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_datasets.py +0 -0
  326. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_delta.py +0 -0
  327. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_feature_pickling.py +0 -0
  328. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_file.py +0 -0
  329. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_hf.py +0 -0
  330. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_hidden_field.py +0 -0
  331. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_image.py +0 -0
  332. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_listing.py +0 -0
  333. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_ls.py +0 -0
  334. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_meta_formats.py +0 -0
  335. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_metrics.py +0 -0
  336. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_mutate.py +0 -0
  337. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_pull.py +0 -0
  338. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_pytorch.py +0 -0
  339. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_query.py +0 -0
  340. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_read_database.py +0 -0
  341. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_read_dataset_remote.py +0 -0
  342. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_read_dataset_version_specifiers.py +0 -0
  343. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_retry.py +0 -0
  344. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_session.py +0 -0
  345. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_studio_datetime_parsing.py +0 -0
  346. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_to_database.py +0 -0
  347. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_toolkit.py +0 -0
  348. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_video.py +0 -0
  349. {datachain-0.32.1 → datachain-0.32.3}/tests/func/test_warehouse.py +0 -0
  350. {datachain-0.32.1 → datachain-0.32.3}/tests/scripts/feature_class.py +0 -0
  351. {datachain-0.32.1 → datachain-0.32.3}/tests/scripts/feature_class_exception.py +0 -0
  352. {datachain-0.32.1 → datachain-0.32.3}/tests/scripts/feature_class_parallel.py +0 -0
  353. {datachain-0.32.1 → datachain-0.32.3}/tests/scripts/feature_class_parallel_data_model.py +0 -0
  354. {datachain-0.32.1 → datachain-0.32.3}/tests/scripts/name_len_slow.py +0 -0
  355. {datachain-0.32.1 → datachain-0.32.3}/tests/test_atomicity.py +0 -0
  356. {datachain-0.32.1 → datachain-0.32.3}/tests/test_cli_e2e.py +0 -0
  357. {datachain-0.32.1 → datachain-0.32.3}/tests/test_cli_studio.py +0 -0
  358. {datachain-0.32.1 → datachain-0.32.3}/tests/test_import_time.py +0 -0
  359. {datachain-0.32.1 → datachain-0.32.3}/tests/test_query_e2e.py +0 -0
  360. {datachain-0.32.1 → datachain-0.32.3}/tests/test_telemetry.py +0 -0
  361. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/__init__.py +0 -0
  362. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/__init__.py +0 -0
  363. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/conftest.py +0 -0
  364. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_arrow.py +0 -0
  365. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_clip.py +0 -0
  366. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_datachain_bootstrap.py +0 -0
  367. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_datachain_merge.py +0 -0
  368. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_diff.py +0 -0
  369. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_feature.py +0 -0
  370. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_feature_utils.py +0 -0
  371. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_file.py +0 -0
  372. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_hf.py +0 -0
  373. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_image.py +0 -0
  374. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_listing_info.py +0 -0
  375. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_partition_by.py +0 -0
  376. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_project.py +0 -0
  377. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_python_to_sql.py +0 -0
  378. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_schema.py +0 -0
  379. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_settings.py +0 -0
  380. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_signal_schema.py +0 -0
  381. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_sql_to_python.py +0 -0
  382. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_text.py +0 -0
  383. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_udf.py +0 -0
  384. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_udf_signature.py +0 -0
  385. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_utils.py +0 -0
  386. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/lib/test_webdataset.py +0 -0
  387. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/model/__init__.py +0 -0
  388. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/model/test_bbox.py +0 -0
  389. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/model/test_pose.py +0 -0
  390. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/model/test_segment.py +0 -0
  391. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/model/test_utils.py +0 -0
  392. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/__init__.py +0 -0
  393. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/sqlite/__init__.py +0 -0
  394. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/sqlite/test_types.py +0 -0
  395. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/sqlite/test_utils.py +0 -0
  396. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/test_array.py +0 -0
  397. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/test_conditional.py +0 -0
  398. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/test_path.py +0 -0
  399. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/test_random.py +0 -0
  400. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/test_selectable.py +0 -0
  401. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/sql/test_string.py +0 -0
  402. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_asyn.py +0 -0
  403. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_cache.py +0 -0
  404. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_catalog.py +0 -0
  405. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_catalog_loader.py +0 -0
  406. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_cli_datasets.py +0 -0
  407. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_cli_parsing.py +0 -0
  408. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_client.py +0 -0
  409. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_client_gcs.py +0 -0
  410. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_client_s3.py +0 -0
  411. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_config.py +0 -0
  412. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_data_storage.py +0 -0
  413. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_database_engine.py +0 -0
  414. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_dataset.py +0 -0
  415. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_dispatch.py +0 -0
  416. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_fileslice.py +0 -0
  417. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_func.py +0 -0
  418. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_listing.py +0 -0
  419. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_metastore.py +0 -0
  420. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_module_exports.py +0 -0
  421. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_pytorch.py +0 -0
  422. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_query.py +0 -0
  423. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_query_metrics.py +0 -0
  424. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_query_params.py +0 -0
  425. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_script_meta.py +0 -0
  426. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_semver.py +0 -0
  427. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_serializer.py +0 -0
  428. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_session.py +0 -0
  429. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_utils.py +0 -0
  430. {datachain-0.32.1 → datachain-0.32.3}/tests/unit/test_warehouse.py +0 -0
  431. {datachain-0.32.1 → datachain-0.32.3}/tests/utils.py +0 -0
@@ -24,7 +24,7 @@ repos:
24
24
  - id: trailing-whitespace
25
25
  exclude: '^LICENSES/'
26
26
  - repo: https://github.com/astral-sh/ruff-pre-commit
27
- rev: 'v0.12.12'
27
+ rev: 'v0.13.0'
28
28
  hooks:
29
29
  - id: ruff
30
30
  args: [--fix, --exit-non-zero-on-fix]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datachain
3
- Version: 0.32.1
3
+ Version: 0.32.3
4
4
  Summary: Wrangle unstructured AI data at scale
5
5
  Author-email: Dmitry Petrov <support@dvc.org>
6
6
  License-Expression: Apache-2.0
@@ -102,7 +102,7 @@ Requires-Dist: scipy; extra == "tests"
102
102
  Requires-Dist: ultralytics; extra == "tests"
103
103
  Provides-Extra: dev
104
104
  Requires-Dist: datachain[docs,tests]; extra == "dev"
105
- Requires-Dist: mypy==1.17.0; extra == "dev"
105
+ Requires-Dist: mypy==1.18.1; extra == "dev"
106
106
  Requires-Dist: types-python-dateutil; extra == "dev"
107
107
  Requires-Dist: types-dateparser; extra == "dev"
108
108
  Requires-Dist: types-pytz; extra == "dev"
@@ -28,12 +28,14 @@ Payload:
28
28
  "id": "da59df47-d121-4eb6-aa76-dc452755544e",
29
29
  "status": "COMPLETE",
30
30
  "error_message": "",
31
+ "name": "job_query.py",
31
32
  "created_at": "2021-07-27T16:02:08.070557",
32
33
  "updated_at": "2021-07-27T16:22:08.070557",
33
34
  "finished_at": "2021-07-27T16:22:08.070557",
34
35
  "url": "https://studio.datachain.ai/team/TeamName/datasets/jobs/da59df47-d121-4eb6-aa76-dc452755544e"
35
36
  },
36
37
  "timestamp": "2021-07-27T16:22:08.070557",
38
+ "text": "Job job_query.py (da59df47-d121-4eb6-aa76-dc452755544e) changed its status to COMPLETE"
37
39
  }
38
40
  ```
39
41
 
@@ -45,7 +47,8 @@ Header: `http-x-datachain-event`: `PING`.
45
47
  Payload:
46
48
  ```json
47
49
  {
48
- "action": "PING"
50
+ "action": "PING",
51
+ "message": "Webhook connection test successful"
49
52
  }
50
53
  ```
51
54
 
@@ -253,6 +256,14 @@ else:
253
256
  print("Warning: No signature header found")
254
257
  ```
255
258
 
259
+ ## Slack Integration
260
+
261
+ You can use this webhook feature to send a message to slack as well. To integrate slack with Studio,
262
+
263
+ 1. Using the guide as described in [Slack documentation](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks/) , create an incoming webhook and copy the webhook address in the following format `https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX` .
264
+ 2. Use the address to create a webhook in Studio as described [above](#creating-webhooks)
265
+ 3. You should now be able to view the message in Slack channel connected.
266
+
256
267
  ## Best practices for using Webhooks
257
268
 
258
269
  1. You should only subscribe to the webhook events that you need. This will reduce the amount of work your server needs to do.
@@ -119,7 +119,7 @@ tests = [
119
119
  ]
120
120
  dev = [
121
121
  "datachain[docs,tests]",
122
- "mypy==1.17.0",
122
+ "mypy==1.18.1",
123
123
  "types-python-dateutil",
124
124
  "types-dateparser",
125
125
  "types-pytz",
@@ -689,9 +689,6 @@ class AbstractDBMetastore(AbstractMetastore):
689
689
  return self._projects.select()
690
690
  return select(*columns)
691
691
 
692
- def _projects_update(self) -> "Update":
693
- return self._projects.update()
694
-
695
692
  def _projects_delete(self) -> "Delete":
696
693
  return self._projects.delete()
697
694
 
@@ -839,6 +836,16 @@ class AbstractDBMetastore(AbstractMetastore):
839
836
 
840
837
  return self.get_project(name, namespace.name)
841
838
 
839
+ def _projects_base_query(self) -> "Select":
840
+ n = self._namespaces
841
+ p = self._projects
842
+
843
+ query = self._projects_select(
844
+ *(getattr(n.c, f) for f in self._namespaces_fields),
845
+ *(getattr(p.c, f) for f in self._projects_fields),
846
+ )
847
+ return query.select_from(n.join(p, n.c.id == p.c.namespace_id))
848
+
842
849
  def get_project(
843
850
  self, name: str, namespace_name: str, create: bool = False, conn=None
844
851
  ) -> Project:
@@ -854,11 +861,7 @@ class AbstractDBMetastore(AbstractMetastore):
854
861
  create = True
855
862
  validate = False
856
863
 
857
- query = self._projects_select(
858
- *(getattr(n.c, f) for f in self._namespaces_fields),
859
- *(getattr(p.c, f) for f in self._projects_fields),
860
- )
861
- query = query.select_from(n.join(p, n.c.id == p.c.namespace_id)).where(
864
+ query = self._projects_base_query().where(
862
865
  p.c.name == name, n.c.name == namespace_name
863
866
  )
864
867
 
@@ -873,16 +876,9 @@ class AbstractDBMetastore(AbstractMetastore):
873
876
 
874
877
  def get_project_by_id(self, project_id: int, conn=None) -> Project:
875
878
  """Gets a single project by id"""
876
- n = self._namespaces
877
879
  p = self._projects
878
880
 
879
- query = self._projects_select(
880
- *(getattr(n.c, f) for f in self._namespaces_fields),
881
- *(getattr(p.c, f) for f in self._projects_fields),
882
- )
883
- query = query.select_from(n.join(p, n.c.id == p.c.namespace_id)).where(
884
- p.c.id == project_id
885
- )
881
+ query = self._projects_base_query().where(p.c.id == project_id)
886
882
 
887
883
  rows = list(self.db.execute(query, conn=conn))
888
884
  if not rows:
@@ -891,7 +887,8 @@ class AbstractDBMetastore(AbstractMetastore):
891
887
 
892
888
  def count_projects(self, namespace_id: Optional[int] = None) -> int:
893
889
  p = self._projects
894
- query = self._projects_select()
890
+
891
+ query = self._projects_base_query()
895
892
  if namespace_id:
896
893
  query = query.where(p.c.namespace_id == namespace_id)
897
894
 
@@ -917,17 +914,12 @@ class AbstractDBMetastore(AbstractMetastore):
917
914
  """
918
915
  Gets a list of projects inside some namespace, or in all namespaces
919
916
  """
920
- n = self._namespaces
921
917
  p = self._projects
922
918
 
923
- query = self._projects_select(
924
- *(getattr(n.c, f) for f in self._namespaces_fields),
925
- *(getattr(p.c, f) for f in self._projects_fields),
926
- )
927
- query = query.select_from(n.join(p, n.c.id == p.c.namespace_id))
919
+ query = self._projects_base_query()
928
920
 
929
921
  if namespace_id:
930
- query = query.where(n.c.id == namespace_id)
922
+ query = query.where(p.c.namespace_id == namespace_id)
931
923
 
932
924
  rows = list(self.db.execute(query, conn=conn))
933
925
 
@@ -619,7 +619,7 @@ class DatasetRecord:
619
619
  if not self.versions:
620
620
  return "1.0.0"
621
621
 
622
- major, minor, patch = semver.parse(self.latest_version)
622
+ major, _, _ = semver.parse(self.latest_version)
623
623
  return semver.create(major + 1, 0, 0)
624
624
 
625
625
  @property
@@ -630,7 +630,7 @@ class DatasetRecord:
630
630
  if not self.versions:
631
631
  return "1.0.0"
632
632
 
633
- major, minor, patch = semver.parse(self.latest_version)
633
+ major, minor, _ = semver.parse(self.latest_version)
634
634
  return semver.create(major, minor + 1, 0)
635
635
 
636
636
  @property
@@ -26,8 +26,14 @@ def read_parquet(
26
26
  """Generate chain from parquet files.
27
27
 
28
28
  Parameters:
29
- path: Storage URI with directory. URI must start with storage prefix such
30
- as `s3://`, `gs://`, `az://` or "file:///".
29
+ path: Storage path(s) or URI(s). Can be a local path or start with a
30
+ storage prefix like `s3://`, `gs://`, `az://`, `hf://` or "file:///".
31
+ Supports glob patterns:
32
+ - `*` : wildcard
33
+ - `**` : recursive wildcard
34
+ - `?` : single character
35
+ - `{a,b}` : brace expansion list
36
+ - `{1..9}` : brace numeric or alphabetic range
31
37
  partitioning: Any pyarrow partitioning schema.
32
38
  output: Dictionary defining column names and their corresponding types.
33
39
  column: Created column name.
@@ -43,10 +49,19 @@ def read_parquet(
43
49
  dc.read_parquet("s3://mybucket/file.parquet")
44
50
  ```
45
51
 
46
- Reading a partitioned dataset from a directory:
52
+ All files from a directory:
47
53
  ```py
48
- import datachain as dc
49
- dc.read_parquet("s3://mybucket/dir")
54
+ dc.read_parquet("s3://mybucket/dir/")
55
+ ```
56
+
57
+ Only parquet files from a directory, and all it's subdirectories:
58
+ ```py
59
+ dc.read_parquet("s3://mybucket/dir/**/*.parquet")
60
+ ```
61
+
62
+ Using filename patterns - numeric, list, starting with zeros:
63
+ ```py
64
+ dc.read_parquet("s3://mybucket/202{1..4}/{yellow,green}-{01..12}.parquet")
50
65
  ```
51
66
  """
52
67
  from .storage import read_storage
@@ -51,7 +51,8 @@ def read_storage(
51
51
  - `*` : wildcard
52
52
  - `**` : recursive wildcard
53
53
  - `?` : single character
54
- - `{a,b}` : brace expansion
54
+ - `{a,b}` : brace expansion list
55
+ - `{1..9}` : brace numeric or alphabetic range
55
56
  type: read file as "binary", "text", or "image" data. Default is "binary".
56
57
  recursive: search recursively for the given path.
57
58
  column: Column name that will contain File objects. Default is "file".
@@ -88,27 +89,32 @@ def read_storage(
88
89
  Simple call from s3:
89
90
  ```python
90
91
  import datachain as dc
91
- chain = dc.read_storage("s3://my-bucket/my-dir")
92
+ dc.read_storage("s3://my-bucket/my-dir")
92
93
  ```
93
94
 
94
95
  Match all .json files recursively using glob pattern
95
96
  ```py
96
- chain = dc.read_storage("gs://bucket/meta/**/*.json")
97
+ dc.read_storage("gs://bucket/meta/**/*.json")
97
98
  ```
98
99
 
99
100
  Match image file extensions for directories with pattern
100
101
  ```py
101
- chain = dc.read_storage("s3://bucket/202?/**/*.{jpg,jpeg,png}")
102
+ dc.read_storage("s3://bucket/202?/**/*.{jpg,jpeg,png}")
103
+ ```
104
+
105
+ By ranges in filenames:
106
+ ```py
107
+ dc.read_storage("s3://bucket/202{1..4}/**/*.{jpg,jpeg,png}")
102
108
  ```
103
109
 
104
110
  Multiple URIs:
105
111
  ```python
106
- chain = dc.read_storage(["s3://my-bkt/dir1", "s3://bucket2/dir2/dir3"])
112
+ dc.read_storage(["s3://my-bkt/dir1", "s3://bucket2/dir2/dir3"])
107
113
  ```
108
114
 
109
115
  With AWS S3-compatible storage:
110
116
  ```python
111
- chain = dc.read_storage(
117
+ dc.read_storage(
112
118
  "s3://my-bucket/my-dir",
113
119
  client_config = {"aws_endpoint_url": "<minio-endpoint-url>"}
114
120
  )
@@ -12,61 +12,37 @@ def validate_cloud_bucket_name(uri: str) -> None:
12
12
  """
13
13
  Validate that cloud storage bucket names don't contain glob patterns.
14
14
 
15
- Args:
16
- uri: URI to validate
17
-
18
15
  Raises:
19
16
  ValueError: If a cloud storage bucket name contains glob patterns
20
17
  """
21
18
  if not is_cloud_uri(uri):
22
19
  return
23
20
 
24
- # Extract bucket name (everything between :// and first /)
25
21
  if "://" in uri:
26
22
  scheme_end = uri.index("://") + 3
27
23
  path_part = uri[scheme_end:]
28
24
 
29
- # Get the bucket name (first segment)
30
25
  if "/" in path_part:
31
26
  bucket_name = path_part.split("/")[0]
32
27
  else:
33
28
  bucket_name = path_part
34
29
 
35
- # Check if bucket name contains glob patterns
36
30
  glob_chars = ["*", "?", "[", "]", "{", "}"]
37
31
  if any(char in bucket_name for char in glob_chars):
38
32
  raise ValueError(f"Glob patterns in bucket names are not supported: {uri}")
39
33
 
40
34
 
41
35
  def split_uri_pattern(uri: str) -> tuple[str, Union[str, None]]:
42
- """
43
- Split a URI into base path and glob pattern.
44
-
45
- Args:
46
- uri: URI that may contain glob patterns (*, **, ?, {})
47
-
48
- Returns:
49
- Tuple of (base_uri, pattern) where pattern is None if no glob pattern found
50
-
51
- Examples:
52
- "s3://bucket/dir/*.mp3" -> ("s3://bucket/dir", "*.mp3")
53
- "s3://bucket/**/*.mp3" -> ("s3://bucket", "**/*.mp3")
54
- "s3://bucket/dir" -> ("s3://bucket/dir", None)
55
- """
36
+ """Split a URI into base path and glob pattern."""
56
37
  if not any(char in uri for char in ["*", "?", "[", "{", "}"]):
57
38
  return uri, None
58
39
 
59
- # Handle different URI schemes
60
40
  if "://" in uri:
61
- # Split into scheme and path
62
41
  scheme_end = uri.index("://") + 3
63
42
  scheme_part = uri[:scheme_end]
64
43
  path_part = uri[scheme_end:]
65
-
66
- # Find where the glob pattern starts
67
44
  path_segments = path_part.split("/")
68
45
 
69
- # Find first segment with glob pattern
70
46
  pattern_start_idx = None
71
47
  for i, segment in enumerate(path_segments):
72
48
  # Check for glob patterns including brace expansion
@@ -77,9 +53,7 @@ def split_uri_pattern(uri: str) -> tuple[str, Union[str, None]]:
77
53
  if pattern_start_idx is None:
78
54
  return uri, None
79
55
 
80
- # Split into base and pattern
81
56
  if pattern_start_idx == 0:
82
- # Pattern at root of bucket
83
57
  base = scheme_part + path_segments[0]
84
58
  pattern = "/".join(path_segments[1:]) if len(path_segments) > 1 else "*"
85
59
  else:
@@ -87,13 +61,11 @@ def split_uri_pattern(uri: str) -> tuple[str, Union[str, None]]:
87
61
  pattern = "/".join(path_segments[pattern_start_idx:])
88
62
 
89
63
  return base, pattern
90
- # Local path
64
+
91
65
  path_segments = uri.split("/")
92
66
 
93
- # Find first segment with glob pattern
94
67
  pattern_start_idx = None
95
68
  for i, segment in enumerate(path_segments):
96
- # Check for glob patterns including brace expansion
97
69
  if glob.has_magic(segment) or "{" in segment:
98
70
  pattern_start_idx = i
99
71
  break
@@ -101,7 +73,6 @@ def split_uri_pattern(uri: str) -> tuple[str, Union[str, None]]:
101
73
  if pattern_start_idx is None:
102
74
  return uri, None
103
75
 
104
- # Split into base and pattern
105
76
  base = "/".join(path_segments[:pattern_start_idx]) if pattern_start_idx > 0 else "/"
106
77
  pattern = "/".join(path_segments[pattern_start_idx:])
107
78
 
@@ -109,51 +80,30 @@ def split_uri_pattern(uri: str) -> tuple[str, Union[str, None]]:
109
80
 
110
81
 
111
82
  def should_use_recursion(pattern: str, user_recursive: bool) -> bool:
112
- """
113
- Determine if we should use recursive listing based on the pattern.
114
-
115
- Args:
116
- pattern: The glob pattern extracted from URI
117
- user_recursive: User's recursive preference
118
-
119
- Returns:
120
- True if recursive listing should be used
121
-
122
- Examples:
123
- "*" -> False (single level only)
124
- "*.mp3" -> False (single level only)
125
- "**/*.mp3" -> True (globstar requires recursion)
126
- "dir/*/file.txt" -> True (multi-level pattern)
127
- """
128
83
  if not user_recursive:
129
- # If user explicitly wants non-recursive, respect that
130
84
  return False
131
85
 
132
- # If pattern contains globstar, definitely need recursion
133
86
  if "**" in pattern:
134
87
  return True
135
88
 
136
- # If pattern contains path separators, it needs recursion
137
- # Single-level patterns like "*", "*.txt", "file?" should not be recursive
138
89
  return "/" in pattern
139
90
 
140
91
 
141
92
  def expand_brace_pattern(pattern: str) -> list[str]:
142
93
  """
143
- Recursively expand brace patterns like *.{mp3,wav} into multiple glob patterns.
144
- Handles nested and multiple brace patterns.
145
-
146
- Args:
147
- pattern: Pattern that may contain brace expansion
148
-
149
- Returns:
150
- List of expanded patterns
94
+ Recursively expand brace patterns into multiple glob patterns.
95
+ Supports:
96
+ - Comma-separated lists: *.{mp3,wav}
97
+ - Numeric ranges: file{1..10}
98
+ - Zero-padded numeric ranges: file{01..10}
99
+ - Character ranges: file{a..z}
151
100
 
152
101
  Examples:
153
102
  "*.{mp3,wav}" -> ["*.mp3", "*.wav"]
103
+ "file{1..3}" -> ["file1", "file2", "file3"]
104
+ "file{01..03}" -> ["file01", "file02", "file03"]
105
+ "file{a..c}" -> ["filea", "fileb", "filec"]
154
106
  "{a,b}/{c,d}" -> ["a/c", "a/d", "b/c", "b/d"]
155
- "*.txt" -> ["*.txt"]
156
- "{{a,b}}" -> ["{a}", "{b}"] # Handle double braces
157
107
  """
158
108
  if "{" not in pattern or "}" not in pattern:
159
109
  return [pattern]
@@ -162,11 +112,9 @@ def expand_brace_pattern(pattern: str) -> list[str]:
162
112
 
163
113
 
164
114
  def _expand_single_braces(pattern: str) -> list[str]:
165
- """Helper to expand single-level braces."""
166
115
  if "{" not in pattern or "}" not in pattern:
167
116
  return [pattern]
168
117
 
169
- # Find the first complete brace pattern
170
118
  start = pattern.index("{")
171
119
  end = start
172
120
  depth = 0
@@ -184,46 +132,66 @@ def _expand_single_braces(pattern: str) -> list[str]:
184
132
 
185
133
  prefix = pattern[:start]
186
134
  suffix = pattern[end + 1 :]
187
- options = pattern[start + 1 : end].split(",")
135
+ brace_content = pattern[start + 1 : end]
136
+
137
+ if ".." in brace_content:
138
+ options = _expand_range(brace_content)
139
+ else:
140
+ options = [opt.strip() for opt in brace_content.split(",")]
188
141
 
189
- # Generate all combinations and recursively expand
190
142
  expanded = []
191
143
  for option in options:
192
- combined = prefix + option.strip() + suffix
193
- # Recursively expand any remaining braces
144
+ combined = prefix + option + suffix
194
145
  expanded.extend(_expand_single_braces(combined))
195
146
 
196
147
  return expanded
197
148
 
198
149
 
199
- def convert_globstar_to_glob(filter_pattern: str) -> str:
200
- """Convert globstar patterns to GLOB patterns.
150
+ def _expand_range(range_spec: str) -> list[str]: # noqa: PLR0911
151
+ if ".." not in range_spec:
152
+ return [range_spec]
201
153
 
202
- Standard GLOB doesn't understand ** as recursive wildcard,
203
- so we need to convert patterns appropriately.
154
+ parts = range_spec.split("..")
155
+ if len(parts) != 2:
156
+ return [range_spec]
204
157
 
205
- Args:
206
- filter_pattern: Pattern that may contain globstars (**)
158
+ start, end = parts[0], parts[1]
207
159
 
208
- Returns:
209
- GLOB-compatible pattern
210
- """
160
+ if start.isdigit() and end.isdigit():
161
+ pad_width = max(len(start), len(end)) if start[0] == "0" or end[0] == "0" else 0
162
+ start_num = int(start)
163
+ end_num = int(end)
164
+
165
+ if start_num <= end_num:
166
+ if pad_width > 0:
167
+ return [str(i).zfill(pad_width) for i in range(start_num, end_num + 1)]
168
+ return [str(i) for i in range(start_num, end_num + 1)]
169
+ if pad_width > 0:
170
+ return [str(i).zfill(pad_width) for i in range(start_num, end_num - 1, -1)]
171
+ return [str(i) for i in range(start_num, end_num - 1, -1)]
172
+
173
+ if len(start) == 1 and len(end) == 1 and start.isalpha() and end.isalpha():
174
+ start_ord = ord(start)
175
+ end_ord = ord(end)
176
+
177
+ if start_ord <= end_ord:
178
+ return [chr(i) for i in range(start_ord, end_ord + 1)]
179
+ return [chr(i) for i in range(start_ord, end_ord - 1, -1)]
180
+
181
+ return [range_spec]
182
+
183
+
184
+ def convert_globstar_to_glob(filter_pattern: str) -> str:
211
185
  if "**" not in filter_pattern:
212
186
  return filter_pattern
213
187
 
214
188
  parts = filter_pattern.split("/")
215
189
  globstar_positions = [i for i, p in enumerate(parts) if p == "**"]
216
190
 
217
- # Handle different cases based on number of globstars
218
191
  num_globstars = len(globstar_positions)
219
192
 
220
193
  if num_globstars <= 1:
221
- # Special case: pattern like **/* means zero or more directories
222
- # This is tricky because GLOB can't express "zero or more"
223
- # We need different handling based on the pattern structure
224
-
225
194
  if filter_pattern == "**/*":
226
- # Match everything
227
195
  return "*"
228
196
  if filter_pattern.startswith("**/"):
229
197
  remaining = filter_pattern[3:]
@@ -236,20 +204,11 @@ def convert_globstar_to_glob(filter_pattern: str) -> str:
236
204
  # that works with recursive listing
237
205
  # Special handling: if it's a simple extension pattern, match broadly
238
206
  if remaining.startswith("*."):
239
- # Pattern like **/*.ext - match any file with this extension
240
- # This matches *.ext at current level and deeper with recursion:
241
207
  return remaining
242
- # Pattern like **/temp?.* - match as filename in subdirs
243
208
  return f"*/{remaining}"
244
209
 
245
- # Default: Zero or one globstar - simple replacement
246
210
  return filter_pattern.replace("**", "*")
247
211
 
248
- # Multiple globstars - need more careful handling
249
- # For patterns like **/level?/backup/**/*.ext
250
- # We want to match any path containing /level?/backup/ and ending with .ext
251
-
252
- # Find middle directories (between first and last **)
253
212
  middle_parts = []
254
213
  start_idx = globstar_positions[0] + 1
255
214
  end_idx = globstar_positions[-1]
@@ -258,17 +217,12 @@ def convert_globstar_to_glob(filter_pattern: str) -> str:
258
217
  middle_parts.append(parts[i])
259
218
 
260
219
  if not middle_parts:
261
- # No fixed middle parts, just use wildcards
262
220
  result = filter_pattern.replace("**", "*")
263
221
  else:
264
- # Create pattern that matches the middle parts
265
222
  middle_pattern = "/".join(middle_parts)
266
- # Get the file pattern at the end if any
267
223
  last_part = parts[-1] if parts[-1] != "**" else "*"
268
224
 
269
- # Match any path containing this pattern
270
225
  if last_part != "*":
271
- # Has specific file pattern
272
226
  result = f"*{middle_pattern}*{last_part}"
273
227
  else:
274
228
  result = f"*{middle_pattern}*"
@@ -287,14 +241,11 @@ def apply_glob_filter(
287
241
 
288
242
  chain = ls(dc, list_path, recursive=use_recursive, column=column)
289
243
 
290
- # If pattern doesn't contain path separator and list_path is not empty,
291
- # prepend the list_path to make the pattern match correctly
292
244
  if list_path and "/" not in pattern:
293
245
  filter_pattern = f"{list_path.rstrip('/')}/{pattern}"
294
246
  else:
295
247
  filter_pattern = pattern
296
248
 
297
- # Convert globstar patterns to GLOB-compatible patterns
298
249
  glob_pattern = convert_globstar_to_glob(filter_pattern)
299
250
 
300
251
  return chain.filter(Column(f"{column}.path").glob(glob_pattern))
@@ -332,7 +332,10 @@ class File(DataModel):
332
332
 
333
333
  @classmethod
334
334
  def upload(
335
- cls, data: bytes, path: str, catalog: Optional["Catalog"] = None
335
+ cls,
336
+ data: bytes,
337
+ path: Union[str, os.PathLike[str]],
338
+ catalog: Optional["Catalog"] = None,
336
339
  ) -> "Self":
337
340
  if catalog is None:
338
341
  from datachain.catalog.loader import get_catalog
@@ -340,8 +343,10 @@ class File(DataModel):
340
343
  catalog = get_catalog()
341
344
  from datachain.client.fsspec import Client
342
345
 
343
- client_cls = Client.get_implementation(path)
344
- source, rel_path = client_cls.split_url(path)
346
+ path_str = stringify_path(path)
347
+
348
+ client_cls = Client.get_implementation(path_str)
349
+ source, rel_path = client_cls.split_url(path_str)
345
350
 
346
351
  client = catalog.get_client(client_cls.get_uri(source))
347
352
  file = client.upload(data, rel_path)
@@ -351,7 +356,9 @@ class File(DataModel):
351
356
  return file
352
357
 
353
358
  @classmethod
354
- def at(cls, uri: str, session: Optional["Session"] = None) -> "Self":
359
+ def at(
360
+ cls, uri: Union[str, os.PathLike[str]], session: Optional["Session"] = None
361
+ ) -> "Self":
355
362
  """Construct a File from a full URI in one call.
356
363
 
357
364
  Example:
@@ -364,9 +371,10 @@ class File(DataModel):
364
371
  if session is None:
365
372
  session = Session.get()
366
373
  catalog = session.catalog
374
+ uri_str = stringify_path(uri)
367
375
 
368
- client_cls = Client.get_implementation(uri)
369
- source, rel_path = client_cls.split_url(uri)
376
+ client_cls = Client.get_implementation(uri_str)
377
+ source, rel_path = client_cls.split_url(uri_str)
370
378
  file = cls(source=client_cls.get_uri(source), path=rel_path)
371
379
  file._set_stream(catalog)
372
380
  return file
@@ -77,7 +77,7 @@ def ls(session: Optional[Session] = None) -> list[Namespace]:
77
77
  return Session.get(session).catalog.metastore.list_namespaces()
78
78
 
79
79
 
80
- def delete_namespace(name: str, session: Optional[Session]) -> None:
80
+ def delete_namespace(name: str, session: Optional[Session] = None) -> None:
81
81
  """
82
82
  Removes a namespace by name.
83
83
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datachain
3
- Version: 0.32.1
3
+ Version: 0.32.3
4
4
  Summary: Wrangle unstructured AI data at scale
5
5
  Author-email: Dmitry Petrov <support@dvc.org>
6
6
  License-Expression: Apache-2.0
@@ -102,7 +102,7 @@ Requires-Dist: scipy; extra == "tests"
102
102
  Requires-Dist: ultralytics; extra == "tests"
103
103
  Provides-Extra: dev
104
104
  Requires-Dist: datachain[docs,tests]; extra == "dev"
105
- Requires-Dist: mypy==1.17.0; extra == "dev"
105
+ Requires-Dist: mypy==1.18.1; extra == "dev"
106
106
  Requires-Dist: types-python-dateutil; extra == "dev"
107
107
  Requires-Dist: types-dateparser; extra == "dev"
108
108
  Requires-Dist: types-pytz; extra == "dev"
@@ -42,7 +42,7 @@ soundfile
42
42
 
43
43
  [dev]
44
44
  datachain[docs,tests]
45
- mypy==1.17.0
45
+ mypy==1.18.1
46
46
  types-python-dateutil
47
47
  types-dateparser
48
48
  types-pytz
@@ -282,7 +282,7 @@ def test_remove_dataset(metastore):
282
282
  }
283
283
 
284
284
  metastore.remove_dataset(ds)
285
- with pytest.raises(Exception, match="Dataset .+ not found"):
285
+ with pytest.raises(Exception, match=r"Dataset .+ not found"):
286
286
  metastore.get_dataset(ds.name)
287
287
 
288
288
  # dependencies should also be deleted and cleaned up