datachain 0.31.4__tar.gz → 0.32.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (428) hide show
  1. {datachain-0.31.4 → datachain-0.32.0}/PKG-INFO +1 -1
  2. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/__init__.py +2 -0
  3. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/metastore.py +79 -15
  4. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/error.py +8 -0
  5. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/namespaces.py +57 -2
  6. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/projects.py +47 -1
  7. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/namespace.py +19 -0
  8. {datachain-0.31.4 → datachain-0.32.0}/src/datachain.egg-info/PKG-INFO +1 -1
  9. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_namespace.py +45 -0
  10. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_project.py +60 -0
  11. {datachain-0.31.4 → datachain-0.32.0}/.cruft.json +0 -0
  12. {datachain-0.31.4 → datachain-0.32.0}/.gitattributes +0 -0
  13. {datachain-0.31.4 → datachain-0.32.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  14. {datachain-0.31.4 → datachain-0.32.0}/.github/ISSUE_TEMPLATE/empty_issue.md +0 -0
  15. {datachain-0.31.4 → datachain-0.32.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  16. {datachain-0.31.4 → datachain-0.32.0}/.github/codecov.yaml +0 -0
  17. {datachain-0.31.4 → datachain-0.32.0}/.github/dependabot.yml +0 -0
  18. {datachain-0.31.4 → datachain-0.32.0}/.github/workflows/benchmarks.yml +0 -0
  19. {datachain-0.31.4 → datachain-0.32.0}/.github/workflows/release.yml +0 -0
  20. {datachain-0.31.4 → datachain-0.32.0}/.github/workflows/tests-studio.yml +0 -0
  21. {datachain-0.31.4 → datachain-0.32.0}/.github/workflows/tests.yml +0 -0
  22. {datachain-0.31.4 → datachain-0.32.0}/.github/workflows/update-template.yaml +0 -0
  23. {datachain-0.31.4 → datachain-0.32.0}/.gitignore +0 -0
  24. {datachain-0.31.4 → datachain-0.32.0}/.pre-commit-config.yaml +0 -0
  25. {datachain-0.31.4 → datachain-0.32.0}/CODE_OF_CONDUCT.rst +0 -0
  26. {datachain-0.31.4 → datachain-0.32.0}/LICENSE +0 -0
  27. {datachain-0.31.4 → datachain-0.32.0}/README.rst +0 -0
  28. {datachain-0.31.4 → datachain-0.32.0}/docs/api_hooks.py +0 -0
  29. {datachain-0.31.4 → datachain-0.32.0}/docs/assets/captioned_cartoons.png +0 -0
  30. {datachain-0.31.4 → datachain-0.32.0}/docs/assets/datachain-white.svg +0 -0
  31. {datachain-0.31.4 → datachain-0.32.0}/docs/assets/datachain.svg +0 -0
  32. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/auth/login.md +0 -0
  33. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/auth/logout.md +0 -0
  34. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/auth/team.md +0 -0
  35. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/auth/token.md +0 -0
  36. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/index.md +0 -0
  37. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/job/cancel.md +0 -0
  38. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/job/clusters.md +0 -0
  39. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/job/logs.md +0 -0
  40. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/job/ls.md +0 -0
  41. {datachain-0.31.4 → datachain-0.32.0}/docs/commands/job/run.md +0 -0
  42. {datachain-0.31.4 → datachain-0.32.0}/docs/contributing.md +0 -0
  43. {datachain-0.31.4 → datachain-0.32.0}/docs/css/github-permalink-style.css +0 -0
  44. {datachain-0.31.4 → datachain-0.32.0}/docs/examples.md +0 -0
  45. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/db_migrations.md +0 -0
  46. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/delta.md +0 -0
  47. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/env.md +0 -0
  48. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/index.md +0 -0
  49. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/namespaces.md +0 -0
  50. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/processing.md +0 -0
  51. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/remotes.md +0 -0
  52. {datachain-0.31.4 → datachain-0.32.0}/docs/guide/retry.md +0 -0
  53. {datachain-0.31.4 → datachain-0.32.0}/docs/index.md +0 -0
  54. {datachain-0.31.4 → datachain-0.32.0}/docs/overrides/main.html +0 -0
  55. {datachain-0.31.4 → datachain-0.32.0}/docs/quick-start.md +0 -0
  56. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/arrowrow.md +0 -0
  57. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/bbox.md +0 -0
  58. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/file.md +0 -0
  59. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/imagefile.md +0 -0
  60. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/index.md +0 -0
  61. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/pose.md +0 -0
  62. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/segment.md +0 -0
  63. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/tarvfile.md +0 -0
  64. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/textfile.md +0 -0
  65. {datachain-0.31.4 → datachain-0.32.0}/docs/references/data-types/videofile.md +0 -0
  66. {datachain-0.31.4 → datachain-0.32.0}/docs/references/datachain.md +0 -0
  67. {datachain-0.31.4 → datachain-0.32.0}/docs/references/func.md +0 -0
  68. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/aggregate.md +0 -0
  69. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/array.md +0 -0
  70. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/conditional.md +0 -0
  71. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/numeric.md +0 -0
  72. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/path.md +0 -0
  73. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/random.md +0 -0
  74. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/string.md +0 -0
  75. {datachain-0.31.4 → datachain-0.32.0}/docs/references/functions/window.md +0 -0
  76. {datachain-0.31.4 → datachain-0.32.0}/docs/references/index.md +0 -0
  77. {datachain-0.31.4 → datachain-0.32.0}/docs/references/toolkit.md +0 -0
  78. {datachain-0.31.4 → datachain-0.32.0}/docs/references/torch.md +0 -0
  79. {datachain-0.31.4 → datachain-0.32.0}/docs/references/udf.md +0 -0
  80. {datachain-0.31.4 → datachain-0.32.0}/docs/studio/api/.gitkeep +0 -0
  81. {datachain-0.31.4 → datachain-0.32.0}/docs/templates/main.dot +0 -0
  82. {datachain-0.31.4 → datachain-0.32.0}/docs/templates/operation.dot +0 -0
  83. {datachain-0.31.4 → datachain-0.32.0}/docs/templates/responses.def +0 -0
  84. {datachain-0.31.4 → datachain-0.32.0}/docs/tutorials.md +0 -0
  85. {datachain-0.31.4 → datachain-0.32.0}/examples/computer_vision/iptc_exif_xmp_lib.py +0 -0
  86. {datachain-0.31.4 → datachain-0.32.0}/examples/computer_vision/llava2_image_desc_lib.py +0 -0
  87. {datachain-0.31.4 → datachain-0.32.0}/examples/computer_vision/openimage-detect.py +0 -0
  88. {datachain-0.31.4 → datachain-0.32.0}/examples/computer_vision/ultralytics-bbox.py +0 -0
  89. {datachain-0.31.4 → datachain-0.32.0}/examples/computer_vision/ultralytics-pose.py +0 -0
  90. {datachain-0.31.4 → datachain-0.32.0}/examples/computer_vision/ultralytics-segment.py +0 -0
  91. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/common_sql_functions.py +0 -0
  92. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/json-csv-reader.py +0 -0
  93. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/nested_datamodel.py +0 -0
  94. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/torch-loader.py +0 -0
  95. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/udfs/parallel.py +0 -0
  96. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/udfs/simple.py +0 -0
  97. {datachain-0.31.4 → datachain-0.32.0}/examples/get_started/udfs/stateful.py +0 -0
  98. {datachain-0.31.4 → datachain-0.32.0}/examples/incremental_processing/delta.py +0 -0
  99. {datachain-0.31.4 → datachain-0.32.0}/examples/incremental_processing/retry.py +0 -0
  100. {datachain-0.31.4 → datachain-0.32.0}/examples/incremental_processing/utils.py +0 -0
  101. {datachain-0.31.4 → datachain-0.32.0}/examples/llm_and_nlp/claude-query.py +0 -0
  102. {datachain-0.31.4 → datachain-0.32.0}/examples/llm_and_nlp/hf-dataset-llm-eval.py +0 -0
  103. {datachain-0.31.4 → datachain-0.32.0}/examples/multimodal/audio-to-text.py +0 -0
  104. {datachain-0.31.4 → datachain-0.32.0}/examples/multimodal/clip_inference.py +0 -0
  105. {datachain-0.31.4 → datachain-0.32.0}/examples/multimodal/hf_pipeline.py +0 -0
  106. {datachain-0.31.4 → datachain-0.32.0}/examples/multimodal/openai_image_desc_lib.py +0 -0
  107. {datachain-0.31.4 → datachain-0.32.0}/examples/multimodal/wds.py +0 -0
  108. {datachain-0.31.4 → datachain-0.32.0}/examples/multimodal/wds_filtered.py +0 -0
  109. {datachain-0.31.4 → datachain-0.32.0}/mkdocs.yml +0 -0
  110. {datachain-0.31.4 → datachain-0.32.0}/noxfile.py +0 -0
  111. {datachain-0.31.4 → datachain-0.32.0}/pyproject.toml +0 -0
  112. {datachain-0.31.4 → datachain-0.32.0}/setup.cfg +0 -0
  113. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/__main__.py +0 -0
  114. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/asyn.py +0 -0
  115. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cache.py +0 -0
  116. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/catalog/__init__.py +0 -0
  117. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/catalog/catalog.py +0 -0
  118. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/catalog/datasource.py +0 -0
  119. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/catalog/loader.py +0 -0
  120. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/__init__.py +0 -0
  121. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/__init__.py +0 -0
  122. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/datasets.py +0 -0
  123. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/du.py +0 -0
  124. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/index.py +0 -0
  125. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/ls.py +0 -0
  126. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/misc.py +0 -0
  127. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/query.py +0 -0
  128. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/commands/show.py +0 -0
  129. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/parser/__init__.py +0 -0
  130. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/parser/job.py +0 -0
  131. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/parser/studio.py +0 -0
  132. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/parser/utils.py +0 -0
  133. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/cli/utils.py +0 -0
  134. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/__init__.py +0 -0
  135. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/azure.py +0 -0
  136. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/fileslice.py +0 -0
  137. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/fsspec.py +0 -0
  138. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/gcs.py +0 -0
  139. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/hf.py +0 -0
  140. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/local.py +0 -0
  141. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/client/s3.py +0 -0
  142. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/config.py +0 -0
  143. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/__init__.py +0 -0
  144. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/db_engine.py +0 -0
  145. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/job.py +0 -0
  146. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/schema.py +0 -0
  147. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/serializer.py +0 -0
  148. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/sqlite.py +0 -0
  149. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/data_storage/warehouse.py +0 -0
  150. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/dataset.py +0 -0
  151. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/delta.py +0 -0
  152. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/diff/__init__.py +0 -0
  153. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/fs/__init__.py +0 -0
  154. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/fs/reference.py +0 -0
  155. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/fs/utils.py +0 -0
  156. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/__init__.py +0 -0
  157. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/aggregate.py +0 -0
  158. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/array.py +0 -0
  159. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/base.py +0 -0
  160. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/conditional.py +0 -0
  161. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/func.py +0 -0
  162. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/numeric.py +0 -0
  163. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/path.py +0 -0
  164. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/random.py +0 -0
  165. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/string.py +0 -0
  166. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/func/window.py +0 -0
  167. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/job.py +0 -0
  168. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/__init__.py +0 -0
  169. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/arrow.py +0 -0
  170. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/audio.py +0 -0
  171. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/clip.py +0 -0
  172. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/convert/__init__.py +0 -0
  173. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/convert/flatten.py +0 -0
  174. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/convert/python_to_sql.py +0 -0
  175. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/convert/sql_to_python.py +0 -0
  176. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/convert/unflatten.py +0 -0
  177. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/convert/values_to_tuples.py +0 -0
  178. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/data_model.py +0 -0
  179. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dataset_info.py +0 -0
  180. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/__init__.py +0 -0
  181. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/csv.py +0 -0
  182. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/database.py +0 -0
  183. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/datachain.py +0 -0
  184. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/datasets.py +0 -0
  185. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/hf.py +0 -0
  186. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/json.py +0 -0
  187. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/listings.py +0 -0
  188. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/pandas.py +0 -0
  189. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/parquet.py +0 -0
  190. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/records.py +0 -0
  191. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/storage.py +0 -0
  192. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/storage_pattern.py +0 -0
  193. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/utils.py +0 -0
  194. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/dc/values.py +0 -0
  195. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/file.py +0 -0
  196. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/hf.py +0 -0
  197. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/image.py +0 -0
  198. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/listing.py +0 -0
  199. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/listing_info.py +0 -0
  200. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/meta_formats.py +0 -0
  201. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/model_store.py +0 -0
  202. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/pytorch.py +0 -0
  203. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/settings.py +0 -0
  204. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/signal_schema.py +0 -0
  205. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/tar.py +0 -0
  206. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/text.py +0 -0
  207. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/udf.py +0 -0
  208. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/udf_signature.py +0 -0
  209. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/utils.py +0 -0
  210. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/video.py +0 -0
  211. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/webdataset.py +0 -0
  212. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/lib/webdataset_laion.py +0 -0
  213. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/listing.py +0 -0
  214. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/__init__.py +0 -0
  215. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/bbox.py +0 -0
  216. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/pose.py +0 -0
  217. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/segment.py +0 -0
  218. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/ultralytics/__init__.py +0 -0
  219. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/ultralytics/bbox.py +0 -0
  220. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/ultralytics/pose.py +0 -0
  221. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/ultralytics/segment.py +0 -0
  222. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/model/utils.py +0 -0
  223. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/node.py +0 -0
  224. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/nodes_fetcher.py +0 -0
  225. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/nodes_thread_pool.py +0 -0
  226. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/progress.py +0 -0
  227. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/project.py +0 -0
  228. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/py.typed +0 -0
  229. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/__init__.py +0 -0
  230. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/batch.py +0 -0
  231. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/dataset.py +0 -0
  232. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/dispatch.py +0 -0
  233. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/metrics.py +0 -0
  234. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/params.py +0 -0
  235. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/queue.py +0 -0
  236. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/schema.py +0 -0
  237. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/session.py +0 -0
  238. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/udf.py +0 -0
  239. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/query/utils.py +0 -0
  240. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/remote/__init__.py +0 -0
  241. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/remote/studio.py +0 -0
  242. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/script_meta.py +0 -0
  243. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/semver.py +0 -0
  244. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/__init__.py +0 -0
  245. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/default/__init__.py +0 -0
  246. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/default/base.py +0 -0
  247. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/__init__.py +0 -0
  248. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/aggregate.py +0 -0
  249. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/array.py +0 -0
  250. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/conditional.py +0 -0
  251. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/numeric.py +0 -0
  252. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/path.py +0 -0
  253. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/random.py +0 -0
  254. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/functions/string.py +0 -0
  255. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/postgresql_dialect.py +0 -0
  256. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/postgresql_types.py +0 -0
  257. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/selectable.py +0 -0
  258. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/sqlite/__init__.py +0 -0
  259. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/sqlite/base.py +0 -0
  260. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/sqlite/types.py +0 -0
  261. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/sqlite/vector.py +0 -0
  262. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/types.py +0 -0
  263. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/sql/utils.py +0 -0
  264. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/studio.py +0 -0
  265. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/telemetry.py +0 -0
  266. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/toolkit/__init__.py +0 -0
  267. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/toolkit/split.py +0 -0
  268. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/torch/__init__.py +0 -0
  269. {datachain-0.31.4 → datachain-0.32.0}/src/datachain/utils.py +0 -0
  270. {datachain-0.31.4 → datachain-0.32.0}/src/datachain.egg-info/SOURCES.txt +0 -0
  271. {datachain-0.31.4 → datachain-0.32.0}/src/datachain.egg-info/dependency_links.txt +0 -0
  272. {datachain-0.31.4 → datachain-0.32.0}/src/datachain.egg-info/entry_points.txt +0 -0
  273. {datachain-0.31.4 → datachain-0.32.0}/src/datachain.egg-info/requires.txt +0 -0
  274. {datachain-0.31.4 → datachain-0.32.0}/src/datachain.egg-info/top_level.txt +0 -0
  275. {datachain-0.31.4 → datachain-0.32.0}/tests/__init__.py +0 -0
  276. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/__init__.py +0 -0
  277. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/conftest.py +0 -0
  278. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/datasets/.dvc/.gitignore +0 -0
  279. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/datasets/.dvc/config +0 -0
  280. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/datasets/.gitignore +0 -0
  281. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/datasets/laion-tiny.npz.dvc +0 -0
  282. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/test_datachain.py +0 -0
  283. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/test_ls.py +0 -0
  284. {datachain-0.31.4 → datachain-0.32.0}/tests/benchmarks/test_version.py +0 -0
  285. {datachain-0.31.4 → datachain-0.32.0}/tests/conftest.py +0 -0
  286. {datachain-0.31.4 → datachain-0.32.0}/tests/data.py +0 -0
  287. {datachain-0.31.4 → datachain-0.32.0}/tests/examples/__init__.py +0 -0
  288. {datachain-0.31.4 → datachain-0.32.0}/tests/examples/test_examples.py +0 -0
  289. {datachain-0.31.4 → datachain-0.32.0}/tests/examples/test_wds_e2e.py +0 -0
  290. {datachain-0.31.4 → datachain-0.32.0}/tests/examples/wds_data.py +0 -0
  291. {datachain-0.31.4 → datachain-0.32.0}/tests/func/__init__.py +0 -0
  292. {datachain-0.31.4 → datachain-0.32.0}/tests/func/data/Big_Buck_Bunny_360_10s_1MB.mp4 +0 -0
  293. {datachain-0.31.4 → datachain-0.32.0}/tests/func/data/lena.jpg +0 -0
  294. {datachain-0.31.4 → datachain-0.32.0}/tests/func/fake-service-account-credentials.json +0 -0
  295. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/__init__.py +0 -0
  296. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_aggregate.py +0 -0
  297. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_array.py +0 -0
  298. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_conditional.py +0 -0
  299. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_numeric.py +0 -0
  300. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_path.py +0 -0
  301. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_random.py +0 -0
  302. {datachain-0.31.4 → datachain-0.32.0}/tests/func/functions/test_string.py +0 -0
  303. {datachain-0.31.4 → datachain-0.32.0}/tests/func/model/__init__.py +0 -0
  304. {datachain-0.31.4 → datachain-0.32.0}/tests/func/model/data/running-mask0.png +0 -0
  305. {datachain-0.31.4 → datachain-0.32.0}/tests/func/model/data/running-mask1.png +0 -0
  306. {datachain-0.31.4 → datachain-0.32.0}/tests/func/model/data/running.jpg +0 -0
  307. {datachain-0.31.4 → datachain-0.32.0}/tests/func/model/data/ships.jpg +0 -0
  308. {datachain-0.31.4 → datachain-0.32.0}/tests/func/model/test_yolo.py +0 -0
  309. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_audio.py +0 -0
  310. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_batching.py +0 -0
  311. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_catalog.py +0 -0
  312. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_client.py +0 -0
  313. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_cloud_transfer.py +0 -0
  314. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_data_storage.py +0 -0
  315. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_datachain.py +0 -0
  316. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_datachain_merge.py +0 -0
  317. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_dataset_query.py +0 -0
  318. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_datasets.py +0 -0
  319. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_delta.py +0 -0
  320. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_feature_pickling.py +0 -0
  321. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_file.py +0 -0
  322. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_hf.py +0 -0
  323. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_hidden_field.py +0 -0
  324. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_image.py +0 -0
  325. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_listing.py +0 -0
  326. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_ls.py +0 -0
  327. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_meta_formats.py +0 -0
  328. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_metastore.py +0 -0
  329. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_metrics.py +0 -0
  330. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_mutate.py +0 -0
  331. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_pull.py +0 -0
  332. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_pytorch.py +0 -0
  333. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_query.py +0 -0
  334. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_read_database.py +0 -0
  335. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_read_dataset_remote.py +0 -0
  336. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_read_dataset_version_specifiers.py +0 -0
  337. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_retry.py +0 -0
  338. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_session.py +0 -0
  339. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_storage_pattern.py +0 -0
  340. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_studio_datetime_parsing.py +0 -0
  341. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_to_database.py +0 -0
  342. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_toolkit.py +0 -0
  343. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_video.py +0 -0
  344. {datachain-0.31.4 → datachain-0.32.0}/tests/func/test_warehouse.py +0 -0
  345. {datachain-0.31.4 → datachain-0.32.0}/tests/scripts/feature_class.py +0 -0
  346. {datachain-0.31.4 → datachain-0.32.0}/tests/scripts/feature_class_exception.py +0 -0
  347. {datachain-0.31.4 → datachain-0.32.0}/tests/scripts/feature_class_parallel.py +0 -0
  348. {datachain-0.31.4 → datachain-0.32.0}/tests/scripts/feature_class_parallel_data_model.py +0 -0
  349. {datachain-0.31.4 → datachain-0.32.0}/tests/scripts/name_len_slow.py +0 -0
  350. {datachain-0.31.4 → datachain-0.32.0}/tests/test_atomicity.py +0 -0
  351. {datachain-0.31.4 → datachain-0.32.0}/tests/test_cli_e2e.py +0 -0
  352. {datachain-0.31.4 → datachain-0.32.0}/tests/test_cli_studio.py +0 -0
  353. {datachain-0.31.4 → datachain-0.32.0}/tests/test_import_time.py +0 -0
  354. {datachain-0.31.4 → datachain-0.32.0}/tests/test_query_e2e.py +0 -0
  355. {datachain-0.31.4 → datachain-0.32.0}/tests/test_telemetry.py +0 -0
  356. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/__init__.py +0 -0
  357. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/__init__.py +0 -0
  358. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/conftest.py +0 -0
  359. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_arrow.py +0 -0
  360. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_audio.py +0 -0
  361. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_clip.py +0 -0
  362. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_datachain.py +0 -0
  363. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_datachain_bootstrap.py +0 -0
  364. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_datachain_merge.py +0 -0
  365. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_diff.py +0 -0
  366. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_feature.py +0 -0
  367. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_feature_utils.py +0 -0
  368. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_file.py +0 -0
  369. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_hf.py +0 -0
  370. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_image.py +0 -0
  371. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_listing_info.py +0 -0
  372. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_partition_by.py +0 -0
  373. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_python_to_sql.py +0 -0
  374. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_schema.py +0 -0
  375. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_settings.py +0 -0
  376. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_signal_schema.py +0 -0
  377. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_sql_to_python.py +0 -0
  378. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_storage_pattern.py +0 -0
  379. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_text.py +0 -0
  380. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_udf.py +0 -0
  381. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_udf_signature.py +0 -0
  382. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_utils.py +0 -0
  383. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/lib/test_webdataset.py +0 -0
  384. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/model/__init__.py +0 -0
  385. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/model/test_bbox.py +0 -0
  386. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/model/test_pose.py +0 -0
  387. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/model/test_segment.py +0 -0
  388. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/model/test_utils.py +0 -0
  389. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/__init__.py +0 -0
  390. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/sqlite/__init__.py +0 -0
  391. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/sqlite/test_types.py +0 -0
  392. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/sqlite/test_utils.py +0 -0
  393. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/test_array.py +0 -0
  394. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/test_conditional.py +0 -0
  395. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/test_path.py +0 -0
  396. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/test_random.py +0 -0
  397. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/test_selectable.py +0 -0
  398. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/sql/test_string.py +0 -0
  399. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_asyn.py +0 -0
  400. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_cache.py +0 -0
  401. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_catalog.py +0 -0
  402. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_catalog_loader.py +0 -0
  403. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_cli_datasets.py +0 -0
  404. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_cli_parsing.py +0 -0
  405. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_client.py +0 -0
  406. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_client_gcs.py +0 -0
  407. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_client_s3.py +0 -0
  408. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_config.py +0 -0
  409. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_data_storage.py +0 -0
  410. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_database_engine.py +0 -0
  411. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_dataset.py +0 -0
  412. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_dispatch.py +0 -0
  413. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_fileslice.py +0 -0
  414. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_func.py +0 -0
  415. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_listing.py +0 -0
  416. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_metastore.py +0 -0
  417. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_module_exports.py +0 -0
  418. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_pytorch.py +0 -0
  419. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_query.py +0 -0
  420. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_query_metrics.py +0 -0
  421. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_query_params.py +0 -0
  422. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_script_meta.py +0 -0
  423. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_semver.py +0 -0
  424. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_serializer.py +0 -0
  425. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_session.py +0 -0
  426. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_utils.py +0 -0
  427. {datachain-0.31.4 → datachain-0.32.0}/tests/unit/test_warehouse.py +0 -0
  428. {datachain-0.31.4 → datachain-0.32.0}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datachain
3
- Version: 0.31.4
3
+ Version: 0.32.0
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
@@ -37,6 +37,7 @@ from datachain.lib.file import (
37
37
  VideoFrame,
38
38
  )
39
39
  from datachain.lib.model_store import ModelStore
40
+ from datachain.lib.namespaces import delete as delete_namespace
40
41
  from datachain.lib.projects import create as create_project
41
42
  from datachain.lib.udf import Aggregator, Generator, Mapper
42
43
  from datachain.lib.utils import AbstractUDF, DataChainError
@@ -74,6 +75,7 @@ __all__ = [
74
75
  "create_project",
75
76
  "datasets",
76
77
  "delete_dataset",
78
+ "delete_namespace",
77
79
  "is_chain_type",
78
80
  "is_studio",
79
81
  "listings",
@@ -22,6 +22,7 @@ from sqlalchemy import (
22
22
  UniqueConstraint,
23
23
  select,
24
24
  )
25
+ from sqlalchemy.sql import func as f
25
26
 
26
27
  from datachain.data_storage import JobQueryType, JobStatus
27
28
  from datachain.data_storage.serializer import Serializable
@@ -37,7 +38,9 @@ from datachain.dataset import (
37
38
  from datachain.error import (
38
39
  DatasetNotFoundError,
39
40
  DatasetVersionNotFoundError,
41
+ NamespaceDeleteNotAllowedError,
40
42
  NamespaceNotFoundError,
43
+ ProjectDeleteNotAllowedError,
41
44
  ProjectNotFoundError,
42
45
  TableMissingError,
43
46
  )
@@ -141,6 +144,10 @@ class AbstractMetastore(ABC, Serializable):
141
144
  def get_namespace(self, name: str, conn=None) -> Namespace:
142
145
  """Gets a single namespace by name"""
143
146
 
147
+ @abstractmethod
148
+ def remove_namespace(self, namespace_id: int, conn=None) -> None:
149
+ """Removes a single namespace by id"""
150
+
144
151
  @abstractmethod
145
152
  def list_namespaces(self, conn=None) -> list[Namespace]:
146
153
  """Gets a list of all namespaces"""
@@ -190,10 +197,30 @@ class AbstractMetastore(ABC, Serializable):
190
197
  It also creates project if not found and create flag is set to True.
191
198
  """
192
199
 
200
+ def is_default_project(self, project_name: str, namespace_name: str) -> bool:
201
+ return (
202
+ project_name == self.default_project_name
203
+ and namespace_name == self.default_namespace_name
204
+ )
205
+
206
+ def is_listing_project(self, project_name: str, namespace_name: str) -> bool:
207
+ return (
208
+ project_name == self.listing_project_name
209
+ and namespace_name == self.system_namespace_name
210
+ )
211
+
193
212
  @abstractmethod
194
213
  def get_project_by_id(self, project_id: int, conn=None) -> Project:
195
214
  """Gets a single project by id"""
196
215
 
216
+ @abstractmethod
217
+ def count_projects(self, namespace_id: Optional[int] = None) -> int:
218
+ """Counts projects in some namespace or in general."""
219
+
220
+ @abstractmethod
221
+ def remove_project(self, project_id: int, conn=None) -> None:
222
+ """Removes a single project by id"""
223
+
197
224
  @abstractmethod
198
225
  def list_projects(self, namespace_id: Optional[int], conn=None) -> list[Project]:
199
226
  """Gets list of projects in some namespace or in general (in all namespaces)"""
@@ -270,6 +297,10 @@ class AbstractMetastore(ABC, Serializable):
270
297
  ) -> Iterator[DatasetListRecord]:
271
298
  """Lists all datasets in some project or in all projects."""
272
299
 
300
+ @abstractmethod
301
+ def count_datasets(self, project_id: Optional[int] = None) -> int:
302
+ """Counts datasets in some project or in all projects."""
303
+
273
304
  @abstractmethod
274
305
  def list_datasets_by_prefix(
275
306
  self, prefix: str, project_id: Optional[int] = None
@@ -735,6 +766,18 @@ class AbstractDBMetastore(AbstractMetastore):
735
766
 
736
767
  return self.get_namespace(name)
737
768
 
769
+ def remove_namespace(self, namespace_id: int, conn=None) -> None:
770
+ num_projects = self.count_projects(namespace_id)
771
+ if num_projects > 0:
772
+ raise NamespaceDeleteNotAllowedError(
773
+ f"Namespace cannot be removed. It contains {num_projects} project(s). "
774
+ "Please remove the project(s) first."
775
+ )
776
+
777
+ n = self._namespaces
778
+ with self.db.transaction():
779
+ self.db.execute(self._namespaces_delete().where(n.c.id == namespace_id))
780
+
738
781
  def get_namespace(self, name: str, conn=None) -> Namespace:
739
782
  """Gets a single namespace by name"""
740
783
  n = self._namespaces
@@ -796,18 +839,6 @@ class AbstractDBMetastore(AbstractMetastore):
796
839
 
797
840
  return self.get_project(name, namespace.name)
798
841
 
799
- def _is_listing_project(self, project_name: str, namespace_name: str) -> bool:
800
- return (
801
- project_name == self.listing_project_name
802
- and namespace_name == self.system_namespace_name
803
- )
804
-
805
- def _is_default_project(self, project_name: str, namespace_name: str) -> bool:
806
- return (
807
- project_name == self.default_project_name
808
- and namespace_name == self.default_namespace_name
809
- )
810
-
811
842
  def get_project(
812
843
  self, name: str, namespace_name: str, create: bool = False, conn=None
813
844
  ) -> Project:
@@ -816,7 +847,7 @@ class AbstractDBMetastore(AbstractMetastore):
816
847
  p = self._projects
817
848
  validate = True
818
849
 
819
- if self._is_listing_project(name, namespace_name) or self._is_default_project(
850
+ if self.is_listing_project(name, namespace_name) or self.is_default_project(
820
851
  name, namespace_name
821
852
  ):
822
853
  # we are always creating default and listing projects if they don't exist
@@ -858,7 +889,31 @@ class AbstractDBMetastore(AbstractMetastore):
858
889
  raise ProjectNotFoundError(f"Project with id {project_id} not found.")
859
890
  return self.project_class.parse(*rows[0])
860
891
 
861
- def list_projects(self, namespace_id: Optional[int], conn=None) -> list[Project]:
892
+ def count_projects(self, namespace_id: Optional[int] = None) -> int:
893
+ p = self._projects
894
+ query = self._projects_select()
895
+ if namespace_id:
896
+ query = query.where(p.c.namespace_id == namespace_id)
897
+
898
+ query = select(f.count(1)).select_from(query.subquery())
899
+
900
+ return next(self.db.execute(query))[0]
901
+
902
+ def remove_project(self, project_id: int, conn=None) -> None:
903
+ num_datasets = self.count_datasets(project_id)
904
+ if num_datasets > 0:
905
+ raise ProjectDeleteNotAllowedError(
906
+ f"Project cannot be removed. It contains {num_datasets} dataset(s). "
907
+ "Please remove the dataset(s) first."
908
+ )
909
+
910
+ p = self._projects
911
+ with self.db.transaction():
912
+ self.db.execute(self._projects_delete().where(p.c.id == project_id))
913
+
914
+ def list_projects(
915
+ self, namespace_id: Optional[int] = None, conn=None
916
+ ) -> list[Project]:
862
917
  """
863
918
  Gets a list of projects inside some namespace, or in all namespaces
864
919
  """
@@ -1189,7 +1244,6 @@ class AbstractDBMetastore(AbstractMetastore):
1189
1244
  def list_datasets(
1190
1245
  self, project_id: Optional[int] = None
1191
1246
  ) -> Iterator["DatasetListRecord"]:
1192
- """Lists all datasets."""
1193
1247
  d = self._datasets
1194
1248
  query = self._base_list_datasets_query().order_by(
1195
1249
  self._datasets.c.name, self._datasets_versions.c.version
@@ -1198,6 +1252,16 @@ class AbstractDBMetastore(AbstractMetastore):
1198
1252
  query = query.where(d.c.project_id == project_id)
1199
1253
  yield from self._parse_dataset_list(self.db.execute(query))
1200
1254
 
1255
+ def count_datasets(self, project_id: Optional[int] = None) -> int:
1256
+ d = self._datasets
1257
+ query = self._datasets_select()
1258
+ if project_id:
1259
+ query = query.where(d.c.project_id == project_id)
1260
+
1261
+ query = select(f.count(1)).select_from(query.subquery())
1262
+
1263
+ return next(self.db.execute(query))[0]
1264
+
1201
1265
  def list_datasets_by_prefix(
1202
1266
  self, prefix: str, project_id: Optional[int] = None, conn=None
1203
1267
  ) -> Iterator["DatasetListRecord"]:
@@ -34,6 +34,14 @@ class ProjectCreateNotAllowedError(NotAllowedError):
34
34
  pass
35
35
 
36
36
 
37
+ class ProjectDeleteNotAllowedError(NotAllowedError):
38
+ pass
39
+
40
+
41
+ class NamespaceDeleteNotAllowedError(NotAllowedError):
42
+ pass
43
+
44
+
37
45
  class ProjectNotFoundError(NotFoundError):
38
46
  pass
39
47
 
@@ -1,7 +1,11 @@
1
1
  from typing import Optional
2
2
 
3
- from datachain.error import NamespaceCreateNotAllowedError
4
- from datachain.namespace import Namespace
3
+ from datachain.error import (
4
+ NamespaceCreateNotAllowedError,
5
+ NamespaceDeleteNotAllowedError,
6
+ )
7
+ from datachain.lib.projects import delete as delete_project
8
+ from datachain.namespace import Namespace, parse_name
5
9
  from datachain.query import Session
6
10
 
7
11
 
@@ -71,3 +75,54 @@ def ls(session: Optional[Session] = None) -> list[Namespace]:
71
75
  ```
72
76
  """
73
77
  return Session.get(session).catalog.metastore.list_namespaces()
78
+
79
+
80
+ def delete(name: str, session: Optional[Session]) -> None:
81
+ """
82
+ Removes a namespace by name.
83
+
84
+ Raises:
85
+ NamespaceNotFoundError: If the namespace does not exist.
86
+ NamespaceDeleteNotAllowedError: If the namespace is non-empty,
87
+ is the default namespace, or is a system namespace,
88
+ as these cannot be removed.
89
+
90
+ Parameters:
91
+ name : The name of the namespace.
92
+ session : Session to use for getting project.
93
+
94
+ Example:
95
+ ```py
96
+ import datachain as dc
97
+ from datachain.lib.namespace import delete as delete_namespace
98
+ delete_namespace("dev")
99
+ ```
100
+ """
101
+ session = Session.get(session)
102
+ metastore = session.catalog.metastore
103
+
104
+ namespace_name, project_name = parse_name(name)
105
+
106
+ if project_name:
107
+ return delete_project(project_name, namespace_name, session)
108
+
109
+ namespace = metastore.get_namespace(name)
110
+
111
+ if name == metastore.system_namespace_name:
112
+ raise NamespaceDeleteNotAllowedError(
113
+ f"Namespace {metastore.system_namespace_name} cannot be removed"
114
+ )
115
+
116
+ if name == metastore.default_namespace_name:
117
+ raise NamespaceDeleteNotAllowedError(
118
+ f"Namespace {metastore.default_namespace_name} cannot be removed"
119
+ )
120
+
121
+ num_projects = metastore.count_projects(namespace.id)
122
+ if num_projects > 0:
123
+ raise NamespaceDeleteNotAllowedError(
124
+ f"Namespace cannot be removed. It contains {num_projects} project(s). "
125
+ "Please remove the project(s) first."
126
+ )
127
+
128
+ metastore.remove_namespace(namespace.id)
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from datachain.error import ProjectCreateNotAllowedError
3
+ from datachain.error import ProjectCreateNotAllowedError, ProjectDeleteNotAllowedError
4
4
  from datachain.project import Project
5
5
  from datachain.query import Session
6
6
 
@@ -86,3 +86,49 @@ def ls(
86
86
  namespace_id = session.catalog.metastore.get_namespace(namespace).id
87
87
 
88
88
  return session.catalog.metastore.list_projects(namespace_id)
89
+
90
+
91
+ def delete(name: str, namespace: str, session: Optional[Session] = None) -> None:
92
+ """
93
+ Removes a project by name within a namespace.
94
+
95
+ Raises:
96
+ ProjectNotFoundError: If the project does not exist.
97
+ ProjectDeleteNotAllowedError: If the project is non-empty,
98
+ is the default project, or is a listing project,
99
+ as these cannot be removed.
100
+
101
+ Parameters:
102
+ name : The name of the project.
103
+ namespace : The name of the namespace.
104
+ session : Session to use for getting project.
105
+
106
+ Example:
107
+ ```py
108
+ import datachain as dc
109
+ dc.delete_project("my-project", "local")
110
+ ```
111
+ """
112
+ session = Session.get(session)
113
+ metastore = session.catalog.metastore
114
+
115
+ project = metastore.get_project(name, namespace)
116
+
117
+ if metastore.is_listing_project(name, namespace):
118
+ raise ProjectDeleteNotAllowedError(
119
+ f"Project {metastore.listing_project_name} cannot be removed"
120
+ )
121
+
122
+ if metastore.is_default_project(name, namespace):
123
+ raise ProjectDeleteNotAllowedError(
124
+ f"Project {metastore.default_project_name} cannot be removed"
125
+ )
126
+
127
+ num_datasets = metastore.count_datasets(project.id)
128
+ if num_datasets > 0:
129
+ raise ProjectDeleteNotAllowedError(
130
+ f"Project cannot be removed. It contains {num_datasets} dataset(s). "
131
+ "Please remove the dataset(s) first."
132
+ )
133
+
134
+ metastore.remove_project(project.id)
@@ -9,6 +9,25 @@ N = TypeVar("N", bound="Namespace")
9
9
  NAMESPACE_NAME_RESERVED_CHARS = [".", "@"]
10
10
 
11
11
 
12
+ def parse_name(name: str) -> tuple[str, Optional[str]]:
13
+ """
14
+ Parses namespace name into namespace and optional project name.
15
+ If both namespace and project are defined in name, they need to be split by dot
16
+ e.g dev.my-project
17
+ Valid inputs:
18
+ - dev.my-project
19
+ - dev
20
+ """
21
+ parts = name.split(".")
22
+ if len(parts) == 1:
23
+ return name, None
24
+ if len(parts) == 2:
25
+ return parts[0], parts[1]
26
+ raise InvalidNamespaceNameError(
27
+ f"Invalid namespace format: {name}. Expected 'namespace' or 'ns1.ns2'."
28
+ )
29
+
30
+
12
31
  @dataclass(frozen=True)
13
32
  class Namespace:
14
33
  id: int
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datachain
3
- Version: 0.31.4
3
+ Version: 0.32.0
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
@@ -3,11 +3,14 @@ import pytest
3
3
  from datachain.error import (
4
4
  InvalidNamespaceNameError,
5
5
  NamespaceCreateNotAllowedError,
6
+ NamespaceDeleteNotAllowedError,
6
7
  NamespaceNotFoundError,
7
8
  )
8
9
  from datachain.lib.namespaces import create as create_namespace
10
+ from datachain.lib.namespaces import delete as delete_namespace
9
11
  from datachain.lib.namespaces import get as get_namespace
10
12
  from datachain.lib.namespaces import ls as ls_namespaces
13
+ from datachain.lib.projects import create as create_project
11
14
  from tests.utils import skip_if_not_sqlite
12
15
 
13
16
 
@@ -77,3 +80,45 @@ def test_ls_namespaces_just_local(test_session):
77
80
  system_namespace_name = test_session.catalog.metastore.system_namespace_name
78
81
  namespaces = ls_namespaces(session=test_session)
79
82
  assert [n.name for n in namespaces] == [system_namespace_name]
83
+
84
+
85
+ def test_delete_namespace(test_session, dev_namespace):
86
+ delete_namespace(dev_namespace.name, session=test_session)
87
+ with pytest.raises(NamespaceNotFoundError):
88
+ get_namespace(dev_namespace.name, session=test_session)
89
+
90
+
91
+ def test_delete_namespace_not_found(test_session, dev_namespace):
92
+ with pytest.raises(NamespaceNotFoundError):
93
+ delete_namespace("missing", session=test_session)
94
+
95
+
96
+ def test_delete_namespace_system(test_session):
97
+ metastore = test_session.catalog.metastore
98
+ with pytest.raises(NamespaceDeleteNotAllowedError) as excinfo:
99
+ delete_namespace(metastore.system_namespace_name, session=test_session)
100
+ assert str(excinfo.value) == (
101
+ f"Namespace {metastore.system_namespace_name} cannot be removed"
102
+ )
103
+
104
+
105
+ def test_delete_namespace_default(test_session):
106
+ metastore = test_session.catalog.metastore
107
+ metastore.create_namespace(metastore.default_namespace_name, validate=False)
108
+ with pytest.raises(NamespaceDeleteNotAllowedError) as excinfo:
109
+ delete_namespace(metastore.default_namespace_name, session=test_session)
110
+ assert str(excinfo.value) == (
111
+ f"Namespace {metastore.default_namespace_name} cannot be removed"
112
+ )
113
+
114
+
115
+ def test_delete_namespace_non_empty(test_session, dev_namespace):
116
+ create_project(dev_namespace.name, "my-project")
117
+
118
+ with pytest.raises(NamespaceDeleteNotAllowedError) as excinfo:
119
+ delete_namespace(dev_namespace.name, session=test_session)
120
+
121
+ assert str(excinfo.value) == (
122
+ "Namespace cannot be removed. It contains 1 project(s)."
123
+ " Please remove the project(s) first."
124
+ )
@@ -4,9 +4,11 @@ import datachain as dc
4
4
  from datachain.error import (
5
5
  InvalidProjectNameError,
6
6
  ProjectCreateNotAllowedError,
7
+ ProjectDeleteNotAllowedError,
7
8
  ProjectNotFoundError,
8
9
  )
9
10
  from datachain.lib.namespaces import create as create_namespace
11
+ from datachain.lib.namespaces import delete as delete_namespace
10
12
  from datachain.lib.namespaces import get as get_namespace
11
13
  from datachain.lib.projects import get as get_project
12
14
  from datachain.lib.projects import ls as ls_projects
@@ -155,3 +157,61 @@ def test_ls_projects_empty_in_namespace(test_session):
155
157
  create_namespace("ns1")
156
158
  projects = ls_projects("ns1", session=test_session)
157
159
  assert [(p.namespace.name, p.name) for p in projects] == []
160
+
161
+
162
+ def test_delete_project(test_session, chatbot_project, dev_namespace):
163
+ delete_namespace(
164
+ f"{dev_namespace.name}.{chatbot_project.name}", session=test_session
165
+ )
166
+ with pytest.raises(ProjectNotFoundError):
167
+ get_project(chatbot_project.name, dev_namespace.name, session=test_session)
168
+
169
+ # namespace should not be deleted
170
+ get_namespace(dev_namespace.name, session=test_session)
171
+
172
+
173
+ def test_delete_project_not_found(test_session, chatbot_project, dev_namespace):
174
+ with pytest.raises(ProjectNotFoundError):
175
+ delete_namespace(f"{dev_namespace.name}.missing", session=test_session)
176
+
177
+
178
+ def test_delete_project_listing(test_session):
179
+ metastore = test_session.catalog.metastore
180
+ with pytest.raises(ProjectDeleteNotAllowedError) as excinfo:
181
+ delete_namespace(
182
+ f"{metastore.system_namespace_name}.{metastore.listing_project_name}",
183
+ session=test_session,
184
+ )
185
+ assert str(excinfo.value) == (
186
+ f"Project {metastore.listing_project_name} cannot be removed"
187
+ )
188
+
189
+
190
+ def test_delete_project_default(test_session):
191
+ metastore = test_session.catalog.metastore
192
+ with pytest.raises(ProjectDeleteNotAllowedError) as excinfo:
193
+ delete_namespace(
194
+ f"{metastore.default_namespace_name}.{metastore.default_project_name}",
195
+ session=test_session,
196
+ )
197
+ assert str(excinfo.value) == (
198
+ f"Project {metastore.default_project_name} cannot be removed"
199
+ )
200
+
201
+
202
+ def test_delete_project_non_empty(test_session, chatbot_project, dev_namespace):
203
+ (
204
+ dc.read_values(num=[1, 2, 3])
205
+ .settings(namespace=dev_namespace.name, project=chatbot_project.name)
206
+ .save("numbers")
207
+ )
208
+
209
+ with pytest.raises(ProjectDeleteNotAllowedError) as excinfo:
210
+ delete_namespace(
211
+ f"{dev_namespace.name}.{chatbot_project.name}", session=test_session
212
+ )
213
+
214
+ assert str(excinfo.value) == (
215
+ "Project cannot be removed. It contains 1 dataset(s)."
216
+ " Please remove the dataset(s) first."
217
+ )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes