From 75877d107dbba3b8bbdbf72b773afd1e18a48cce Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Mon, 13 Jan 2025 23:48:20 +0700 Subject: [PATCH 01/63] Add video models + functions --- pyproject.toml | 6 + src/datachain/lib/file.py | 59 +++++++- src/datachain/lib/vfile.py | 0 src/datachain/lib/video.py | 273 +++++++++++++++++++++++++++++++++++++ 4 files changed, 337 insertions(+), 1 deletion(-) delete mode 100644 src/datachain/lib/vfile.py create mode 100644 src/datachain/lib/video.py diff --git a/pyproject.toml b/pyproject.toml index 48129fb76..9c5d6f61b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,6 +77,12 @@ hf = [ "numba>=0.60.0", "datasets[audio,vision]>=2.21.0" ] +video = [ + "av<14", + "imageio[ffmpeg]", + "moviepy", + "opencv-python" +] tests = [ "datachain[torch,remote,vector,hf]", "pytest>=8,<9", diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 1aaa3fc91..5a480c3f0 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -39,7 +39,7 @@ # how to create file path when exporting ExportPlacement = Literal["filename", "etag", "fullpath", "checksum"] -FileType = Literal["binary", "text", "image"] +FileType = Literal["binary", "text", "image", "video", "video_clip", "video_frame"] class VFileError(DataChainError): @@ -231,6 +231,10 @@ def read_text(self): with self.open(mode="r") as stream: return stream.read() + def stream(self) -> BytesIO: + """Returns file contents as BytesIO stream.""" + return BytesIO(self.read()) + def save(self, destination: str): """Writes it's content to destination""" with open(destination, mode="wb") as f: @@ -454,6 +458,53 @@ def save(self, destination: str): self.read().save(destination) +class ImageMeta(DataModel): + """`DataModel` for image file meta information.""" + + width: int + height: int + format: str + + +class VideoFile(File): + """`DataModel` for reading video files.""" + + +class VideoClip(VideoFile): + """`DataModel` for reading video clips.""" + + start_time: float + end_time: float + + +class VideoFrame(VideoFile): + """`DataModel` for reading video frames.""" + + frame: int + timestamp: float + + +class VideoMeta(DataModel): + """`DataModel` for video file meta information.""" + + width: int + height: int + fps: float + duration: float + frames_count: int + codec: str + + +class VideoFrameMeta(DataModel): + """`DataModel` for video frame image meta information.""" + + frame: int + timestamp: float + width: int + height: int + format: str + + class ArrowRow(DataModel): """`DataModel` for reading row from Arrow-supported file.""" @@ -489,5 +540,11 @@ def get_file_type(type_: FileType = "binary") -> type[File]: file = TextFile elif type_ == "image": file = ImageFile # type: ignore[assignment] + elif type_ == "video": + file = VideoFile + elif type_ == "video_clip": + file = VideoClip + elif type_ == "video_frame": + file = VideoFrame return file diff --git a/src/datachain/lib/vfile.py b/src/datachain/lib/vfile.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py new file mode 100644 index 000000000..74dedeb71 --- /dev/null +++ b/src/datachain/lib/video.py @@ -0,0 +1,273 @@ +import os.path +import pathlib +from typing import TYPE_CHECKING, Optional, Union + +from datachain.lib.file import VideoMeta + +if TYPE_CHECKING: + from collections.abc import Iterator + + from numpy import ndarray + + from datachain.lib.file import VideoFile + +try: + import imageio.v3 as iio + from moviepy.video.io.VideoFileClip import VideoFileClip +except ImportError as exc: + raise ImportError( + "Missing dependencies for processing video:\n" + "To install run:\n\n" + " pip install 'datachain[video]'\n" + ) from exc + + +def video_meta(file: "VideoFile") -> VideoMeta: + """ + Returns video file meta information. + + Args: + file (VideoFile): VideoFile object. + + Returns: + VideoMeta: Video file meta information. + """ + props = iio.improps(file.stream(), plugin="pyav") + frames_count, width, height, _ = props.shape + + meta = iio.immeta(file.stream(), plugin="pyav") + fps = meta["fps"] + codec = meta["codec"] + duration = meta["duration"] + + return VideoMeta( + width=width, + height=height, + fps=fps, + duration=duration, + frames_count=frames_count, + codec=codec, + ) + + +def video_frame_np(file: "VideoFile", frame: int) -> "ndarray": + """ + Reads video frame from a file. + + Args: + file (VideoFile): VideoFile object. + frame (int): Frame number to read. + + Returns: + ndarray: Video frame. + """ + if frame < 0: + raise ValueError("frame must be a non-negative integer.") + + return iio.imread(file.stream(), index=frame, plugin="pyav") + + +def video_frame(file: "VideoFile", frame: int, format: str = "jpeg") -> bytes: + """ + Reads video frame from a file and returns as image bytes. + + Args: + file (VideoFile): VideoFile object. + frame (int): Frame number to read. + format (str): Image format (default: 'jpeg'). + + Returns: + bytes: Video frame image as bytes. + """ + img = video_frame_np(file, frame) + return iio.imwrite("", img, extension=f".{format}") + + +def save_video_frame( + file: "VideoFile", + frame: int, + output_file: Union[str, pathlib.Path], + format: str = "jpeg", +) -> None: + """ + Saves video frame as an image file. + + Args: + file (VideoFile): VideoFile object. + frame (int): Frame number to read. + output_file (Union[str, pathlib.Path]): Output file path. + format (str): Image format (default: 'jpeg'). + """ + img = video_frame_np(file, frame) + iio.imwrite(output_file, img, extension=f".{format}") + + +def video_frames_np( + file: "VideoFile", + start_frame: int = 0, + end_frame: Optional[int] = None, + step: int = 1, +) -> "Iterator[ndarray]": + """ + Reads video frames from a file. + + Args: + file (VideoFile): VideoFile object. + start_frame (int): Frame number to start reading from (default: 0). + end_frame (int): Frame number to stop reading at (default: None). + step (int): Step size for reading frames (default: 1). + + Returns: + Iterator[ndarray]: Iterator of video frames. + """ + if start_frame < 0: + raise ValueError("start_frame must be a non-negative integer.") + if end_frame is not None: + if end_frame < 0: + raise ValueError("end_frame must be a non-negative integer.") + if start_frame > end_frame: + raise ValueError("start_frame must be less than or equal to end_frame.") + if step < 1: + raise ValueError("step must be a positive integer.") + + # Compute the frame shift to determine the number of frames to skip, + # considering the start frame and step size + frame_shift = start_frame % step + + # Iterate over video frames and yield only those within the specified range and step + for frame, img in enumerate(iio.imiter(file.stream(), plugin="pyav")): + if frame < start_frame: + continue + if (frame - frame_shift) % step != 0: + continue + if end_frame is not None and frame > end_frame: + break + yield img + + +def video_frames( + file: "VideoFile", + start_frame: int = 0, + end_frame: Optional[int] = None, + step: int = 1, + format: str = "jpeg", +) -> "Iterator[bytes]": + """ + Reads video frames from a file and returns as bytes. + + Args: + file (VideoFile): VideoFile object. + start_frame (int): Frame number to start reading from (default: 0). + end_frame (int): Frame number to stop reading at (default: None). + step (int): Step size for reading frames (default: 1). + format (str): Image format (default: 'jpeg'). + + Returns: + Iterator[bytes]: Iterator of video frames. + """ + for img in video_frames_np(file, start_frame, end_frame, step): + yield iio.imwrite("", img, extension=f".{format}") + + +def save_video_frames( + file: "VideoFile", + output_dir: Union[str, pathlib.Path], + start_frame: int = 0, + end_frame: Optional[int] = None, + step: int = 1, + format: str = "jpeg", +) -> "Iterator[str]": + """ + Saves video frames as image files. + + Args: + file (VideoFile): VideoFile object. + output_dir (Union[str, pathlib.Path]): Output directory path. + start_frame (int): Frame number to start reading from (default: 0). + end_frame (int): Frame number to stop reading at (default: None). + step (int): Step size for reading frames (default: 1). + format (str): Image format (default: 'jpeg'). + + Returns: + Iterator[str]: List of output file paths. + """ + file_stem = file.get_file_stem() + + for i, img in enumerate(video_frames_np(file, start_frame, end_frame, step)): + frame = start_frame + i * step + output_file = os.path.join(output_dir, f"{file_stem}_{frame:06d}.{format}") + iio.imwrite(output_file, img, extension=f".{format}") + yield output_file + + +def save_video_clip( + file: "VideoFile", + start_time: float, + end_time: float, + output_file: Union[str, pathlib.Path], + codec: str = "libx264", + audio_codec: str = "aac", +) -> None: + """ + Saves video interval as a new video file. + + Args: + file (VideoFile): VideoFile object. + start_time (float): Start time in seconds. + end_time (float): End time in seconds. + output_file (Union[str, pathlib.Path]): Output file path. + codec (str): Video codec for encoding (default: 'libx264'). + audio_codec (str): Audio codec for encoding (default: 'aac'). + """ + video = VideoFileClip(file.stream()) + + if start_time < 0 or end_time > video.duration or start_time >= end_time: + raise ValueError(f"Invalid time range: ({start_time}, {end_time}).") + + clip = video.subclip(start_time, end_time) + clip.write_videofile(output_file, codec=codec, audio_codec=audio_codec) + video.close() + + +def save_video_clips( + file: "VideoFile", + intervals: list[tuple[float, float]], + output_dir: Union[str, pathlib.Path], + codec: str = "libx264", + audio_codec: str = "aac", +) -> "Iterator[str]": + """ + Saves video interval as a new video file. + + Args: + file (VideoFile): VideoFile object. + intervals (list[tuple[float, float]]): List of start and end times in seconds. + output_dir (Union[str, pathlib.Path]): Output directory path. + codec (str): Video codec for encoding (default: 'libx264'). + audio_codec (str): Audio codec for encoding (default: 'aac'). + + Returns: + Iterator[str]: List of output file paths. + """ + file_stem = file.get_file_stem() + file_ext = file.get_file_ext() + + video = VideoFileClip(file.stream()) + + for i, (start, end) in enumerate(intervals): + if start < 0 or end > video.duration or start >= end: + print(f"Invalid time range: ({start}, {end}). Skipping this segment.") + continue + + # Extract the segment + clip = video.subclip(start, end) + + # Define the output file name + output_file = os.path.join(output_dir, f"{file_stem}_{i+1}.{file_ext}") + + # Write the video segment to file + clip.write_videofile(output_file, codec=codec, audio_codec=audio_codec) + + yield output_file + + video.close() From 031b9df63dc3a5c5d31fa6a3d3774c586227bc48 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 14 Jan 2025 22:24:40 +0700 Subject: [PATCH 02/63] Code review update --- src/datachain/lib/file.py | 52 ++++++++++++++++++-------------------- src/datachain/lib/video.py | 10 ++++---- 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 5a480c3f0..b1a4c3801 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -16,7 +16,7 @@ from urllib.request import url2pathname from fsspec.callbacks import DEFAULT_CALLBACK, Callback -from PIL import Image +from PIL import Image as PilImage from pydantic import Field, field_validator from datachain.client.fileslice import FileSlice @@ -39,7 +39,7 @@ # how to create file path when exporting ExportPlacement = Literal["filename", "etag", "fullpath", "checksum"] -FileType = Literal["binary", "text", "image", "video", "video_clip", "video_frame"] +FileType = Literal["binary", "text", "image", "video"] class VFileError(DataChainError): @@ -451,19 +451,19 @@ class ImageFile(File): def read(self): """Returns `PIL.Image.Image` object.""" fobj = super().read() - return Image.open(BytesIO(fobj)) + return PilImage.open(BytesIO(fobj)) def save(self, destination: str): """Writes it's content to destination""" self.read().save(destination) -class ImageMeta(DataModel): +class Image(DataModel): """`DataModel` for image file meta information.""" - width: int - height: int - format: str + width: int = Field(default=0) + height: int = Field(default=0) + format: str = Field(default="") class VideoFile(File): @@ -473,36 +473,36 @@ class VideoFile(File): class VideoClip(VideoFile): """`DataModel` for reading video clips.""" - start_time: float - end_time: float + start: float = Field(default=0) + end: float = Field(default=0) class VideoFrame(VideoFile): """`DataModel` for reading video frames.""" - frame: int - timestamp: float + frame: int = Field(default=0) + timestamp: float = Field(default=0) -class VideoMeta(DataModel): +class Video(DataModel): """`DataModel` for video file meta information.""" - width: int - height: int - fps: float - duration: float - frames_count: int - codec: str + width: int = Field(default=0) + height: int = Field(default=0) + fps: float = Field(default=0) + duration: float = Field(default=0) + frames: int = Field(default=0) + codec: str = Field(default="") -class VideoFrameMeta(DataModel): +class Frame(DataModel): """`DataModel` for video frame image meta information.""" - frame: int - timestamp: float - width: int - height: int - format: str + frame: int = Field(default=0) + timestamp: float = Field(default=0) + width: int = Field(default=0) + height: int = Field(default=0) + format: str = Field(default="") class ArrowRow(DataModel): @@ -542,9 +542,5 @@ def get_file_type(type_: FileType = "binary") -> type[File]: file = ImageFile # type: ignore[assignment] elif type_ == "video": file = VideoFile - elif type_ == "video_clip": - file = VideoClip - elif type_ == "video_frame": - file = VideoFrame return file diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 74dedeb71..f5eb10a9d 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -2,7 +2,7 @@ import pathlib from typing import TYPE_CHECKING, Optional, Union -from datachain.lib.file import VideoMeta +from datachain.lib.file import Video if TYPE_CHECKING: from collections.abc import Iterator @@ -22,7 +22,7 @@ ) from exc -def video_meta(file: "VideoFile") -> VideoMeta: +def video_meta(file: "VideoFile") -> Video: """ Returns video file meta information. @@ -30,7 +30,7 @@ def video_meta(file: "VideoFile") -> VideoMeta: file (VideoFile): VideoFile object. Returns: - VideoMeta: Video file meta information. + Video: Video file meta information. """ props = iio.improps(file.stream(), plugin="pyav") frames_count, width, height, _ = props.shape @@ -40,12 +40,12 @@ def video_meta(file: "VideoFile") -> VideoMeta: codec = meta["codec"] duration = meta["duration"] - return VideoMeta( + return Video( width=width, height=height, fps=fps, duration=duration, - frames_count=frames_count, + frames=frames_count, codec=codec, ) From 548bbd5dd4b569fea9831e9cebb60f1f5ae5b9fc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:25:16 +0000 Subject: [PATCH 03/63] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/datachain/lib/video.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index f5eb10a9d..6e269b641 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -263,7 +263,7 @@ def save_video_clips( clip = video.subclip(start, end) # Define the output file name - output_file = os.path.join(output_dir, f"{file_stem}_{i+1}.{file_ext}") + output_file = os.path.join(output_dir, f"{file_stem}_{i + 1}.{file_ext}") # Write the video segment to file clip.write_videofile(output_file, codec=codec, audio_codec=audio_codec) From b55149add6f375a09aa1e13b336d8a291ac1fdc1 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 14 Jan 2025 22:26:23 +0700 Subject: [PATCH 04/63] Code review update --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 9c5d6f61b..20a519471 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,6 +78,8 @@ hf = [ "datasets[audio,vision]>=2.21.0" ] video = [ + # Use 'av<14' because of incompatibility with imageio + # See https://github.com/PyAV-Org/PyAV/discussions/1700 "av<14", "imageio[ffmpeg]", "moviepy", From 2cd6d628d27440e43b2bdbb370d4cf7fa96031fe Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 15 Jan 2025 08:48:41 +0700 Subject: [PATCH 05/63] Code review update --- src/datachain/lib/hf.py | 2 +- src/datachain/lib/video.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/datachain/lib/hf.py b/src/datachain/lib/hf.py index 763fe9167..73952bfde 100644 --- a/src/datachain/lib/hf.py +++ b/src/datachain/lib/hf.py @@ -20,7 +20,7 @@ except ImportError as exc: raise ImportError( - "Missing dependencies for huggingface datasets:\n" + "Missing dependencies for huggingface datasets.\n" "To install run:\n\n" " pip install 'datachain[hf]'\n" ) from exc diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 6e269b641..47969618f 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -16,7 +16,7 @@ from moviepy.video.io.VideoFileClip import VideoFileClip except ImportError as exc: raise ImportError( - "Missing dependencies for processing video:\n" + "Missing dependencies for processing video.\n" "To install run:\n\n" " pip install 'datachain[video]'\n" ) from exc From 5892ab90d71bc160ae44b0448de9abe552017d70 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 15 Jan 2025 23:24:06 +0700 Subject: [PATCH 06/63] Small fixes due to work on usage examples --- src/datachain/lib/file.py | 1 + src/datachain/lib/video.py | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index b1a4c3801..1c1bc1496 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -492,6 +492,7 @@ class Video(DataModel): fps: float = Field(default=0) duration: float = Field(default=0) frames: int = Field(default=0) + format: str = Field(default="") codec: str = Field(default="") diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 47969618f..f96946bbb 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -33,19 +33,21 @@ def video_meta(file: "VideoFile") -> Video: Video: Video file meta information. """ props = iio.improps(file.stream(), plugin="pyav") - frames_count, width, height, _ = props.shape + frames, width, height, _ = props.shape meta = iio.immeta(file.stream(), plugin="pyav") - fps = meta["fps"] - codec = meta["codec"] - duration = meta["duration"] + fps = meta.get("fps", 0) + duration = meta.get("duration", 0) + format = meta.get("video_format", "") + codec = meta.get("codec", "") return Video( width=width, height=height, fps=fps, duration=duration, - frames=frames_count, + frames=frames, + format=format, codec=codec, ) From f3dc66a82cbdf3722a08178f334a0f4d09bf406d Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 21 Jan 2025 02:07:23 +0700 Subject: [PATCH 07/63] Examples fixes --- pyproject.toml | 2 +- src/datachain/lib/video.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 20a519471..c592c1efd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,7 +82,7 @@ video = [ # See https://github.com/PyAV-Org/PyAV/discussions/1700 "av<14", "imageio[ffmpeg]", - "moviepy", + "moviepy<2", "opencv-python" ] tests = [ diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index f96946bbb..81ace913c 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -221,7 +221,7 @@ def save_video_clip( codec (str): Video codec for encoding (default: 'libx264'). audio_codec (str): Audio codec for encoding (default: 'aac'). """ - video = VideoFileClip(file.stream()) + video = VideoFileClip(file.get_local_path()) if start_time < 0 or end_time > video.duration or start_time >= end_time: raise ValueError(f"Invalid time range: ({start_time}, {end_time}).") From 65529f3cde166cabc522c0bcaf6e35ffec880b3b Mon Sep 17 00:00:00 2001 From: Ivan Shcheklein Date: Mon, 13 Jan 2025 09:00:26 -0800 Subject: [PATCH 08/63] docs(merge): add examples with Func object (#811) --- src/datachain/lib/dc.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/datachain/lib/dc.py b/src/datachain/lib/dc.py index 8b3cc79b0..4f84255a4 100644 --- a/src/datachain/lib/dc.py +++ b/src/datachain/lib/dc.py @@ -1330,19 +1330,27 @@ def merge( Parameters: right_ds: Chain to join with. - on: Predicate or list of Predicates to join on. If both chains have the - same predicates then this predicate is enough for the join. Otherwise, - `right_on` parameter has to specify the predicates for the other chain. - right_on: Optional predicate or list of Predicates - for the `right_ds` to join. + on: Predicate ("column.name", C("column.name"), or Func) or list of + Predicates to join on. If both chains have the same predicates then + this predicate is enough for the join. Otherwise, `right_on` parameter + has to specify the predicates for the other chain. + right_on: Optional predicate or list of Predicates for the `right_ds` + to join. inner (bool): Whether to run inner join or outer join. - rname (str): name prefix for conflicting signal names. + rname (str): Name prefix for conflicting signal names. - Example: + Examples: ```py meta = meta_emd.merge(meta_pq, on=(C.name, C.emd__index), right_on=(C.name, C.pq__index)) ``` + + ```py + imgs.merge(captions, + on=func.path.file_stem(imgs.c("file.path")), + right_on=func.path.file_stem(captions.c("file.path")) + ``` + ) """ if on is None: raise DatasetMergeError(["None"], None, "'on' must be specified") From b0440825bc432c85bf7e54b8f0e0ddf7ee3170f1 Mon Sep 17 00:00:00 2001 From: Ivan Shcheklein Date: Mon, 13 Jan 2025 13:18:47 -0800 Subject: [PATCH 09/63] fix(tqdm): import tqdm to support jupyter (#812) --- src/datachain/cache.py | 6 +- src/datachain/catalog/catalog.py | 2 +- src/datachain/client/azure.py | 2 +- src/datachain/client/fsspec.py | 2 +- src/datachain/client/gcs.py | 2 +- src/datachain/client/s3.py | 2 +- src/datachain/data_storage/sqlite.py | 2 +- src/datachain/data_storage/warehouse.py | 2 +- src/datachain/lib/arrow.py | 2 +- src/datachain/lib/hf.py | 2 +- src/datachain/listing.py | 2 +- src/datachain/progress.py | 126 +----------------------- src/datachain/query/dataset.py | 9 +- 13 files changed, 23 insertions(+), 138 deletions(-) diff --git a/src/datachain/cache.py b/src/datachain/cache.py index ae8457d98..959a85175 100644 --- a/src/datachain/cache.py +++ b/src/datachain/cache.py @@ -9,8 +9,6 @@ from dvc_objects.fs.utils import remove from fsspec.callbacks import Callback, TqdmCallback -from .progress import Tqdm - if TYPE_CHECKING: from datachain.client import Client from datachain.lib.file import File @@ -86,9 +84,11 @@ async def download( size = file.size if size < 0: size = await client.get_size(from_path, version_id=file.version) + from tqdm.auto import tqdm + cb = callback or TqdmCallback( tqdm_kwargs={"desc": odb_fs.name(from_path), "bytes": True, "leave": False}, - tqdm_cls=Tqdm, + tqdm_cls=tqdm, size=size, ) try: diff --git a/src/datachain/catalog/catalog.py b/src/datachain/catalog/catalog.py index 44d1eba48..06099ff10 100644 --- a/src/datachain/catalog/catalog.py +++ b/src/datachain/catalog/catalog.py @@ -28,7 +28,7 @@ import sqlalchemy as sa import yaml from sqlalchemy import Column -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.cache import DataChainCache from datachain.client import Client diff --git a/src/datachain/client/azure.py b/src/datachain/client/azure.py index 4e52bc28e..719c5da77 100644 --- a/src/datachain/client/azure.py +++ b/src/datachain/client/azure.py @@ -2,7 +2,7 @@ from urllib.parse import parse_qs, urlsplit, urlunsplit from adlfs import AzureBlobFileSystem -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.lib.file import File diff --git a/src/datachain/client/fsspec.py b/src/datachain/client/fsspec.py index c9f99259a..8c8a64170 100644 --- a/src/datachain/client/fsspec.py +++ b/src/datachain/client/fsspec.py @@ -23,7 +23,7 @@ from dvc_objects.fs.system import reflink from fsspec.asyn import get_loop, sync from fsspec.callbacks import DEFAULT_CALLBACK, Callback -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.cache import DataChainCache from datachain.client.fileslice import FileWrapper diff --git a/src/datachain/client/gcs.py b/src/datachain/client/gcs.py index 5a48a6139..7473d6019 100644 --- a/src/datachain/client/gcs.py +++ b/src/datachain/client/gcs.py @@ -7,7 +7,7 @@ from dateutil.parser import isoparse from gcsfs import GCSFileSystem -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.lib.file import File diff --git a/src/datachain/client/s3.py b/src/datachain/client/s3.py index c8cec7ca8..dc4f7947b 100644 --- a/src/datachain/client/s3.py +++ b/src/datachain/client/s3.py @@ -5,7 +5,7 @@ from botocore.exceptions import NoCredentialsError from s3fs import S3FileSystem -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.lib.file import File diff --git a/src/datachain/data_storage/sqlite.py b/src/datachain/data_storage/sqlite.py index f6fde728a..65dea3b3a 100644 --- a/src/datachain/data_storage/sqlite.py +++ b/src/datachain/data_storage/sqlite.py @@ -21,7 +21,7 @@ from sqlalchemy.sql import func from sqlalchemy.sql.expression import bindparam, cast from sqlalchemy.sql.selectable import Select -from tqdm import tqdm +from tqdm.auto import tqdm import datachain.sql.sqlite from datachain.data_storage import AbstractDBMetastore, AbstractWarehouse diff --git a/src/datachain/data_storage/warehouse.py b/src/datachain/data_storage/warehouse.py index 32dfb5385..f53a4bb4a 100644 --- a/src/datachain/data_storage/warehouse.py +++ b/src/datachain/data_storage/warehouse.py @@ -14,7 +14,7 @@ from sqlalchemy import Table, case, select from sqlalchemy.sql import func from sqlalchemy.sql.expression import true -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.client import Client from datachain.data_storage.schema import convert_rows_custom_column_types diff --git a/src/datachain/lib/arrow.py b/src/datachain/lib/arrow.py index 5c906d5ed..28954477b 100644 --- a/src/datachain/lib/arrow.py +++ b/src/datachain/lib/arrow.py @@ -7,7 +7,7 @@ import pyarrow as pa from fsspec.core import split_protocol from pyarrow.dataset import CsvFileFormat, dataset -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.lib.data_model import dict_to_data_model from datachain.lib.file import ArrowRow, File diff --git a/src/datachain/lib/hf.py b/src/datachain/lib/hf.py index 73952bfde..2e31c7f84 100644 --- a/src/datachain/lib/hf.py +++ b/src/datachain/lib/hf.py @@ -29,7 +29,7 @@ from typing import TYPE_CHECKING, Any, Union import PIL -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.lib.arrow import arrow_type_mapper from datachain.lib.data_model import DataModel, DataType, dict_to_data_model diff --git a/src/datachain/listing.py b/src/datachain/listing.py index 4311c7f3b..8d2ab76c6 100644 --- a/src/datachain/listing.py +++ b/src/datachain/listing.py @@ -7,7 +7,7 @@ from sqlalchemy import Column from sqlalchemy.sql import func -from tqdm import tqdm +from tqdm.auto import tqdm from datachain.node import DirType, Node, NodeWithPath from datachain.sql.functions import path as pathfunc diff --git a/src/datachain/progress.py b/src/datachain/progress.py index c7e5e80cc..cf681fa43 100644 --- a/src/datachain/progress.py +++ b/src/datachain/progress.py @@ -1,138 +1,16 @@ """Manages progress bars.""" import logging -import sys from threading import RLock -from typing import Any, ClassVar from fsspec import Callback from fsspec.callbacks import TqdmCallback -from tqdm import tqdm - -from datachain.utils import env2bool +from tqdm.auto import tqdm logger = logging.getLogger(__name__) tqdm.set_lock(RLock()) -class Tqdm(tqdm): - """ - maximum-compatibility tqdm-based progressbars - """ - - BAR_FMT_DEFAULT = ( - "{percentage:3.0f}% {desc}|{bar}|" - "{postfix[info]}{n_fmt}/{total_fmt}" - " [{elapsed}<{remaining}, {rate_fmt:>11}]" - ) - # nested bars should have fixed bar widths to align nicely - BAR_FMT_DEFAULT_NESTED = ( - "{percentage:3.0f}%|{bar:10}|{desc:{ncols_desc}.{ncols_desc}}" - "{postfix[info]}{n_fmt}/{total_fmt}" - " [{elapsed}<{remaining}, {rate_fmt:>11}]" - ) - BAR_FMT_NOTOTAL = "{desc}{bar:b}|{postfix[info]}{n_fmt} [{elapsed}, {rate_fmt:>11}]" - BYTES_DEFAULTS: ClassVar[dict[str, Any]] = { - "unit": "B", - "unit_scale": True, - "unit_divisor": 1024, - "miniters": 1, - } - - def __init__( - self, - iterable=None, - disable=None, - level=logging.ERROR, - desc=None, - leave=False, - bar_format=None, - bytes=False, - file=None, - total=None, - postfix=None, - **kwargs, - ): - """ - bytes : shortcut for - `unit='B', unit_scale=True, unit_divisor=1024, miniters=1` - desc : persists after `close()` - level : effective logging level for determining `disable`; - used only if `disable` is unspecified - disable : If (default: None) or False, - will be determined by logging level. - May be overridden to `True` due to non-TTY status. - Skip override by specifying env var `DATACHAIN_IGNORE_ISATTY`. - kwargs : anything accepted by `tqdm.tqdm()` - """ - kwargs = kwargs.copy() - if bytes: - kwargs = self.BYTES_DEFAULTS | kwargs - else: - kwargs.setdefault("unit_scale", total > 999 if total else True) - if file is None: - file = sys.stderr - # auto-disable based on `logger.level` - if not disable: - disable = logger.getEffectiveLevel() > level - # auto-disable based on TTY - if ( - not disable - and not env2bool("DATACHAIN_IGNORE_ISATTY") - and hasattr(file, "isatty") - ): - disable = not file.isatty() - super().__init__( - iterable=iterable, - disable=disable, - leave=leave, - desc=desc, - bar_format="!", - lock_args=(False,), - total=total, - **kwargs, - ) - self.postfix = postfix or {"info": ""} - if bar_format is None: - if self.__len__(): - self.bar_format = ( - self.BAR_FMT_DEFAULT_NESTED if self.pos else self.BAR_FMT_DEFAULT - ) - else: - self.bar_format = self.BAR_FMT_NOTOTAL - else: - self.bar_format = bar_format - self.refresh() - - def close(self): - self.postfix["info"] = "" - # remove ETA (either unknown or zero); remove completed bar - self.bar_format = self.bar_format.replace("<{remaining}", "").replace( - "|{bar:10}|", " " - ) - super().close() - - @property - def format_dict(self): - """inject `ncols_desc` to fill the display width (`ncols`)""" - d = super().format_dict - ncols = d["ncols"] or 80 - # assumes `bar_format` has max one of ("ncols_desc" & "ncols_info") - - meter = self.format_meter( # type: ignore[call-arg] - ncols_desc=1, ncols_info=1, **d - ) - ncols_left = ncols - len(meter) + 1 - ncols_left = max(ncols_left, 0) - if ncols_left: - d["ncols_desc"] = d["ncols_info"] = ncols_left - else: - # work-around for zero-width description - d["ncols_desc"] = d["ncols_info"] = 1 - d["prefix"] = "" - return d - - class CombinedDownloadCallback(Callback): def set_size(self, size): # This is a no-op to prevent fsspec's .get_file() from setting the combined @@ -148,6 +26,8 @@ def __init__(self, tqdm_kwargs=None, *args, **kwargs): self.files_count = 0 tqdm_kwargs = tqdm_kwargs or {} tqdm_kwargs.setdefault("postfix", {}).setdefault("files", self.files_count) + kwargs = kwargs or {} + kwargs["tqdm_cls"] = tqdm super().__init__(tqdm_kwargs, *args, **kwargs) def increment_file_count(self, n: int = 1) -> None: diff --git a/src/datachain/query/dataset.py b/src/datachain/query/dataset.py index 875bbcf25..d1cd22cf5 100644 --- a/src/datachain/query/dataset.py +++ b/src/datachain/query/dataset.py @@ -33,6 +33,7 @@ from sqlalchemy.sql.expression import label from sqlalchemy.sql.schema import TableClause from sqlalchemy.sql.selectable import Select +from tqdm.auto import tqdm from datachain.asyn import ASYNC_WORKERS, AsyncMapper, OrderedMapper from datachain.catalog.catalog import clone_catalog_with_cache @@ -366,12 +367,16 @@ def get_download_callback(suffix: str = "", **kwargs) -> CombinedDownloadCallbac def get_processed_callback() -> Callback: - return TqdmCallback({"desc": "Processed", "unit": " rows", "leave": False}) + return TqdmCallback( + {"desc": "Processed", "unit": " rows", "leave": False}, tqdm_cls=tqdm + ) def get_generated_callback(is_generator: bool = False) -> Callback: if is_generator: - return TqdmCallback({"desc": "Generated", "unit": " rows", "leave": False}) + return TqdmCallback( + {"desc": "Generated", "unit": " rows", "leave": False}, tqdm_cls=tqdm + ) return DEFAULT_CALLBACK From 2a7704764f17a2481049786ce0c05ce7315e94c0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 09:49:05 +1100 Subject: [PATCH 10/63] [pre-commit.ci] pre-commit autoupdate (#815) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.6 → v0.9.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.6...v0.9.1) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- src/datachain/client/local.py | 2 +- src/datachain/lib/convert/unflatten.py | 3 +-- src/datachain/lib/listing.py | 8 ++++---- src/datachain/lib/udf.py | 6 +++--- src/datachain/model/bbox.py | 18 +++++++++--------- src/datachain/model/pose.py | 18 +++++++++--------- src/datachain/model/segment.py | 12 ++++++------ tests/func/test_pull.py | 4 ++-- tests/utils.py | 2 +- 10 files changed, 37 insertions(+), 38 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2ee030168..cfc69d8a9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: - id: trailing-whitespace exclude: '^LICENSES/' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.8.6' + rev: 'v0.9.1' hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] diff --git a/src/datachain/client/local.py b/src/datachain/client/local.py index c1cd29229..baac7f9da 100644 --- a/src/datachain/client/local.py +++ b/src/datachain/client/local.py @@ -38,7 +38,7 @@ def url(self, path: str, expires: int = 3600, **kwargs) -> str: def get_uri(cls, name: str) -> "StorageURI": from datachain.dataset import StorageURI - return StorageURI(f'{cls.PREFIX}/{name.removeprefix("/")}') + return StorageURI(f"{cls.PREFIX}/{name.removeprefix('/')}") @classmethod def ls_buckets(cls, **kwargs): diff --git a/src/datachain/lib/convert/unflatten.py b/src/datachain/lib/convert/unflatten.py index a41a4b65a..68bb3ff3a 100644 --- a/src/datachain/lib/convert/unflatten.py +++ b/src/datachain/lib/convert/unflatten.py @@ -35,8 +35,7 @@ def unflatten_to_json_pos( def _normalize(name: str) -> str: if DEFAULT_DELIMITER in name: raise RuntimeError( - f"variable '{name}' cannot be used " - f"because it contains {DEFAULT_DELIMITER}" + f"variable '{name}' cannot be used because it contains {DEFAULT_DELIMITER}" ) return _to_snake_case(name) diff --git a/src/datachain/lib/listing.py b/src/datachain/lib/listing.py index ce80536eb..1a05f84b0 100644 --- a/src/datachain/lib/listing.py +++ b/src/datachain/lib/listing.py @@ -113,14 +113,14 @@ def parse_listing_uri(uri: str, cache, client_config) -> tuple[Optional[str], st telemetry.log_param("client", client.PREFIX) if not uri.endswith("/") and _isfile(client, uri): - return None, f'{storage_uri}/{path.lstrip("/")}', path + return None, f"{storage_uri}/{path.lstrip('/')}", path if uses_glob(path): lst_uri_path = posixpath.dirname(path) else: - storage_uri, path = Client.parse_url(f'{uri.rstrip("/")}/') + storage_uri, path = Client.parse_url(f"{uri.rstrip('/')}/") lst_uri_path = path - lst_uri = f'{storage_uri}/{lst_uri_path.lstrip("/")}' + lst_uri = f"{storage_uri}/{lst_uri_path.lstrip('/')}" ds_name = ( f"{LISTING_PREFIX}{storage_uri}/{posixpath.join(lst_uri_path, '').lstrip('/')}" ) @@ -180,7 +180,7 @@ def get_listing( # for local file system we need to fix listing path / prefix # if we are reusing existing listing if isinstance(client, FileClient) and listing and listing.name != ds_name: - list_path = f'{ds_name.strip("/").removeprefix(listing.name)}/{list_path}' + list_path = f"{ds_name.strip('/').removeprefix(listing.name)}/{list_path}" ds_name = listing.name if listing else ds_name diff --git a/src/datachain/lib/udf.py b/src/datachain/lib/udf.py index 4a69ff6fd..717d940b9 100644 --- a/src/datachain/lib/udf.py +++ b/src/datachain/lib/udf.py @@ -391,9 +391,9 @@ def run( ) result_objs = list(self.process_safe(udf_args)) n_objs = len(result_objs) - assert ( - n_objs == n_rows - ), f"{self.name} returns {n_objs} rows, but {n_rows} were expected" + assert n_objs == n_rows, ( + f"{self.name} returns {n_objs} rows, but {n_rows} were expected" + ) udf_outputs = (self._flatten_row(row) for row in result_objs) output = [ {"sys__id": row_id} | dict(zip(self.signal_names, signals)) diff --git a/src/datachain/model/bbox.py b/src/datachain/model/bbox.py index 89fbc2617..4dff3375c 100644 --- a/src/datachain/model/bbox.py +++ b/src/datachain/model/bbox.py @@ -22,9 +22,9 @@ class BBox(DataModel): @staticmethod def from_list(coords: list[float], title: str = "") -> "BBox": assert len(coords) == 4, "Bounding box must be a list of 4 coordinates." - assert all( - isinstance(value, (int, float)) for value in coords - ), "Bounding box coordinates must be floats or integers." + assert all(isinstance(value, (int, float)) for value in coords), ( + "Bounding box coordinates must be floats or integers." + ) return BBox( title=title, coords=[round(c) for c in coords], @@ -64,12 +64,12 @@ class OBBox(DataModel): @staticmethod def from_list(coords: list[float], title: str = "") -> "OBBox": - assert ( - len(coords) == 8 - ), "Oriented bounding box must be a list of 8 coordinates." - assert all( - isinstance(value, (int, float)) for value in coords - ), "Oriented bounding box coordinates must be floats or integers." + assert len(coords) == 8, ( + "Oriented bounding box must be a list of 8 coordinates." + ) + assert all(isinstance(value, (int, float)) for value in coords), ( + "Oriented bounding box coordinates must be floats or integers." + ) return OBBox( title=title, coords=[round(c) for c in coords], diff --git a/src/datachain/model/pose.py b/src/datachain/model/pose.py index 13f476059..0c5f376aa 100644 --- a/src/datachain/model/pose.py +++ b/src/datachain/model/pose.py @@ -22,9 +22,9 @@ class Pose(DataModel): def from_list(points: list[list[float]]) -> "Pose": assert len(points) == 2, "Pose must be a list of 2 lists: x and y coordinates." points_x, points_y = points - assert ( - len(points_x) == len(points_y) == 17 - ), "Pose x and y coordinates must have the same length of 17." + assert len(points_x) == len(points_y) == 17, ( + "Pose x and y coordinates must have the same length of 17." + ) assert all( isinstance(value, (int, float)) for value in [*points_x, *points_y] ), "Pose coordinates must be floats or integers." @@ -61,13 +61,13 @@ class Pose3D(DataModel): @staticmethod def from_list(points: list[list[float]]) -> "Pose3D": - assert ( - len(points) == 3 - ), "Pose3D must be a list of 3 lists: x, y coordinates and visible." + assert len(points) == 3, ( + "Pose3D must be a list of 3 lists: x, y coordinates and visible." + ) points_x, points_y, points_v = points - assert ( - len(points_x) == len(points_y) == len(points_v) == 17 - ), "Pose3D x, y coordinates and visible must have the same length of 17." + assert len(points_x) == len(points_y) == len(points_v) == 17, ( + "Pose3D x, y coordinates and visible must have the same length of 17." + ) assert all( isinstance(value, (int, float)) for value in [*points_x, *points_y, *points_v] diff --git a/src/datachain/model/segment.py b/src/datachain/model/segment.py index 7d58790e0..85fc4e351 100644 --- a/src/datachain/model/segment.py +++ b/src/datachain/model/segment.py @@ -22,13 +22,13 @@ class Segment(DataModel): @staticmethod def from_list(points: list[list[float]], title: str = "") -> "Segment": - assert ( - len(points) == 2 - ), "Segment must be a list of 2 lists: x and y coordinates." + assert len(points) == 2, ( + "Segment must be a list of 2 lists: x and y coordinates." + ) points_x, points_y = points - assert len(points_x) == len( - points_y - ), "Segment x and y coordinates must have the same length." + assert len(points_x) == len(points_y), ( + "Segment x and y coordinates must have the same length." + ) assert all( isinstance(value, (int, float)) for value in [*points_x, *points_y] ), "Segment coordinates must be floats or integers." diff --git a/tests/func/test_pull.py b/tests/func/test_pull.py index e1d0fb76d..4250e0594 100644 --- a/tests/func/test_pull.py +++ b/tests/func/test_pull.py @@ -432,8 +432,8 @@ def test_pull_dataset_local_name_already_exists( catalog.pull_dataset("ds://dogs@v1", local_ds_name=local_ds_name) assert str(exc_info.value) == ( - f'Local dataset ds://{local_ds_name or "dogs"}@v1 already exists with different' - ' uuid, please choose different local dataset name or version' + f"Local dataset ds://{local_ds_name or 'dogs'}@v1 already exists with different" + " uuid, please choose different local dataset name or version" ) # able to save it as version 2 of local dataset name diff --git a/tests/utils.py b/tests/utils.py index 9c79d8a54..a4809db0a 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -65,7 +65,7 @@ def uppercase_scheme(uri: str) -> str: Makes scheme (or protocol) of an url uppercased e.g s3://bucket_name -> S3://bucket_name """ - return f'{uri.split(":")[0].upper()}:{":".join(uri.split(":")[1:])}' + return f"{uri.split(':')[0].upper()}:{':'.join(uri.split(':')[1:])}" def make_tar(tree) -> bytes: From 89ee2f0f15ce225a62635d8bfeaf62b81ac74695 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:35:09 +0545 Subject: [PATCH 11/63] progress: remove unused logging/tqdm lock (#817) --- src/datachain/progress.py | 13 ------------- src/datachain/query/dataset.py | 3 ++- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/datachain/progress.py b/src/datachain/progress.py index cf681fa43..9ed924100 100644 --- a/src/datachain/progress.py +++ b/src/datachain/progress.py @@ -1,14 +1,5 @@ -"""Manages progress bars.""" - -import logging -from threading import RLock - from fsspec import Callback from fsspec.callbacks import TqdmCallback -from tqdm.auto import tqdm - -logger = logging.getLogger(__name__) -tqdm.set_lock(RLock()) class CombinedDownloadCallback(Callback): @@ -24,10 +15,6 @@ def increment_file_count(self, n: int = 1) -> None: class TqdmCombinedDownloadCallback(CombinedDownloadCallback, TqdmCallback): def __init__(self, tqdm_kwargs=None, *args, **kwargs): self.files_count = 0 - tqdm_kwargs = tqdm_kwargs or {} - tqdm_kwargs.setdefault("postfix", {}).setdefault("files", self.files_count) - kwargs = kwargs or {} - kwargs["tqdm_cls"] = tqdm super().__init__(tqdm_kwargs, *args, **kwargs) def increment_file_count(self, n: int = 1) -> None: diff --git a/src/datachain/query/dataset.py b/src/datachain/query/dataset.py index d1cd22cf5..b510b604d 100644 --- a/src/datachain/query/dataset.py +++ b/src/datachain/query/dataset.py @@ -355,7 +355,7 @@ def process_udf_outputs( def get_download_callback(suffix: str = "", **kwargs) -> CombinedDownloadCallback: return TqdmCombinedDownloadCallback( - { + tqdm_kwargs={ "desc": "Download" + suffix, "unit": "B", "unit_scale": True, @@ -363,6 +363,7 @@ def get_download_callback(suffix: str = "", **kwargs) -> CombinedDownloadCallbac "leave": False, **kwargs, }, + tqdm_cls=tqdm, ) From 5f522ad98719a2e21dc407c47ee9b1028c87689b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 21:06:26 -0800 Subject: [PATCH 12/63] build(deps): bump ultralytics from 8.3.58 to 8.3.61 (#816) Bumps [ultralytics](https://github.com/ultralytics/ultralytics) from 8.3.58 to 8.3.61. - [Release notes](https://github.com/ultralytics/ultralytics/releases) - [Commits](https://github.com/ultralytics/ultralytics/compare/v8.3.58...v8.3.61) --- updated-dependencies: - dependency-name: ultralytics dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c592c1efd..d14749032 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,7 +120,7 @@ examples = [ "pdfplumber==0.11.5", "huggingface_hub[hf_transfer]", "onnx==1.16.1", - "ultralytics==8.3.58" + "ultralytics==8.3.61" ] [project.urls] From e2f5a3a8a17c7b591339d6d09ef094480f039acd Mon Sep 17 00:00:00 2001 From: Amrit Ghimire <16842655+amritghimire@users.noreply.github.com> Date: Wed, 15 Jan 2025 08:57:43 +0545 Subject: [PATCH 13/63] Review help/usage for cli commands (#802) * Review help/usage for cli commands The pattern followed is: - Descriptions: Complete sentences with periods - Help messages: Concise phrases without periods - Consistent terminology ("Iterative Studio") - Clear, standardized format for similar arguments * Bring uniformity for Studio mention * Override default command failure * Remove datasets from studio * Fix anon message and remove edatachain message * dirs to directories * Remove studio dataset test --- src/datachain/cli/__init__.py | 16 +++- src/datachain/cli/commands/datasets.py | 5 +- src/datachain/cli/parser/__init__.py | 120 +++++++++++-------------- src/datachain/cli/parser/job.py | 45 +++++----- src/datachain/cli/parser/studio.py | 68 +++++--------- src/datachain/cli/parser/utils.py | 2 +- src/datachain/studio.py | 24 +++-- tests/test_cli_studio.py | 16 ---- 8 files changed, 123 insertions(+), 173 deletions(-) diff --git a/src/datachain/cli/__init__.py b/src/datachain/cli/__init__.py index 4dc088724..3c8f195aa 100644 --- a/src/datachain/cli/__init__.py +++ b/src/datachain/cli/__init__.py @@ -39,6 +39,10 @@ def main(argv: Optional[list[str]] = None) -> int: if args.command in ("internal-run-udf", "internal-run-udf-worker"): return handle_udf(args.command) + if args.command is None: + datachain_parser.print_help(sys.stderr) + return 1 + logger.addHandler(logging.StreamHandler()) logging_level = get_logging_level(args) logger.setLevel(logging_level) @@ -120,12 +124,17 @@ def handle_clone_command(args, catalog): recursive=bool(args.recursive), no_glob=args.no_glob, no_cp=args.no_cp, - edatachain=args.edatachain, - edatachain_file=args.edatachain_file, ) def handle_dataset_command(args, catalog): + if args.datasets_cmd is None: + print( + f"Use 'datachain {args.command} --help' to see available options", + file=sys.stderr, + ) + return 1 + dataset_commands = { "pull": lambda: catalog.pull_dataset( args.dataset, @@ -134,8 +143,6 @@ def handle_dataset_command(args, catalog): local_ds_version=args.local_version, cp=args.cp, force=bool(args.force), - edatachain=args.edatachain, - edatachain_file=args.edatachain_file, ), "edit": lambda: edit_dataset( catalog, @@ -187,6 +194,7 @@ def handle_dataset_command(args, catalog): handler = dataset_commands.get(args.datasets_cmd) if handler: return handler() + raise Exception(f"Unexpected command {args.datasets_cmd}") diff --git a/src/datachain/cli/commands/datasets.py b/src/datachain/cli/commands/datasets.py index 057cf8f25..055702d2a 100644 --- a/src/datachain/cli/commands/datasets.py +++ b/src/datachain/cli/commands/datasets.py @@ -11,6 +11,7 @@ from datachain.cli.utils import determine_flavors from datachain.config import Config from datachain.error import DatasetNotFoundError +from datachain.studio import list_datasets as list_datasets_studio def list_datasets( @@ -20,14 +21,12 @@ def list_datasets( all: bool = True, team: Optional[str] = None, ): - from datachain.studio import list_datasets - token = Config().read().get("studio", {}).get("token") all, local, studio = determine_flavors(studio, local, all, token) local_datasets = set(list_datasets_local(catalog)) if all or local else set() studio_datasets = ( - set(list_datasets(team=team)) if (all or studio) and token else set() + set(list_datasets_studio(team=team)) if (all or studio) and token else set() ) rows = [ diff --git a/src/datachain/cli/parser/__init__.py b/src/datachain/cli/parser/__init__.py index 9a1995d8a..6a3a9222d 100644 --- a/src/datachain/cli/parser/__init__.py +++ b/src/datachain/cli/parser/__init__.py @@ -1,3 +1,4 @@ +import argparse from argparse import ArgumentParser from importlib.metadata import PackageNotFoundError, version @@ -18,7 +19,8 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 __version__ = "unknown" parser = ArgumentParser( - description="DataChain: Wrangle unstructured AI data at scale", prog="datachain" + description="DataChain: Wrangle unstructured AI data at scale.", + prog="datachain", ) parser.add_argument("-V", "--version", action="version", version=__version__) @@ -31,13 +33,13 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 parent_parser.add_argument( "--anon", action="store_true", - help="AWS anon (aka awscli's --no-sign-request)", + help="anon flag for remote storage (like awscli's --no-sign-request)", ) parent_parser.add_argument( "-u", "--update", action="count", default=0, help="Update cache" ) parent_parser.add_argument( - "-v", "--verbose", action="count", default=0, help="Verbose" + "-v", "--verbose", action="count", default=0, help="Be verbose" ) parent_parser.add_argument( "-q", "--quiet", action="count", default=0, help="Be quiet" @@ -46,24 +48,23 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--debug-sql", action="store_true", default=False, - help="Show All SQL Queries (very verbose output, for debugging only)", + help=argparse.SUPPRESS, ) parent_parser.add_argument( "--pdb", action="store_true", default=False, - help="Drop into the pdb debugger on fatal exception", + help=argparse.SUPPRESS, ) subp = parser.add_subparsers( title="Available Commands", metavar="command", dest="command", - help=f"Use `{parser.prog} command --help` for command-specific help.", - required=True, + help=f"Use `{parser.prog} command --help` for command-specific help", ) parse_cp = subp.add_parser( - "cp", parents=[parent_parser], description="Copy data files from the cloud" + "cp", parents=[parent_parser], description="Copy data files from the cloud." ) add_sources_arg(parse_cp).complete = shtab.DIR # type: ignore[attr-defined] parse_cp.add_argument("output", type=str, help="Output") @@ -72,7 +73,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--force", default=False, action="store_true", - help="Force creating outputs", + help="Force creating files even if they already exist", ) parse_cp.add_argument( "-r", @@ -90,7 +91,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 ) parse_clone = subp.add_parser( - "clone", parents=[parent_parser], description="Copy data files from the cloud" + "clone", parents=[parent_parser], description="Copy data files from the cloud." ) add_sources_arg(parse_clone).complete = shtab.DIR # type: ignore[attr-defined] parse_clone.add_argument("output", type=str, help="Output") @@ -121,16 +122,6 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 action="store_true", help="Do not copy files, just create a dataset", ) - parse_clone.add_argument( - "--edatachain", - default=False, - action="store_true", - help="Create a .edatachain file", - ) - parse_clone.add_argument( - "--edatachain-file", - help="Use a different filename for the resulting .edatachain file", - ) add_studio_parser(subp, parent_parser) add_jobs_parser(subp, parent_parser) @@ -139,22 +130,22 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "dataset", aliases=["ds"], parents=[parent_parser], - description="Commands for managing datasers", + description="Commands for managing datasets.", ) datasets_subparser = datasets_parser.add_subparsers( dest="datasets_cmd", - help="Use `datachain datasets CMD --help` to display command specific help", + help="Use `datachain dataset CMD --help` to display command-specific help", ) parse_pull = datasets_subparser.add_parser( "pull", parents=[parent_parser], - description="Pull specific dataset version from SaaS", + description="Pull specific dataset version from Studio.", ) parse_pull.add_argument( "dataset", type=str, - help="Name and version of remote dataset created in SaaS", + help="Name and version of remote dataset created in Studio", ) parse_pull.add_argument("-o", "--output", type=str, help="Output") parse_pull.add_argument( @@ -178,16 +169,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 action="store_true", help="Copy actual files after pulling remote dataset into local DB", ) - parse_pull.add_argument( - "--edatachain", - default=False, - action="store_true", - help="Create .edatachain file", - ) - parse_pull.add_argument( - "--edatachain-file", - help="Use a different filename for the resulting .edatachain file", - ) + parse_pull.add_argument( "--local-name", action="store", @@ -202,7 +184,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 ) parse_edit_dataset = datasets_subparser.add_parser( - "edit", parents=[parent_parser], description="Edit dataset metadata" + "edit", parents=[parent_parser], description="Edit dataset metadata." ) parse_edit_dataset.add_argument("name", type=str, help="Dataset name") parse_edit_dataset.add_argument( @@ -244,41 +226,41 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--team", action="store", default=None, - help="The team to edit a dataset. By default, it will use team from config.", + help="The team to edit a dataset. By default, it will use team from config", ) - datasets_parser = datasets_subparser.add_parser( - "ls", parents=[parent_parser], description="List datasets" + datasets_ls_parser = datasets_subparser.add_parser( + "ls", parents=[parent_parser], description="List datasets." ) - datasets_parser.add_argument( + datasets_ls_parser.add_argument( "--studio", action="store_true", default=False, help="List the files in the Studio", ) - datasets_parser.add_argument( + datasets_ls_parser.add_argument( "-L", "--local", action="store_true", default=False, help="List local files only", ) - datasets_parser.add_argument( + datasets_ls_parser.add_argument( "-a", "--all", action="store_true", default=True, help="List all files including hidden files", ) - datasets_parser.add_argument( + datasets_ls_parser.add_argument( "--team", action="store", default=None, - help="The team to list datasets for. By default, it will use team from config.", + help="The team to list datasets for. By default, it will use team from config", ) rm_dataset_parser = datasets_subparser.add_parser( - "rm", parents=[parent_parser], description="Removes dataset", aliases=["remove"] + "rm", parents=[parent_parser], description="Remove dataset.", aliases=["remove"] ) rm_dataset_parser.add_argument("name", type=str, help="Dataset name") rm_dataset_parser.add_argument( @@ -292,7 +274,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--force", default=False, action=BooleanOptionalAction, - help="Force delete registered dataset with all of it's versions", + help="Force delete registered dataset with all of its versions", ) rm_dataset_parser.add_argument( "--studio", @@ -318,13 +300,11 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--team", action="store", default=None, - help="The team to delete a dataset. By default, it will use team from config.", + help="The team to delete a dataset. By default, it will use team from config", ) dataset_stats_parser = datasets_subparser.add_parser( - "stats", - parents=[parent_parser], - description="Shows basic dataset stats", + "stats", parents=[parent_parser], description="Show basic dataset statistics." ) dataset_stats_parser.add_argument("name", type=str, help="Dataset name") dataset_stats_parser.add_argument( @@ -349,7 +329,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 ) parse_ls = subp.add_parser( - "ls", parents=[parent_parser], description="List storage contents" + "ls", parents=[parent_parser], description="List storage contents." ) add_sources_arg(parse_ls, nargs="*") parse_ls.add_argument( @@ -357,7 +337,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--long", action="count", default=0, - help="List files in the long format", + help="List files in long format", ) parse_ls.add_argument( "--studio", @@ -383,11 +363,11 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "--team", action="store", default=None, - help="The team to list datasets for. By default, it will use team from config.", + help="The team to list datasets for. By default, it will use team from config", ) parse_du = subp.add_parser( - "du", parents=[parent_parser], description="Display space usage" + "du", parents=[parent_parser], description="Display space usage." ) add_sources_arg(parse_du) parse_du.add_argument( @@ -405,8 +385,8 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 type=int, metavar="N", help=( - "Display sizes for N directory depths below the given directory, " - "the default is 0 (summarize provided directory only)." + "Display sizes up to N directory levels deep " + "(default: 0, summarize provided directory only)" ), ) parse_du.add_argument( @@ -417,32 +397,32 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 ) parse_find = subp.add_parser( - "find", parents=[parent_parser], description="Search in a directory hierarchy" + "find", parents=[parent_parser], description="Search in a directory hierarchy." ) add_sources_arg(parse_find) parse_find.add_argument( "--name", type=str, action="append", - help="Filename to match pattern.", + help="Match filename pattern", ) parse_find.add_argument( "--iname", type=str, action="append", - help="Like -name but case insensitive.", + help="Match filename pattern (case insensitive)", ) parse_find.add_argument( "--path", type=str, action="append", - help="Path to match pattern.", + help="Path to match pattern", ) parse_find.add_argument( "--ipath", type=str, action="append", - help="Like -path but case insensitive.", + help="Like -path but case insensitive", ) parse_find.add_argument( "--size", @@ -450,7 +430,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 help=( "Filter by size (+ is greater or equal, - is less or equal). " "Specified size is in bytes, or use a suffix like K, M, G for " - "kilobytes, megabytes, gigabytes, etc." + "kilobytes, megabytes, gigabytes, etc" ), ) parse_find.add_argument( @@ -470,14 +450,14 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 ) parse_index = subp.add_parser( - "index", parents=[parent_parser], description="Index storage location" + "index", parents=[parent_parser], description="Index storage location." ) add_sources_arg(parse_index) show_parser = subp.add_parser( "show", parents=[parent_parser], - description="Create a new dataset with a query script", + description="Create a new dataset with a query script.", ) show_parser.add_argument("name", type=str, help="Dataset name") show_parser.add_argument( @@ -493,7 +473,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 query_parser = subp.add_parser( "query", parents=[parent_parser], - description="Create a new dataset with a query script", + description="Create a new dataset with a query script.", ) query_parser.add_argument( "script", metavar="", type=str, help="Filepath for script" @@ -507,7 +487,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 metavar="N", help=( "Use multiprocessing to run any query script UDFs with N worker processes. " - "N defaults to the CPU count." + "N defaults to the CPU count" ), ) query_parser.add_argument( @@ -520,10 +500,12 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 ) subp.add_parser( - "clear-cache", parents=[parent_parser], description="Clear the local file cache" + "clear-cache", + parents=[parent_parser], + description="Clear the local file cache.", ) subp.add_parser( - "gc", parents=[parent_parser], description="Garbage collect temporary tables" + "gc", parents=[parent_parser], description="Garbage collect temporary tables." ) subp.add_parser("internal-run-udf", parents=[parent_parser]) @@ -536,12 +518,12 @@ def add_completion_parser(subparsers, parents): parser = subparsers.add_parser( "completion", parents=parents, - description="Output shell completion script", + description="Output shell completion script.", ) parser.add_argument( "-s", "--shell", - help="Shell syntax for completions.", + help="Shell syntax for completions", default="bash", choices=shtab.SUPPORTED_SHELLS, ) diff --git a/src/datachain/cli/parser/job.py b/src/datachain/cli/parser/job.py index 3ef29d5c1..5fd9301fa 100644 --- a/src/datachain/cli/parser/job.py +++ b/src/datachain/cli/parser/job.py @@ -1,19 +1,16 @@ def add_jobs_parser(subparsers, parent_parser) -> None: - jobs_help = "Commands to handle the Job running with Iterative Studio" - jobs_description = ( - "This will help us to run, cancel and view the status of the job in Studio. " - ) + jobs_help = "Manage jobs in Studio" + jobs_description = "Commands to manage job execution in Studio." jobs_parser = subparsers.add_parser( "job", parents=[parent_parser], description=jobs_description, help=jobs_help ) jobs_subparser = jobs_parser.add_subparsers( dest="cmd", - help="Use `DataChain studio CMD --help` to display command-specific help.", - required=True, + help="Use `datachain studio CMD --help` to display command-specific help", ) studio_run_help = "Run a job in Studio" - studio_run_description = "This command runs a job in Studio." + studio_run_description = "Run a job in Studio." studio_run_parser = jobs_subparser.add_parser( "run", @@ -25,56 +22,56 @@ def add_jobs_parser(subparsers, parent_parser) -> None: studio_run_parser.add_argument( "query_file", action="store", - help="The query file to run.", + help="Query file to run", ) studio_run_parser.add_argument( "--team", action="store", default=None, - help="The team to run a job for. By default, it will use team from config.", + help="Team to run job for (default: from config)", ) studio_run_parser.add_argument( "--env-file", action="store", - help="File containing environment variables to set for the job.", + help="File with environment variables for the job", ) studio_run_parser.add_argument( "--env", nargs="+", - help="Environment variable. Can be specified multiple times. Format: KEY=VALUE", + help="Environment variables in KEY=VALUE format", ) studio_run_parser.add_argument( "--workers", type=int, - help="Number of workers to use for the job.", + help="Number of workers for the job", ) studio_run_parser.add_argument( "--files", nargs="+", - help="Files to include in the job.", + help="Additional files to include in the job", ) studio_run_parser.add_argument( "--python-version", action="store", - help="Python version to use for the job (e.g. '3.9', '3.10', '3.11').", + help="Python version for the job (e.g., 3.9, 3.10, 3.11)", ) studio_run_parser.add_argument( "--req-file", action="store", - help="File containing Python package requirements.", + help="Python requirements file", ) studio_run_parser.add_argument( "--req", nargs="+", - help="Python package requirement. Can be specified multiple times.", + help="Python package requirements", ) studio_cancel_help = "Cancel a job in Studio" - studio_cancel_description = "This command cancels a job in Studio." + studio_cancel_description = "Cancel a running job in Studio." studio_cancel_parser = jobs_subparser.add_parser( "cancel", @@ -86,19 +83,17 @@ def add_jobs_parser(subparsers, parent_parser) -> None: studio_cancel_parser.add_argument( "job_id", action="store", - help="The job ID to cancel.", + help="Job ID to cancel", ) studio_cancel_parser.add_argument( "--team", action="store", default=None, - help="The team to cancel a job for. By default, it will use team from config.", + help="Team to cancel job for (default: from config)", ) - studio_log_help = "Show the logs and latest status of Jobs in Studio" - studio_log_description = ( - "This will display the logs and latest status of jobs in Studio" - ) + studio_log_help = "Show job logs and status in Studio" + studio_log_description = "Display logs and current status of jobs in Studio." studio_log_parser = jobs_subparser.add_parser( "logs", @@ -110,11 +105,11 @@ def add_jobs_parser(subparsers, parent_parser) -> None: studio_log_parser.add_argument( "job_id", action="store", - help="The job ID to show the logs.", + help="Job ID to show logs for", ) studio_log_parser.add_argument( "--team", action="store", default=None, - help="The team to check the logs. By default, it will use team from config.", + help="Team to check logs for (default: from config)", ) diff --git a/src/datachain/cli/parser/studio.py b/src/datachain/cli/parser/studio.py index c13b9b726..d0fa48fbf 100644 --- a/src/datachain/cli/parser/studio.py +++ b/src/datachain/cli/parser/studio.py @@ -1,10 +1,8 @@ def add_studio_parser(subparsers, parent_parser) -> None: - studio_help = "Commands to authenticate DataChain with Iterative Studio" + studio_help = "Manage Studio authentication" studio_description = ( - "Authenticate DataChain with Studio and set the token. " - "Once this token has been properly configured,\n" - "DataChain will utilize it for seamlessly sharing datasets\n" - "and using Studio features from CLI" + "Manage authentication and settings for Studio. " + "Configure tokens for sharing datasets and using Studio features." ) studio_parser = subparsers.add_parser( @@ -15,14 +13,13 @@ def add_studio_parser(subparsers, parent_parser) -> None: ) studio_subparser = studio_parser.add_subparsers( dest="cmd", - help="Use `DataChain studio CMD --help` to display command-specific help.", - required=True, + help="Use `datachain studio CMD --help` to display command-specific help", ) - studio_login_help = "Authenticate DataChain with Studio host" + studio_login_help = "Authenticate with Studio" studio_login_description = ( - "By default, this command authenticates the DataChain with Studio\n" - "using default scopes and assigns a random name as the token name." + "Authenticate with Studio using default scopes. " + "A random name will be assigned as the token name if not specified." ) login_parser = studio_subparser.add_parser( "login", @@ -36,14 +33,14 @@ def add_studio_parser(subparsers, parent_parser) -> None: "--hostname", action="store", default=None, - help="The hostname of the Studio instance to authenticate with.", + help="Hostname of the Studio instance", ) login_parser.add_argument( "-s", "--scopes", action="store", default=None, - help="The scopes for the authentication token. ", + help="Authentication token scopes", ) login_parser.add_argument( @@ -51,21 +48,20 @@ def add_studio_parser(subparsers, parent_parser) -> None: "--name", action="store", default=None, - help="The name of the authentication token. It will be used to\n" - "identify token shown in Studio profile.", + help="Authentication token name (shown in Studio profile)", ) login_parser.add_argument( "--no-open", action="store_true", default=False, - help="Use authentication flow based on user code.\n" - "You will be presented with user code to enter in browser.\n" - "DataChain will also use this if it cannot launch browser on your behalf.", + help="Use code-based authentication without browser", ) - studio_logout_help = "Logout user from Studio" - studio_logout_description = "This removes the studio token from your global config." + studio_logout_help = "Log out from Studio" + studio_logout_description = ( + "Remove the Studio authentication token from global config." + ) studio_subparser.add_parser( "logout", @@ -74,10 +70,8 @@ def add_studio_parser(subparsers, parent_parser) -> None: help=studio_logout_help, ) - studio_team_help = "Set the default team for DataChain" - studio_team_description = ( - "Set the default team for DataChain to use when interacting with Studio." - ) + studio_team_help = "Set default team for Studio operations" + studio_team_description = "Set the default team for Studio operations." team_parser = studio_subparser.add_parser( "team", @@ -88,39 +82,21 @@ def add_studio_parser(subparsers, parent_parser) -> None: team_parser.add_argument( "team_name", action="store", - help="The name of the team to set as the default.", + help="Name of the team to set as default", ) team_parser.add_argument( "--global", action="store_true", default=False, - help="Set the team globally for all DataChain projects.", + help="Set team globally for all projects", ) - studio_token_help = "View the token datachain uses to contact Studio" # noqa: S105 # nosec B105 + studio_token_help = "View Studio authentication token" # noqa: S105 + studio_token_description = "Display the current authentication token for Studio." # noqa: S105 studio_subparser.add_parser( "token", parents=[parent_parser], - description=studio_token_help, + description=studio_token_description, help=studio_token_help, ) - - studio_ls_dataset_help = "List the available datasets from Studio" - studio_ls_dataset_description = ( - "This command lists all the datasets available in Studio.\n" - "It will show the dataset name and the number of versions available." - ) - - ls_dataset_parser = studio_subparser.add_parser( - "dataset", - parents=[parent_parser], - description=studio_ls_dataset_description, - help=studio_ls_dataset_help, - ) - ls_dataset_parser.add_argument( - "--team", - action="store", - default=None, - help="The team to list datasets for. By default, it will use team from config.", - ) diff --git a/src/datachain/cli/parser/utils.py b/src/datachain/cli/parser/utils.py index 6a4239a07..e9638f375 100644 --- a/src/datachain/cli/parser/utils.py +++ b/src/datachain/cli/parser/utils.py @@ -30,7 +30,7 @@ def add_sources_arg(parser: ArgumentParser, nargs: Union[str, int] = "+") -> Act "sources", type=str, nargs=nargs, - help="Data sources - paths to cloud storage dirs", + help="Data sources - paths to cloud storage directories", ) diff --git a/src/datachain/studio.py b/src/datachain/studio.py index 7248ee255..08839cbb8 100644 --- a/src/datachain/studio.py +++ b/src/datachain/studio.py @@ -1,9 +1,8 @@ import asyncio import os +import sys from typing import TYPE_CHECKING, Optional -from tabulate import tabulate - from datachain.catalog.catalog import raise_remote_error from datachain.config import Config, ConfigLevel from datachain.dataset import QUERY_DATASET_PREFIX @@ -21,6 +20,13 @@ def process_jobs_args(args: "Namespace"): + if args.cmd is None: + print( + f"Use 'datachain {args.command} --help' to see available options", + file=sys.stderr, + ) + return 1 + if args.cmd == "run": return create_job( args.query_file, @@ -42,19 +48,19 @@ def process_jobs_args(args: "Namespace"): def process_studio_cli_args(args: "Namespace"): + if args.cmd is None: + print( + f"Use 'datachain {args.command} --help' to see available options", + file=sys.stderr, + ) + return 1 + if args.cmd == "login": return login(args) if args.cmd == "logout": return logout() if args.cmd == "token": return token() - if args.cmd == "dataset": - rows = [ - {"Name": name, "Version": version} - for name, version in list_datasets(args.team) - ] - print(tabulate(rows, headers="keys")) - return 0 if args.cmd == "team": return set_team(args) diff --git a/tests/test_cli_studio.py b/tests/test_cli_studio.py index e1dfe1b3c..c6bb180fd 100644 --- a/tests/test_cli_studio.py +++ b/tests/test_cli_studio.py @@ -107,22 +107,6 @@ def test_studio_token(capsys): assert main(["studio", "token"]) == 1 -def test_studio_ls_datasets(capsys, studio_datasets): - assert main(["studio", "dataset"]) == 0 - out = capsys.readouterr().out - - expected_rows = [ - {"Name": "dogs", "Version": "1"}, - {"Name": "dogs", "Version": "2"}, - { - "Name": "cats", - "Version": "1", - }, - {"Name": "both", "Version": "1"}, - ] - assert out.strip() == tabulate(expected_rows, headers="keys") - - def test_studio_team_local(): assert main(["studio", "team", "team_name"]) == 0 config = Config(ConfigLevel.LOCAL).read() From 67beb9fa48a7976d2287c3fd7c42c6bb91d1a977 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:38:08 +0545 Subject: [PATCH 14/63] file: raise error (#820) --- src/datachain/lib/file.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 1c1bc1496..8f063957a 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -76,18 +76,18 @@ def get_vtype(cls) -> str: def open(cls, file: "File", location: list[dict]): """Stream file from tar archive based on location in archive.""" if len(location) > 1: - VFileError(file, "multiple 'location's are not supported yet") + raise VFileError(file, "multiple 'location's are not supported yet") loc = location[0] if (offset := loc.get("offset", None)) is None: - VFileError(file, "'offset' is not specified") + raise VFileError(file, "'offset' is not specified") if (size := loc.get("size", None)) is None: - VFileError(file, "'size' is not specified") + raise VFileError(file, "'size' is not specified") if (parent := loc.get("parent", None)) is None: - VFileError(file, "'parent' is not specified") + raise VFileError(file, "'parent' is not specified") tar_file = File(**parent) tar_file._set_stream(file._catalog) From 60c584883deeb0ef6417a57d1fc9322bfbaab73a Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 15 Jan 2025 17:38:55 -0800 Subject: [PATCH 15/63] README - mistral fix (#821) --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b45689d81..9075b9846 100644 --- a/README.rst +++ b/README.rst @@ -86,13 +86,14 @@ Python code: .. code:: py + import os from mistralai import Mistral from datachain import File, DataChain, Column PROMPT = "Was this dialog successful? Answer in a single word: Success or Failure." def eval_dialogue(file: File) -> bool: - client = Mistral() + client = Mistral(api_key = os.environ["MISTRAL_API_KEY"]) response = client.chat.complete( model="open-mixtral-8x22b", messages=[{"role": "system", "content": PROMPT}, From d3b1619a53def113698225d174060c4a367b4ec2 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Thu, 16 Jan 2025 10:02:40 +0545 Subject: [PATCH 16/63] file: support exporting files as a symlink (#819) --- src/datachain/lib/dc.py | 18 +++++++++++++++--- src/datachain/lib/file.py | 23 +++++++++++++++++++++++ tests/unit/lib/test_file.py | 16 ++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/datachain/lib/dc.py b/src/datachain/lib/dc.py index 4f84255a4..ebc727e32 100644 --- a/src/datachain/lib/dc.py +++ b/src/datachain/lib/dc.py @@ -11,6 +11,7 @@ BinaryIO, Callable, ClassVar, + Literal, Optional, TypeVar, Union, @@ -2415,11 +2416,22 @@ def setup(self, **kwargs) -> "Self": def export_files( self, output: str, - signal="file", + signal: str = "file", placement: FileExportPlacement = "fullpath", use_cache: bool = True, + link_type: Literal["copy", "symlink"] = "copy", ) -> None: - """Method that exports all files from chain to some folder.""" + """Export files from a specified signal to a directory. + + Args: + output: Path to the target directory for exporting files. + signal: Name of the signal to export files from. + placement: The method to use for naming exported files. + The possible values are: "filename", "etag", "fullpath", and "checksum". + use_cache: If `True`, cache the files before exporting. + link_type: Method to use for exporting files. + Falls back to `'copy'` if symlinking fails. + """ if placement == "filename" and ( self._query.distinct(pathfunc.name(C(f"{signal}__path"))).count() != self._query.count() @@ -2427,7 +2439,7 @@ def export_files( raise ValueError("Files with the same name found") for file in self.collect(signal): - file.export(output, placement, use_cache) # type: ignore[union-attr] + file.export(output, placement, use_cache, link_type=link_type) # type: ignore[union-attr] def shuffle(self) -> "Self": """Shuffle the rows of the chain deterministically.""" diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 8f063957a..fc3b57612 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -1,3 +1,4 @@ +import errno import hashlib import io import json @@ -240,11 +241,26 @@ def save(self, destination: str): with open(destination, mode="wb") as f: f.write(self.read()) + def _symlink_to(self, destination: str): + if self.location: + raise OSError(errno.ENOTSUP, "Symlinking virtual file is not supported") + + if self._caching_enabled: + self.ensure_cached() + source = self.get_local_path() + assert source, "File was not cached" + elif self.source.startswith("file://"): + source = self.get_path() + else: + raise OSError(errno.EXDEV, "can't link across filesystems") + return os.symlink(source, destination) + def export( self, output: str, placement: ExportPlacement = "fullpath", use_cache: bool = True, + link_type: Literal["copy", "symlink"] = "copy", ) -> None: """Export file to new location.""" if use_cache: @@ -253,6 +269,13 @@ def export( dst_dir = os.path.dirname(dst) os.makedirs(dst_dir, exist_ok=True) + if link_type == "symlink": + try: + return self._symlink_to(dst) + except OSError as exc: + if exc.errno not in (errno.ENOTSUP, errno.EXDEV, errno.ENOSYS): + raise + self.save(dst) def _set_stream( diff --git a/tests/unit/lib/test_file.py b/tests/unit/lib/test_file.py index 87e574fd8..65c75f84e 100644 --- a/tests/unit/lib/test_file.py +++ b/tests/unit/lib/test_file.py @@ -1,4 +1,5 @@ import json +from pathlib import Path from unittest.mock import Mock import pytest @@ -379,3 +380,18 @@ def test_get_local_path(tmp_path, catalog): assert file.get_local_path() is None file.ensure_cached() assert file.get_local_path() is not None + + +@pytest.mark.parametrize("use_cache", (True, False)) +def test_export_with_symlink(tmp_path, catalog, use_cache): + path = tmp_path / "myfile.txt" + path.write_text("some text") + + file = File(path=path.name, source=tmp_path.as_uri()) + file._set_stream(catalog, use_cache) + + file.export(tmp_path / "dir", link_type="symlink", use_cache=use_cache) + assert (tmp_path / "dir" / "myfile.txt").is_symlink() + + dst = Path(file.get_local_path()) if use_cache else path + assert (tmp_path / "dir" / "myfile.txt").resolve() == dst From e31210ca8ed93710df6b5674701ff4e3c115ca37 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Thu, 16 Jan 2025 17:43:27 +0545 Subject: [PATCH 17/63] prefetching: remove prefetched item after use in udf (#818) * prefetching: remove prefetched item after use in udf This PR removes the prefetched item after use in the UDF. This is enabled by default on `prefetch>0`, unless `cache=True` is set in the UDF, in which case the prefetched item is not removed. For pytorch dataloader, this is not enabled by default, but can be enabled by setting `remove_prefetched=True` in the `PytorchDataset` class. This is done so because the dataset can be used in multiple epochs, and removing the prefetched item after use can cause it to redownload again in the next epoch. The exposed `remove_prefetched=True|False` setting could be renamed to some better option. Feedbacks are welcome. * close iterable properly --- src/datachain/lib/dc.py | 9 +++- src/datachain/lib/pytorch.py | 4 +- src/datachain/lib/udf.py | 70 ++++++++++++++++++++++-------- src/datachain/query/dataset.py | 19 ++++---- tests/benchmarks/test_datachain.py | 5 +++ tests/func/test_datachain.py | 39 +++++++++++++---- tests/func/test_pytorch.py | 17 +++++++- tests/unit/test_pytorch.py | 30 +++++++++++++ 8 files changed, 155 insertions(+), 38 deletions(-) diff --git a/src/datachain/lib/dc.py b/src/datachain/lib/dc.py index ebc727e32..842ee9d1a 100644 --- a/src/datachain/lib/dc.py +++ b/src/datachain/lib/dc.py @@ -1277,7 +1277,12 @@ def collect(self, *cols: str) -> Iterator[Union[DataValue, tuple[DataValue, ...] yield ret[0] if len(cols) == 1 else tuple(ret) def to_pytorch( - self, transform=None, tokenizer=None, tokenizer_kwargs=None, num_samples=0 + self, + transform=None, + tokenizer=None, + tokenizer_kwargs=None, + num_samples=0, + remove_prefetched: bool = False, ): """Convert to pytorch dataset format. @@ -1287,6 +1292,7 @@ def to_pytorch( tokenizer_kwargs (dict): Additional kwargs to pass when calling tokenizer. num_samples (int): Number of random samples to draw for each epoch. This argument is ignored if `num_samples=0` (the default). + remove_prefetched (bool): Whether to remove prefetched files after reading. Example: ```py @@ -1313,6 +1319,7 @@ def to_pytorch( tokenizer_kwargs=tokenizer_kwargs, num_samples=num_samples, dc_settings=chain._settings, + remove_prefetched=remove_prefetched, ) def remove_file_signals(self) -> "Self": # noqa: D102 diff --git a/src/datachain/lib/pytorch.py b/src/datachain/lib/pytorch.py index 985af387c..f3b504d75 100644 --- a/src/datachain/lib/pytorch.py +++ b/src/datachain/lib/pytorch.py @@ -50,6 +50,7 @@ def __init__( tokenizer_kwargs: Optional[dict[str, Any]] = None, num_samples: int = 0, dc_settings: Optional[Settings] = None, + remove_prefetched: bool = False, ): """ Pytorch IterableDataset that streams DataChain datasets. @@ -84,6 +85,7 @@ def __init__( self._cache = catalog.cache self._prefetch_cache: Optional[Cache] = None + self._remove_prefetched = remove_prefetched if prefetch and not self.cache: tmp_dir = catalog.cache.tmp_dir assert tmp_dir @@ -147,7 +149,7 @@ def _iter_with_prefetch(self) -> Generator[tuple[Any], None, None]: rows, self.prefetch, download_cb=download_cb, - after_prefetch=download_cb.increment_file_count, + remove_prefetched=self._remove_prefetched, ) with download_cb, closing(rows): diff --git a/src/datachain/lib/udf.py b/src/datachain/lib/udf.py index 717d940b9..750e58dc8 100644 --- a/src/datachain/lib/udf.py +++ b/src/datachain/lib/udf.py @@ -16,6 +16,7 @@ from datachain.lib.data_model import DataValue from datachain.lib.file import File from datachain.lib.utils import AbstractUDF, DataChainError, DataChainParamsError +from datachain.progress import CombinedDownloadCallback from datachain.query.batch import ( Batch, BatchingStrategy, @@ -301,20 +302,42 @@ async def _prefetch_input( return row +def _remove_prefetched(row: T) -> None: + for obj in row: + if isinstance(obj, File): + catalog = obj._catalog + assert catalog is not None + try: + catalog.cache.remove(obj) + except Exception as e: # noqa: BLE001 + print(f"Failed to remove prefetched item {obj.name!r}: {e!s}") + + def _prefetch_inputs( prepared_inputs: "Iterable[T]", prefetch: int = 0, download_cb: Optional["Callback"] = None, - after_prefetch: "Callable[[], None]" = noop, + after_prefetch: Optional[Callable[[], None]] = None, + remove_prefetched: bool = False, ) -> "abc.Generator[T, None, None]": - if prefetch > 0: - f = partial( - _prefetch_input, - download_cb=download_cb, - after_prefetch=after_prefetch, - ) - prepared_inputs = AsyncMapper(f, prepared_inputs, workers=prefetch).iterate() # type: ignore[assignment] - yield from prepared_inputs + if not prefetch: + yield from prepared_inputs + return + + if after_prefetch is None: + after_prefetch = noop + if isinstance(download_cb, CombinedDownloadCallback): + after_prefetch = download_cb.increment_file_count + + f = partial(_prefetch_input, download_cb=download_cb, after_prefetch=after_prefetch) + mapper = AsyncMapper(f, prepared_inputs, workers=prefetch) + with closing(mapper.iterate()) as row_iter: + for row in row_iter: + try: + yield row # type: ignore[misc] + finally: + if remove_prefetched: + _remove_prefetched(row) def _get_cache( @@ -351,7 +374,13 @@ def _prepare_rows(udf_inputs) -> "abc.Generator[Sequence[Any], None, None]": ) prepared_inputs = _prepare_rows(udf_inputs) - prepared_inputs = _prefetch_inputs(prepared_inputs, self.prefetch) + prepared_inputs = _prefetch_inputs( + prepared_inputs, + self.prefetch, + download_cb=download_cb, + remove_prefetched=bool(self.prefetch) and not cache, + ) + with closing(prepared_inputs): for id_, *udf_args in prepared_inputs: result_objs = self.process_safe(udf_args) @@ -429,15 +458,22 @@ def _prepare_rows(udf_inputs) -> "abc.Generator[Sequence[Any], None, None]": row, udf_fields, catalog, cache, download_cb ) + def _process_row(row): + with safe_closing(self.process_safe(row)) as result_objs: + for result_obj in result_objs: + udf_output = self._flatten_row(result_obj) + yield dict(zip(self.signal_names, udf_output)) + prepared_inputs = _prepare_rows(udf_inputs) - prepared_inputs = _prefetch_inputs(prepared_inputs, self.prefetch) + prepared_inputs = _prefetch_inputs( + prepared_inputs, + self.prefetch, + download_cb=download_cb, + remove_prefetched=bool(self.prefetch) and not cache, + ) with closing(prepared_inputs): - for row in prepared_inputs: - result_objs = self.process_safe(row) - udf_outputs = (self._flatten_row(row) for row in result_objs) - output = (dict(zip(self.signal_names, row)) for row in udf_outputs) - processed_cb.relative_update(1) - yield output + for row in processed_cb.wrap(prepared_inputs): + yield _process_row(row) self.teardown() diff --git a/src/datachain/query/dataset.py b/src/datachain/query/dataset.py index b510b604d..1da0eaaad 100644 --- a/src/datachain/query/dataset.py +++ b/src/datachain/query/dataset.py @@ -336,15 +336,16 @@ def process_udf_outputs( for udf_output in udf_results: if not udf_output: continue - for row in udf_output: - cb.relative_update() - rows.append(adjust_outputs(warehouse, row, udf_col_types)) - if len(rows) >= batch_size or ( - len(rows) % 10 == 0 and psutil.virtual_memory().percent > 80 - ): - for row_chunk in batched(rows, batch_size): - warehouse.insert_rows(udf_table, row_chunk) - rows.clear() + with safe_closing(udf_output): + for row in udf_output: + cb.relative_update() + rows.append(adjust_outputs(warehouse, row, udf_col_types)) + if len(rows) >= batch_size or ( + len(rows) % 10 == 0 and psutil.virtual_memory().percent > 80 + ): + for row_chunk in batched(rows, batch_size): + warehouse.insert_rows(udf_table, row_chunk) + rows.clear() if rows: for row_chunk in batched(rows, batch_size): diff --git a/tests/benchmarks/test_datachain.py b/tests/benchmarks/test_datachain.py index 3dc5b4e92..88139885d 100644 --- a/tests/benchmarks/test_datachain.py +++ b/tests/benchmarks/test_datachain.py @@ -6,6 +6,11 @@ def test_datachain(tmp_dir, test_session, datasets, benchmark): def run_script(uri, **kwargs): DataChain.from_storage(uri, session=test_session, **kwargs).gen( emd=process_laion_meta + ).settings( + # Disable `prefetch` for `map()` because `process_laion_meta` repeatedly + # returns the dataset file. This causes `prefetch` to download and + # remove the file multiple times unnecessarily, slowing down the process. + prefetch=0, ).map( stem=lambda file: file.get_file_stem(), params=["emd.file"], diff --git a/tests/func/test_datachain.py b/tests/func/test_datachain.py index 979a624e5..a486d2c28 100644 --- a/tests/func/test_datachain.py +++ b/tests/func/test_datachain.py @@ -1,3 +1,4 @@ +import functools import math import os import pickle @@ -234,17 +235,28 @@ def verify_cache_used(file): assert head == catalog.cache.tmp_dir assert tail.startswith("prefetch-") - def new_signal(file: File) -> str: - assert is_prefetched(file) == (prefetch > 0) - verify_cache_used(file) + def with_checks(func, seen=[]): # noqa: B006 + @functools.wraps(func) + def wrapped(file, *args, **kwargs): + # previously prefetched files should be removed if `cache` is disabled. + for f in seen: + assert f._catalog.cache.contains(f) == use_cache + seen.append(file) + + assert is_prefetched(file) == (prefetch > 0) + verify_cache_used(file) + return func(file, *args, **kwargs) + return wrapped + + def new_signal(file: File) -> str: with file.open() as f: return file.name + " -> " + f.read().decode("utf-8") dc = ( DataChain.from_storage(ctc.src_uri, session=ctc.session) .settings(cache=use_cache, prefetch=prefetch) - .map(signal=new_signal) + .map(signal=with_checks(new_signal)) .save() ) @@ -1307,17 +1319,28 @@ def verify_cache_used(file): assert head == catalog.cache.tmp_dir assert tail.startswith("prefetch-") - def new_signal(file: File) -> list[str]: - assert is_prefetched(file) == (prefetch > 0) - verify_cache_used(file) + def with_checks(func, seen=[]): # noqa: B006 + @functools.wraps(func) + def wrapped(file, *args, **kwargs): + # previously prefetched files should be removed if `cache` is disabled. + for f in seen: + assert f._catalog.cache.contains(f) == use_cache + seen.append(file) + + assert is_prefetched(file) == (prefetch > 0) + verify_cache_used(file) + return func(file, *args, **kwargs) + return wrapped + + def new_signal(file: File) -> list[str]: with file.open("rb") as f: return [file.name, f.read().decode("utf-8")] dc = ( DataChain.from_storage(ctc.src_uri, session=ctc.session) .settings(cache=use_cache, prefetch=prefetch) - .gen(signal=new_signal, output=str) + .gen(signal=with_checks(new_signal), output=str) .save() ) expected = { diff --git a/tests/func/test_pytorch.py b/tests/func/test_pytorch.py index 2ebcbc9ab..a39df26b7 100644 --- a/tests/func/test_pytorch.py +++ b/tests/func/test_pytorch.py @@ -86,11 +86,16 @@ def test_to_pytorch(fake_dataset): @pytest.mark.parametrize("use_cache", (True, False)) @pytest.mark.parametrize("prefetch", (0, 2)) -def test_prefetch(mocker, catalog, fake_dataset, use_cache, prefetch): +@pytest.mark.parametrize("remove_prefetched", (True, False)) +def test_prefetch( + mocker, catalog, fake_dataset, use_cache, prefetch, remove_prefetched +): catalog.cache.clear() dataset = fake_dataset.limit(10) - ds = dataset.settings(cache=use_cache, prefetch=prefetch).to_pytorch() + ds = dataset.settings(cache=use_cache, prefetch=prefetch).to_pytorch( + remove_prefetched=remove_prefetched + ) iter_with_prefetch = ds._iter_with_prefetch cache = ds._cache @@ -101,8 +106,16 @@ def is_prefetched(file: File): return cache.contains(file) def check_prefetched(): + seen = [] for row in iter_with_prefetch(): + # prefetched files should persist if `cache` is enabled, or + # `remove_prefetched` is not set. Otherwise, the old prefetched + # files should be removed. + for f in seen: + assert is_prefetched(f) == (cache and not remove_prefetched) + files = [f for f in row if isinstance(f, File)] + seen.extend(files) assert files files_not_in_cache = [f for f in files if not is_prefetched(f)] if prefetch: diff --git a/tests/unit/test_pytorch.py b/tests/unit/test_pytorch.py index 2018837aa..6e30c34f2 100644 --- a/tests/unit/test_pytorch.py +++ b/tests/unit/test_pytorch.py @@ -4,6 +4,7 @@ import pytest from datachain.cache import DataChainCache +from datachain.lib.file import File from datachain.lib.pytorch import PytorchDataset from datachain.lib.settings import Settings @@ -42,6 +43,35 @@ def test_close(mocker, catalog, cache): spy.assert_called_once() +def test_prefetched_files_are_removed_after_yield(tmp_dir, mocker, catalog, cache): + files = [] + for name in "abc": + (tmp_dir / name).write_text(name, encoding="utf-8") + file = File(path=tmp_dir / name) + file._set_stream(catalog) + files.append((file,)) + + ds = PytorchDataset( + "fake", + 1, + catalog, + dc_settings=Settings(prefetch=10), + remove_prefetched=True, + ) + mocker.patch.object(ds, "_row_iter", return_value=iter(files)) + + seen = [] + for (file,) in ds._iter_with_prefetch(): + # previously prefetched files should have been removed by now + for f in seen: + assert not f._catalog.cache.contains(f) + assert not f.get_local_path() + seen.append(file) + + assert file._catalog.cache.contains(file) + assert file.get_local_path() + + @pytest.mark.parametrize("cache", [True, False]) def test_prefetch_cache_gets_destroyed_on_gc(mocker, catalog, cache): spy = mocker.patch.object(DataChainCache, "destroy") From bcd95b1570778865ec80d934cc054cf024a929b8 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:52:29 +0545 Subject: [PATCH 18/63] ReferenceFileSystem: use fs.open instead of fs._open (#823) --- src/datachain/lib/arrow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datachain/lib/arrow.py b/src/datachain/lib/arrow.py index 28954477b..2c3aebb2f 100644 --- a/src/datachain/lib/arrow.py +++ b/src/datachain/lib/arrow.py @@ -33,7 +33,7 @@ def _open(self, path, mode="rb", *args, **kwargs): # reads the whole file in-memory. (uri,) = self.references[path] protocol, _ = split_protocol(uri) - return self.fss[protocol]._open(uri, mode, *args, **kwargs) + return self.fss[protocol].open(uri, mode, *args, **kwargs) class ArrowGenerator(Generator): From 08edd27b07f78686a001e8fae2dd7eb8b53924b4 Mon Sep 17 00:00:00 2001 From: Amrit Ghimire <16842655+amritghimire@users.noreply.github.com> Date: Sat, 18 Jan 2025 09:22:40 +0545 Subject: [PATCH 19/63] Second iteration of cli command help (#826) * Rename studio to auth for cli command https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEQ * Drop aws_endpoint_url option https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEU * Fix sources argument for cp https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEY https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEc * Fix anonymous arg help https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEs https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEo * Update cached list of files for the sources https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEw * Reorder verbose and quiet https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrE0 * Path to a directory or file to put data to https://docs.google.com/document/d/1_QeMQ1NsguHSRSyJpF2n-1s57SHSuiyGzl10q9d1UaE/edit?disco=AAABcAvsrEg --- src/datachain/cli/__init__.py | 5 +-- src/datachain/cli/parser/__init__.py | 35 ++++++++++------- src/datachain/cli/parser/job.py | 2 +- src/datachain/cli/parser/studio.py | 58 ++++++++++++++-------------- src/datachain/cli/parser/utils.py | 2 +- src/datachain/cli/utils.py | 2 +- src/datachain/remote/studio.py | 4 +- src/datachain/studio.py | 14 +++---- tests/test_cli_studio.py | 18 ++++----- 9 files changed, 72 insertions(+), 68 deletions(-) diff --git a/src/datachain/cli/__init__.py b/src/datachain/cli/__init__.py index 3c8f195aa..c1f46c2a1 100644 --- a/src/datachain/cli/__init__.py +++ b/src/datachain/cli/__init__.py @@ -48,7 +48,6 @@ def main(argv: Optional[list[str]] = None) -> int: logger.setLevel(logging_level) client_config = { - "aws_endpoint_url": args.aws_endpoint_url, "anon": args.anon, } @@ -73,7 +72,7 @@ def main(argv: Optional[list[str]] = None) -> int: def handle_command(args, catalog, client_config) -> int: """Handle the different CLI commands.""" - from datachain.studio import process_jobs_args, process_studio_cli_args + from datachain.studio import process_auth_cli_args, process_jobs_args command_handlers = { "cp": lambda: handle_cp_command(args, catalog), @@ -89,7 +88,7 @@ def handle_command(args, catalog, client_config) -> int: "query": lambda: handle_query_command(args, catalog), "clear-cache": lambda: clear_cache(catalog), "gc": lambda: garbage_collect(catalog), - "studio": lambda: process_studio_cli_args(args), + "auth": lambda: process_auth_cli_args(args), "job": lambda: process_jobs_args(args), } diff --git a/src/datachain/cli/parser/__init__.py b/src/datachain/cli/parser/__init__.py index 6a3a9222d..44a8c46ba 100644 --- a/src/datachain/cli/parser/__init__.py +++ b/src/datachain/cli/parser/__init__.py @@ -7,7 +7,7 @@ from datachain.cli.utils import BooleanOptionalAction, KeyValueArgs from .job import add_jobs_parser -from .studio import add_studio_parser +from .studio import add_auth_parser from .utils import FIND_COLUMNS, add_show_args, add_sources_arg, find_columns_type @@ -26,24 +26,25 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 parent_parser = ArgumentParser(add_help=False) parent_parser.add_argument( - "--aws-endpoint-url", - type=str, - help="AWS endpoint URL", - ) - parent_parser.add_argument( - "--anon", - action="store_true", - help="anon flag for remote storage (like awscli's --no-sign-request)", + "-v", "--verbose", action="count", default=0, help="Be verbose" ) parent_parser.add_argument( - "-u", "--update", action="count", default=0, help="Update cache" + "-q", "--quiet", action="count", default=0, help="Be quiet" ) + parent_parser.add_argument( - "-v", "--verbose", action="count", default=0, help="Be verbose" + "--anon", + action="store_true", + help="Use anonymous access to storage", ) parent_parser.add_argument( - "-q", "--quiet", action="count", default=0, help="Be quiet" + "-u", + "--update", + action="count", + default=0, + help="Update cached list of files for the sources", ) + parent_parser.add_argument( "--debug-sql", action="store_true", @@ -67,7 +68,9 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "cp", parents=[parent_parser], description="Copy data files from the cloud." ) add_sources_arg(parse_cp).complete = shtab.DIR # type: ignore[attr-defined] - parse_cp.add_argument("output", type=str, help="Output") + parse_cp.add_argument( + "output", type=str, help="Path to a directory or file to put data to" + ) parse_cp.add_argument( "-f", "--force", @@ -94,7 +97,9 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 "clone", parents=[parent_parser], description="Copy data files from the cloud." ) add_sources_arg(parse_clone).complete = shtab.DIR # type: ignore[attr-defined] - parse_clone.add_argument("output", type=str, help="Output") + parse_clone.add_argument( + "output", type=str, help="Path to a directory or file to put data to" + ) parse_clone.add_argument( "-f", "--force", @@ -123,7 +128,7 @@ def get_parser() -> ArgumentParser: # noqa: PLR0915 help="Do not copy files, just create a dataset", ) - add_studio_parser(subp, parent_parser) + add_auth_parser(subp, parent_parser) add_jobs_parser(subp, parent_parser) datasets_parser = subp.add_parser( diff --git a/src/datachain/cli/parser/job.py b/src/datachain/cli/parser/job.py index 5fd9301fa..627daa3ce 100644 --- a/src/datachain/cli/parser/job.py +++ b/src/datachain/cli/parser/job.py @@ -6,7 +6,7 @@ def add_jobs_parser(subparsers, parent_parser) -> None: ) jobs_subparser = jobs_parser.add_subparsers( dest="cmd", - help="Use `datachain studio CMD --help` to display command-specific help", + help="Use `datachain auth CMD --help` to display command-specific help", ) studio_run_help = "Run a job in Studio" diff --git a/src/datachain/cli/parser/studio.py b/src/datachain/cli/parser/studio.py index d0fa48fbf..d4a4820fe 100644 --- a/src/datachain/cli/parser/studio.py +++ b/src/datachain/cli/parser/studio.py @@ -1,31 +1,31 @@ -def add_studio_parser(subparsers, parent_parser) -> None: - studio_help = "Manage Studio authentication" - studio_description = ( +def add_auth_parser(subparsers, parent_parser) -> None: + auth_help = "Manage Studio authentication" + auth_description = ( "Manage authentication and settings for Studio. " "Configure tokens for sharing datasets and using Studio features." ) - studio_parser = subparsers.add_parser( - "studio", + auth_parser = subparsers.add_parser( + "auth", parents=[parent_parser], - description=studio_description, - help=studio_help, + description=auth_description, + help=auth_help, ) - studio_subparser = studio_parser.add_subparsers( + auth_subparser = auth_parser.add_subparsers( dest="cmd", - help="Use `datachain studio CMD --help` to display command-specific help", + help="Use `datachain auth CMD --help` to display command-specific help", ) - studio_login_help = "Authenticate with Studio" - studio_login_description = ( + auth_login_help = "Authenticate with Studio" + auth_login_description = ( "Authenticate with Studio using default scopes. " "A random name will be assigned as the token name if not specified." ) - login_parser = studio_subparser.add_parser( + login_parser = auth_subparser.add_parser( "login", parents=[parent_parser], - description=studio_login_description, - help=studio_login_help, + description=auth_login_description, + help=auth_login_help, ) login_parser.add_argument( @@ -58,26 +58,26 @@ def add_studio_parser(subparsers, parent_parser) -> None: help="Use code-based authentication without browser", ) - studio_logout_help = "Log out from Studio" - studio_logout_description = ( + auth_logout_help = "Log out from Studio" + auth_logout_description = ( "Remove the Studio authentication token from global config." ) - studio_subparser.add_parser( + auth_subparser.add_parser( "logout", parents=[parent_parser], - description=studio_logout_description, - help=studio_logout_help, + description=auth_logout_description, + help=auth_logout_help, ) - studio_team_help = "Set default team for Studio operations" - studio_team_description = "Set the default team for Studio operations." + auth_team_help = "Set default team for Studio operations" + auth_team_description = "Set the default team for Studio operations." - team_parser = studio_subparser.add_parser( + team_parser = auth_subparser.add_parser( "team", parents=[parent_parser], - description=studio_team_description, - help=studio_team_help, + description=auth_team_description, + help=auth_team_help, ) team_parser.add_argument( "team_name", @@ -91,12 +91,12 @@ def add_studio_parser(subparsers, parent_parser) -> None: help="Set team globally for all projects", ) - studio_token_help = "View Studio authentication token" # noqa: S105 - studio_token_description = "Display the current authentication token for Studio." # noqa: S105 + auth_token_help = "View Studio authentication token" # noqa: S105 + auth_token_description = "Display the current authentication token for Studio." # noqa: S105 - studio_subparser.add_parser( + auth_subparser.add_parser( "token", parents=[parent_parser], - description=studio_token_description, - help=studio_token_help, + description=auth_token_description, + help=auth_token_help, ) diff --git a/src/datachain/cli/parser/utils.py b/src/datachain/cli/parser/utils.py index e9638f375..49aa7946f 100644 --- a/src/datachain/cli/parser/utils.py +++ b/src/datachain/cli/parser/utils.py @@ -30,7 +30,7 @@ def add_sources_arg(parser: ArgumentParser, nargs: Union[str, int] = "+") -> Act "sources", type=str, nargs=nargs, - help="Data sources - paths to cloud storage directories", + help="Data sources - paths to source storage directories or files", ) diff --git a/src/datachain/cli/utils.py b/src/datachain/cli/utils.py index 50c3b3577..a08c32481 100644 --- a/src/datachain/cli/utils.py +++ b/src/datachain/cli/utils.py @@ -87,7 +87,7 @@ def get_logging_level(args: Namespace) -> int: def determine_flavors(studio: bool, local: bool, all: bool, token: Optional[str]): if studio and not token: raise DataChainError( - "Not logged in to Studio. Log in with 'datachain studio login'." + "Not logged in to Studio. Log in with 'datachain auth login'." ) if local or studio: diff --git a/src/datachain/remote/studio.py b/src/datachain/remote/studio.py index c53b5a23d..4825dc30f 100644 --- a/src/datachain/remote/studio.py +++ b/src/datachain/remote/studio.py @@ -75,7 +75,7 @@ def token(self) -> str: if not token: raise DataChainError( - "Studio token is not set. Use `datachain studio login` " + "Studio token is not set. Use `datachain auth login` " "or environment variable `DVC_STUDIO_TOKEN` to set it." ) @@ -105,7 +105,7 @@ def _get_team(self) -> str: if not team: raise DataChainError( "Studio team is not set. " - "Use `datachain studio team ` " + "Use `datachain auth team ` " "or environment variable `DVC_STUDIO_TEAM` to set it." "You can also set it in the config file as team under studio." ) diff --git a/src/datachain/studio.py b/src/datachain/studio.py index 08839cbb8..61afab52d 100644 --- a/src/datachain/studio.py +++ b/src/datachain/studio.py @@ -47,7 +47,7 @@ def process_jobs_args(args: "Namespace"): raise DataChainError(f"Unknown command '{args.cmd}'.") -def process_studio_cli_args(args: "Namespace"): +def process_auth_cli_args(args: "Namespace"): if args.cmd is None: print( f"Use 'datachain {args.command} --help' to see available options", @@ -95,7 +95,7 @@ def login(args: "Namespace"): raise DataChainError( "Token already exists. " "To login with a different token, " - "logout using `datachain studio logout`." + "logout using `datachain auth logout`." ) open_browser = not args.no_open @@ -121,12 +121,12 @@ def logout(): token = conf.get("studio", {}).get("token") if not token: raise DataChainError( - "Not logged in to Studio. Log in with 'datachain studio login'." + "Not logged in to Studio. Log in with 'datachain auth login'." ) del conf["studio"]["token"] - print("Logged out from Studio. (you can log back in with 'datachain studio login')") + print("Logged out from Studio. (you can log back in with 'datachain auth login')") def token(): @@ -134,7 +134,7 @@ def token(): token = config.get("token") if not token: raise DataChainError( - "Not logged in to Studio. Log in with 'datachain studio login'." + "Not logged in to Studio. Log in with 'datachain auth login'." ) print(token) @@ -299,7 +299,7 @@ def cancel_job(job_id: str, team_name: Optional[str]): token = Config().read().get("studio", {}).get("token") if not token: raise DataChainError( - "Not logged in to Studio. Log in with 'datachain studio login'." + "Not logged in to Studio. Log in with 'datachain auth login'." ) client = StudioClient(team=team_name) @@ -314,7 +314,7 @@ def show_job_logs(job_id: str, team_name: Optional[str]): token = Config().read().get("studio", {}).get("token") if not token: raise DataChainError( - "Not logged in to Studio. Log in with 'datachain studio login'." + "Not logged in to Studio. Log in with 'datachain auth login'." ) client = StudioClient(team=team_name) diff --git a/tests/test_cli_studio.py b/tests/test_cli_studio.py index c6bb180fd..d2a6d678f 100644 --- a/tests/test_cli_studio.py +++ b/tests/test_cli_studio.py @@ -34,7 +34,7 @@ def test_studio_login_token_check_failed(mocker): "dvc_studio_client.auth.get_access_token", side_effect=AuthorizationExpiredError, ) - assert main(["studio", "login"]) == 1 + assert main(["auth", "login"]) == 1 def test_studio_login_success(mocker): @@ -43,7 +43,7 @@ def test_studio_login_success(mocker): return_value=("token_name", "isat_access_token"), ) - assert main(["studio", "login"]) == 0 + assert main(["auth", "login"]) == 0 config = Config().read() assert config["studio"]["token"] == "isat_access_token" # noqa: S105 # nosec B105 @@ -59,7 +59,7 @@ def test_studio_login_arguments(mocker): assert ( main( [ - "studio", + "auth", "login", "--name", "token_name", @@ -87,34 +87,34 @@ def test_studio_logout(): with Config(ConfigLevel.GLOBAL).edit() as conf: conf["studio"] = {"token": "isat_access_token"} - assert main(["studio", "logout"]) == 0 + assert main(["auth", "logout"]) == 0 config = Config(ConfigLevel.GLOBAL).read() assert "token" not in config["studio"] - assert main(["studio", "logout"]) == 1 + assert main(["auth", "logout"]) == 1 def test_studio_token(capsys): with Config(ConfigLevel.GLOBAL).edit() as conf: conf["studio"] = {"token": "isat_access_token"} - assert main(["studio", "token"]) == 0 + assert main(["auth", "token"]) == 0 assert capsys.readouterr().out == "isat_access_token\n" with Config(ConfigLevel.GLOBAL).edit() as conf: del conf["studio"]["token"] - assert main(["studio", "token"]) == 1 + assert main(["auth", "token"]) == 1 def test_studio_team_local(): - assert main(["studio", "team", "team_name"]) == 0 + assert main(["auth", "team", "team_name"]) == 0 config = Config(ConfigLevel.LOCAL).read() assert config["studio"]["team"] == "team_name" def test_studio_team_global(): - assert main(["studio", "team", "team_name", "--global"]) == 0 + assert main(["auth", "team", "team_name", "--global"]) == 0 config = Config(ConfigLevel.GLOBAL).read() assert config["studio"]["team"] == "team_name" From dbefa5fe9389db08298fae4770786f24990443c3 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Sat, 18 Jan 2025 17:29:17 -0800 Subject: [PATCH 20/63] Fix list of tuples. Closes #827 (#828) --- src/datachain/lib/convert/python_to_sql.py | 18 +++++++-- tests/unit/lib/test_python_to_sql.py | 45 ++++++++++++++++++++++ tests/unit/lib/test_utils.py | 22 ++--------- 3 files changed, 63 insertions(+), 22 deletions(-) create mode 100644 tests/unit/lib/test_python_to_sql.py diff --git a/src/datachain/lib/convert/python_to_sql.py b/src/datachain/lib/convert/python_to_sql.py index 84b18a7b4..ca181657e 100644 --- a/src/datachain/lib/convert/python_to_sql.py +++ b/src/datachain/lib/convert/python_to_sql.py @@ -52,15 +52,15 @@ def python_to_sql(typ): # noqa: PLR0911 args = get_args(typ) if inspect.isclass(orig) and (issubclass(list, orig) or issubclass(tuple, orig)): - if args is None or len(args) != 1: + if args is None: raise TypeError(f"Cannot resolve type '{typ}' for flattening features") args0 = args[0] if ModelStore.is_pydantic(args0): return Array(JSON()) - next_type = python_to_sql(args0) - return Array(next_type) + list_type = list_of_args_to_type(args) + return Array(list_type) if orig is Annotated: # Ignoring annotations @@ -82,6 +82,18 @@ def python_to_sql(typ): # noqa: PLR0911 raise TypeError(f"Cannot recognize type {typ}") +def list_of_args_to_type(args) -> SQLType: + first_type = python_to_sql(args[0]) + for next_arg in args[1:]: + try: + next_type = python_to_sql(next_arg) + if next_type != first_type: + return JSON() + except TypeError: + return JSON() + return first_type + + def _is_json_inside_union(orig, args) -> bool: if orig == Union and len(args) >= 2: # List in JSON: Union[dict, list[dict]] diff --git a/tests/unit/lib/test_python_to_sql.py b/tests/unit/lib/test_python_to_sql.py new file mode 100644 index 000000000..5ca43e3ac --- /dev/null +++ b/tests/unit/lib/test_python_to_sql.py @@ -0,0 +1,45 @@ +from collections.abc import Mapping +from typing import Literal, Optional, Union + +import pytest + +from datachain.lib.convert.python_to_sql import python_to_sql +from datachain.sql.types import JSON, Array, Float, String +from tests.unit.lib.test_utils import MyModel + + +@pytest.mark.parametrize( + "typ,expected", + ( + (str, String), + (String, String), + (Literal["text"], String), + (dict[str, int], JSON), + (Mapping[str, int], JSON), + (Optional[str], String), + (Union[dict, list[dict]], JSON), + ), +) +def test_convert_type_to_datachain(typ, expected): + assert python_to_sql(typ) == expected + + +def test_list_of_tuples_matching_types(): + assert ( + python_to_sql(list[tuple[float, float]]).to_dict() + == Array(Array(Float)).to_dict() + ) + + +def test_list_of_tuples_not_matching_types(): + assert ( + python_to_sql(list[tuple[float, String]]).to_dict() + == Array(Array(JSON)).to_dict() + ) + + +def test_list_of_tuples_object(): + assert ( + python_to_sql(list[tuple[float, MyModel]]).to_dict() + == Array(Array(JSON)).to_dict() + ) diff --git a/tests/unit/lib/test_utils.py b/tests/unit/lib/test_utils.py index 83b423e4a..8432d1747 100644 --- a/tests/unit/lib/test_utils.py +++ b/tests/unit/lib/test_utils.py @@ -1,12 +1,12 @@ -from collections.abc import Iterable, Mapping -from typing import Literal, Optional, Union +from collections.abc import Iterable +from typing import Union import pytest from pydantic import BaseModel from datachain.lib.convert.python_to_sql import python_to_sql from datachain.lib.utils import normalize_col_names -from datachain.sql.types import JSON, Array, String +from datachain.sql.types import Array, String class MyModel(BaseModel): @@ -17,22 +17,6 @@ class MyFeature(BaseModel): val1: str -@pytest.mark.parametrize( - "typ,expected", - ( - (str, String), - (String, String), - (Literal["text"], String), - (dict[str, int], JSON), - (Mapping[str, int], JSON), - (Optional[str], String), - (Union[dict, list[dict]], JSON), - ), -) -def test_convert_type_to_datachain(typ, expected): - assert python_to_sql(typ) == expected - - @pytest.mark.parametrize( "typ,expected", ( From 258454ed30d2c72ebca90bb112c613b07477202f Mon Sep 17 00:00:00 2001 From: Ivan Longin Date: Mon, 20 Jan 2025 03:28:16 +0100 Subject: [PATCH 21/63] Added full outer join (#822) * added main logic for outer join * fixing filters * removign datasetquery tests and added more datachain unit tests --- src/datachain/data_storage/sqlite.py | 45 +++++++++++++++++++---- src/datachain/data_storage/warehouse.py | 4 +- src/datachain/lib/dc.py | 4 +- src/datachain/query/dataset.py | 12 ++++-- tests/unit/lib/test_datachain_merge.py | 49 ++++++++++++++++++++++++- 5 files changed, 99 insertions(+), 15 deletions(-) diff --git a/src/datachain/data_storage/sqlite.py b/src/datachain/data_storage/sqlite.py index 65dea3b3a..d0247a4df 100644 --- a/src/datachain/data_storage/sqlite.py +++ b/src/datachain/data_storage/sqlite.py @@ -19,6 +19,7 @@ from sqlalchemy.dialects import sqlite from sqlalchemy.schema import CreateIndex, CreateTable, DropTable from sqlalchemy.sql import func +from sqlalchemy.sql.elements import BinaryExpression, BooleanClauseList from sqlalchemy.sql.expression import bindparam, cast from sqlalchemy.sql.selectable import Select from tqdm.auto import tqdm @@ -40,7 +41,6 @@ from sqlalchemy.schema import SchemaItem from sqlalchemy.sql._typing import _FromClauseArgument, _OnClauseArgument from sqlalchemy.sql.elements import ColumnElement - from sqlalchemy.sql.selectable import Join from sqlalchemy.types import TypeEngine from datachain.lib.file import File @@ -654,16 +654,47 @@ def join( right: "_FromClauseArgument", onclause: "_OnClauseArgument", inner: bool = True, - ) -> "Join": + full: bool = False, + columns=None, + ) -> "Select": """ Join two tables together. """ - return sqlalchemy.join( - left, - right, - onclause, - isouter=not inner, + if not full: + join_query = sqlalchemy.join( + left, + right, + onclause, + isouter=not inner, + ) + return sqlalchemy.select(*columns).select_from(join_query) + + left_right_join = sqlalchemy.select(*columns).select_from( + sqlalchemy.join(left, right, onclause, isouter=True) ) + right_left_join = sqlalchemy.select(*columns).select_from( + sqlalchemy.join(right, left, onclause, isouter=True) + ) + + def add_left_rows_filter(exp: BinaryExpression): + """ + Adds filter to right_left_join to remove unmatched left table rows by + getting column names that need to be NULL from BinaryExpressions in onclause + """ + return right_left_join.where( + getattr(left.c, exp.left.name) == None # type: ignore[union-attr] # noqa: E711 + ) + + if isinstance(onclause, BinaryExpression): + right_left_join = add_left_rows_filter(onclause) + + if isinstance(onclause, BooleanClauseList): + for c in onclause.get_children(): + if isinstance(c, BinaryExpression): + right_left_join = add_left_rows_filter(c) + + union = sqlalchemy.union(left_right_join, right_left_join).subquery() + return sqlalchemy.select(*union.c).select_from(union) def create_pre_udf_table(self, query: "Select") -> "Table": """ diff --git a/src/datachain/data_storage/warehouse.py b/src/datachain/data_storage/warehouse.py index f53a4bb4a..9d5dfdc0f 100644 --- a/src/datachain/data_storage/warehouse.py +++ b/src/datachain/data_storage/warehouse.py @@ -31,7 +31,7 @@ _FromClauseArgument, _OnClauseArgument, ) - from sqlalchemy.sql.selectable import Join, Select + from sqlalchemy.sql.selectable import Select from sqlalchemy.types import TypeEngine from datachain.data_storage import schema @@ -873,7 +873,7 @@ def join( right: "_FromClauseArgument", onclause: "_OnClauseArgument", inner: bool = True, - ) -> "Join": + ) -> "Select": """ Join two tables together. """ diff --git a/src/datachain/lib/dc.py b/src/datachain/lib/dc.py index 842ee9d1a..92ac525b0 100644 --- a/src/datachain/lib/dc.py +++ b/src/datachain/lib/dc.py @@ -1332,6 +1332,7 @@ def merge( on: Union[MergeColType, Sequence[MergeColType]], right_on: Optional[Union[MergeColType, Sequence[MergeColType]]] = None, inner=False, + full=False, rname="right_", ) -> "Self": """Merge two chains based on the specified criteria. @@ -1345,6 +1346,7 @@ def merge( right_on: Optional predicate or list of Predicates for the `right_ds` to join. inner (bool): Whether to run inner join or outer join. + full (bool): Whether to run full outer join. rname (str): Name prefix for conflicting signal names. Examples: @@ -1419,7 +1421,7 @@ def _resolve( ) query = self._query.join( - right_ds._query, sqlalchemy.and_(*ops), inner, rname + "{name}" + right_ds._query, sqlalchemy.and_(*ops), inner, full, rname + "{name}" ) query.feature_schema = None ds = self._evolve(query=query) diff --git a/src/datachain/query/dataset.py b/src/datachain/query/dataset.py index 1da0eaaad..9552d16f5 100644 --- a/src/datachain/query/dataset.py +++ b/src/datachain/query/dataset.py @@ -875,6 +875,7 @@ class SQLJoin(Step): query2: "DatasetQuery" predicates: Union[JoinPredicateType, tuple[JoinPredicateType, ...]] inner: bool + full: bool rname: str def get_query(self, dq: "DatasetQuery", temp_tables: list[str]) -> sa.Subquery: @@ -977,14 +978,14 @@ def apply( self.validate_expression(join_expression, q1, q2) def q(*columns): - join_query = self.catalog.warehouse.join( + return self.catalog.warehouse.join( q1, q2, join_expression, inner=self.inner, + full=self.full, + columns=columns, ) - return sqlalchemy.select(*columns).select_from(join_query) - # return sqlalchemy.select(*subquery.c).select_from(subquery) return step_result( q, @@ -1489,6 +1490,7 @@ def join( dataset_query: "DatasetQuery", predicates: Union[JoinPredicateType, Sequence[JoinPredicateType]], inner=False, + full=False, rname="{name}_right", ) -> "Self": left = self.clone(new_table=False) @@ -1504,7 +1506,9 @@ def join( if isinstance(predicates, (str, ColumnClause, ColumnElement)) else tuple(predicates) ) - new_query.steps = [SQLJoin(self.catalog, left, right, predicates, inner, rname)] + new_query.steps = [ + SQLJoin(self.catalog, left, right, predicates, inner, full, rname) + ] return new_query @detach diff --git a/tests/unit/lib/test_datachain_merge.py b/tests/unit/lib/test_datachain_merge.py index 3d5a5265e..ea0399e0a 100644 --- a/tests/unit/lib/test_datachain_merge.py +++ b/tests/unit/lib/test_datachain_merge.py @@ -43,6 +43,7 @@ class TeamMember(BaseModel): TeamMember(player="Alice", sport="volleyball", weight=120.3, height=5.5), TeamMember(player="Charlie", sport="football", weight=200.0, height=6.0), TeamMember(player="David", sport="football", weight=158.7, height=5.7), + TeamMember(player="John", sport="basketball", weight=250.3, height=7.0), ] @@ -77,7 +78,53 @@ def test_merge_objects(test_session): assert pd.isnull(player.height) assert i == len(employees) - assert j == len(team) + assert j == len(team) - 1 + + +@pytest.mark.parametrize("multiple_predicates", [True, False]) +def test_merge_objects_full_join(test_session, multiple_predicates): + ch1 = DataChain.from_values(emp=employees, session=test_session) + ch2 = DataChain.from_values(team=team, session=test_session) + if multiple_predicates: + ch = ch1.merge( + ch2, + ["emp.person.name", "emp.person.name"], + ["team.player", "team.player"], + full=True, + ) + else: + ch = ch1.merge(ch2, "emp.person.name", "team.player", full=True) + + str_default = String.default_value(test_session.catalog.warehouse.db.dialect) + int_default = Int.default_value(test_session.catalog.warehouse.db.dialect) + + i = 0 + for items in ch.order_by("emp.person.name", "team.player").collect(): + assert len(items) == 2 + + empl, player = items + assert isinstance(empl, Employee) + assert isinstance(player, TeamMember) + + if player.player == "John": + assert empl.person.name == str_default + assert empl.person.age == int_default + continue + + if empl.person.name == "Bob": + assert player.player == str_default + assert player.sport == str_default + assert pd.isnull(player.weight) + assert pd.isnull(player.height) + continue + + assert player.player == team[i].player + assert player.sport == team[i].sport + assert math.isclose(player.weight, team[i].weight, rel_tol=1e-7) + assert math.isclose(player.height, team[i].height, rel_tol=1e-7) + i += 1 + + assert i == len(employees) - 1 == len(team) - 1 def test_merge_similar_objects(test_session): From 328c1a750ced5fb65db2b932b23b0ae366cb3c0b Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Mon, 20 Jan 2025 14:34:25 +0545 Subject: [PATCH 22/63] memoize usearch.sqlite_path() (#833) If usearch fails to download the extension, it will keep retrying in the future. This adds significant cost - for example, in `tests/func/test_pytorch.py` run, it was invoked 111 times, taking ~30 seconds in total. Now, we cache the return value for the whole session. --- src/datachain/sql/sqlite/base.py | 49 +++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/datachain/sql/sqlite/base.py b/src/datachain/sql/sqlite/base.py index 552d39efd..d9a285543 100644 --- a/src/datachain/sql/sqlite/base.py +++ b/src/datachain/sql/sqlite/base.py @@ -4,6 +4,7 @@ import warnings from collections.abc import Iterable from datetime import MAXYEAR, MINYEAR, datetime, timezone +from functools import cache from types import MappingProxyType from typing import Callable, Optional @@ -526,24 +527,44 @@ def compile_collect(element, compiler, **kwargs): return compiler.process(func.json_group_array(*element.clauses.clauses), **kwargs) -def load_usearch_extension(conn: sqlite3.Connection) -> bool: +@cache +def usearch_sqlite_path() -> Optional[str]: try: - # usearch is part of the vector optional dependencies - # we use the extension's cosine and euclidean distance functions - from usearch import sqlite_path + import usearch + except ImportError: + return None - conn.enable_load_extension(True) + with warnings.catch_warnings(): + # usearch binary is not available for Windows, see: https://github.com/unum-cloud/usearch/issues/427. + # and, sometimes fail to download the binary in other platforms + # triggering UserWarning. - with warnings.catch_warnings(): - # usearch binary is not available for Windows, see: https://github.com/unum-cloud/usearch/issues/427. - # and, sometimes fail to download the binary in other platforms - # triggering UserWarning. + warnings.filterwarnings("ignore", category=UserWarning, module="usearch") - warnings.filterwarnings("ignore", category=UserWarning, module="usearch") - conn.load_extension(sqlite_path()) + try: + return usearch.sqlite_path() + except FileNotFoundError: + return None - conn.enable_load_extension(False) - return True - except Exception: # noqa: BLE001 +def load_usearch_extension(conn: sqlite3.Connection) -> bool: + # usearch is part of the vector optional dependencies + # we use the extension's cosine and euclidean distance functions + ext_path = usearch_sqlite_path() + if ext_path is None: + return False + + try: + conn.enable_load_extension(True) + except AttributeError: + # sqlite3 module is not built with loadable extension support by default. + return False + + try: + conn.load_extension(ext_path) + except sqlite3.OperationalError: return False + else: + return True + finally: + conn.enable_load_extension(False) From a1a47b2f243dbd93b5a0ee478cf0764723c485b3 Mon Sep 17 00:00:00 2001 From: Ivan Longin Date: Mon, 20 Jan 2025 14:22:37 +0100 Subject: [PATCH 23/63] Added `isnone()` function (#801) Added `isnone()` function --- src/datachain/func/__init__.py | 3 +- src/datachain/func/conditional.py | 90 ++++++++++++++++++++++-------- src/datachain/func/func.py | 22 ++++++-- tests/unit/sql/test_conditional.py | 32 ++++++++++- tests/unit/test_func.py | 83 +++++++++++++++++++++++++++ 5 files changed, 200 insertions(+), 30 deletions(-) diff --git a/src/datachain/func/__init__.py b/src/datachain/func/__init__.py index b7cea4b46..fc7249e0f 100644 --- a/src/datachain/func/__init__.py +++ b/src/datachain/func/__init__.py @@ -16,7 +16,7 @@ sum, ) from .array import cosine_distance, euclidean_distance, length, sip_hash_64 -from .conditional import case, greatest, ifelse, least +from .conditional import case, greatest, ifelse, isnone, least from .numeric import bit_and, bit_hamming_distance, bit_or, bit_xor, int_hash_64 from .random import rand from .string import byte_hamming_distance @@ -42,6 +42,7 @@ "greatest", "ifelse", "int_hash_64", + "isnone", "least", "length", "literal", diff --git a/src/datachain/func/conditional.py b/src/datachain/func/conditional.py index 363e9d216..6f7457c54 100644 --- a/src/datachain/func/conditional.py +++ b/src/datachain/func/conditional.py @@ -1,14 +1,15 @@ -from typing import Union +from typing import Optional, Union +from sqlalchemy import ColumnElement from sqlalchemy import case as sql_case -from sqlalchemy.sql.elements import BinaryExpression from datachain.lib.utils import DataChainParamsError +from datachain.query.schema import Column from datachain.sql.functions import conditional from .func import ColT, Func -CaseT = Union[int, float, complex, bool, str] +CaseT = Union[int, float, complex, bool, str, Func] def greatest(*args: Union[ColT, float]) -> Func: @@ -87,17 +88,21 @@ def least(*args: Union[ColT, float]) -> Func: ) -def case(*args: tuple[BinaryExpression, CaseT], else_=None) -> Func: +def case( + *args: tuple[Union[ColumnElement, Func], CaseT], else_: Optional[CaseT] = None +) -> Func: """ Returns the case function that produces case expression which has a list of - conditions and corresponding results. Results can only be python primitives - like string, numbes or booleans. Result type is inferred from condition results. + conditions and corresponding results. Results can be python primitives like string, + numbers or booleans but can also be other nested function (including case function). + Result type is inferred from condition results. Args: - args (tuple(BinaryExpression, value(str | int | float | complex | bool): - - Tuple of binary expression and values pair which corresponds to one - case condition - value - else_ (str | int | float | complex | bool): else value in case expression + args (tuple((ColumnElement, Func), (str | int | float | complex | bool, Func))): + Tuple of condition and values pair. + else_ (str | int | float | complex | bool, Func): optional else value in case + expression. If omitted, and no case conditions are satisfied, the result + will be None (NULL in DB). Returns: Func: A Func object that represents the case function. @@ -111,15 +116,24 @@ def case(*args: tuple[BinaryExpression, CaseT], else_=None) -> Func: """ supported_types = [int, float, complex, str, bool] - type_ = type(else_) if else_ else None + def _get_type(val): + if isinstance(val, Func): + # nested functions + return val.result_type + return type(val) if not args: raise DataChainParamsError("Missing statements") + type_ = _get_type(else_) if else_ is not None else None + for arg in args: - if type_ and not isinstance(arg[1], type_): - raise DataChainParamsError("Statement values must be of the same type") - type_ = type(arg[1]) + arg_type = _get_type(arg[1]) + if type_ and arg_type != type_: + raise DataChainParamsError( + f"Statement values must be of the same type, got {type_} and {arg_type}" + ) + type_ = arg_type if type_ not in supported_types: raise DataChainParamsError( @@ -127,20 +141,25 @@ def case(*args: tuple[BinaryExpression, CaseT], else_=None) -> Func: ) kwargs = {"else_": else_} - return Func("case", inner=sql_case, args=args, kwargs=kwargs, result_type=type_) + + return Func("case", inner=sql_case, cols=args, kwargs=kwargs, result_type=type_) -def ifelse(condition: BinaryExpression, if_val: CaseT, else_val: CaseT) -> Func: +def ifelse( + condition: Union[ColumnElement, Func], if_val: CaseT, else_val: CaseT +) -> Func: """ Returns the ifelse function that produces if expression which has a condition - and values for true and false outcome. Results can only be python primitives - like string, numbes or booleans. Result type is inferred from the values. + and values for true and false outcome. Results can be one of python primitives + like string, numbers or booleans, but can also be nested functions. + Result type is inferred from the values. Args: - condition: BinaryExpression - condition which is evaluated - if_val: (str | int | float | complex | bool): value for true condition outcome - else_val: (str | int | float | complex | bool): value for false condition - outcome + condition (ColumnElement, Func): Condition which is evaluated. + if_val (str | int | float | complex | bool, Func): Value for true + condition outcome. + else_val (str | int | float | complex | bool, Func): Value for false condition + outcome. Returns: Func: A Func object that represents the ifelse function. @@ -148,8 +167,33 @@ def ifelse(condition: BinaryExpression, if_val: CaseT, else_val: CaseT) -> Func: Example: ```py dc.mutate( - res=func.ifelse(C("num") > 0, "P", "N"), + res=func.ifelse(isnone("col"), "EMPTY", "NOT_EMPTY") ) ``` """ return case((condition, if_val), else_=else_val) + + +def isnone(col: Union[str, Column]) -> Func: + """ + Returns True if column value is None, otherwise False. + + Args: + col (str | Column): Column to check if it's None or not. + If a string is provided, it is assumed to be the name of the column. + + Returns: + Func: A Func object that represents the conditional to check if column is None. + + Example: + ```py + dc.mutate(test=ifelse(isnone("col"), "EMPTY", "NOT_EMPTY")) + ``` + """ + from datachain import C + + if isinstance(col, str): + # if string, it is assumed to be the name of the column + col = C(col) + + return case((col.is_(None) if col is not None else True, True), else_=False) diff --git a/src/datachain/func/func.py b/src/datachain/func/func.py index 90ee5796e..072519df2 100644 --- a/src/datachain/func/func.py +++ b/src/datachain/func/func.py @@ -23,7 +23,7 @@ from .window import Window -ColT = Union[str, ColumnElement, "Func"] +ColT = Union[str, ColumnElement, "Func", tuple] class Func(Function): @@ -78,7 +78,7 @@ def _db_cols(self) -> Sequence[ColT]: return ( [ col - if isinstance(col, (Func, BindParameter, Case, Comparator)) + if isinstance(col, (Func, BindParameter, Case, Comparator, tuple)) else ColumnMeta.to_db_name( col.name if isinstance(col, ColumnElement) else col ) @@ -381,17 +381,24 @@ def get_column( col_type = self.get_result_type(signals_schema) sql_type = python_to_sql(col_type) - def get_col(col: ColT) -> ColT: + def get_col(col: ColT, string_as_literal=False) -> ColT: + # string_as_literal is used only for conditionals like `case()` where + # literals are nested inside ColT as we have tuples of condition - values + # and if user wants to set some case value as column, explicit `C("col")` + # syntax must be used to distinguish from literals + if isinstance(col, tuple): + return tuple(get_col(x, string_as_literal=True) for x in col) if isinstance(col, Func): return col.get_column(signals_schema, table=table) - if isinstance(col, str): + if isinstance(col, str) and not string_as_literal: column = Column(col, sql_type) column.table = table return column return col cols = [get_col(col) for col in self._db_cols] - func_col = self.inner(*cols, *self.args, **self.kwargs) + kwargs = {k: get_col(v, string_as_literal=True) for k, v in self.kwargs.items()} + func_col = self.inner(*cols, *self.args, **kwargs) if self.is_window: if not self.window: @@ -416,6 +423,11 @@ def get_col(col: ColT) -> ColT: def get_db_col_type(signals_schema: "SignalSchema", col: ColT) -> "DataType": + if isinstance(col, tuple): + raise DataChainParamsError( + "Cannot get type from tuple, please provide type hint to the function" + ) + if isinstance(col, Func): return col.get_result_type(signals_schema) diff --git a/tests/unit/sql/test_conditional.py b/tests/unit/sql/test_conditional.py index b1c4f59bd..e78cdcb24 100644 --- a/tests/unit/sql/test_conditional.py +++ b/tests/unit/sql/test_conditional.py @@ -86,6 +86,19 @@ def test_case(warehouse, val, expected): assert result == ((expected,),) +@pytest.mark.parametrize( + "val,expected", + [ + (1, "A"), + (2, None), + ], +) +def test_case_without_else(warehouse, val, expected): + query = select(func.case(*[(val < 2, "A")])) + result = tuple(warehouse.db.execute(query)) + assert result == ((expected,),) + + def test_case_missing_statements(warehouse): with pytest.raises(DataChainParamsError) as exc_info: select(func.case(*[], else_="D")) @@ -96,7 +109,9 @@ def test_case_not_same_result_types(warehouse): val = 2 with pytest.raises(DataChainParamsError) as exc_info: select(func.case(*[(val > 1, "A"), (2 < val < 4, 5)], else_="D")) - assert str(exc_info.value) == "Statement values must be of the same type" + assert str(exc_info.value) == ( + "Statement values must be of the same type, got and " + ) def test_case_wrong_result_type(warehouse): @@ -124,3 +139,18 @@ def test_ifelse(warehouse, val, expected): query = select(func.ifelse(val <= 3, "L", "H")) result = tuple(warehouse.db.execute(query)) assert result == ((expected,),) + + +@pytest.mark.parametrize( + "val,expected", + [ + [None, True], + [func.literal("abcd"), False], + ], +) +def test_isnone(warehouse, val, expected): + from datachain.func.conditional import isnone + + query = select(isnone(val)) + result = tuple(warehouse.db.execute(query)) + assert result == ((expected,),) diff --git a/tests/unit/test_func.py b/tests/unit/test_func.py index ad6d062b0..4b4237f12 100644 --- a/tests/unit/test_func.py +++ b/tests/unit/test_func.py @@ -8,6 +8,7 @@ case, ifelse, int_hash_64, + isnone, literal, ) from datachain.func.random import rand @@ -18,6 +19,7 @@ sqlite_byte_hamming_distance, sqlite_int_hash_64, ) +from tests.utils import skip_if_not_sqlite @pytest.fixture() @@ -663,6 +665,59 @@ def test_case_mutate(dc, val, else_, type_): assert res.schema["test"] == type_ +@pytest.mark.parametrize( + "val,else_,type_", + [ + ["A", "D", str], + [1, 2, int], + [1.5, 2.5, float], + [True, False, bool], + ], +) +def test_nested_case_on_condition_mutate(dc, val, else_, type_): + res = dc.mutate( + test=case((case((C("num") < 2, True), else_=False), val), else_=else_) + ) + assert list(res.order_by("test").collect("test")) == sorted( + [val, else_, else_, else_, else_] + ) + assert res.schema["test"] == type_ + + +@pytest.mark.parametrize( + "v1,v2,v3,type_", + [ + ["A", "B", "C", str], + [1, 2, 3, int], + [1.5, 2.5, 3.5, float], + [False, True, True, bool], + ], +) +def test_nested_case_on_value_mutate(dc, v1, v2, v3, type_): + res = dc.mutate( + test=case((C("num") < 4, case((C("num") < 2, v1), else_=v2)), else_=v3) + ) + assert list(res.order_by("num").collect("test")) == sorted([v1, v2, v2, v3, v3]) + assert res.schema["test"] == type_ + + +@pytest.mark.parametrize( + "v1,v2,v3,type_", + [ + ["A", "B", "C", str], + [1, 2, 3, int], + [1.5, 2.5, 3.5, float], + [False, True, True, bool], + ], +) +def test_nested_case_on_else_mutate(dc, v1, v2, v3, type_): + res = dc.mutate( + test=case((C("num") < 3, v1), else_=case((C("num") < 4, v2), else_=v3)) + ) + assert list(res.order_by("num").collect("test")) == sorted([v1, v1, v2, v3, v3]) + assert res.schema["test"] == type_ + + @pytest.mark.parametrize( "if_val,else_val,type_", [ @@ -678,3 +733,31 @@ def test_ifelse_mutate(dc, if_val, else_val, type_): [if_val, else_val, else_val, else_val, else_val] ) assert res.schema["test"] == type_ + + +@pytest.mark.parametrize("col", ["val", C("val")]) +@skip_if_not_sqlite +def test_isnone_mutate(col): + dc = DataChain.from_values( + num=list(range(1, 6)), + val=[None if i > 3 else "A" for i in range(1, 6)], + ) + + res = dc.mutate(test=isnone(col)) + assert list(res.order_by("test").collect("test")) == sorted( + [False, False, False, True, True] + ) + assert res.schema["test"] is bool + + +@pytest.mark.parametrize("col", [C("val"), "val"]) +@skip_if_not_sqlite +def test_isnone_with_ifelse_mutate(col): + dc = DataChain.from_values( + num=list(range(1, 6)), + val=[None if i > 3 else "A" for i in range(1, 6)], + ) + + res = dc.mutate(test=ifelse(isnone(col), "NONE", "NOT_NONE")) + assert list(res.order_by("num").collect("test")) == ["NOT_NONE"] * 3 + ["NONE"] * 2 + assert res.schema["test"] is str From 5b2f45b9c436fd9c4b16766873a4fb5892383e00 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Mon, 20 Jan 2025 19:39:59 +0545 Subject: [PATCH 24/63] tests: reduce pytorch functional tests' runtime (#834) --- pyproject.toml | 4 ++-- tests/func/test_pytorch.py | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d14749032..a664822bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,7 +97,6 @@ tests = [ "virtualenv", "dulwich", "hypothesis", - "open_clip_torch", "aiotools>=1.7.0", "requests-mock", "scipy" @@ -120,7 +119,8 @@ examples = [ "pdfplumber==0.11.5", "huggingface_hub[hf_transfer]", "onnx==1.16.1", - "ultralytics==8.3.61" + "ultralytics==8.3.61", + "open_clip_torch" ] [project.urls] diff --git a/tests/func/test_pytorch.py b/tests/func/test_pytorch.py index a39df26b7..107dbfbf5 100644 --- a/tests/func/test_pytorch.py +++ b/tests/func/test_pytorch.py @@ -1,7 +1,7 @@ import os +import random from contextlib import closing -import open_clip import pytest import torch from datasets import load_dataset @@ -14,11 +14,11 @@ from datachain.lib.pytorch import PytorchDataset -@pytest.fixture -def fake_image_dir(catalog, tmp_path): +@pytest.fixture(scope="module") +def fake_image_dir(tmp_path_factory): # Create fake images in labeled dirs - data_path = tmp_path / "data" / "" - for i, (img, label) in enumerate(FakeData()): + data_path = tmp_path_factory.mktemp("data") + for i, (img, label) in enumerate(FakeData(size=100)): label = str(label) (data_path / label).mkdir(parents=True, exist_ok=True) img.save(data_path / label / f"{i}.jpg") @@ -31,22 +31,26 @@ def fake_dataset(catalog, fake_image_dir): uri = fake_image_dir.as_uri() return ( DataChain.from_storage(uri, type="image") + .settings(prefetch=0, cache=False) .map(text=lambda file: file.parent.split("/")[-1], output=str) .map(label=lambda text: int(text), output=int) .save("fake") ) +def fake_tokenizer(text: str): + return [random.randint(0, 100) for _ in text] # noqa: S311 + + def test_pytorch_dataset(fake_dataset): transform = v2.Compose( [v2.ToImage(), v2.ToDtype(torch.float32, scale=True), v2.Resize((64, 64))] ) - tokenizer = open_clip.get_tokenizer("ViT-B-32") pt_dataset = PytorchDataset( name=fake_dataset.name, version=fake_dataset.version, transform=transform, - tokenizer=tokenizer, + tokenizer=fake_tokenizer, ) img, text, label = next(iter(pt_dataset)) assert isinstance(img, Tensor) @@ -63,9 +67,9 @@ def test_pytorch_dataset_sample(fake_dataset): name=fake_dataset.name, version=fake_dataset.version, transform=transform, - num_samples=700, + num_samples=50, ) - assert len(list(pt_dataset)) == 700 + assert len(list(pt_dataset)) == 50 def test_to_pytorch(fake_dataset): @@ -74,8 +78,7 @@ def test_to_pytorch(fake_dataset): transform = v2.Compose( [v2.ToImage(), v2.ToDtype(torch.float32, scale=True), v2.Resize((64, 64))] ) - tokenizer = open_clip.get_tokenizer("ViT-B-32") - pt_dataset = fake_dataset.to_pytorch(transform=transform, tokenizer=tokenizer) + pt_dataset = fake_dataset.to_pytorch(transform=transform, tokenizer=fake_tokenizer) assert isinstance(pt_dataset, IterableDataset) img, text, label = next(iter(pt_dataset)) assert isinstance(img, Tensor) From 14caa082eb1173554d3a515bb04a7705da96b435 Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Tue, 21 Jan 2025 06:37:54 +1100 Subject: [PATCH 25/63] improve runtime of diff unit tests (#831) --- tests/unit/lib/test_diff.py | 165 +++++++++++++++++------------------- tests/unit/test_diff.py | 70 --------------- 2 files changed, 76 insertions(+), 159 deletions(-) delete mode 100644 tests/unit/test_diff.py diff --git a/tests/unit/lib/test_diff.py b/tests/unit/lib/test_diff.py index 0267b8af3..2a572fad2 100644 --- a/tests/unit/lib/test_diff.py +++ b/tests/unit/lib/test_diff.py @@ -1,7 +1,7 @@ import pytest from pydantic import BaseModel -from datachain.diff import CompareStatus +from datachain.diff import CompareStatus, compare_and_split from datachain.lib.dc import DataChain from datachain.lib.file import File from datachain.sql.types import Int64, String @@ -12,9 +12,7 @@ @pytest.mark.parametrize("deleted", (True, False)) @pytest.mark.parametrize("modified", (True, False)) @pytest.mark.parametrize("same", (True, False)) -@pytest.mark.parametrize("status_col", ("diff", None)) -@pytest.mark.parametrize("save", (True, False)) -def test_compare(test_session, added, deleted, modified, same, status_col, save): +def test_compare(test_session, added, deleted, modified, same): ds1 = DataChain.from_values( id=[1, 2, 4], name=["John1", "Doe", "Andy"], @@ -36,7 +34,7 @@ def test_compare(test_session, added, deleted, modified, same, status_col, save) modified=modified, same=same, on=["id"], - status_col=status_col, + status_col="diff", ) assert str(exc_info.value) == ( "At least one of added, deleted, modified, same flags must be set" @@ -53,29 +51,65 @@ def test_compare(test_session, added, deleted, modified, same, status_col, save) status_col="diff", ) - if save: - diff.save("diff") - diff = DataChain.from_dataset("diff") + chains = compare_and_split( + ds1, + ds2, + same=True, + on=["id"], + ) expected = [] + if modified: + assert "diff" not in chains[CompareStatus.MODIFIED].signals_schema.db_signals() expected.append((CompareStatus.MODIFIED, 1, "John1")) + if added: + assert "diff" not in chains[CompareStatus.ADDED].signals_schema.db_signals() expected.append((CompareStatus.ADDED, 2, "Doe")) + if deleted: + assert "diff" not in chains[CompareStatus.DELETED].signals_schema.db_signals() expected.append((CompareStatus.DELETED, 3, "Mark")) + if same: + assert "diff" not in chains[CompareStatus.SAME].signals_schema.db_signals() expected.append((CompareStatus.SAME, 4, "Andy")) - collect_fields = ["diff", "id", "name"] - if not status_col: - expected = [row[1:] for row in expected] - collect_fields = collect_fields[1:] + assert list(diff.order_by("id").collect("diff", "id", "name")) == expected - assert list(diff.order_by("id").collect(*collect_fields)) == expected +def test_compare_no_status_col(test_session): + ds1 = DataChain.from_values( + id=[1, 2, 4], + name=["John1", "Doe", "Andy"], + session=test_session, + ).save("ds1") -def test_compare_with_from_dataset(test_session): + ds2 = DataChain.from_values( + id=[1, 3, 4], + name=["John", "Mark", "Andy"], + session=test_session, + ).save("ds2") + + diff = ds1.compare( + ds2, + same=True, + on=["id"], + status_col=None, + ) + + expected = [ + (1, "John1"), + (2, "Doe"), + (3, "Mark"), + (4, "Andy"), + ] + + assert list(diff.order_by("id").collect()) == expected + + +def test_compare_from_datasets(test_session): ds1 = DataChain.from_values( id=[1, 2, 4], name=["John1", "Doe", "Andy"], @@ -102,17 +136,8 @@ def test_compare_with_from_dataset(test_session): ] -@pytest.mark.parametrize("added", (True, False)) -@pytest.mark.parametrize("deleted", (True, False)) -@pytest.mark.parametrize("modified", (True, False)) -@pytest.mark.parametrize("same", (True, False)) @pytest.mark.parametrize("right_name", ("other_name", "name")) -def test_compare_with_explicit_compare_fields( - test_session, added, deleted, modified, same, right_name -): - if not any([added, deleted, modified, same]): - pytest.skip("This case is tested in another test") - +def test_compare_with_explicit_compare_fields(test_session, right_name): ds1 = DataChain.from_values( id=[1, 2, 4], name=["John1", "Doe", "Andy"], @@ -134,46 +159,29 @@ def test_compare_with_explicit_compare_fields( on=["id"], compare=["name"], right_compare=[right_name], - added=added, - deleted=deleted, - modified=modified, - same=same, + same=True, status_col="diff", ) string_default = String.default_value(test_session.catalog.warehouse.db.dialect) - expected = [] - if modified: - expected.append((CompareStatus.MODIFIED, 1, "John1", "New York")) - if added: - expected.append((CompareStatus.ADDED, 2, "Doe", "Boston")) - if deleted: - expected.append( - ( - CompareStatus.DELETED, - 3, - string_default if right_name == "other_name" else "Mark", - "Seattle", - ) - ) - if same: - expected.append((CompareStatus.SAME, 4, "Andy", "San Francisco")) + expected = [ + (CompareStatus.MODIFIED, 1, "John1", "New York"), + (CompareStatus.ADDED, 2, "Doe", "Boston"), + ( + CompareStatus.DELETED, + 3, + string_default if right_name == "other_name" else "Mark", + "Seattle", + ), + (CompareStatus.SAME, 4, "Andy", "San Francisco"), + ] collect_fields = ["diff", "id", "name", "city"] assert list(diff.order_by("id").collect(*collect_fields)) == expected -@pytest.mark.parametrize("added", (True, False)) -@pytest.mark.parametrize("deleted", (True, False)) -@pytest.mark.parametrize("modified", (True, False)) -@pytest.mark.parametrize("same", (True, False)) -def test_compare_different_left_right_on_columns( - test_session, added, deleted, modified, same -): - if not any([added, deleted, modified, same]): - pytest.skip("This case is tested in another test") - +def test_compare_different_left_right_on_columns(test_session): ds1 = DataChain.from_values( id=[1, 2, 4], name=["John1", "Doe", "Andy"], @@ -188,10 +196,7 @@ def test_compare_different_left_right_on_columns( diff = ds1.compare( ds2, - added=added, - deleted=deleted, - modified=modified, - same=same, + same=True, on=["id"], right_on=["other_id"], status_col="diff", @@ -199,31 +204,19 @@ def test_compare_different_left_right_on_columns( int_default = Int64.default_value(test_session.catalog.warehouse.db.dialect) - expected = [] - if same: - expected.append((CompareStatus.SAME, 4, "Andy")) - if added: - expected.append((CompareStatus.ADDED, 2, "Doe")) - if modified: - expected.append((CompareStatus.MODIFIED, 1, "John1")) - if deleted: - expected.append((CompareStatus.DELETED, int_default, "Mark")) + expected = [ + (CompareStatus.SAME, 4, "Andy"), + (CompareStatus.ADDED, 2, "Doe"), + (CompareStatus.MODIFIED, 1, "John1"), + (CompareStatus.DELETED, int_default, "Mark"), + ] collect_fields = ["diff", "id", "name"] assert list(diff.order_by("name").collect(*collect_fields)) == expected -@pytest.mark.parametrize("added", (True, False)) -@pytest.mark.parametrize("deleted", (True, False)) -@pytest.mark.parametrize("modified", (True, False)) -@pytest.mark.parametrize("same", (True, False)) @pytest.mark.parametrize("on_self", (True, False)) -def test_compare_on_equal_datasets( - test_session, added, deleted, modified, same, on_self -): - if not any([added, deleted, modified, same]): - pytest.skip("This case is tested in another test") - +def test_compare_on_equal_datasets(test_session, on_self): ds1 = DataChain.from_values( id=[1, 2, 3], name=["John", "Doe", "Andy"], @@ -241,22 +234,16 @@ def test_compare_on_equal_datasets( diff = ds1.compare( ds2, - added=added, - deleted=deleted, - modified=modified, - same=same, + same=True, on=["id"], status_col="diff", ) - if not same: - expected = [] - else: - expected = [ - (CompareStatus.SAME, 1, "John"), - (CompareStatus.SAME, 2, "Doe"), - (CompareStatus.SAME, 3, "Andy"), - ] + expected = [ + (CompareStatus.SAME, 1, "John"), + (CompareStatus.SAME, 2, "Doe"), + (CompareStatus.SAME, 3, "Andy"), + ] collect_fields = ["diff", "id", "name"] assert list(diff.order_by("id").collect(*collect_fields)) == expected diff --git a/tests/unit/test_diff.py b/tests/unit/test_diff.py deleted file mode 100644 index 885dbcbf5..000000000 --- a/tests/unit/test_diff.py +++ /dev/null @@ -1,70 +0,0 @@ -import pytest - -from datachain.diff import CompareStatus, compare_and_split -from datachain.lib.dc import DataChain - - -@pytest.mark.parametrize("added", (True, False)) -@pytest.mark.parametrize("deleted", (True, False)) -@pytest.mark.parametrize("modified", (True, False)) -@pytest.mark.parametrize("same", (True, False)) -def test_compare(test_session, added, deleted, modified, same): - ds1 = DataChain.from_values( - id=[1, 2, 4], - name=["John1", "Doe", "Andy"], - session=test_session, - ).save("ds1") - - ds2 = DataChain.from_values( - id=[1, 3, 4], - name=["John", "Mark", "Andy"], - session=test_session, - ).save("ds2") - - if not any([added, deleted, modified, same]): - with pytest.raises(ValueError) as exc_info: - compare_and_split( - ds1, - ds2, - added=added, - deleted=deleted, - modified=modified, - same=same, - on=["id"], - ) - assert str(exc_info.value) == ( - "At least one of added, deleted, modified, same flags must be set" - ) - return - - chains = compare_and_split( - ds1, - ds2, - added=added, - deleted=deleted, - modified=modified, - same=same, - on=["id"], - ) - - collect_fields = ["id", "name"] - if added: - assert "diff" not in chains[CompareStatus.ADDED].signals_schema.db_signals() - assert list( - chains[CompareStatus.ADDED].order_by("id").collect(*collect_fields) - ) == [(2, "Doe")] - if deleted: - assert "diff" not in chains[CompareStatus.DELETED].signals_schema.db_signals() - assert list( - chains[CompareStatus.DELETED].order_by("id").collect(*collect_fields) - ) == [(3, "Mark")] - if modified: - assert "diff" not in chains[CompareStatus.MODIFIED].signals_schema.db_signals() - assert list( - chains[CompareStatus.MODIFIED].order_by("id").collect(*collect_fields) - ) == [(1, "John1")] - if same: - assert "diff" not in chains[CompareStatus.SAME].signals_schema.db_signals() - assert list( - chains[CompareStatus.SAME].order_by("id").collect(*collect_fields) - ) == [(4, "Andy")] From 746fd7340dc27f43b09a83c4e3957e520cb481b9 Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Tue, 21 Jan 2025 06:41:00 +1100 Subject: [PATCH 26/63] move functional tests out of unit test suite (#832) * move tests using cloud_test_catalog into func directory * move tests using tmpfile catalog * move long running tests that read/write from disk --- tests/func/test_client.py | 96 +++++++++++++ tests/func/test_data_storage.py | 160 +++++++++++++++++++++ tests/func/test_datachain.py | 89 ++++++++++++ tests/func/test_datachain_merge.py | 101 +++++++++++++ tests/func/test_file.py | 45 ++++++ tests/func/test_hf.py | 50 +++++++ tests/func/test_listing.py | 39 ++++- tests/func/test_warehouse.py | 6 + tests/unit/lib/test_datachain.py | 58 -------- tests/unit/lib/test_datachain_bootstrap.py | 30 ---- tests/unit/lib/test_datachain_merge.py | 99 +------------ tests/unit/lib/test_file.py | 42 ------ tests/unit/lib/test_hf.py | 45 +----- tests/unit/test_client.py | 93 ------------ tests/unit/test_data_storage.py | 134 ----------------- tests/unit/test_listing.py | 36 ----- tests/unit/test_warehouse.py | 8 -- 17 files changed, 587 insertions(+), 544 deletions(-) create mode 100644 tests/func/test_data_storage.py create mode 100644 tests/func/test_datachain_merge.py create mode 100644 tests/func/test_file.py create mode 100644 tests/func/test_hf.py create mode 100644 tests/func/test_warehouse.py diff --git a/tests/func/test_client.py b/tests/func/test_client.py index 5237d4948..10cfed471 100644 --- a/tests/func/test_client.py +++ b/tests/func/test_client.py @@ -1,12 +1,22 @@ import asyncio +import os +import sys +from pathlib import Path import pytest from fsspec.asyn import sync +from hypothesis import HealthCheck, assume, given, settings +from hypothesis import strategies as st from tqdm import tqdm from datachain.asyn import get_loop from datachain.client import Client from tests.data import ENTRIES +from tests.utils import uppercase_scheme + +_non_null_text = st.text( + alphabet=st.characters(blacklist_categories=["Cc", "Cs"]), min_size=1 +) @pytest.fixture @@ -91,3 +101,89 @@ def test_fetch_dir_does_not_return_self(client, cloud_type): ) assert "directory" not in subdirs + + +@settings(suppress_health_check=[HealthCheck.function_scoped_fixture], deadline=None) +@given(rel_path=_non_null_text) +def test_parse_url(cloud_test_catalog, rel_path, cloud_type): + if cloud_type == "file": + assume(not rel_path.startswith("/")) + bucket_uri = cloud_test_catalog.src_uri + url = f"{bucket_uri}/{rel_path}" + uri, rel_part = Client.parse_url(url) + if cloud_type == "file": + assert uri == url.rsplit("/", 1)[0] + assert rel_part == url.rsplit("/", 1)[1] + else: + assert uri == bucket_uri + assert rel_part == rel_path + + +@settings(suppress_health_check=[HealthCheck.function_scoped_fixture], deadline=None) +@given(rel_path=_non_null_text) +def test_get_client(cloud_test_catalog, rel_path, cloud_type): + catalog = cloud_test_catalog.catalog + bucket_uri = cloud_test_catalog.src_uri + url = f"{bucket_uri}/{rel_path}" + client = Client.get_client(url, catalog.cache) + assert client + assert client.uri + + +@settings(suppress_health_check=[HealthCheck.function_scoped_fixture], deadline=None) +@given(rel_path=_non_null_text) +def test_parse_url_uppercase_scheme(cloud_test_catalog, rel_path, cloud_type): + if cloud_type == "file": + assume(not rel_path.startswith("/")) + bucket_uri = cloud_test_catalog.src_uri + bucket_uri_upper = uppercase_scheme(bucket_uri) + url = f"{bucket_uri_upper}/{rel_path}" + uri, rel_part = Client.parse_url(url) + if cloud_type == "file": + url = f"{bucket_uri}/{rel_path}" + assert uri == url.rsplit("/", 1)[0] + assert rel_part == url.rsplit("/", 1)[1] + else: + assert uri == bucket_uri + assert rel_part == rel_path + + +@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) +def test_parse_file_absolute_path_without_protocol(cloud_test_catalog): + working_dir = Path().absolute() + uri, rel_part = Client.parse_url(str(working_dir / Path("animals"))) + assert uri == working_dir.as_uri() + assert rel_part == "animals" + + +@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) +def test_parse_file_relative_path_multiple_dirs_back(cloud_test_catalog): + uri, rel_part = Client.parse_url("../../animals".replace("/", os.sep)) + assert uri == Path().absolute().parents[1].as_uri() + assert rel_part == "animals" + + +@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) +@pytest.mark.parametrize("url", ["./animals".replace("/", os.sep), "animals"]) +def test_parse_file_relative_path_working_dir(cloud_test_catalog, url): + uri, rel_part = Client.parse_url(url) + assert uri == Path().absolute().as_uri() + assert rel_part == "animals" + + +@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) +def test_parse_file_relative_path_home_dir(cloud_test_catalog): + if sys.platform == "win32": + # home dir shortcut is not available on windows + pytest.skip() + uri, rel_part = Client.parse_url("~/animals") + assert uri == Path().home().as_uri() + assert rel_part == "animals" + + +@pytest.mark.parametrize("cloud_type", ["s3", "azure", "gs"], indirect=True) +def test_parse_cloud_path_ends_with_slash(cloud_test_catalog): + uri = f"{cloud_test_catalog.src_uri}/animals/" + uri, rel_part = Client.parse_url(uri) + assert uri == cloud_test_catalog.src_uri + assert rel_part == "animals/" diff --git a/tests/func/test_data_storage.py b/tests/func/test_data_storage.py new file mode 100644 index 000000000..64fd7c410 --- /dev/null +++ b/tests/func/test_data_storage.py @@ -0,0 +1,160 @@ +from datetime import datetime +from typing import Any + +import pytest + +from datachain.sql.types import ( + JSON, + Array, + Boolean, + DateTime, + Float, + Float32, + Float64, + Int, + String, +) +from tests.utils import ( + DEFAULT_TREE, + TARRED_TREE, + create_tar_dataset_with_legacy_columns, +) + +COMPLEX_TREE: dict[str, Any] = { + **TARRED_TREE, + **DEFAULT_TREE, + "nested": {"dir": {"path": {"abc.txt": "abc"}}}, +} + + +@pytest.mark.parametrize("tree", [COMPLEX_TREE], indirect=True) +def test_dir_expansion(cloud_test_catalog, version_aware, cloud_type): + has_version = version_aware or cloud_type == "gs" + + ctc = cloud_test_catalog + session = ctc.session + catalog = ctc.catalog + src_uri = ctc.src_uri + if cloud_type == "file": + # we don't want to index things in parent directory + src_uri += "/" + + dc = create_tar_dataset_with_legacy_columns(session, ctc.src_uri, "dc") + dataset = catalog.get_dataset(dc.name) + with catalog.warehouse.clone() as warehouse: + dr = warehouse.dataset_rows(dataset, object_name="file") + de = dr.dir_expansion() + q = de.query(dr.get_table()) + + columns = ( + "id", + "is_dir", + "source", + "path", + "version", + "location", + ) + + result = [dict(zip(columns, r)) for r in warehouse.db.execute(q)] + to_compare = [(r["path"], r["is_dir"], r["version"] != "") for r in result] + + assert all(r["source"] == ctc.src_uri for r in result) + + # Note, we have both a file and a directory entry for expanded tar files + expected = [ + ("animals.tar", 0, has_version), + ("animals.tar", 1, False), + ("animals.tar/cats", 1, False), + ("animals.tar/cats/cat1", 0, has_version), + ("animals.tar/cats/cat2", 0, has_version), + ("animals.tar/description", 0, has_version), + ("animals.tar/dogs", 1, False), + ("animals.tar/dogs/dog1", 0, has_version), + ("animals.tar/dogs/dog2", 0, has_version), + ("animals.tar/dogs/dog3", 0, has_version), + ("animals.tar/dogs/others", 1, False), + ("animals.tar/dogs/others/dog4", 0, has_version), + ("cats", 1, False), + ("cats/cat1", 0, has_version), + ("cats/cat2", 0, has_version), + ("description", 0, has_version), + ("dogs", 1, False), + ("dogs/dog1", 0, has_version), + ("dogs/dog2", 0, has_version), + ("dogs/dog3", 0, has_version), + ("dogs/others", 1, False), + ("dogs/others/dog4", 0, has_version), + ("nested", 1, False), + ("nested/dir", 1, False), + ("nested/dir/path", 1, False), + ("nested/dir/path/abc.txt", 0, has_version), + ] + + assert to_compare == expected + + +@pytest.mark.parametrize( + "cloud_type,version_aware", + [("s3", True)], + indirect=True, +) +def test_convert_type(cloud_test_catalog): + ctc = cloud_test_catalog + catalog = ctc.catalog + warehouse = catalog.warehouse + now = datetime.now() + + def run_convert_type(value, sql_type): + return warehouse.convert_type( + value, + sql_type, + warehouse.python_type(sql_type), + type(sql_type).__name__, + "test_column", + ) + + # convert int to float + for f in [Float, Float32, Float64]: + converted = run_convert_type(1, f()) + assert converted == 1.0 + assert isinstance(converted, float) + + # types match, nothing to convert + assert run_convert_type(1, Int()) == 1 + assert run_convert_type(1.5, Float()) == 1.5 + assert run_convert_type(True, Boolean()) is True + assert run_convert_type("s", String()) == "s" + assert run_convert_type(now, DateTime()) == now + assert run_convert_type([1, 2], Array(Int)) == [1, 2] + assert run_convert_type([1.5, 2.5], Array(Float)) == [1.5, 2.5] + assert run_convert_type(["a", "b"], Array(String)) == ["a", "b"] + assert run_convert_type([[1, 2], [3, 4]], Array(Array(Int))) == [ + [1, 2], + [3, 4], + ] + + # JSON Tests + assert run_convert_type('{"a": 1}', JSON()) == '{"a": 1}' + assert run_convert_type({"a": 1}, JSON()) == '{"a": 1}' + assert run_convert_type([{"a": 1}], JSON()) == '[{"a": 1}]' + with pytest.raises(ValueError): + run_convert_type(0.5, JSON()) + + # convert array to compatible type + converted = run_convert_type([1, 2], Array(Float)) + assert converted == [1.0, 2.0] + assert all(isinstance(c, float) for c in converted) + + # convert nested array to compatible type + converted = run_convert_type([[1, 2], [3, 4]], Array(Array(Float))) + assert converted == [[1.0, 2.0], [3.0, 4.0]] + assert all(isinstance(c, float) for c in converted[0]) + assert all(isinstance(c, float) for c in converted[1]) + + # error, float to int + with pytest.raises(ValueError): + run_convert_type(1.5, Int()) + + # error, float to int in list + with pytest.raises(ValueError): + run_convert_type([1.5, 1], Array(Int)) diff --git a/tests/func/test_datachain.py b/tests/func/test_datachain.py index a486d2c28..1ddb7cdcf 100644 --- a/tests/func/test_datachain.py +++ b/tests/func/test_datachain.py @@ -1,4 +1,5 @@ import functools +import json import math import os import pickle @@ -555,6 +556,23 @@ def test_mutate_existing_column(test_session): assert list(ds.order_by("ids").collect()) == [(2,), (3,), (4,)] +@pytest.mark.parametrize("processes", [False, 2, True]) +@pytest.mark.xdist_group(name="tmpfile") +def test_parallel(processes, test_session_tmpfile): + prefix = "t & " + vals = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] + + res = list( + DataChain.from_values(key=vals, session=test_session_tmpfile) + .settings(parallel=processes) + .map(res=lambda key: prefix + key) + .order_by("res") + .collect("res") + ) + + assert res == [prefix + v for v in vals] + + @pytest.mark.parametrize( "cloud_type,version_aware", [("s3", True)], @@ -613,6 +631,36 @@ def name_len(name): assert count == 7 +@pytest.mark.xdist_group(name="tmpfile") +def test_udf_parallel_boostrap(test_session_tmpfile): + vals = ["a", "b", "c", "d", "e", "f"] + + class MyMapper(Mapper): + DEFAULT_VALUE = 84 + BOOTSTRAP_VALUE = 1452 + TEARDOWN_VALUE = 98763 + + def __init__(self): + super().__init__() + self.value = MyMapper.DEFAULT_VALUE + self._had_teardown = False + + def process(self, *args) -> int: + return self.value + + def setup(self): + self.value = MyMapper.BOOTSTRAP_VALUE + + def teardown(self): + self.value = MyMapper.TEARDOWN_VALUE + + chain = DataChain.from_values(key=vals, session=test_session_tmpfile) + + res = list(chain.settings(parallel=4).map(res=MyMapper()).collect("res")) + + assert res == [MyMapper.BOOTSTRAP_VALUE] * len(vals) + + @pytest.mark.parametrize( "cloud_type,version_aware", [("s3", True)], @@ -1653,6 +1701,47 @@ def test_to_from_parquet_partitioned_remote(cloud_test_catalog_upload): assert df_equal(df1, df) +# These deprecation warnings occur in the datamodel-code-generator package. +@pytest.mark.filterwarnings("ignore::pydantic.warnings.PydanticDeprecatedSince20") +def test_to_from_json(tmp_dir, test_session): + df = pd.DataFrame(DF_DATA) + dc_to = DataChain.from_pandas(df, session=test_session) + path = tmp_dir / "test.json" + dc_to.order_by("first_name", "age").to_json(path) + + with open(path) as f: + values = json.load(f) + assert values == [ + {"first_name": n, "age": a, "city": c} + for n, a, c in zip(DF_DATA["first_name"], DF_DATA["age"], DF_DATA["city"]) + ] + + dc_from = DataChain.from_json(path.as_uri(), session=test_session) + df1 = dc_from.select("json.first_name", "json.age", "json.city").to_pandas() + df1 = df1["json"] + assert df_equal(df1, df) + + +# These deprecation warnings occur in the datamodel-code-generator package. +@pytest.mark.filterwarnings("ignore::pydantic.warnings.PydanticDeprecatedSince20") +def test_from_json_jmespath(tmp_dir, test_session): + df = pd.DataFrame(DF_DATA) + values = [ + {"first_name": n, "age": a, "city": c} + for n, a, c in zip(DF_DATA["first_name"], DF_DATA["age"], DF_DATA["city"]) + ] + path = tmp_dir / "test.json" + with open(path, "w") as f: + json.dump({"author": "Test User", "version": 5, "values": values}, f) + + dc_from = DataChain.from_json( + path.as_uri(), jmespath="values", session=test_session + ) + df1 = dc_from.select("values.first_name", "values.age", "values.city").to_pandas() + df1 = df1["values"] + assert df_equal(df1, df) + + # These deprecation warnings occur in the datamodel-code-generator package. @pytest.mark.filterwarnings("ignore::pydantic.warnings.PydanticDeprecatedSince20") def test_to_from_json_remote(cloud_test_catalog_upload): diff --git a/tests/func/test_datachain_merge.py b/tests/func/test_datachain_merge.py new file mode 100644 index 000000000..78b5049f1 --- /dev/null +++ b/tests/func/test_datachain_merge.py @@ -0,0 +1,101 @@ +import pytest + +from datachain.lib.dc import DataChain +from datachain.sql.types import Int + + +@pytest.mark.parametrize( + "cloud_type,version_aware", + [("s3", True)], + indirect=True, +) +@pytest.mark.parametrize("inner", [True, False]) +def test_merge_union(cloud_test_catalog, inner, cloud_type): + catalog = cloud_test_catalog.catalog + session = cloud_test_catalog.session + + src = cloud_test_catalog.src_uri + + dogs = DataChain.from_storage(f"{src}/dogs/*", session=session) + cats = DataChain.from_storage(f"{src}/cats/*", session=session) + + signal_default_value = Int.default_value(catalog.warehouse.db.dialect) + + dogs1 = dogs.map(sig1=lambda: 1, output={"sig1": int}) + dogs2 = dogs.map(sig2=lambda: 2, output={"sig2": int}) + cats1 = cats.map(sig1=lambda: 1, output={"sig1": int}) + + merged = (dogs1 | cats1).merge(dogs2, "file.path", inner=inner) + signals = merged.select("file.path", "sig1", "sig2").order_by("file.path").results() + + if inner: + assert signals == [ + ("dogs/dog1", 1, 2), + ("dogs/dog2", 1, 2), + ("dogs/dog3", 1, 2), + ("dogs/others/dog4", 1, 2), + ] + else: + assert signals == [ + ("cats/cat1", 1, signal_default_value), + ("cats/cat2", 1, signal_default_value), + ("dogs/dog1", 1, 2), + ("dogs/dog2", 1, 2), + ("dogs/dog3", 1, 2), + ("dogs/others/dog4", 1, 2), + ] + + +@pytest.mark.parametrize( + "cloud_type,version_aware", + [("s3", True)], + indirect=True, +) +@pytest.mark.parametrize("inner1", [True, False]) +@pytest.mark.parametrize("inner2", [True, False]) +@pytest.mark.parametrize("inner3", [True, False]) +def test_merge_multiple(cloud_test_catalog, inner1, inner2, inner3): + catalog = cloud_test_catalog.catalog + session = cloud_test_catalog.session + + src = cloud_test_catalog.src_uri + + dogs = DataChain.from_storage(f"{src}/dogs/*", session=session) + cats = DataChain.from_storage(f"{src}/cats/*", session=session) + + signal_default_value = Int.default_value(catalog.warehouse.db.dialect) + + dogs_and_cats = dogs | cats + dogs1 = dogs.map(sig1=lambda: 1, output={"sig1": int}) + cats1 = cats.map(sig2=lambda: 2, output={"sig2": int}) + dogs2 = dogs_and_cats.merge(dogs1, "file.path", inner=inner1) + cats2 = dogs_and_cats.merge(cats1, "file.path", inner=inner2) + merged = dogs2.merge(cats2, "file.path", inner=inner3) + + merged_signals = ( + merged.select("file.path", "sig1", "sig2").order_by("file.path").results() + ) + + if inner1 and inner2 and inner3: + assert merged_signals == [] + elif inner1: + assert merged_signals == [ + ("dogs/dog1", 1, signal_default_value), + ("dogs/dog2", 1, signal_default_value), + ("dogs/dog3", 1, signal_default_value), + ("dogs/others/dog4", 1, signal_default_value), + ] + elif inner2 and inner3: + assert merged_signals == [ + ("cats/cat1", signal_default_value, 2), + ("cats/cat2", signal_default_value, 2), + ] + else: + assert merged_signals == [ + ("cats/cat1", signal_default_value, 2), + ("cats/cat2", signal_default_value, 2), + ("dogs/dog1", 1, signal_default_value), + ("dogs/dog2", 1, signal_default_value), + ("dogs/dog3", 1, signal_default_value), + ("dogs/others/dog4", 1, signal_default_value), + ] diff --git a/tests/func/test_file.py b/tests/func/test_file.py new file mode 100644 index 000000000..4adc4fe4b --- /dev/null +++ b/tests/func/test_file.py @@ -0,0 +1,45 @@ +import pytest +import pytz + +from datachain import DataChain +from datachain.data_storage.sqlite import SQLiteWarehouse +from datachain.lib.file import File +from datachain.utils import TIME_ZERO + + +@pytest.mark.parametrize("cloud_type", ["s3"], indirect=True) +def test_get_path_cloud(cloud_test_catalog): + file = File(path="dir/file", source="s3://") + file._catalog = cloud_test_catalog.catalog + assert file.get_path().strip("/") == "s3:///dir/file" + + +def test_resolve_file(cloud_test_catalog): + ctc = cloud_test_catalog + + is_sqlite = isinstance(cloud_test_catalog.catalog.warehouse, SQLiteWarehouse) + + dc = DataChain.from_storage(ctc.src_uri, session=ctc.session) + for orig_file in dc.collect("file"): + file = File( + source=orig_file.source, + path=orig_file.path, + ) + file._catalog = ctc.catalog + resolved_file = file.resolve() + if not is_sqlite: + resolved_file.last_modified = resolved_file.last_modified.replace( + microsecond=0, tzinfo=pytz.UTC + ) + assert orig_file == resolved_file + + +def test_resolve_file_no_exist(cloud_test_catalog): + ctc = cloud_test_catalog + + non_existent_file = File(source=ctc.src_uri, path="non_existent_file.txt") + non_existent_file._catalog = ctc.catalog + resolved_non_existent = non_existent_file.resolve() + assert resolved_non_existent.size == 0 + assert resolved_non_existent.etag == "" + assert resolved_non_existent.last_modified == TIME_ZERO diff --git a/tests/func/test_hf.py b/tests/func/test_hf.py new file mode 100644 index 000000000..9ef0dc6b0 --- /dev/null +++ b/tests/func/test_hf.py @@ -0,0 +1,50 @@ +import numpy as np +from datasets import load_dataset +from datasets.features.image import image_to_bytes +from PIL import Image +from scipy.io.wavfile import write + +from datachain.lib.data_model import dict_to_data_model +from datachain.lib.hf import ( + HFGenerator, + HFImage, + get_output_schema, +) + + +def test_hf_image(tmp_path): + train_dir = tmp_path / "train" + train_dir.mkdir() + img = Image.new(mode="RGB", size=(64, 64)) + img.save(train_dir / "img1.png") + + ds = load_dataset("imagefolder", data_dir=tmp_path) + schema = {"split": str} | get_output_schema(ds["train"].features) + assert schema["image"] is HFImage + + gen = HFGenerator(ds, dict_to_data_model("", schema)) + gen.setup() + row = next(iter(gen.process("train"))) + assert row.image.img == image_to_bytes(img) + + +def test_hf_audio(tmp_path): + # See https://stackoverflow.com/questions/66191480/how-to-convert-a-numpy-array-to-a-mp3-file + samplerate = 44100 + fs = 100 + t = np.linspace(0.0, 1.0, samplerate) + amplitude = np.iinfo(np.int16).max + data = amplitude * np.sin(2.0 * np.pi * fs * t) + train_dir = tmp_path / "train" + train_dir.mkdir() + write(train_dir / "example.wav", samplerate, data.astype(np.int16)) + + ds = load_dataset("audiofolder", data_dir=tmp_path) + schema = {"split": str} | get_output_schema(ds["train"].features) + + gen = HFGenerator(ds, dict_to_data_model("", schema)) + gen.setup() + row = next(iter(gen.process("train"))) + assert row.audio.path == str(train_dir / "example.wav") + assert np.allclose(row.audio.array, data / amplitude, atol=1e-4) + assert row.audio.sampling_rate == samplerate diff --git a/tests/func/test_listing.py b/tests/func/test_listing.py index 70ac4cefd..c785e8977 100644 --- a/tests/func/test_listing.py +++ b/tests/func/test_listing.py @@ -1,5 +1,7 @@ +import pytest + from datachain.lib.dc import DataChain -from datachain.lib.listing import list_bucket +from datachain.lib.listing import list_bucket, parse_listing_uri from tests.data import ENTRIES @@ -25,3 +27,38 @@ def test_listing_generator(cloud_test_catalog, cloud_type): assert cat_file.size == cat_entry.size assert cat_file.is_latest == cat_entry.is_latest assert cat_file.location is None + + +@pytest.mark.parametrize( + "cloud_type", + ["s3", "azure", "gs", "file"], + indirect=True, +) +def test_parse_listing_uri(cloud_test_catalog, cloud_type): + ctc = cloud_test_catalog + catalog = ctc.catalog + dataset_name, listing_uri, listing_path = parse_listing_uri( + f"{ctc.src_uri}/dogs", catalog.cache, catalog.client_config + ) + assert dataset_name == f"lst__{ctc.src_uri}/dogs/" + assert listing_uri == f"{ctc.src_uri}/dogs/" + if cloud_type == "file": + assert listing_path == "" + else: + assert listing_path == "dogs/" + + +@pytest.mark.parametrize( + "cloud_type", + ["s3", "azure", "gs"], + indirect=True, +) +def test_parse_listing_uri_with_glob(cloud_test_catalog): + ctc = cloud_test_catalog + catalog = ctc.catalog + dataset_name, listing_uri, listing_path = parse_listing_uri( + f"{ctc.src_uri}/dogs/*", catalog.cache, catalog.client_config + ) + assert dataset_name == f"lst__{ctc.src_uri}/dogs/" + assert listing_uri == f"{ctc.src_uri}/dogs" + assert listing_path == "dogs/*" diff --git a/tests/func/test_warehouse.py b/tests/func/test_warehouse.py new file mode 100644 index 000000000..443736630 --- /dev/null +++ b/tests/func/test_warehouse.py @@ -0,0 +1,6 @@ +def test_dataset_stats_no_table(cloud_test_catalog, dogs_dataset): + catalog = cloud_test_catalog.catalog + catalog.warehouse.drop_dataset_rows_table(dogs_dataset, 1) + num_objects, size = catalog.warehouse.dataset_stats(dogs_dataset, 1) + assert num_objects is None + assert size is None diff --git a/tests/unit/lib/test_datachain.py b/tests/unit/lib/test_datachain.py index 6f03c1197..26590dcd3 100644 --- a/tests/unit/lib/test_datachain.py +++ b/tests/unit/lib/test_datachain.py @@ -1423,47 +1423,6 @@ def test_explode_raises_on_wrong_column_type(test_session): dc.explode("f1.count") -# These deprecation warnings occur in the datamodel-code-generator package. -@pytest.mark.filterwarnings("ignore::pydantic.warnings.PydanticDeprecatedSince20") -def test_to_from_json(tmp_dir, test_session): - df = pd.DataFrame(DF_DATA) - dc_to = DataChain.from_pandas(df, session=test_session) - path = tmp_dir / "test.json" - dc_to.order_by("first_name", "age").to_json(path) - - with open(path) as f: - values = json.load(f) - assert values == [ - {"first_name": n, "age": a, "city": c} - for n, a, c in zip(DF_DATA["first_name"], DF_DATA["age"], DF_DATA["city"]) - ] - - dc_from = DataChain.from_json(path.as_uri(), session=test_session) - df1 = dc_from.select("json.first_name", "json.age", "json.city").to_pandas() - df1 = df1["json"] - assert df_equal(df1, df) - - -# These deprecation warnings occur in the datamodel-code-generator package. -@pytest.mark.filterwarnings("ignore::pydantic.warnings.PydanticDeprecatedSince20") -def test_from_json_jmespath(tmp_dir, test_session): - df = pd.DataFrame(DF_DATA) - values = [ - {"first_name": n, "age": a, "city": c} - for n, a, c in zip(DF_DATA["first_name"], DF_DATA["age"], DF_DATA["city"]) - ] - path = tmp_dir / "test.json" - with open(path, "w") as f: - json.dump({"author": "Test User", "version": 5, "values": values}, f) - - dc_from = DataChain.from_json( - path.as_uri(), jmespath="values", session=test_session - ) - df1 = dc_from.select("values.first_name", "values.age", "values.city").to_pandas() - df1 = df1["values"] - assert df_equal(df1, df) - - def test_to_json_features(tmp_dir, test_session): dc_to = DataChain.from_values( f1=features, num=range(len(features)), session=test_session @@ -1735,23 +1694,6 @@ def test_to_from_parquet_two_top_level_features(tmp_dir, test_session, chunk_siz assert nested == features_nested[n] -@pytest.mark.parametrize("processes", [False, 2, True]) -@pytest.mark.xdist_group(name="tmpfile") -def test_parallel(processes, test_session_tmpfile): - prefix = "t & " - vals = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] - - res = list( - DataChain.from_values(key=vals, session=test_session_tmpfile) - .settings(parallel=processes) - .map(res=lambda key: prefix + key) - .order_by("res") - .collect("res") - ) - - assert res == [prefix + v for v in vals] - - @skip_if_not_sqlite def test_parallel_in_memory(): prefix = "t & " diff --git a/tests/unit/lib/test_datachain_bootstrap.py b/tests/unit/lib/test_datachain_bootstrap.py index b4fe6029a..8c3387c30 100644 --- a/tests/unit/lib/test_datachain_bootstrap.py +++ b/tests/unit/lib/test_datachain_bootstrap.py @@ -34,36 +34,6 @@ def teardown(self): assert udf.value == MyMapper.TEARDOWN_VALUE -@pytest.mark.xdist_group(name="tmpfile") -def test_udf_parallel(test_session_tmpfile): - vals = ["a", "b", "c", "d", "e", "f"] - - class MyMapper(Mapper): - DEFAULT_VALUE = 84 - BOOTSTRAP_VALUE = 1452 - TEARDOWN_VALUE = 98763 - - def __init__(self): - super().__init__() - self.value = MyMapper.DEFAULT_VALUE - self._had_teardown = False - - def process(self, *args) -> int: - return self.value - - def setup(self): - self.value = MyMapper.BOOTSTRAP_VALUE - - def teardown(self): - self.value = MyMapper.TEARDOWN_VALUE - - chain = DataChain.from_values(key=vals, session=test_session_tmpfile) - - res = list(chain.settings(parallel=4).map(res=MyMapper()).collect("res")) - - assert res == [MyMapper.BOOTSTRAP_VALUE] * len(vals) - - def test_no_bootstrap_for_callable(): class MyMapper: def __init__(self): diff --git a/tests/unit/lib/test_datachain_merge.py b/tests/unit/lib/test_datachain_merge.py index ea0399e0a..88dee513e 100644 --- a/tests/unit/lib/test_datachain_merge.py +++ b/tests/unit/lib/test_datachain_merge.py @@ -7,7 +7,7 @@ from sqlalchemy import func from datachain.lib.dc import C, DataChain, DatasetMergeError -from datachain.sql.types import Int, String +from datachain.sql.types import String from tests.utils import skip_if_not_sqlite @@ -341,100 +341,3 @@ def _get_expr(dc): count += 1 assert count == len(team) * len(team) - - -@pytest.mark.parametrize( - "cloud_type,version_aware", - [("s3", True)], - indirect=True, -) -@pytest.mark.parametrize("inner", [True, False]) -def test_merge_union(cloud_test_catalog, inner, cloud_type): - catalog = cloud_test_catalog.catalog - session = cloud_test_catalog.session - - src = cloud_test_catalog.src_uri - - dogs = DataChain.from_storage(f"{src}/dogs/*", session=session) - cats = DataChain.from_storage(f"{src}/cats/*", session=session) - - signal_default_value = Int.default_value(catalog.warehouse.db.dialect) - - dogs1 = dogs.map(sig1=lambda: 1, output={"sig1": int}) - dogs2 = dogs.map(sig2=lambda: 2, output={"sig2": int}) - cats1 = cats.map(sig1=lambda: 1, output={"sig1": int}) - - merged = (dogs1 | cats1).merge(dogs2, "file.path", inner=inner) - signals = merged.select("file.path", "sig1", "sig2").order_by("file.path").results() - - if inner: - assert signals == [ - ("dogs/dog1", 1, 2), - ("dogs/dog2", 1, 2), - ("dogs/dog3", 1, 2), - ("dogs/others/dog4", 1, 2), - ] - else: - assert signals == [ - ("cats/cat1", 1, signal_default_value), - ("cats/cat2", 1, signal_default_value), - ("dogs/dog1", 1, 2), - ("dogs/dog2", 1, 2), - ("dogs/dog3", 1, 2), - ("dogs/others/dog4", 1, 2), - ] - - -@pytest.mark.parametrize( - "cloud_type,version_aware", - [("s3", True)], - indirect=True, -) -@pytest.mark.parametrize("inner1", [True, False]) -@pytest.mark.parametrize("inner2", [True, False]) -@pytest.mark.parametrize("inner3", [True, False]) -def test_merge_multiple(cloud_test_catalog, inner1, inner2, inner3): - catalog = cloud_test_catalog.catalog - session = cloud_test_catalog.session - - src = cloud_test_catalog.src_uri - - dogs = DataChain.from_storage(f"{src}/dogs/*", session=session) - cats = DataChain.from_storage(f"{src}/cats/*", session=session) - - signal_default_value = Int.default_value(catalog.warehouse.db.dialect) - - dogs_and_cats = dogs | cats - dogs1 = dogs.map(sig1=lambda: 1, output={"sig1": int}) - cats1 = cats.map(sig2=lambda: 2, output={"sig2": int}) - dogs2 = dogs_and_cats.merge(dogs1, "file.path", inner=inner1) - cats2 = dogs_and_cats.merge(cats1, "file.path", inner=inner2) - merged = dogs2.merge(cats2, "file.path", inner=inner3) - - merged_signals = ( - merged.select("file.path", "sig1", "sig2").order_by("file.path").results() - ) - - if inner1 and inner2 and inner3: - assert merged_signals == [] - elif inner1: - assert merged_signals == [ - ("dogs/dog1", 1, signal_default_value), - ("dogs/dog2", 1, signal_default_value), - ("dogs/dog3", 1, signal_default_value), - ("dogs/others/dog4", 1, signal_default_value), - ] - elif inner2 and inner3: - assert merged_signals == [ - ("cats/cat1", signal_default_value, 2), - ("cats/cat2", signal_default_value, 2), - ] - else: - assert merged_signals == [ - ("cats/cat1", signal_default_value, 2), - ("cats/cat2", signal_default_value, 2), - ("dogs/dog1", 1, signal_default_value), - ("dogs/dog2", 1, signal_default_value), - ("dogs/dog3", 1, signal_default_value), - ("dogs/others/dog4", 1, signal_default_value), - ] diff --git a/tests/unit/lib/test_file.py b/tests/unit/lib/test_file.py index 65c75f84e..df784c9e9 100644 --- a/tests/unit/lib/test_file.py +++ b/tests/unit/lib/test_file.py @@ -3,15 +3,11 @@ from unittest.mock import Mock import pytest -import pytz from fsspec.implementations.local import LocalFileSystem from PIL import Image -from datachain import DataChain from datachain.catalog import Catalog -from datachain.data_storage.sqlite import SQLiteWarehouse from datachain.lib.file import File, ImageFile, TextFile, resolve -from datachain.utils import TIME_ZERO def create_file(source: str): @@ -237,13 +233,6 @@ def test_get_path_local(catalog): assert file.get_path().replace("\\", "/").strip("/") == "dir/file" -@pytest.mark.parametrize("cloud_type", ["s3"], indirect=True) -def test_get_path_cloud(cloud_test_catalog): - file = File(path="dir/file", source="s3://") - file._catalog = cloud_test_catalog.catalog - assert file.get_path().strip("/") == "s3:///dir/file" - - def test_get_fs(catalog): file = File(path="dir/file", source="file:///") file._catalog = catalog @@ -303,37 +292,6 @@ def test_read_text(tmp_path, catalog): assert file.read_text() == data -def test_resolve_file(cloud_test_catalog): - ctc = cloud_test_catalog - - is_sqlite = isinstance(cloud_test_catalog.catalog.warehouse, SQLiteWarehouse) - - dc = DataChain.from_storage(ctc.src_uri, session=ctc.session) - for orig_file in dc.collect("file"): - file = File( - source=orig_file.source, - path=orig_file.path, - ) - file._catalog = ctc.catalog - resolved_file = file.resolve() - if not is_sqlite: - resolved_file.last_modified = resolved_file.last_modified.replace( - microsecond=0, tzinfo=pytz.UTC - ) - assert orig_file == resolved_file - - -def test_resolve_file_no_exist(cloud_test_catalog): - ctc = cloud_test_catalog - - non_existent_file = File(source=ctc.src_uri, path="non_existent_file.txt") - non_existent_file._catalog = ctc.catalog - resolved_non_existent = non_existent_file.resolve() - assert resolved_non_existent.size == 0 - assert resolved_non_existent.etag == "" - assert resolved_non_existent.last_modified == TIME_ZERO - - def test_resolve_unsupported_protocol(): mock_catalog = Mock() mock_catalog.get_client.side_effect = NotImplementedError("Unsupported protocol") diff --git a/tests/unit/lib/test_hf.py b/tests/unit/lib/test_hf.py index d430b9f09..cc6895d2b 100644 --- a/tests/unit/lib/test_hf.py +++ b/tests/unit/lib/test_hf.py @@ -1,14 +1,9 @@ -import numpy as np -from datasets import Array2D, Dataset, DatasetDict, Sequence, Value, load_dataset -from datasets.features.image import image_to_bytes -from PIL import Image -from scipy.io.wavfile import write +from datasets import Array2D, Dataset, DatasetDict, Sequence, Value from datachain.lib.data_model import dict_to_data_model from datachain.lib.hf import ( HFClassLabel, HFGenerator, - HFImage, get_output_schema, stream_splits, ) @@ -92,41 +87,3 @@ def test_hf_array(): gen.setup() row = next(iter(gen.process())) assert row.arr == [[0, 1], [2, 3]] - - -def test_hf_image(tmp_path): - train_dir = tmp_path / "train" - train_dir.mkdir() - img = Image.new(mode="RGB", size=(64, 64)) - img.save(train_dir / "img1.png") - - ds = load_dataset("imagefolder", data_dir=tmp_path) - schema = {"split": str} | get_output_schema(ds["train"].features) - assert schema["image"] is HFImage - - gen = HFGenerator(ds, dict_to_data_model("", schema)) - gen.setup() - row = next(iter(gen.process("train"))) - assert row.image.img == image_to_bytes(img) - - -def test_hf_audio(tmp_path): - # See https://stackoverflow.com/questions/66191480/how-to-convert-a-numpy-array-to-a-mp3-file - samplerate = 44100 - fs = 100 - t = np.linspace(0.0, 1.0, samplerate) - amplitude = np.iinfo(np.int16).max - data = amplitude * np.sin(2.0 * np.pi * fs * t) - train_dir = tmp_path / "train" - train_dir.mkdir() - write(train_dir / "example.wav", samplerate, data.astype(np.int16)) - - ds = load_dataset("audiofolder", data_dir=tmp_path) - schema = {"split": str} | get_output_schema(ds["train"].features) - - gen = HFGenerator(ds, dict_to_data_model("", schema)) - gen.setup() - row = next(iter(gen.process("train"))) - assert row.audio.path == str(train_dir / "example.wav") - assert np.allclose(row.audio.array, data / amplitude, atol=1e-4) - assert row.audio.sampling_rate == samplerate diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index f77fcfb32..21a1bc2c9 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -3,16 +3,9 @@ from pathlib import Path import pytest -from hypothesis import HealthCheck, assume, given, settings -from hypothesis import strategies as st from datachain.client import Client from datachain.client.local import FileClient -from tests.utils import uppercase_scheme - -non_null_text = st.text( - alphabet=st.characters(blacklist_categories=["Cc", "Cs"]), min_size=1 -) def test_bad_protocol(): @@ -33,94 +26,8 @@ def test_win_paths_are_recognized(): assert Client.get_implementation("\bucket") == FileClient -@settings(suppress_health_check=[HealthCheck.function_scoped_fixture], deadline=None) -@given(rel_path=non_null_text) -def test_parse_url(cloud_test_catalog, rel_path, cloud_type): - if cloud_type == "file": - assume(not rel_path.startswith("/")) - bucket_uri = cloud_test_catalog.src_uri - url = f"{bucket_uri}/{rel_path}" - uri, rel_part = Client.parse_url(url) - if cloud_type == "file": - assert uri == url.rsplit("/", 1)[0] - assert rel_part == url.rsplit("/", 1)[1] - else: - assert uri == bucket_uri - assert rel_part == rel_path - - -@settings(suppress_health_check=[HealthCheck.function_scoped_fixture], deadline=None) -@given(rel_path=non_null_text) -def test_get_client(cloud_test_catalog, rel_path, cloud_type): - catalog = cloud_test_catalog.catalog - bucket_uri = cloud_test_catalog.src_uri - url = f"{bucket_uri}/{rel_path}" - client = Client.get_client(url, catalog.cache) - assert client - assert client.uri - - -@settings(suppress_health_check=[HealthCheck.function_scoped_fixture], deadline=None) -@given(rel_path=non_null_text) -def test_parse_url_uppercase_scheme(cloud_test_catalog, rel_path, cloud_type): - if cloud_type == "file": - assume(not rel_path.startswith("/")) - bucket_uri = cloud_test_catalog.src_uri - bucket_uri_upper = uppercase_scheme(bucket_uri) - url = f"{bucket_uri_upper}/{rel_path}" - uri, rel_part = Client.parse_url(url) - if cloud_type == "file": - url = f"{bucket_uri}/{rel_path}" - assert uri == url.rsplit("/", 1)[0] - assert rel_part == url.rsplit("/", 1)[1] - else: - assert uri == bucket_uri - assert rel_part == rel_path - - -@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) -def test_parse_file_absolute_path_without_protocol(cloud_test_catalog): - working_dir = Path().absolute() - uri, rel_part = Client.parse_url(str(working_dir / Path("animals"))) - assert uri == working_dir.as_uri() - assert rel_part == "animals" - - -@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) -def test_parse_file_relative_path_multiple_dirs_back(cloud_test_catalog): - uri, rel_part = Client.parse_url("../../animals".replace("/", os.sep)) - assert uri == Path().absolute().parents[1].as_uri() - assert rel_part == "animals" - - -@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) -@pytest.mark.parametrize("url", ["./animals".replace("/", os.sep), "animals"]) -def test_parse_file_relative_path_working_dir(cloud_test_catalog, url): - uri, rel_part = Client.parse_url(url) - assert uri == Path().absolute().as_uri() - assert rel_part == "animals" - - -@pytest.mark.parametrize("cloud_type", ["file"], indirect=True) -def test_parse_file_relative_path_home_dir(cloud_test_catalog): - if sys.platform == "win32": - # home dir shortcut is not available on windows - pytest.skip() - uri, rel_part = Client.parse_url("~/animals") - assert uri == Path().home().as_uri() - assert rel_part == "animals" - - @pytest.mark.parametrize("cloud_type", ["file"], indirect=True) def test_parse_file_path_ends_with_slash(cloud_type): uri, rel_part = Client.parse_url("./animals/".replace("/", os.sep)) assert uri == (Path().absolute() / Path("animals")).as_uri() assert rel_part == "" - - -@pytest.mark.parametrize("cloud_type", ["s3", "azure", "gs"], indirect=True) -def test_parse_cloud_path_ends_with_slash(cloud_test_catalog): - uri = f"{cloud_test_catalog.src_uri}/animals/" - uri, rel_part = Client.parse_url(uri) - assert uri == cloud_test_catalog.src_uri - assert rel_part == "animals/" diff --git a/tests/unit/test_data_storage.py b/tests/unit/test_data_storage.py index a126c3051..6bd390d8f 100644 --- a/tests/unit/test_data_storage.py +++ b/tests/unit/test_data_storage.py @@ -24,7 +24,6 @@ from tests.utils import ( DEFAULT_TREE, TARRED_TREE, - create_tar_dataset_with_legacy_columns, ) COMPLEX_TREE: dict[str, Any] = { @@ -34,139 +33,6 @@ } -@pytest.mark.parametrize("tree", [COMPLEX_TREE], indirect=True) -def test_dir_expansion(cloud_test_catalog, version_aware, cloud_type): - has_version = version_aware or cloud_type == "gs" - - ctc = cloud_test_catalog - session = ctc.session - catalog = ctc.catalog - src_uri = ctc.src_uri - if cloud_type == "file": - # we don't want to index things in parent directory - src_uri += "/" - - dc = create_tar_dataset_with_legacy_columns(session, ctc.src_uri, "dc") - dataset = catalog.get_dataset(dc.name) - with catalog.warehouse.clone() as warehouse: - dr = warehouse.dataset_rows(dataset, object_name="file") - de = dr.dir_expansion() - q = de.query(dr.get_table()) - - columns = ( - "id", - "is_dir", - "source", - "path", - "version", - "location", - ) - - result = [dict(zip(columns, r)) for r in warehouse.db.execute(q)] - to_compare = [(r["path"], r["is_dir"], r["version"] != "") for r in result] - - assert all(r["source"] == ctc.src_uri for r in result) - - # Note, we have both a file and a directory entry for expanded tar files - expected = [ - ("animals.tar", 0, has_version), - ("animals.tar", 1, False), - ("animals.tar/cats", 1, False), - ("animals.tar/cats/cat1", 0, has_version), - ("animals.tar/cats/cat2", 0, has_version), - ("animals.tar/description", 0, has_version), - ("animals.tar/dogs", 1, False), - ("animals.tar/dogs/dog1", 0, has_version), - ("animals.tar/dogs/dog2", 0, has_version), - ("animals.tar/dogs/dog3", 0, has_version), - ("animals.tar/dogs/others", 1, False), - ("animals.tar/dogs/others/dog4", 0, has_version), - ("cats", 1, False), - ("cats/cat1", 0, has_version), - ("cats/cat2", 0, has_version), - ("description", 0, has_version), - ("dogs", 1, False), - ("dogs/dog1", 0, has_version), - ("dogs/dog2", 0, has_version), - ("dogs/dog3", 0, has_version), - ("dogs/others", 1, False), - ("dogs/others/dog4", 0, has_version), - ("nested", 1, False), - ("nested/dir", 1, False), - ("nested/dir/path", 1, False), - ("nested/dir/path/abc.txt", 0, has_version), - ] - - assert to_compare == expected - - -@pytest.mark.parametrize( - "cloud_type,version_aware", - [("s3", True)], - indirect=True, -) -def test_convert_type(cloud_test_catalog): - ctc = cloud_test_catalog - catalog = ctc.catalog - warehouse = catalog.warehouse - now = datetime.now() - - def run_convert_type(value, sql_type): - return warehouse.convert_type( - value, - sql_type, - warehouse.python_type(sql_type), - type(sql_type).__name__, - "test_column", - ) - - # convert int to float - for f in [Float, Float32, Float64]: - converted = run_convert_type(1, f()) - assert converted == 1.0 - assert isinstance(converted, float) - - # types match, nothing to convert - assert run_convert_type(1, Int()) == 1 - assert run_convert_type(1.5, Float()) == 1.5 - assert run_convert_type(True, Boolean()) is True - assert run_convert_type("s", String()) == "s" - assert run_convert_type(now, DateTime()) == now - assert run_convert_type([1, 2], Array(Int)) == [1, 2] - assert run_convert_type([1.5, 2.5], Array(Float)) == [1.5, 2.5] - assert run_convert_type(["a", "b"], Array(String)) == ["a", "b"] - assert run_convert_type([[1, 2], [3, 4]], Array(Array(Int))) == [ - [1, 2], - [3, 4], - ] - - # JSON Tests - assert run_convert_type('{"a": 1}', JSON()) == '{"a": 1}' - assert run_convert_type({"a": 1}, JSON()) == '{"a": 1}' - assert run_convert_type([{"a": 1}], JSON()) == '[{"a": 1}]' - with pytest.raises(ValueError): - run_convert_type(0.5, JSON()) - - # convert array to compatible type - converted = run_convert_type([1, 2], Array(Float)) - assert converted == [1.0, 2.0] - assert all(isinstance(c, float) for c in converted) - - # convert nested array to compatible type - converted = run_convert_type([[1, 2], [3, 4]], Array(Array(Float))) - assert converted == [[1.0, 2.0], [3.0, 4.0]] - assert all(isinstance(c, float) for c in converted[0]) - assert all(isinstance(c, float) for c in converted[1]) - - # error, float to int - with pytest.raises(ValueError): - run_convert_type(1.5, Int()) - - # error, float to int in list - with pytest.raises(ValueError): - run_convert_type([1.5, 1], Array(Int)) - - @pytest.mark.parametrize( "col_type,default_value", [ diff --git a/tests/unit/test_listing.py b/tests/unit/test_listing.py index 3e5800d75..c88c94b8f 100644 --- a/tests/unit/test_listing.py +++ b/tests/unit/test_listing.py @@ -11,7 +11,6 @@ get_listing, is_listing_dataset, listing_uri_from_name, - parse_listing_uri, ) from datachain.listing import Listing from datachain.node import DirType @@ -181,41 +180,6 @@ def test_subdirs(listing): _match_filenames(dirs, ["dir1", "dir2"]) -@pytest.mark.parametrize( - "cloud_type", - ["s3", "azure", "gs", "file"], - indirect=True, -) -def test_parse_listing_uri(cloud_test_catalog, cloud_type): - ctc = cloud_test_catalog - catalog = ctc.catalog - dataset_name, listing_uri, listing_path = parse_listing_uri( - f"{ctc.src_uri}/dogs", catalog.cache, catalog.client_config - ) - assert dataset_name == f"lst__{ctc.src_uri}/dogs/" - assert listing_uri == f"{ctc.src_uri}/dogs/" - if cloud_type == "file": - assert listing_path == "" - else: - assert listing_path == "dogs/" - - -@pytest.mark.parametrize( - "cloud_type", - ["s3", "azure", "gs"], - indirect=True, -) -def test_parse_listing_uri_with_glob(cloud_test_catalog): - ctc = cloud_test_catalog - catalog = ctc.catalog - dataset_name, listing_uri, listing_path = parse_listing_uri( - f"{ctc.src_uri}/dogs/*", catalog.cache, catalog.client_config - ) - assert dataset_name == f"lst__{ctc.src_uri}/dogs/" - assert listing_uri == f"{ctc.src_uri}/dogs" - assert listing_path == "dogs/*" - - @pytest.mark.parametrize( "name,is_listing", [ diff --git a/tests/unit/test_warehouse.py b/tests/unit/test_warehouse.py index 238e6f440..7fe678418 100644 --- a/tests/unit/test_warehouse.py +++ b/tests/unit/test_warehouse.py @@ -40,11 +40,3 @@ def test_is_temp_table_name(warehouse): assert warehouse.is_temp_table_name("ds_my_dataset") is False assert warehouse.is_temp_table_name("src_my_bucket") is False assert warehouse.is_temp_table_name("ds_ds_my_query_script_1_1") is False - - -def test_dataset_stats_no_table(cloud_test_catalog, dogs_dataset): - catalog = cloud_test_catalog.catalog - catalog.warehouse.drop_dataset_rows_table(dogs_dataset, 1) - num_objects, size = catalog.warehouse.dataset_stats(dogs_dataset, 1) - assert num_objects is None - assert size is None From 0fe47dd68383b2acb4fbf3e90fc284cbb144aca7 Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Tue, 21 Jan 2025 08:59:18 +1100 Subject: [PATCH 27/63] import Int into test_datachain_merge (fix tests broken on bad merge) (#837) --- tests/unit/lib/test_datachain_merge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/lib/test_datachain_merge.py b/tests/unit/lib/test_datachain_merge.py index 88dee513e..e55e5ea1c 100644 --- a/tests/unit/lib/test_datachain_merge.py +++ b/tests/unit/lib/test_datachain_merge.py @@ -7,7 +7,7 @@ from sqlalchemy import func from datachain.lib.dc import C, DataChain, DatasetMergeError -from datachain.sql.types import String +from datachain.sql.types import Int, String from tests.utils import skip_if_not_sqlite From 1598c4c56c6de7a211041024b1a18f618eb42250 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 22:26:18 +0000 Subject: [PATCH 28/63] [pre-commit.ci] pre-commit autoupdate (#836) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.1 → v0.9.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.1...v0.9.2) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cfc69d8a9..05d9b29e9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: - id: trailing-whitespace exclude: '^LICENSES/' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.9.1' + rev: 'v0.9.2' hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] From 0c3f3b41dfba7754c33de6a66ce0df46e8b7d9ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:35:17 -0800 Subject: [PATCH 29/63] build(deps): bump ultralytics from 8.3.61 to 8.3.64 (#839) Bumps [ultralytics](https://github.com/ultralytics/ultralytics) from 8.3.61 to 8.3.64. - [Release notes](https://github.com/ultralytics/ultralytics/releases) - [Commits](https://github.com/ultralytics/ultralytics/compare/v8.3.61...v8.3.64) --- updated-dependencies: - dependency-name: ultralytics dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a664822bb..17ee75320 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -119,7 +119,7 @@ examples = [ "pdfplumber==0.11.5", "huggingface_hub[hf_transfer]", "onnx==1.16.1", - "ultralytics==8.3.61", + "ultralytics==8.3.64", "open_clip_torch" ] From bf824af78c9d2c72152e5247562b235b88fcfbe1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:35:45 -0800 Subject: [PATCH 30/63] build(deps): bump mkdocs-material from 9.5.22 to 9.5.50 (#838) Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.22 to 9.5.50. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.22...9.5.50) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 17ee75320..9ad953cb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ dependencies = [ docs = [ "mkdocs>=1.5.2", "mkdocs-gen-files>=0.5.0", - "mkdocs-material==9.5.22", + "mkdocs-material==9.5.50", "mkdocs-section-index>=0.3.6", "mkdocstrings-python>=1.6.3", "mkdocs-literate-nav>=0.6.1" From 428d865a304adce6ef8bbb4ace8bdbedc7c97b55 Mon Sep 17 00:00:00 2001 From: Thomas Kunwar <20840228+yathomasi@users.noreply.github.com> Date: Tue, 21 Jan 2025 09:09:35 +0545 Subject: [PATCH 31/63] Revert "build(deps): bump mkdocs-material from 9.5.22 to 9.5.50 (#838)" (#840) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9ad953cb1..17ee75320 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ dependencies = [ docs = [ "mkdocs>=1.5.2", "mkdocs-gen-files>=0.5.0", - "mkdocs-material==9.5.50", + "mkdocs-material==9.5.22", "mkdocs-section-index>=0.3.6", "mkdocstrings-python>=1.6.3", "mkdocs-literate-nav>=0.6.1" From b7549b1885e4a8c2dcfa12aaf9cb374b93d37a82 Mon Sep 17 00:00:00 2001 From: Stan Kirdey Date: Mon, 20 Jan 2025 20:11:10 -0800 Subject: [PATCH 32/63] Add CSV parsing options (#813) * Update dc.py Adding support for CSV files where values can span several lines, pyarrow parser already supports it * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update dc.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * adding csv parse options config * naming of parse_options_config to parse_options * typo * fix tests, address PR review --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ivan Shcheklein --- src/datachain/lib/dc.py | 16 +++++++++++++--- tests/unit/lib/test_datachain.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/datachain/lib/dc.py b/src/datachain/lib/dc.py index 92ac525b0..945ba3c1f 100644 --- a/src/datachain/lib/dc.py +++ b/src/datachain/lib/dc.py @@ -1942,7 +1942,7 @@ def parse_tabular( def from_csv( cls, path, - delimiter: str = ",", + delimiter: Optional[str] = None, header: bool = True, output: OutputType = None, object_name: str = "", @@ -1952,6 +1952,7 @@ def from_csv( session: Optional[Session] = None, settings: Optional[dict] = None, column_types: Optional[dict[str, "Union[str, ArrowDataType]"]] = None, + parse_options: Optional[dict[str, "Union[str, Union[bool, Callable]]"]] = None, **kwargs, ) -> "DataChain": """Generate chain from csv files. @@ -1959,7 +1960,8 @@ def from_csv( Parameters: path : Storage URI with directory. URI must start with storage prefix such as `s3://`, `gs://`, `az://` or "file:///". - delimiter : Character for delimiting columns. + delimiter : Character for delimiting columns. Takes precedence if also + specified in `parse_options`. Defaults to ",". header : Whether the files include a header row. output : Dictionary or feature class defining column names and their corresponding types. List of column names is also accepted, in which @@ -1973,6 +1975,8 @@ def from_csv( column_types : Dictionary of column names and their corresponding types. It is passed to CSV reader and for each column specified type auto inference is disabled. + parse_options: Tells the parser how to process lines. + See https://arrow.apache.org/docs/python/generated/pyarrow.csv.ParseOptions.html Example: Reading a csv file: @@ -1990,6 +1994,12 @@ def from_csv( from pyarrow.dataset import CsvFileFormat from pyarrow.lib import type_for_alias + parse_options = parse_options or {} + if "delimiter" not in parse_options: + parse_options["delimiter"] = "," + if delimiter: + parse_options["delimiter"] = delimiter + if column_types: column_types = { name: type_for_alias(typ) if isinstance(typ, str) else typ @@ -2017,7 +2027,7 @@ def from_csv( msg = f"error parsing csv - incompatible output type {type(output)}" raise DatasetPrepareError(chain.name, msg) - parse_options = ParseOptions(delimiter=delimiter) + parse_options = ParseOptions(**parse_options) read_options = ReadOptions(column_names=column_names) convert_options = ConvertOptions( strings_can_be_null=True, diff --git a/tests/unit/lib/test_datachain.py b/tests/unit/lib/test_datachain.py index 26590dcd3..89608bf4d 100644 --- a/tests/unit/lib/test_datachain.py +++ b/tests/unit/lib/test_datachain.py @@ -1332,6 +1332,34 @@ def test_from_csv_column_types(tmp_dir, test_session): assert df1["age"].dtype == pd.StringDtype +def test_from_csv_parse_options(tmp_dir, test_session): + def skip_comment(row): + if row.text.startswith("# "): + return "skip" + return "error" + + s = ( + "animals;n_legs;entry\n" + "Flamingo;2;2022-03-01\n" + "# Comment here:\n" + "Horse;4;2022-03-02\n" + "Brittle stars;5;2022-03-03\n" + "Centipede;100;2022-03-04" + ) + + path = tmp_dir / "test.csv" + path.write_text(s) + + dc = DataChain.from_csv( + path.as_uri(), + session=test_session, + parse_options={"invalid_row_handler": skip_comment, "delimiter": ";"}, + ) + + df = dc.select("animals", "n_legs", "entry").to_pandas() + assert set(df["animals"]) == {"Horse", "Centipede", "Brittle stars", "Flamingo"} + + def test_to_csv_features(tmp_dir, test_session): dc_to = DataChain.from_values( f1=features, num=range(len(features)), session=test_session From 86392460ede79cb43255febcfa779f51725a0e47 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:15:13 +0545 Subject: [PATCH 33/63] e2e tests: limit name_len_slow to 3, split e2e tests from other tests (#842) [The `test_query_e2e` takes almost ~8mins to run][1] (whole CI job takes 11 mins). The `name_len_slow` script is the main culprit, since it sleeps for 1 sec in each udf function and that mapper is run in a single process parallel mode. ``` 474.21s call tests/test_query_e2e.py::test_query_e2e@tmpfile ``` This commit adds a limit of 3 files to the name_len_slow script, which is enough, since it's only running a single process. (We immediately interrupt the running process after seeing "UDF Processing Started" gets printed). This also split tests into two: one for the e2e tests and one for the rest, so that these things are more obvious in the future. [1]: https://github.com/iterative/datachain/actions/runs/12879531971/job/35907168617#step:8:82 --- .github/workflows/tests.yml | 6 +++++- tests/scripts/name_len_slow.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 26bc33d95..75fe6ced8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -112,7 +112,11 @@ jobs: run: echo 'DISABLE_REMOTES_ARG=--disable-remotes=azure,gs' >> $env:GITHUB_ENV - name: Run tests - run: nox -s tests-${{ matrix.pyv }} -- $DISABLE_REMOTES_ARG + run: nox -s tests-${{ matrix.pyv }} -- -m "not e2e and not examples" $DISABLE_REMOTES_ARG + shell: bash + + - name: Run E2E tests + run: nox -s tests-${{ matrix.pyv }} -- -m "e2e" $DISABLE_REMOTES_ARG shell: bash - name: Upload coverage report diff --git a/tests/scripts/name_len_slow.py b/tests/scripts/name_len_slow.py index 5088bc3ee..e99eb3ea6 100644 --- a/tests/scripts/name_len_slow.py +++ b/tests/scripts/name_len_slow.py @@ -35,6 +35,6 @@ def name_len(file): DataChain.from_storage( "gs://dvcx-datalakes/dogs-and-cats/", anon=True, -).filter(C("file.path").glob("*cat*")).settings(parallel=1).map( +).filter(C("file.path").glob("*cat*")).limit(3).settings(parallel=1).map( name_len, params=["file"], output={"name_len": int} ).save("name_len") From 3376449f6388a3b6f7cb93bdc4a6c21f1b3c8d74 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:10:00 +0545 Subject: [PATCH 34/63] ci: switch trigger from `pull_request_target` to `pull_request` (#843) --- .github/workflows/tests.yml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 75fe6ced8..9bf83ebf7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,7 +3,7 @@ name: Tests on: push: branches: [main] - pull_request_target: + pull_request: workflow_dispatch: env: @@ -14,15 +14,7 @@ concurrency: cancel-in-progress: true jobs: - authorize: - environment: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository && 'external' || 'internal' }} - runs-on: ubuntu-latest - steps: - - run: true - lint: - needs: authorize - runs-on: ubuntu-latest steps: - name: Check out the repository @@ -62,8 +54,6 @@ jobs: run: nox -s lint datachain: - needs: authorize - timeout-minutes: 40 runs-on: ${{ matrix.os }} strategy: @@ -133,8 +123,6 @@ jobs: run: nox -s docs examples: - needs: authorize - runs-on: ${{ matrix.os }} timeout-minutes: 60 strategy: From 5b2e437d0434b2c8a74d2a6a50e21e855a22d922 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:30:59 +0545 Subject: [PATCH 35/63] rename DataChainCache to Cache (#847) --- src/datachain/cache.py | 8 ++++---- src/datachain/catalog/catalog.py | 6 +++--- src/datachain/client/fsspec.py | 12 +++++------- src/datachain/client/local.py | 8 ++++---- src/datachain/lib/pytorch.py | 2 +- src/datachain/lib/udf.py | 2 +- src/datachain/nodes_fetcher.py | 4 ++-- tests/unit/test_cache.py | 8 ++++---- tests/unit/test_pytorch.py | 6 +++--- 9 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/datachain/cache.py b/src/datachain/cache.py index 959a85175..3bfd305b5 100644 --- a/src/datachain/cache.py +++ b/src/datachain/cache.py @@ -22,15 +22,15 @@ def try_scandir(path): pass -def get_temp_cache(tmp_dir: str, prefix: Optional[str] = None) -> "DataChainCache": +def get_temp_cache(tmp_dir: str, prefix: Optional[str] = None) -> "Cache": cache_dir = mkdtemp(prefix=prefix, dir=tmp_dir) - return DataChainCache(cache_dir, tmp_dir=tmp_dir) + return Cache(cache_dir, tmp_dir=tmp_dir) @contextmanager def temporary_cache( tmp_dir: str, prefix: Optional[str] = None, delete: bool = True -) -> Iterator["DataChainCache"]: +) -> Iterator["Cache"]: cache = get_temp_cache(tmp_dir, prefix=prefix) try: yield cache @@ -39,7 +39,7 @@ def temporary_cache( cache.destroy() -class DataChainCache: +class Cache: def __init__(self, cache_dir: str, tmp_dir: str): self.odb = LocalHashFileDB( LocalFileSystem(), diff --git a/src/datachain/catalog/catalog.py b/src/datachain/catalog/catalog.py index 06099ff10..b19249deb 100644 --- a/src/datachain/catalog/catalog.py +++ b/src/datachain/catalog/catalog.py @@ -30,7 +30,7 @@ from sqlalchemy import Column from tqdm.auto import tqdm -from datachain.cache import DataChainCache +from datachain.cache import Cache from datachain.client import Client from datachain.dataset import ( DATASET_PREFIX, @@ -536,7 +536,7 @@ def find_column_to_str( # noqa: PLR0911 return "" -def clone_catalog_with_cache(catalog: "Catalog", cache: "DataChainCache") -> "Catalog": +def clone_catalog_with_cache(catalog: "Catalog", cache: "Cache") -> "Catalog": clone = catalog.copy() clone.cache = cache return clone @@ -559,7 +559,7 @@ def __init__( datachain_dir.init() self.metastore = metastore self._warehouse = warehouse - self.cache = DataChainCache(datachain_dir.cache, datachain_dir.tmp) + self.cache = Cache(datachain_dir.cache, datachain_dir.tmp) self.client_config = client_config if client_config is not None else {} self._init_params = { "cache_dir": cache_dir, diff --git a/src/datachain/client/fsspec.py b/src/datachain/client/fsspec.py index 8c8a64170..92741e9fc 100644 --- a/src/datachain/client/fsspec.py +++ b/src/datachain/client/fsspec.py @@ -25,7 +25,7 @@ from fsspec.callbacks import DEFAULT_CALLBACK, Callback from tqdm.auto import tqdm -from datachain.cache import DataChainCache +from datachain.cache import Cache from datachain.client.fileslice import FileWrapper from datachain.error import ClientError as DataChainClientError from datachain.nodes_fetcher import NodesFetcher @@ -74,9 +74,7 @@ class Client(ABC): PREFIX: ClassVar[str] protocol: ClassVar[str] - def __init__( - self, name: str, fs_kwargs: dict[str, Any], cache: DataChainCache - ) -> None: + def __init__(self, name: str, fs_kwargs: dict[str, Any], cache: Cache) -> None: self.name = name self.fs_kwargs = fs_kwargs self._fs: Optional[AbstractFileSystem] = None @@ -122,7 +120,7 @@ def parse_url(source: str) -> tuple["StorageURI", str]: return cls.get_uri(storage_name), rel_path @staticmethod - def get_client(source: str, cache: DataChainCache, **kwargs) -> "Client": + def get_client(source: str, cache: Cache, **kwargs) -> "Client": cls = Client.get_implementation(source) storage_url, _ = cls.split_url(source) if os.name == "nt": @@ -145,7 +143,7 @@ def version_path(cls, path: str, version_id: Optional[str]) -> str: def from_name( cls, name: str, - cache: DataChainCache, + cache: Cache, kwargs: dict[str, Any], ) -> "Client": return cls(name, kwargs, cache) @@ -154,7 +152,7 @@ def from_name( def from_source( cls, uri: "StorageURI", - cache: DataChainCache, + cache: Cache, **kwargs, ) -> "Client": return cls(cls.FS_CLASS._strip_protocol(uri), kwargs, cache) diff --git a/src/datachain/client/local.py b/src/datachain/client/local.py index baac7f9da..0ebe726f4 100644 --- a/src/datachain/client/local.py +++ b/src/datachain/client/local.py @@ -12,7 +12,7 @@ from .fsspec import Client if TYPE_CHECKING: - from datachain.cache import DataChainCache + from datachain.cache import Cache from datachain.dataset import StorageURI @@ -25,7 +25,7 @@ def __init__( self, name: str, fs_kwargs: dict[str, Any], - cache: "DataChainCache", + cache: "Cache", use_symlinks: bool = False, ) -> None: super().__init__(name, fs_kwargs, cache) @@ -82,7 +82,7 @@ def split_url(cls, url: str) -> tuple[str, str]: return bucket, path @classmethod - def from_name(cls, name: str, cache: "DataChainCache", kwargs) -> "FileClient": + def from_name(cls, name: str, cache: "Cache", kwargs) -> "FileClient": use_symlinks = kwargs.pop("use_symlinks", False) return cls(name, kwargs, cache, use_symlinks=use_symlinks) @@ -90,7 +90,7 @@ def from_name(cls, name: str, cache: "DataChainCache", kwargs) -> "FileClient": def from_source( cls, uri: str, - cache: "DataChainCache", + cache: "Cache", use_symlinks: bool = False, **kwargs, ) -> "FileClient": diff --git a/src/datachain/lib/pytorch.py b/src/datachain/lib/pytorch.py index f3b504d75..411ae2623 100644 --- a/src/datachain/lib/pytorch.py +++ b/src/datachain/lib/pytorch.py @@ -23,7 +23,7 @@ if TYPE_CHECKING: from torchvision.transforms.v2 import Transform - from datachain.cache import DataChainCache as Cache + from datachain.cache import Cache logger = logging.getLogger("datachain") diff --git a/src/datachain/lib/udf.py b/src/datachain/lib/udf.py index 750e58dc8..e4565b426 100644 --- a/src/datachain/lib/udf.py +++ b/src/datachain/lib/udf.py @@ -32,7 +32,7 @@ from typing_extensions import Self - from datachain.cache import DataChainCache as Cache + from datachain.cache import Cache from datachain.catalog import Catalog from datachain.lib.signal_schema import SignalSchema from datachain.lib.udf_signature import UdfSignature diff --git a/src/datachain/nodes_fetcher.py b/src/datachain/nodes_fetcher.py index 5aa75dc3c..57511dca0 100644 --- a/src/datachain/nodes_fetcher.py +++ b/src/datachain/nodes_fetcher.py @@ -5,7 +5,7 @@ from datachain.nodes_thread_pool import NodesThreadPool if TYPE_CHECKING: - from datachain.cache import DataChainCache + from datachain.cache import Cache from datachain.client.fsspec import Client from datachain.node import Node @@ -13,7 +13,7 @@ class NodesFetcher(NodesThreadPool): - def __init__(self, client: "Client", max_threads: int, cache: "DataChainCache"): + def __init__(self, client: "Client", max_threads: int, cache: "Cache"): super().__init__(max_threads) self.client = client self.cache = cache diff --git a/tests/unit/test_cache.py b/tests/unit/test_cache.py index d926acdb5..2fe1902b2 100644 --- a/tests/unit/test_cache.py +++ b/tests/unit/test_cache.py @@ -2,13 +2,13 @@ import pytest -from datachain.cache import DataChainCache, get_temp_cache, temporary_cache +from datachain.cache import Cache, get_temp_cache, temporary_cache from datachain.lib.file import File @pytest.fixture def cache(tmp_path): - return DataChainCache(str(tmp_path / "cache"), str(tmp_path / "tmp")) + return Cache(str(tmp_path / "cache"), str(tmp_path / "tmp")) def test_simple(cache): @@ -57,7 +57,7 @@ def test_remove(cache): assert not cache.contains(uid) -def test_destroy(cache: DataChainCache): +def test_destroy(cache: Cache): file = File(source="s3://foo", path="data/bar", etag="xyz", size=3, location=None) cache.store_data(file, b"foo") assert cache.contains(file) @@ -69,7 +69,7 @@ def test_destroy(cache: DataChainCache): def test_get_temp_cache(tmp_path): temp = get_temp_cache(tmp_path, prefix="test-") assert os.path.isdir(temp.cache_dir) - assert isinstance(temp, DataChainCache) + assert isinstance(temp, Cache) head, tail = os.path.split(temp.cache_dir) assert head == str(tmp_path) assert tail.startswith("test-") diff --git a/tests/unit/test_pytorch.py b/tests/unit/test_pytorch.py index 6e30c34f2..f4372488c 100644 --- a/tests/unit/test_pytorch.py +++ b/tests/unit/test_pytorch.py @@ -3,7 +3,7 @@ import pytest -from datachain.cache import DataChainCache +from datachain.cache import Cache from datachain.lib.file import File from datachain.lib.pytorch import PytorchDataset from datachain.lib.settings import Settings @@ -30,7 +30,7 @@ def test_cache(catalog, cache, prefetch): @pytest.mark.parametrize("cache", [True, False]) def test_close(mocker, catalog, cache): - spy = mocker.spy(DataChainCache, "destroy") + spy = mocker.spy(Cache, "destroy") ds = PytorchDataset( "fake", 1, catalog, dc_settings=Settings(cache=cache, prefetch=10) ) @@ -74,7 +74,7 @@ def test_prefetched_files_are_removed_after_yield(tmp_dir, mocker, catalog, cach @pytest.mark.parametrize("cache", [True, False]) def test_prefetch_cache_gets_destroyed_on_gc(mocker, catalog, cache): - spy = mocker.patch.object(DataChainCache, "destroy") + spy = mocker.patch.object(Cache, "destroy") ds = PytorchDataset( "fake", 1, catalog, dc_settings=Settings(cache=cache, prefetch=10) ) From 213b1d8042dd1a26f28cb2a53bb46e5b2d4ed6ba Mon Sep 17 00:00:00 2001 From: Thomas Kunwar <20840228+yathomasi@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:54:16 +0545 Subject: [PATCH 36/63] feat: add apollo integration, drop reo.dev (#835) --- docs/overrides/main.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/overrides/main.html b/docs/overrides/main.html index bce263759..7f914fbf1 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -8,6 +8,16 @@ + + {% endblock %} From 43389f718fd38cf18d80bee08ebd0201428c4b75 Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Thu, 23 Jan 2025 06:27:12 +1100 Subject: [PATCH 37/63] append e2e tests coverage instead of overwriting (#851) --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9bf83ebf7..3b96a12fd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -106,7 +106,7 @@ jobs: shell: bash - name: Run E2E tests - run: nox -s tests-${{ matrix.pyv }} -- -m "e2e" $DISABLE_REMOTES_ARG + run: nox -s tests-${{ matrix.pyv }} -- -m "e2e" --cov-append $DISABLE_REMOTES_ARG shell: bash - name: Upload coverage report From 5a20c4ebff8ea3d51a392dedf6883de02a1d95df Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Fri, 24 Jan 2025 11:44:15 +1100 Subject: [PATCH 38/63] drop unstructured examples (#854) --- .../unstructured-embeddings-gen.py | 78 ------------------- .../llm_and_nlp/unstructured-summary-map.py | 67 ---------------- pyproject.toml | 4 - 3 files changed, 149 deletions(-) delete mode 100644 examples/llm_and_nlp/unstructured-embeddings-gen.py delete mode 100644 examples/llm_and_nlp/unstructured-summary-map.py diff --git a/examples/llm_and_nlp/unstructured-embeddings-gen.py b/examples/llm_and_nlp/unstructured-embeddings-gen.py deleted file mode 100644 index 193d5e159..000000000 --- a/examples/llm_and_nlp/unstructured-embeddings-gen.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -To install the required dependencies: - - pip install datachain[examples] - -""" - -from collections.abc import Iterator - -from unstructured.cleaners.core import ( - clean, - group_broken_paragraphs, - replace_unicode_quotes, -) -from unstructured.partition.pdf import partition_pdf -from unstructured_ingest.embed.huggingface import ( - HuggingFaceEmbeddingConfig, - HuggingFaceEmbeddingEncoder, -) - -from datachain import C, DataChain, DataModel, File - -source = "gs://datachain-demo/neurips/1987/" - - -# Define the output as a DataModel class -class Chunk(DataModel): - key: str - text: str - embeddings: list[float] - - -# Define embedding encoder - -embedding_encoder = HuggingFaceEmbeddingEncoder(config=HuggingFaceEmbeddingConfig()) - - -# Use signatures to define UDF input/output -# these can be pydantic model or regular Python types -def process_pdf(file: File) -> Iterator[Chunk]: - # Ingest the file - with file.open() as f: - chunks = partition_pdf(file=f, chunking_strategy="by_title", strategy="fast") - - # Clean the chunks and add new columns - text_chunks = [] - for chunk in chunks: - chunk.apply( - lambda text: clean( - text, bullets=True, extra_whitespace=True, trailing_punctuation=True - ) - ) - chunk.apply(replace_unicode_quotes) - chunk.apply(group_broken_paragraphs) - text_chunks.append({"text": str(chunk)}) - - # create embeddings - chunks_embedded = embedding_encoder.embed_documents(text_chunks) - - # Add new rows to DataChain - for chunk in chunks_embedded: - yield Chunk( - key=file.path, - text=chunk.get("text"), - embeddings=chunk.get("embeddings"), - ) - - -dc = ( - DataChain.from_storage(source) - .settings(parallel=-1) - .filter(C.file.path.glob("*.pdf")) - .gen(document=process_pdf) -) - -dc.save("embedded-documents") - -DataChain.from_dataset("embedded-documents").show() diff --git a/examples/llm_and_nlp/unstructured-summary-map.py b/examples/llm_and_nlp/unstructured-summary-map.py deleted file mode 100644 index c765b6255..000000000 --- a/examples/llm_and_nlp/unstructured-summary-map.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -To install the required dependencies: - - pip install datachain[examples] - -""" - -import os - -os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1" - -from transformers import pipeline -from unstructured.partition.pdf import PartitionStrategy -from unstructured.partition.pdf import partition_pdf as partition -from unstructured.staging.base import convert_to_dataframe - -from datachain import DataChain - -device = "cpu" -model = "pszemraj/led-large-book-summary" -source = "gs://datachain-demo/nlp-infobooks/*.pdf" - - -def partition_object(file): - with file.open() as raw: - elements = partition( - file=raw, metadata_filename=file.name, strategy=PartitionStrategy.FAST - ) - title = str(elements[0]) - text = "\n\n".join([str(el) for el in elements]) - df = convert_to_dataframe(elements) - return (df.to_json(), title, text, "") - - -def cleanse(text): - separator = "Listen to this story" - head, _sep, _tail = text.partition(separator) - return (head,) - - -def summarize(clean): - helper = pipeline(model=model, device=device) - summary = helper(clean, max_length=200)[0]["summary_text"] - return (summary,) - - -dc = ( - DataChain.from_storage(source) - .limit(1) - .map( - partition_object, - params=["file"], - output={"elements": dict, "title": str, "text": str, "error": str}, - ) -) - -dc = dc.map(cleanse, output={"clean": str}) -dc = dc.map(summarize, output={"summary": str}) -results = dc.select("text", "summary").collect() - -for story in results: - print("\n *********** the original: ********** ") - print(story[0]) - - print("\n *********** the summary: *********** ") - print(story[1]) - print("\n") diff --git a/pyproject.toml b/pyproject.toml index 17ee75320..f0a20074e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,11 +114,7 @@ examples = [ "datachain[tests]", "defusedxml", "accelerate", - "unstructured_ingest[embed-huggingface]", - "unstructured[pdf]<0.16.12", - "pdfplumber==0.11.5", "huggingface_hub[hf_transfer]", - "onnx==1.16.1", "ultralytics==8.3.64", "open_clip_torch" ] From b72c440bc6e3dc87f8c0db230a1dde613d54b9c7 Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:22:23 +1100 Subject: [PATCH 39/63] add upload classmethod to File (#850) --- src/datachain/client/fsspec.py | 4 ++++ src/datachain/lib/file.py | 18 ++++++++++++++++++ tests/func/test_file.py | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/src/datachain/client/fsspec.py b/src/datachain/client/fsspec.py index 92741e9fc..5ead774f4 100644 --- a/src/datachain/client/fsspec.py +++ b/src/datachain/client/fsspec.py @@ -390,6 +390,10 @@ def open_object( def upload(self, path: str, data: bytes) -> "File": full_path = self.get_full_path(path) + + parent = "/".join(full_path.split("/")[:-1]) + self.fs.makedirs(parent, exist_ok=True) + self.fs.pipe_file(full_path, data) file_info = self.fs.info(full_path) return self.info_to_file(file_info, path) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index fc3b57612..98762d839 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -190,6 +190,24 @@ def __init__(self, **kwargs): self._catalog = None self._caching_enabled: bool = False + @classmethod + def upload( + cls, path: str, data: bytes, catalog: Optional["Catalog"] = None + ) -> "File": + if catalog is None: + from datachain.catalog.loader import get_catalog + + catalog = get_catalog() + + parts = path.split("/") + parent = "/".join(parts[:-1]) + name = parts[-1] + + client = catalog.get_client(parent) + file = client.upload(name, data) + file._set_stream(catalog) + return file + @classmethod def _from_row(cls, row: "RowDict") -> "Self": return cls(**{key: row[key] for key in cls._datachain_column_types}) diff --git a/tests/func/test_file.py b/tests/func/test_file.py index 4adc4fe4b..4a2db34f1 100644 --- a/tests/func/test_file.py +++ b/tests/func/test_file.py @@ -43,3 +43,23 @@ def test_resolve_file_no_exist(cloud_test_catalog): assert resolved_non_existent.size == 0 assert resolved_non_existent.etag == "" assert resolved_non_existent.last_modified == TIME_ZERO + + +def test_upload(cloud_test_catalog): + ctc = cloud_test_catalog + + src_uri = ctc.src_uri + filename = "image_1.jpg" + source = f"{src_uri}/upload-test-images" + catalog = ctc.catalog + + img_bytes = b"bytes" + + f = File.upload(f"{source}/{filename}", img_bytes, catalog) + + assert f.path == filename + assert f.source == source + assert f.read() == img_bytes + + client = catalog.get_client(src_uri) + client.fs.rm(source, recursive=True) From 55cd044783e66049a8b30a5c1a6e0c5ae820aebb Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Fri, 24 Jan 2025 08:56:43 +0545 Subject: [PATCH 40/63] drop .edatachain support (#853) --- src/datachain/catalog/__init__.py | 2 - src/datachain/catalog/catalog.py | 145 ++--------- src/datachain/cli/__init__.py | 3 - src/datachain/listing.py | 14 +- src/datachain/node.py | 15 -- tests/func/test_catalog.py | 401 +++--------------------------- 6 files changed, 51 insertions(+), 529 deletions(-) diff --git a/src/datachain/catalog/__init__.py b/src/datachain/catalog/__init__.py index 498142c1a..3f18a1845 100644 --- a/src/datachain/catalog/__init__.py +++ b/src/datachain/catalog/__init__.py @@ -3,7 +3,6 @@ QUERY_SCRIPT_CANCELED_EXIT_CODE, QUERY_SCRIPT_INVALID_LAST_STATEMENT_EXIT_CODE, Catalog, - parse_edatachain_file, ) from .loader import get_catalog @@ -13,5 +12,4 @@ "QUERY_SCRIPT_INVALID_LAST_STATEMENT_EXIT_CODE", "Catalog", "get_catalog", - "parse_edatachain_file", ] diff --git a/src/datachain/catalog/catalog.py b/src/datachain/catalog/catalog.py index b19249deb..e893d860e 100644 --- a/src/datachain/catalog/catalog.py +++ b/src/datachain/catalog/catalog.py @@ -26,7 +26,6 @@ import requests import sqlalchemy as sa -import yaml from sqlalchemy import Column from tqdm.auto import tqdm @@ -57,7 +56,7 @@ from datachain.nodes_thread_pool import NodesThreadPool from datachain.remote.studio import StudioClient from datachain.sql.types import DateTime, SQLType -from datachain.utils import DataChainDir, datachain_paths_join +from datachain.utils import DataChainDir from .datasource import DataSource @@ -73,7 +72,6 @@ logger = logging.getLogger("datachain") DEFAULT_DATASET_DIR = "dataset" -DATASET_FILE_SUFFIX = ".edatachain" TTL_INT = 4 * 60 * 60 @@ -247,7 +245,6 @@ class NodeGroup: # The source path within the bucket # (not including the bucket name or s3:// prefix) source_path: str = "" - is_edatachain: bool = False dataset_name: Optional[str] = None dataset_version: Optional[int] = None instantiated_nodes: Optional[list[NodeWithPath]] = None @@ -272,55 +269,11 @@ def download(self, recursive: bool = False, pbar=None) -> None: self.client.fetch_nodes(self.iternodes(recursive), shared_progress_bar=pbar) -def check_output_dataset_file( - output: str, - force: bool = False, - dataset_filename: Optional[str] = None, - skip_check_edatachain: bool = False, -) -> str: - """ - Checks the dataset filename for existence or if it should be force-overwritten. - """ - dataset_file = ( - dataset_filename if dataset_filename else output + DATASET_FILE_SUFFIX - ) - if not skip_check_edatachain and os.path.exists(dataset_file): - if force: - os.remove(dataset_file) - else: - raise RuntimeError(f"Output dataset file already exists: {dataset_file}") - return dataset_file - - -def parse_edatachain_file(filename: str) -> list[dict[str, Any]]: - with open(filename, encoding="utf-8") as f: - contents = yaml.safe_load(f) - - if not isinstance(contents, list): - contents = [contents] - - for entry in contents: - if not isinstance(entry, dict): - raise TypeError( - "Failed parsing EDataChain file, " - "each data source entry must be a dictionary" - ) - if "data-source" not in entry or "files" not in entry: - raise ValueError( - "Failed parsing EDataChain file, " - "each data source entry must contain the " - '"data-source" and "files" keys' - ) - - return contents - - def prepare_output_for_cp( node_groups: list[NodeGroup], output: str, force: bool = False, - edatachain_only: bool = False, - no_edatachain_file: bool = False, + no_cp: bool = False, ) -> tuple[bool, Optional[str]]: total_node_count = 0 for node_group in node_groups: @@ -333,7 +286,7 @@ def prepare_output_for_cp( always_copy_dir_contents = False copy_to_filename = None - if edatachain_only: + if no_cp: return always_copy_dir_contents, copy_to_filename if not os.path.isdir(output): @@ -358,10 +311,6 @@ def prepare_output_for_cp( copy_to_filename = output else: raise FileNotFoundError(f"Is not a directory: {output}") - - if copy_to_filename and not no_edatachain_file: - raise RuntimeError("File to file cp not supported with .edatachain files!") - return always_copy_dir_contents, copy_to_filename @@ -465,8 +414,6 @@ def instantiate_node_groups( copy_to_filename, recursive, copy_dir_contents, - source_path, - node_group.is_edatachain, node_group.is_dataset, ) if not virtual_only: @@ -484,24 +431,6 @@ def instantiate_node_groups( instantiate_progress_bar.close() -def compute_metafile_data(node_groups) -> list[dict[str, Any]]: - metafile_data = [] - for node_group in node_groups: - if not node_group.sources: - continue - listing: Listing = node_group.listing - metafile_group = {"data-source": {"uri": listing.uri}, "files": []} - for node in node_group.instantiated_nodes: - if not node.n.is_dir: - metafile_group["files"].append( # type: ignore [attr-defined] - node.get_metafile_data() - ) - if metafile_group["files"]: - metafile_data.append(metafile_group) - - return metafile_data - - def find_column_to_str( # noqa: PLR0911 row: tuple[Any, ...], field_lookup: dict[str, int], src: DataSource, column: str ) -> str: @@ -703,22 +632,8 @@ def _row_to_node(d: dict[str, Any]) -> Node: enlisted_sources: list[tuple[bool, bool, Any]] = [] client_config = client_config or self.client_config for src in sources: # Opt: parallel - if src.endswith(DATASET_FILE_SUFFIX) and os.path.isfile(src): - # TODO: Also allow using EDataChain files from cloud locations? - edatachain_data = parse_edatachain_file(src) - indexed_sources = [] - for ds in edatachain_data: - listing, _, source_path = self.enlist_source( - ds["data-source"]["uri"], - update, - client_config=client_config, - ) - paths = datachain_paths_join( - source_path, (f["name"] for f in ds["files"]) - ) - indexed_sources.append((listing, source_path, paths)) - enlisted_sources.append((True, False, indexed_sources)) - elif src.startswith("ds://"): + listing: Optional[Listing] + if src.startswith("ds://"): ds_name, ds_version = parse_dataset_uri(src) dataset = self.get_dataset(ds_name) if not ds_version: @@ -796,7 +711,6 @@ def _row_to_node(d: dict[str, Any]) -> Node: listing.client, dsrc, source_path, - is_edatachain=True, ) ) else: @@ -1360,8 +1274,6 @@ def pull_dataset( # noqa: C901, PLR0915 local_ds_version: Optional[int] = None, cp: bool = False, force: bool = False, - edatachain: bool = False, - edatachain_file: Optional[str] = None, *, client_config=None, ) -> None: @@ -1373,8 +1285,6 @@ def _instantiate(ds_uri: str) -> None: [ds_uri], output, force=force, - no_edatachain_file=not edatachain, - edatachain_file=edatachain_file, client_config=client_config, ) print(f"Dataset {ds_uri} instantiated locally to {output}") @@ -1541,8 +1451,6 @@ def clone( recursive: bool = False, no_glob: bool = False, no_cp: bool = False, - edatachain: bool = False, - edatachain_file: Optional[str] = None, *, client_config=None, ) -> None: @@ -1551,9 +1459,8 @@ def clone( them into the dataset folder. It also adds those files to a dataset in database, which is created if doesn't exist yet - Optionally, it creates a .edatachain file """ - if not no_cp or edatachain: + if not no_cp: self.cp( sources, output, @@ -1561,9 +1468,7 @@ def clone( update=update, recursive=recursive, no_glob=no_glob, - edatachain_only=no_cp, - no_edatachain_file=not edatachain, - edatachain_file=edatachain_file, + no_cp=no_cp, client_config=client_config, ) else: @@ -1626,17 +1531,14 @@ def cp( force: bool = False, update: bool = False, recursive: bool = False, - edatachain_file: Optional[str] = None, - edatachain_only: bool = False, - no_edatachain_file: bool = False, + no_cp: bool = False, no_glob: bool = False, *, - client_config=None, - ) -> list[dict[str, Any]]: + client_config: Optional["dict"] = None, + ) -> None: """ This function copies files from cloud sources to local destination directory If cloud source is not indexed, or has expired index, it runs indexing - It also creates .edatachain file by default, if not specified differently """ client_config = client_config or self.client_config node_groups = self.enlist_sources_grouped( @@ -1647,17 +1549,11 @@ def cp( ) always_copy_dir_contents, copy_to_filename = prepare_output_for_cp( - node_groups, output, force, edatachain_only, no_edatachain_file + node_groups, output, force, no_cp ) - dataset_file = check_output_dataset_file( - output, force, edatachain_file, no_edatachain_file - ) - total_size, total_files = collect_nodes_for_cp(node_groups, recursive) - - if total_files == 0: - # Nothing selected to cp - return [] + if not total_files: + return desc_max_len = max(len(output) + 16, 19) bar_format = ( @@ -1667,7 +1563,7 @@ def cp( "[{elapsed}<{remaining}, {rate_fmt:>8}]" ) - if not edatachain_only: + if not no_cp: with get_download_bar(bar_format, total_size) as pbar: for node_group in node_groups: node_group.download(recursive=recursive, pbar=pbar) @@ -1679,21 +1575,10 @@ def cp( total_files, force, recursive, - edatachain_only, + no_cp, always_copy_dir_contents, copy_to_filename, ) - if no_edatachain_file: - return [] - - metafile_data = compute_metafile_data(node_groups) - if metafile_data: - # Don't write the metafile if nothing was copied - print(f"Creating '{dataset_file}'") - with open(dataset_file, "w", encoding="utf-8") as fd: - yaml.dump(metafile_data, fd, sort_keys=False) - - return metafile_data def du( self, diff --git a/src/datachain/cli/__init__.py b/src/datachain/cli/__init__.py index c1f46c2a1..d0ff24c9b 100644 --- a/src/datachain/cli/__init__.py +++ b/src/datachain/cli/__init__.py @@ -107,9 +107,6 @@ def handle_cp_command(args, catalog): force=bool(args.force), update=bool(args.update), recursive=bool(args.recursive), - edatachain_file=None, - edatachain_only=False, - no_edatachain_file=True, no_glob=args.no_glob, ) diff --git a/src/datachain/listing.py b/src/datachain/listing.py index 8d2ab76c6..53eacef53 100644 --- a/src/datachain/listing.py +++ b/src/datachain/listing.py @@ -2,7 +2,6 @@ import os from collections.abc import Iterable, Iterator from functools import cached_property -from itertools import zip_longest from typing import TYPE_CHECKING, Optional from sqlalchemy import Column @@ -101,11 +100,8 @@ def collect_nodes_to_instantiate( copy_to_filename: Optional[str], recursive=False, copy_dir_contents=False, - relative_path=None, - from_edatachain=False, from_dataset=False, ) -> list[NodeWithPath]: - rel_path_elements = relative_path.split("/") if relative_path else [] all_nodes: list[NodeWithPath] = [] for src in sources: node = src.node @@ -119,15 +115,7 @@ def collect_nodes_to_instantiate( ) else: node_path = [] - if from_edatachain: - for rpe, npe in zip_longest( - rel_path_elements, node.path.split("/") - ): - if rpe == npe: - continue - if npe: - node_path.append(npe) - elif copy_to_filename: + if copy_to_filename: node_path = [os.path.basename(copy_to_filename)] elif from_dataset: node_path = [ diff --git a/src/datachain/node.py b/src/datachain/node.py index 60c437ed9..f891191c7 100644 --- a/src/datachain/node.py +++ b/src/datachain/node.py @@ -84,18 +84,6 @@ def append_to_file(self, fd, path: str): fd.write(f" size: {self.size}\n") return size - def get_metafile_data(self, path: str): - data: dict[str, Any] = { - "name": path, - "etag": self.etag, - } - version = self.version - if version: - data["version"] = version - data["last_modified"] = time_to_str(self.last_modified) - data["size"] = self.size - return data - @property def full_path(self) -> str: if self.is_dir and self.path: @@ -181,9 +169,6 @@ class NodeWithPath: def append_to_file(self, fd): return self.n.append_to_file(fd, "/".join(self.path)) - def get_metafile_data(self): - return self.n.get_metafile_data("/".join(self.path)) - @property def full_path(self) -> str: path = "/".join(self.path) diff --git a/tests/func/test_catalog.py b/tests/func/test_catalog.py index 58c37c7de..5a9cac39a 100644 --- a/tests/func/test_catalog.py +++ b/tests/func/test_catalog.py @@ -4,11 +4,9 @@ import pytest import requests -import yaml from fsspec.implementations.local import LocalFileSystem from datachain import DataChain, File -from datachain.catalog import parse_edatachain_file from datachain.cli import garbage_collect from datachain.error import DatasetNotFoundError from datachain.lib.listing import parse_listing_uri @@ -154,50 +152,12 @@ def test_cp_root(cloud_test_catalog, recursive, star, dir_exists, cloud_type): if not star and not recursive: # The root directory is skipped, so nothing is copied - assert tree_from_path(dest) == {} - return - - assert (dest / "description").read_text() == "Cats and Dogs" - - # Testing DataChain File Contents - assert dest.with_suffix(".edatachain").is_file() - edatachain_contents = yaml.safe_load(dest.with_suffix(".edatachain").read_text()) - assert len(edatachain_contents) == 1 - data = edatachain_contents[0] - assert data["data-source"]["uri"] == src_uri.rstrip("/") + "/" - expected_file_count = 7 if recursive else 1 - assert len(data["files"]) == expected_file_count - files_by_name = {f["name"]: f for f in data["files"]} - - # Directories should never be saved - assert "cats" not in files_by_name - assert "dogs" not in files_by_name - assert "others" not in files_by_name - assert "dogs/others" not in files_by_name - - # Description is always copied (if anything is copied) - prefix = "" if star or (recursive and not dir_exists) else "/" - assert files_by_name[f"{prefix}description"]["size"] == 13 - - if recursive: - assert tree_from_path(dest) == DEFAULT_TREE - assert files_by_name[f"{prefix}cats/cat1"]["size"] == 4 - assert files_by_name[f"{prefix}cats/cat2"]["size"] == 4 - assert files_by_name[f"{prefix}dogs/dog1"]["size"] == 4 - assert files_by_name[f"{prefix}dogs/dog2"]["size"] == 3 - assert files_by_name[f"{prefix}dogs/dog3"]["size"] == 4 - assert files_by_name[f"{prefix}dogs/others/dog4"]["size"] == 4 - return - - assert (dest / "cats").exists() is False - assert (dest / "dogs").exists() is False - for prefix in ["/", ""]: - assert f"{prefix}cats/cat1" not in files_by_name - assert f"{prefix}cats/cat2" not in files_by_name - assert f"{prefix}dogs/dog1" not in files_by_name - assert f"{prefix}dogs/dog2" not in files_by_name - assert f"{prefix}dogs/dog3" not in files_by_name - assert f"{prefix}dogs/others/dog4" not in files_by_name + expected = {} + elif recursive: + expected = DEFAULT_TREE + else: + expected = {"description": "Cats and Dogs"} + assert tree_from_path(dest) == expected @pytest.mark.parametrize( @@ -271,48 +231,15 @@ def test_cp_subdir(cloud_test_catalog, recursive, star, slash, dir_exists): if not star and not recursive: # Directories are skipped, so nothing is copied - assert tree_from_path(dest) == {} - return - - # Testing DataChain File Contents - assert dest.with_suffix(".edatachain").is_file() - edatachain_contents = yaml.safe_load(dest.with_suffix(".edatachain").read_text()) - assert len(edatachain_contents) == 1 - data = edatachain_contents[0] - assert data["data-source"]["uri"] == src_uri.rstrip("/") + "/" - expected_file_count = 4 if recursive else 3 - assert len(data["files"]) == expected_file_count - files_by_name = {f["name"]: f for f in data["files"]} - - # Directories should never be saved - assert "others" not in files_by_name - assert "dogs/others" not in files_by_name - - if not dir_exists: - assert (dest / "dog1").read_text() == "woof" - assert (dest / "dog2").read_text() == "arf" - assert (dest / "dog3").read_text() == "bark" - assert (dest / "dogs").exists() is False - assert files_by_name["dog1"]["size"] == 4 - assert files_by_name["dog2"]["size"] == 3 - assert files_by_name["dog3"]["size"] == 4 - if recursive: - assert (dest / "others" / "dog4").read_text() == "ruff" - assert files_by_name["others/dog4"]["size"] == 4 - else: - assert (dest / "others").exists() is False - assert "others/dog4" not in files_by_name - return - - assert tree_from_path(dest / "dogs") == DEFAULT_TREE["dogs"] - assert (dest / "dog1").exists() is False - assert (dest / "dog2").exists() is False - assert (dest / "dog3").exists() is False - assert (dest / "others").exists() is False - assert files_by_name["dogs/dog1"]["size"] == 4 - assert files_by_name["dogs/dog2"]["size"] == 3 - assert files_by_name["dogs/dog3"]["size"] == 4 - assert files_by_name["dogs/others/dog4"]["size"] == 4 + expected = {} + elif not dir_exists: + expected = DEFAULT_TREE["dogs"] + if not recursive: + expected = expected.copy() + expected.pop("others") + else: + expected = {"dogs": DEFAULT_TREE["dogs"]} + assert tree_from_path(dest) == expected @pytest.mark.parametrize( @@ -326,7 +253,7 @@ def test_cp_subdir(cloud_test_catalog, recursive, star, slash, dir_exists): (False, False, True), ), ) -def test_cp_multi_subdir(cloud_test_catalog, recursive, star, slash, cloud_type): # noqa: PLR0915 +def test_cp_multi_subdir(cloud_test_catalog, recursive, star, slash, cloud_type): if recursive and not star and not slash: pytest.skip("Fix in https://github.com/iterative/datachain/issues/535") @@ -358,65 +285,14 @@ def test_cp_multi_subdir(cloud_test_catalog, recursive, star, slash, cloud_type) if not star and not recursive: # Directories are skipped, so nothing is copied - assert tree_from_path(dest) == {} - return - - # Testing DataChain File Contents - assert dest.with_suffix(".edatachain").is_file() - edatachain_contents = yaml.safe_load(dest.with_suffix(".edatachain").read_text()) - assert len(edatachain_contents) == 2 - data_cats = edatachain_contents[0] - data_dogs = edatachain_contents[1] - assert data_cats["data-source"]["uri"] == sources[0].rstrip("/") + "/" - assert data_dogs["data-source"]["uri"] == sources[1].rstrip("/") + "/" - assert len(data_cats["files"]) == 2 - assert len(data_dogs["files"]) == 4 if recursive else 3 - cat_files_by_name = {f["name"]: f for f in data_cats["files"]} - dog_files_by_name = {f["name"]: f for f in data_dogs["files"]} - - # Directories should never be saved - assert "others" not in dog_files_by_name - assert "dogs/others" not in dog_files_by_name - - if star or slash: - assert (dest / "cat1").read_text() == "meow" - assert (dest / "cat2").read_text() == "mrow" - assert (dest / "dog1").read_text() == "woof" - assert (dest / "dog2").read_text() == "arf" - assert (dest / "dog3").read_text() == "bark" - assert (dest / "cats").exists() is False - assert (dest / "dogs").exists() is False - assert cat_files_by_name["cat1"]["size"] == 4 - assert cat_files_by_name["cat2"]["size"] == 4 - assert dog_files_by_name["dog1"]["size"] == 4 - assert dog_files_by_name["dog2"]["size"] == 3 - assert dog_files_by_name["dog3"]["size"] == 4 - if recursive: - assert (dest / "others" / "dog4").read_text() == "ruff" - assert dog_files_by_name["others/dog4"]["size"] == 4 - else: - assert (dest / "others").exists() is False - assert "others/dog4" not in dog_files_by_name - return - - assert (dest / "cats" / "cat1").read_text() == "meow" - assert (dest / "cats" / "cat2").read_text() == "mrow" - assert (dest / "dogs" / "dog1").read_text() == "woof" - assert (dest / "dogs" / "dog2").read_text() == "arf" - assert (dest / "dogs" / "dog3").read_text() == "bark" - assert (dest / "dogs" / "others" / "dog4").read_text() == "ruff" - assert (dest / "cat1").exists() is False - assert (dest / "cat2").exists() is False - assert (dest / "dog1").exists() is False - assert (dest / "dog2").exists() is False - assert (dest / "dog3").exists() is False - assert (dest / "others").exists() is False - assert cat_files_by_name["cats/cat1"]["size"] == 4 - assert cat_files_by_name["cats/cat2"]["size"] == 4 - assert dog_files_by_name["dogs/dog1"]["size"] == 4 - assert dog_files_by_name["dogs/dog2"]["size"] == 3 - assert dog_files_by_name["dogs/dog3"]["size"] == 4 - assert dog_files_by_name["dogs/others/dog4"]["size"] == 4 + expected = {} + elif star or slash: + expected = DEFAULT_TREE["dogs"] | DEFAULT_TREE["cats"] + if not recursive: + expected = {k: v for k, v in expected.items() if not isinstance(v, dict)} + else: + expected = DEFAULT_TREE + assert tree_from_path(dest) == expected def test_cp_double_subdir(cloud_test_catalog): @@ -428,23 +304,7 @@ def test_cp_double_subdir(cloud_test_catalog): catalog.cp([src_path], str(dest), recursive=True) - # Testing DataChain File Contents - assert dest.with_suffix(".edatachain").is_file() - edatachain_contents = yaml.safe_load(dest.with_suffix(".edatachain").read_text()) - assert len(edatachain_contents) == 1 - data = edatachain_contents[0] - assert data["data-source"]["uri"] == src_path.rstrip("/") + "/" - assert len(data["files"]) == 1 - files_by_name = {f["name"]: f for f in data["files"]} - - # Directories should never be saved - assert "others" not in files_by_name - assert "dogs/others" not in files_by_name - - assert (dest / "dogs").exists() is False - assert (dest / "others").exists() is False - assert (dest / "dog4").read_text() == "ruff" - assert files_by_name["dog4"]["size"] == 4 + assert tree_from_path(dest) == {"dog4": "ruff"} @pytest.mark.parametrize("no_glob", (True, False)) @@ -455,9 +315,7 @@ def test_cp_single_file(cloud_test_catalog, no_glob): src_path = f"{cloud_test_catalog.src_uri}/dogs/dog1" dest.mkdir() - catalog.cp( - [src_path], str(dest / "local_dog"), no_edatachain_file=True, no_glob=no_glob - ) + catalog.cp([src_path], str(dest / "local_dog"), no_glob=no_glob) assert tree_from_path(dest) == {"local_dog": "woof"} @@ -470,13 +328,13 @@ def test_cp_file_storage_mutation(cloud_test_catalog): dest = working_dir / "data1" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True) + catalog.cp([src_path], str(dest / "local")) assert tree_from_path(dest) == {"local": "original"} (cloud_test_catalog.src / "bar-file").write_text("modified") dest = working_dir / "data2" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True) + catalog.cp([src_path], str(dest / "local")) assert tree_from_path(dest) == {"local": "modified"} # For a file we access it directly, we don't take the entry from listing @@ -484,13 +342,13 @@ def test_cp_file_storage_mutation(cloud_test_catalog): catalog.cache.clear() dest = working_dir / "data3" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True) + catalog.cp([src_path], str(dest / "local")) assert tree_from_path(dest) == {"local": "modified"} catalog.index([src_path], update=True) dest = working_dir / "data4" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True) + catalog.cp([src_path], str(dest / "local")) assert tree_from_path(dest) == {"local": "modified"} @@ -502,13 +360,13 @@ def test_cp_dir_storage_mutation(cloud_test_catalog, version_aware): dest = working_dir / "data1" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True, recursive=True) + catalog.cp([src_path], str(dest / "local"), recursive=True) assert tree_from_path(dest) == {"local": {"foo-file": "original"}} (cloud_test_catalog.src / "foo-file").write_text("modified") dest = working_dir / "data2" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True, recursive=True) + catalog.cp([src_path], str(dest / "local"), recursive=True) assert tree_from_path(dest) == {"local": {"foo-file": "original"}} # For a dir we access files through listing @@ -520,209 +378,20 @@ def test_cp_dir_storage_mutation(cloud_test_catalog, version_aware): dest = working_dir / "data3" dest.mkdir() if version_aware: - catalog.cp( - [src_path], str(dest / "local"), no_edatachain_file=True, recursive=True - ) + catalog.cp([src_path], str(dest / "local"), recursive=True) assert tree_from_path(dest) == {"local": {"foo-file": "original"}} else: with pytest.raises(FileNotFoundError): - catalog.cp( - [src_path], str(dest / "local"), no_edatachain_file=True, recursive=True - ) + catalog.cp([src_path], str(dest / "local"), recursive=True) assert tree_from_path(dest) == {"local": {}} catalog.index([src_path], update=True) dest = working_dir / "data4" dest.mkdir() - catalog.cp([src_path], str(dest / "local"), no_edatachain_file=True, recursive=True) + catalog.cp([src_path], str(dest / "local"), recursive=True) assert tree_from_path(dest) == {"local": {"foo-file": "modified"}} -def test_cp_edatachain_file_options(cloud_test_catalog): - working_dir = cloud_test_catalog.working_dir - catalog = cloud_test_catalog.catalog - dest = working_dir / "data" - src_path = f"{cloud_test_catalog.src_uri}/dogs/*" - edatachain_file = working_dir / "custom_name.edatachain" - - catalog.cp( - [src_path], - str(dest), - recursive=False, - edatachain_only=True, - edatachain_file=str(edatachain_file), - ) - - assert (dest / "dog1").exists() is False - assert (dest / "dog2").exists() is False - assert (dest / "dog3").exists() is False - assert (dest / "dogs").exists() is False - assert (dest / "others").exists() is False - assert dest.with_suffix(".edatachain").exists() is False - - # Testing DataChain File Contents - assert edatachain_file.is_file() - edatachain_contents = yaml.safe_load(edatachain_file.read_text()) - assert len(edatachain_contents) == 1 - data = edatachain_contents[0] - assert data["data-source"]["uri"] == f"{cloud_test_catalog.src_uri}/dogs/" - expected_file_count = 3 - assert len(data["files"]) == expected_file_count - files_by_name = {f["name"]: f for f in data["files"]} - - assert parse_edatachain_file(str(edatachain_file)) == edatachain_contents - - # Directories should never be saved - assert "others" not in files_by_name - assert "dogs/others" not in files_by_name - - assert files_by_name["dog1"]["size"] == 4 - assert files_by_name["dog2"]["size"] == 3 - assert files_by_name["dog3"]["size"] == 4 - assert "others/dog4" not in files_by_name - - with pytest.raises(FileNotFoundError): - # Should fail, as * will not be expanded - catalog.cp( - [src_path], - str(dest), - recursive=False, - edatachain_only=True, - edatachain_file=str(edatachain_file), - no_glob=True, - ) - - # Should succeed, as the DataChain file exists check will be skipped - edatachain_only_data = catalog.cp( - [src_path], - str(dest), - recursive=False, - edatachain_only=True, - edatachain_file=str(edatachain_file), - force=True, - ) - - # Check the returned DataChain data contents - assert len(edatachain_only_data) == len(edatachain_contents) - edatachain_only_source = edatachain_only_data[0] - assert data["data-source"]["uri"] == f"{cloud_test_catalog.src_uri}/dogs/" - assert edatachain_only_source["files"] == data["files"] - - -def test_cp_edatachain_file_sources(cloud_test_catalog): # noqa: PLR0915 - pytest.skip("Fix in https://github.com/iterative/datachain/issues/535") - sources = [ - f"{cloud_test_catalog.src_uri}/cats/", - f"{cloud_test_catalog.src_uri}/dogs/*", - ] - working_dir = cloud_test_catalog.working_dir - catalog = cloud_test_catalog.catalog - - dest = working_dir / "data" - - edatachain_files = [ - working_dir / "custom_cats.edatachain", - working_dir / "custom_dogs.edatachain", - ] - - catalog.cp( - sources[:1], - str(dest), - recursive=True, - edatachain_only=True, - edatachain_file=str(edatachain_files[0]), - ) - - catalog.cp( - sources[1:], - str(dest), - recursive=True, - edatachain_only=True, - edatachain_file=str(edatachain_files[1]), - ) - - # Files should not be copied yet - assert (dest / "cat1").exists() is False - assert (dest / "cat2").exists() is False - assert (dest / "cats").exists() is False - assert (dest / "dog1").exists() is False - assert (dest / "dog2").exists() is False - assert (dest / "dog3").exists() is False - assert (dest / "dogs").exists() is False - assert (dest / "others").exists() is False - - # Testing DataChain File Contents - edatachain_data = [] - for dqf in edatachain_files: - assert dqf.is_file() - edatachain_contents = yaml.safe_load(dqf.read_text()) - assert len(edatachain_contents) == 1 - edatachain_data.extend(edatachain_contents) - - assert len(edatachain_data) == 2 - data_cats1 = edatachain_data[0] - data_dogs1 = edatachain_data[1] - assert data_cats1["data-source"]["uri"] == sources[0] - assert data_dogs1["data-source"]["uri"] == sources[1].rstrip("*") - assert len(data_cats1["files"]) == 2 - assert len(data_dogs1["files"]) == 4 - cat_files_by_name1 = {f["name"]: f for f in data_cats1["files"]} - dog_files_by_name1 = {f["name"]: f for f in data_dogs1["files"]} - - # Directories should never be saved - assert "others" not in dog_files_by_name1 - assert "dogs/others" not in dog_files_by_name1 - - assert cat_files_by_name1["cat1"]["size"] == 4 - assert cat_files_by_name1["cat2"]["size"] == 4 - assert dog_files_by_name1["dog1"]["size"] == 4 - assert dog_files_by_name1["dog2"]["size"] == 3 - assert dog_files_by_name1["dog3"]["size"] == 4 - assert dog_files_by_name1["others/dog4"]["size"] == 4 - - assert not dest.exists() - - with pytest.raises(FileNotFoundError): - catalog.cp([str(dqf) for dqf in edatachain_files], str(dest), recursive=True) - - dest.mkdir() - - # Copy using these DataChain files as sources - catalog.cp([str(dqf) for dqf in edatachain_files], str(dest), recursive=True) - - # Files should now be copied - assert (dest / "cat1").read_text() == "meow" - assert (dest / "cat2").read_text() == "mrow" - assert (dest / "dog1").read_text() == "woof" - assert (dest / "dog2").read_text() == "arf" - assert (dest / "dog3").read_text() == "bark" - assert (dest / "others" / "dog4").read_text() == "ruff" - - # Testing DataChain File Contents - assert dest.with_suffix(".edatachain").is_file() - edatachain_contents = yaml.safe_load(dest.with_suffix(".edatachain").read_text()) - assert len(edatachain_contents) == 2 - data_cats2 = edatachain_contents[0] - data_dogs2 = edatachain_contents[1] - assert data_cats2["data-source"]["uri"] == sources[0] - assert data_dogs2["data-source"]["uri"] == sources[1].rstrip("*") - assert len(data_cats2["files"]) == 2 - assert len(data_dogs2["files"]) == 4 - cat_files_by_name2 = {f["name"]: f for f in data_cats2["files"]} - dog_files_by_name2 = {f["name"]: f for f in data_dogs2["files"]} - - # Directories should never be saved - assert "others" not in dog_files_by_name2 - assert "dogs/others" not in dog_files_by_name2 - - assert cat_files_by_name2["cat1"]["size"] == 4 - assert cat_files_by_name2["cat2"]["size"] == 4 - assert dog_files_by_name2["dog1"]["size"] == 4 - assert dog_files_by_name2["dog2"]["size"] == 3 - assert dog_files_by_name2["dog3"]["size"] == 4 - assert dog_files_by_name2["others/dog4"]["size"] == 4 - - @pytest.mark.parametrize("cloud_type, version_aware", [("file", False)], indirect=True) def test_cp_symlinks(cloud_test_catalog): catalog = cloud_test_catalog.catalog From 69a438551a35d23ab5782ada78074ba825d1dd98 Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Fri, 24 Jan 2025 08:57:39 +0545 Subject: [PATCH 41/63] pull _is_file checks to get_listing (#846) --- src/datachain/dataset.py | 2 +- src/datachain/lib/listing.py | 19 ++++++++----------- tests/func/test_catalog.py | 4 +--- tests/func/test_datachain.py | 6 +++--- tests/func/test_datasets.py | 2 +- tests/func/test_listing.py | 4 ++-- 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/datachain/dataset.py b/src/datachain/dataset.py index 0bd3b6ee0..1f9d362e4 100644 --- a/src/datachain/dataset.py +++ b/src/datachain/dataset.py @@ -91,7 +91,7 @@ def dataset_name(self) -> str: if self.type == DatasetDependencyType.DATASET: return self.name - list_dataset_name, _, _ = parse_listing_uri(self.name.strip("/"), None, {}) + list_dataset_name, _, _ = parse_listing_uri(self.name.strip("/"), {}) assert list_dataset_name return list_dataset_name diff --git a/src/datachain/lib/listing.py b/src/datachain/lib/listing.py index 1a05f84b0..a3f0e3091 100644 --- a/src/datachain/lib/listing.py +++ b/src/datachain/lib/listing.py @@ -103,17 +103,12 @@ def _isfile(client: "Client", path: str) -> bool: return False -def parse_listing_uri(uri: str, cache, client_config) -> tuple[Optional[str], str, str]: +def parse_listing_uri(uri: str, client_config) -> tuple[str, str, str]: """ Parsing uri and returns listing dataset name, listing uri and listing path """ client_config = client_config or {} - client = Client.get_client(uri, cache, **client_config) storage_uri, path = Client.parse_url(uri) - telemetry.log_param("client", client.PREFIX) - - if not uri.endswith("/") and _isfile(client, uri): - return None, f"{storage_uri}/{path.lstrip('/')}", path if uses_glob(path): lst_uri_path = posixpath.dirname(path) else: @@ -157,13 +152,15 @@ def get_listing( client_config = catalog.client_config client = Client.get_client(uri, cache, **client_config) - ds_name, list_uri, list_path = parse_listing_uri(uri, cache, client_config) - listing = None + telemetry.log_param("client", client.PREFIX) - # if we don't want to use cached dataset (e.g. for a single file listing) - if not ds_name: - return None, list_uri, list_path, False + # we don't want to use cached dataset (e.g. for a single file listing) + if not uri.endswith("/") and _isfile(client, uri): + storage_uri, path = Client.parse_url(uri) + return None, f"{storage_uri}/{path.lstrip('/')}", path, False + ds_name, list_uri, list_path = parse_listing_uri(uri, client_config) + listing = None listings = [ ls for ls in catalog.listings() if not ls.is_expired and ls.contains(ds_name) ] diff --git a/tests/func/test_catalog.py b/tests/func/test_catalog.py index 5a9cac39a..437e8eba5 100644 --- a/tests/func/test_catalog.py +++ b/tests/func/test_catalog.py @@ -15,9 +15,7 @@ def listing_stats(uri, catalog): - list_dataset_name, _, _ = parse_listing_uri( - uri, catalog.cache, catalog.client_config - ) + list_dataset_name, _, _ = parse_listing_uri(uri, catalog.client_config) dataset = catalog.get_dataset(list_dataset_name) return catalog.dataset_stats(dataset.name, dataset.latest_version) diff --git a/tests/func/test_datachain.py b/tests/func/test_datachain.py index 1ddb7cdcf..ee76f9470 100644 --- a/tests/func/test_datachain.py +++ b/tests/func/test_datachain.py @@ -110,7 +110,7 @@ def test_from_storage_reindex_expired(tmp_dir, test_session): os.mkdir(tmp_dir) uri = tmp_dir.as_uri() - lst_ds_name = parse_listing_uri(uri, catalog.cache, catalog.client_config)[0] + lst_ds_name = parse_listing_uri(uri, catalog.client_config)[0] pd.DataFrame({"name": ["Alice", "Bob"]}).to_parquet(tmp_dir / "test1.parquet") assert DataChain.from_storage(uri, session=test_session).count() == 1 @@ -138,7 +138,7 @@ def test_from_storage_partials(cloud_test_catalog): catalog = session.catalog def _list_dataset_name(uri: str) -> str: - name = parse_listing_uri(uri, catalog.cache, catalog.client_config)[0] + name = parse_listing_uri(uri, catalog.client_config)[0] assert name return name @@ -182,7 +182,7 @@ def test_from_storage_partials_with_update(cloud_test_catalog): catalog = session.catalog def _list_dataset_name(uri: str) -> str: - name = parse_listing_uri(uri, catalog.cache, catalog.client_config)[0] + name = parse_listing_uri(uri, catalog.client_config)[0] assert name return name diff --git a/tests/func/test_datasets.py b/tests/func/test_datasets.py index e7b990807..022a48992 100644 --- a/tests/func/test_datasets.py +++ b/tests/func/test_datasets.py @@ -862,7 +862,7 @@ def test_dataset_storage_dependencies(cloud_test_catalog, cloud_type, indirect): ds_name = "some_ds" DataChain.from_storage(uri, session=session).save(ds_name) - lst_ds_name, _, _ = parse_listing_uri(uri, catalog.cache, catalog.client_config) + lst_ds_name, _, _ = parse_listing_uri(uri, catalog.client_config) lst_dataset = catalog.metastore.get_dataset(lst_ds_name) assert [ diff --git a/tests/func/test_listing.py b/tests/func/test_listing.py index c785e8977..c010c3e89 100644 --- a/tests/func/test_listing.py +++ b/tests/func/test_listing.py @@ -38,7 +38,7 @@ def test_parse_listing_uri(cloud_test_catalog, cloud_type): ctc = cloud_test_catalog catalog = ctc.catalog dataset_name, listing_uri, listing_path = parse_listing_uri( - f"{ctc.src_uri}/dogs", catalog.cache, catalog.client_config + f"{ctc.src_uri}/dogs", catalog.client_config ) assert dataset_name == f"lst__{ctc.src_uri}/dogs/" assert listing_uri == f"{ctc.src_uri}/dogs/" @@ -57,7 +57,7 @@ def test_parse_listing_uri_with_glob(cloud_test_catalog): ctc = cloud_test_catalog catalog = ctc.catalog dataset_name, listing_uri, listing_path = parse_listing_uri( - f"{ctc.src_uri}/dogs/*", catalog.cache, catalog.client_config + f"{ctc.src_uri}/dogs/*", catalog.client_config ) assert dataset_name == f"lst__{ctc.src_uri}/dogs/" assert listing_uri == f"{ctc.src_uri}/dogs" From 7859e169b252695db0956e60accafadf56b5dc6e Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:43:15 +1100 Subject: [PATCH 42/63] use posixpath in upload methods (#855) --- src/datachain/client/fsspec.py | 3 ++- src/datachain/lib/file.py | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/datachain/client/fsspec.py b/src/datachain/client/fsspec.py index 5ead774f4..f9362b1de 100644 --- a/src/datachain/client/fsspec.py +++ b/src/datachain/client/fsspec.py @@ -3,6 +3,7 @@ import logging import multiprocessing import os +import posixpath import re import sys from abc import ABC, abstractmethod @@ -391,7 +392,7 @@ def open_object( def upload(self, path: str, data: bytes) -> "File": full_path = self.get_full_path(path) - parent = "/".join(full_path.split("/")[:-1]) + parent = posixpath.dirname(full_path) self.fs.makedirs(parent, exist_ok=True) self.fs.pipe_file(full_path, data) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 98762d839..65d2eb67d 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -199,9 +199,7 @@ def upload( catalog = get_catalog() - parts = path.split("/") - parent = "/".join(parts[:-1]) - name = parts[-1] + parent, name = posixpath.split(path) client = catalog.get_client(parent) file = client.upload(name, data) From 3f47d1290b9647517ebf4d56ec84c9f6bdc46328 Mon Sep 17 00:00:00 2001 From: Amrit Ghimire <16842655+amritghimire@users.noreply.github.com> Date: Mon, 27 Jan 2025 12:10:53 +0545 Subject: [PATCH 43/63] Handle permission error properly when checking for file (#856) * Handle permission error properly when checking for file Currently, we had blanket catch for exception when trying to check the file using _isfile. As a result, the exception stacktrace was repeated and catching the exception in script was difficult as we had to capture different exception. This convert the error to datachain native error that can be captured safely and proceed accordingly. This is first step toward handling #600 * Convert scheme to lower * Handle case for glob in windows --- src/datachain/error.py | 12 ++++++++++++ src/datachain/lib/listing.py | 18 +++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/datachain/error.py b/src/datachain/error.py index fb9b78df6..811966431 100644 --- a/src/datachain/error.py +++ b/src/datachain/error.py @@ -1,3 +1,15 @@ +import botocore.errorfactory +import botocore.exceptions +import gcsfs.retry + +REMOTE_ERRORS = ( + gcsfs.retry.HttpError, # GCS + OSError, # GCS + botocore.exceptions.BotoCoreError, # S3 + ValueError, # Azure +) + + class DataChainError(RuntimeError): pass diff --git a/src/datachain/lib/listing.py b/src/datachain/lib/listing.py index a3f0e3091..3c003a6ba 100644 --- a/src/datachain/lib/listing.py +++ b/src/datachain/lib/listing.py @@ -1,3 +1,4 @@ +import os import posixpath from collections.abc import Iterator from typing import TYPE_CHECKING, Callable, Optional, TypeVar @@ -7,6 +8,7 @@ from datachain.asyn import iter_over_async from datachain.client import Client +from datachain.error import REMOTE_ERRORS, ClientError from datachain.lib.file import File from datachain.query.schema import Column from datachain.sql.functions import path as pathfunc @@ -90,6 +92,15 @@ def _isfile(client: "Client", path: str) -> bool: Returns True if uri points to a file """ try: + if "://" in path: + # This makes sure that the uppercase scheme is converted to lowercase + scheme, path = path.split("://", 1) + path = f"{scheme.lower()}://{path}" + + if os.name == "nt" and "*" in path: + # On Windows, the glob pattern "*" is not supported + return False + info = client.fs.info(path) name = info.get("name") # case for special simulated directories on some clouds @@ -99,8 +110,13 @@ def _isfile(client: "Client", path: str) -> bool: return False return info["type"] == "file" - except: # noqa: E722 + except FileNotFoundError: return False + except REMOTE_ERRORS as e: + raise ClientError( + message=str(e), + error_code=getattr(e, "code", None), + ) from e def parse_listing_uri(uri: str, client_config) -> tuple[str, str, str]: From 17118d197fe78ed364282f51b627b6a792418606 Mon Sep 17 00:00:00 2001 From: Matt Seddon <37993418+mattseddon@users.noreply.github.com> Date: Mon, 27 Jan 2025 21:35:27 +1100 Subject: [PATCH 44/63] catch (HfHub)HTTPError in hf-dataset-llm-eval example (#848) --- examples/llm_and_nlp/hf-dataset-llm-eval.py | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/examples/llm_and_nlp/hf-dataset-llm-eval.py b/examples/llm_and_nlp/hf-dataset-llm-eval.py index 8b5ce3e5f..c9ef690a6 100644 --- a/examples/llm_and_nlp/hf-dataset-llm-eval.py +++ b/examples/llm_and_nlp/hf-dataset-llm-eval.py @@ -1,4 +1,5 @@ from huggingface_hub import InferenceClient +from requests import HTTPError from datachain import C, DataChain, DataModel @@ -20,15 +21,20 @@ def eval_dialog( user_input: str, bot_response: str, ) -> DialogEval: - completion = client.chat_completion( - messages=[ - { - "role": "user", - "content": f"{PROMPT}\n\nUser: {user_input}\nBot: {bot_response}", - }, - ], - response_format={"type": "json", "value": DialogEval.model_json_schema()}, - ) + try: + completion = client.chat_completion( + messages=[ + { + "role": "user", + "content": f"{PROMPT}\n\nUser: {user_input}\nBot: {bot_response}", + }, + ], + response_format={"type": "json", "value": DialogEval.model_json_schema()}, + ) + except HTTPError: + return DialogEval( + result="Error", reason="Error while interacting with the Hugging Face API." + ) message = completion.choices[0].message try: From cc05da9553b818b4e080c6d31a83e48cf932784b Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 28 Jan 2025 01:01:31 +0700 Subject: [PATCH 45/63] Code review updates --- src/datachain/lib/file.py | 210 +++++++++++++++++++++++++++++++--- src/datachain/lib/video.py | 227 +++++++++++++++++++++++-------------- 2 files changed, 333 insertions(+), 104 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 65d2eb67d..8304e650f 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -27,6 +27,7 @@ from datachain.utils import TIME_ZERO if TYPE_CHECKING: + from numpy import ndarray from typing_extensions import Self from datachain.catalog import Catalog @@ -206,6 +207,19 @@ def upload( file._set_stream(catalog) return file + @classmethod + def from_local_path(cls, path: str, catalog: Optional["Catalog"] = None) -> "File": + if catalog is None: + from datachain.catalog.loader import get_catalog + + catalog = get_catalog() + + parent, name = posixpath.split(path) + client = catalog.get_client(parent) + + file_info = client.fs.info(path) + return client.info_to_file(file_info, name) + @classmethod def _from_row(cls, row: "RowDict") -> "Self": return cls(**{key: row[key] for key in cls._datachain_column_types}) @@ -500,37 +514,199 @@ def save(self, destination: str): class Image(DataModel): """`DataModel` for image file meta information.""" - width: int = Field(default=0) - height: int = Field(default=0) + width: int = Field(default=-1) + height: int = Field(default=-1) format: str = Field(default="") class VideoFile(File): """`DataModel` for reading video files.""" + def get_info(self) -> "Video": + """Returns video file information.""" + from .video import video_info + + return video_info(self) + + def get_frame_np(self, frame: int) -> "ndarray": + """ + Reads video frame from a file. + + Args: + frame (int): Frame number to read. + + Returns: + ndarray: Video frame. + """ + from .video import video_frame_np + + return video_frame_np(self, frame) + + def get_frame(self, frame: int, format: str = "jpg") -> bytes: + """ + Reads video frame from a file and returns as image bytes. + + Args: + frame (int): Frame number to read. + format (str): Image format (default: 'jpg'). + + Returns: + bytes: Video frame image as bytes. + """ + from .video import video_frame + + return video_frame(self, frame, format) + + def save_frame(self, frame: int, output_file: str) -> "VideoFrame": + """ + Saves video frame as an image file. + + Args: + frame (int): Frame number to read. + output_file (str): Output file path. + + Returns: + VideoFrame: Video frame model. + """ + from .video import save_video_frame + + return save_video_frame(self, frame, output_file) + + def get_frames_np( + self, + start_frame: int = 0, + end_frame: Optional[int] = None, + step: int = 1, + ) -> "Iterator[ndarray]": + """ + Reads video frames from a file. + + Args: + start_frame (int): Frame number to start reading from (default: 0). + end_frame (int): Frame number to stop reading at (default: None). + step (int): Step size for reading frames (default: 1). + + Returns: + Iterator[ndarray]: Iterator of video frames. + """ + from .video import video_frames_np + + return video_frames_np(self, start_frame, end_frame, step) + + def get_frames( + self, + start_frame: int = 0, + end_frame: Optional[int] = None, + step: int = 1, + format: str = "jpg", + ) -> "Iterator[bytes]": + """ + Reads video frames from a file and returns as bytes. + + Args: + start_frame (int): Frame number to start reading from (default: 0). + end_frame (int): Frame number to stop reading at (default: None). + step (int): Step size for reading frames (default: 1). + format (str): Image format (default: 'jpg'). + + Returns: + Iterator[bytes]: Iterator of video frames. + """ + from .video import video_frames + + return video_frames(self, start_frame, end_frame, step, format) + + def save_frames( + self, + output_dir: str, + start_frame: int = 0, + end_frame: Optional[int] = None, + step: int = 1, + format: str = "jpg", + ) -> "Iterator[VideoFrame]": + """ + Saves video frames as image files. + + Args: + output_dir (str): Output directory path. + start_frame (int): Frame number to start reading from (default: 0). + end_frame (int): Frame number to stop reading at (default: None). + step (int): Step size for reading frames (default: 1). + format (str): Image format (default: 'jpg'). + + Returns: + Iterator[VideoFrame]: List of video frame models. + """ + from .video import save_video_frames + + return save_video_frames(self, output_dir, start_frame, end_frame, step, format) + + def save_fragment( + self, + start_time: float, + end_time: float, + output_file: str, + ) -> "VideoFragment": + """ + Saves video interval as a new video file. + + Args: + start_time (float): Start time in seconds. + end_time (float): End time in seconds. + output_file (str): Output file path. + + Returns: + VideoFragment: Video fragment model. + """ + from .video import save_video_fragment + + return save_video_fragment(self, start_time, end_time, output_file) + + def save_fragments( + self, + intervals: list[tuple[float, float]], + output_dir: str, + ) -> "Iterator[VideoFragment]": + """ + Saves video intervals as new video files. + + Args: + intervals (list[tuple[float, float]]): List of start and end times + in seconds. + output_dir (str): Output directory path. + + Returns: + Iterator[VideoFragment]: List of video fragment models. + """ + from .video import save_video_fragments + + return save_video_fragments(self, intervals, output_dir) + -class VideoClip(VideoFile): - """`DataModel` for reading video clips.""" +class VideoFragment(VideoFile): + """`DataModel` for reading video fragments.""" - start: float = Field(default=0) - end: float = Field(default=0) + start: float = Field(default=-1.0) + end: float = Field(default=-1.0) + orig: File class VideoFrame(VideoFile): """`DataModel` for reading video frames.""" - frame: int = Field(default=0) - timestamp: float = Field(default=0) + frame: int = Field(default=-1) + timestamp: float = Field(default=-1.0) + orig: File class Video(DataModel): """`DataModel` for video file meta information.""" - width: int = Field(default=0) - height: int = Field(default=0) - fps: float = Field(default=0) - duration: float = Field(default=0) - frames: int = Field(default=0) + width: int = Field(default=-1) + height: int = Field(default=-1) + fps: float = Field(default=-1.0) + duration: float = Field(default=-1.0) + frames: int = Field(default=-1) format: str = Field(default="") codec: str = Field(default="") @@ -538,10 +714,10 @@ class Video(DataModel): class Frame(DataModel): """`DataModel` for video frame image meta information.""" - frame: int = Field(default=0) - timestamp: float = Field(default=0) - width: int = Field(default=0) - height: int = Field(default=0) + frame: int = Field(default=-1) + timestamp: float = Field(default=-1.0) + width: int = Field(default=-1) + height: int = Field(default=-1) format: str = Field(default="") diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 81ace913c..b327dd49f 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -1,19 +1,16 @@ import os.path -import pathlib -from typing import TYPE_CHECKING, Optional, Union +from typing import TYPE_CHECKING, Optional -from datachain.lib.file import Video +from datachain.lib.file import File, FileError, Video, VideoFragment, VideoFrame if TYPE_CHECKING: from collections.abc import Iterator from numpy import ndarray - from datachain.lib.file import VideoFile - try: + import ffmpeg import imageio.v3 as iio - from moviepy.video.io.VideoFileClip import VideoFileClip except ImportError as exc: raise ImportError( "Missing dependencies for processing video.\n" @@ -22,24 +19,64 @@ ) from exc -def video_meta(file: "VideoFile") -> Video: +def _video_probe(file: "File") -> tuple[dict, dict, float]: + """Probes video file for video stream, video format and fps.""" + try: + probe = ffmpeg.probe(file.get_local_path()) + except ffmpeg.Error as exc: + raise FileError(file, f"unable to probe video file: {exc.stderr}") from exc + except Exception as exc: + raise FileError(file, f"unable to probe video file: {exc}") from exc + + if not probe: + raise FileError(file, "unable to probe video file") + + all_streams = probe.get("streams") + video_format = probe.get("format") + if not all_streams or not video_format: + raise FileError(file, "unable to probe video file") + + video_streams = [s for s in all_streams if s["codec_type"] == "video"] + if len(video_streams) == 0: + raise FileError(file, "no video streams found in video file") + + video_stream = video_streams[0] + + r_frame_rate = video_stream.get("r_frame_rate", "0") + if "/" in r_frame_rate: + num, denom = r_frame_rate.split("/") + fps = float(num) / float(denom) + else: + fps = float(r_frame_rate) + + return video_stream, video_format, fps + + +def _video_fps(file: "File") -> float: + """Returns video file frames per second.""" + _, _, fps = _video_probe(file) + return fps + + +def video_info(file: "File") -> "Video": """ - Returns video file meta information. + Returns video file information. Args: - file (VideoFile): VideoFile object. + file (File): File object. Returns: - Video: Video file meta information. + Video: Video file information. """ - props = iio.improps(file.stream(), plugin="pyav") - frames, width, height, _ = props.shape + video_stream, video_format, fps = _video_probe(file) - meta = iio.immeta(file.stream(), plugin="pyav") - fps = meta.get("fps", 0) - duration = meta.get("duration", 0) - format = meta.get("video_format", "") - codec = meta.get("codec", "") + width = int(video_stream.get("width", 0)) + height = int(video_stream.get("height", 0)) + duration = float(video_format.get("duration", 0)) + start_time = float(video_format.get("start_time", 0)) + frames = round((duration - start_time) * fps) + format_name = video_format.get("format_name", "") + codec_name = video_stream.get("codec_name", "") return Video( width=width, @@ -47,17 +84,17 @@ def video_meta(file: "VideoFile") -> Video: fps=fps, duration=duration, frames=frames, - format=format, - codec=codec, + format=format_name, + codec=codec_name, ) -def video_frame_np(file: "VideoFile", frame: int) -> "ndarray": +def video_frame_np(file: "File", frame: int) -> "ndarray": """ Reads video frame from a file. Args: - file (VideoFile): VideoFile object. + file (File): File object. frame (int): Frame number to read. Returns: @@ -69,14 +106,14 @@ def video_frame_np(file: "VideoFile", frame: int) -> "ndarray": return iio.imread(file.stream(), index=frame, plugin="pyav") -def video_frame(file: "VideoFile", frame: int, format: str = "jpeg") -> bytes: +def video_frame(file: "File", frame: int, format: str = "jpg") -> bytes: """ Reads video frame from a file and returns as image bytes. Args: - file (VideoFile): VideoFile object. + file (File): File object. frame (int): Frame number to read. - format (str): Image format (default: 'jpeg'). + format (str): Image format (default: 'jpg'). Returns: bytes: Video frame image as bytes. @@ -86,26 +123,39 @@ def video_frame(file: "VideoFile", frame: int, format: str = "jpeg") -> bytes: def save_video_frame( - file: "VideoFile", + file: "File", frame: int, - output_file: Union[str, pathlib.Path], - format: str = "jpeg", -) -> None: + output_file: str, +) -> "VideoFrame": """ Saves video frame as an image file. Args: - file (VideoFile): VideoFile object. + file (File): File object. frame (int): Frame number to read. - output_file (Union[str, pathlib.Path]): Output file path. - format (str): Image format (default: 'jpeg'). + output_file (str): Output file path. + + Returns: + VideoFrame: Video frame model. """ + _, _, fps = _video_probe(file) + + ext = os.path.splitext(output_file)[1] + img = video_frame_np(file, frame) - iio.imwrite(output_file, img, extension=f".{format}") + iio.imwrite(output_file, img, extension=f".{ext}") + + frame_file = File.from_local_path(output_file) + return VideoFrame( + **frame_file.model_dump(), + frame=frame, + timestamp=float(frame) / fps, + orig=file, + ) def video_frames_np( - file: "VideoFile", + file: "File", start_frame: int = 0, end_frame: Optional[int] = None, step: int = 1, @@ -114,7 +164,7 @@ def video_frames_np( Reads video frames from a file. Args: - file (VideoFile): VideoFile object. + file (File): File object. start_frame (int): Frame number to start reading from (default: 0). end_frame (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). @@ -148,21 +198,21 @@ def video_frames_np( def video_frames( - file: "VideoFile", + file: "File", start_frame: int = 0, end_frame: Optional[int] = None, step: int = 1, - format: str = "jpeg", + format: str = "jpg", ) -> "Iterator[bytes]": """ Reads video frames from a file and returns as bytes. Args: - file (VideoFile): VideoFile object. + file (File): File object. start_frame (int): Frame number to start reading from (default: 0). end_frame (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). - format (str): Image format (default: 'jpeg'). + format (str): Image format (default: 'jpg'). Returns: Iterator[bytes]: Iterator of video frames. @@ -172,104 +222,107 @@ def video_frames( def save_video_frames( - file: "VideoFile", - output_dir: Union[str, pathlib.Path], + file: "File", + output_dir: str, start_frame: int = 0, end_frame: Optional[int] = None, step: int = 1, - format: str = "jpeg", -) -> "Iterator[str]": + format: str = "jpg", +) -> "Iterator[VideoFrame]": """ Saves video frames as image files. Args: - file (VideoFile): VideoFile object. - output_dir (Union[str, pathlib.Path]): Output directory path. + file (File): File object. + output_dir (str): Output directory path. start_frame (int): Frame number to start reading from (default: 0). end_frame (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). - format (str): Image format (default: 'jpeg'). + format (str): Image format (default: 'jpg'). Returns: - Iterator[str]: List of output file paths. + Iterator[VideoFrame]: List of video frame models. """ + _, _, fps = _video_probe(file) file_stem = file.get_file_stem() for i, img in enumerate(video_frames_np(file, start_frame, end_frame, step)): frame = start_frame + i * step output_file = os.path.join(output_dir, f"{file_stem}_{frame:06d}.{format}") + iio.imwrite(output_file, img, extension=f".{format}") - yield output_file + frame_file = File.from_local_path(output_file) + yield VideoFrame( + **frame_file.model_dump(), + frame=frame, + timestamp=frame / fps, + orig=file, + ) -def save_video_clip( - file: "VideoFile", + +def save_video_fragment( + file: "File", start_time: float, end_time: float, - output_file: Union[str, pathlib.Path], - codec: str = "libx264", - audio_codec: str = "aac", -) -> None: + output_file: str, +) -> "VideoFragment": """ Saves video interval as a new video file. Args: - file (VideoFile): VideoFile object. + file (File): File object. start_time (float): Start time in seconds. end_time (float): End time in seconds. - output_file (Union[str, pathlib.Path]): Output file path. - codec (str): Video codec for encoding (default: 'libx264'). - audio_codec (str): Audio codec for encoding (default: 'aac'). - """ - video = VideoFileClip(file.get_local_path()) + output_file (str): Output file path. - if start_time < 0 or end_time > video.duration or start_time >= end_time: + Returns: + VideoFragment: Video fragment model. + """ + if start_time < 0 or start_time >= end_time: raise ValueError(f"Invalid time range: ({start_time}, {end_time}).") - clip = video.subclip(start_time, end_time) - clip.write_videofile(output_file, codec=codec, audio_codec=audio_codec) - video.close() + ( + ffmpeg.input(file.get_local_path(), ss=start_time, to=end_time) + .output(output_file) + .run(quiet=True) + ) + + clip_file = File.from_local_path(output_file) + return VideoFragment( + **clip_file.model_dump(), + start=start_time, + end=end_time, + orig=file, + ) -def save_video_clips( - file: "VideoFile", +def save_video_fragments( + file: "File", intervals: list[tuple[float, float]], - output_dir: Union[str, pathlib.Path], - codec: str = "libx264", - audio_codec: str = "aac", -) -> "Iterator[str]": + output_dir: str, +) -> "Iterator[VideoFragment]": """ - Saves video interval as a new video file. + Saves video intervals as new video files. Args: - file (VideoFile): VideoFile object. + file (File): File object. intervals (list[tuple[float, float]]): List of start and end times in seconds. - output_dir (Union[str, pathlib.Path]): Output directory path. - codec (str): Video codec for encoding (default: 'libx264'). - audio_codec (str): Audio codec for encoding (default: 'aac'). + output_dir (str): Output directory path. Returns: - Iterator[str]: List of output file paths. + Iterator[VideoFragment]: List of video fragment models. """ file_stem = file.get_file_stem() file_ext = file.get_file_ext() - video = VideoFileClip(file.stream()) - for i, (start, end) in enumerate(intervals): - if start < 0 or end > video.duration or start >= end: + if start < 0 or start >= end: print(f"Invalid time range: ({start}, {end}). Skipping this segment.") continue - # Extract the segment - clip = video.subclip(start, end) - # Define the output file name output_file = os.path.join(output_dir, f"{file_stem}_{i + 1}.{file_ext}") - # Write the video segment to file - clip.write_videofile(output_file, codec=codec, audio_codec=audio_codec) - - yield output_file - - video.close() + # Write the video fragment to file and yield it + yield save_video_fragment(file, start, end, output_file) From 23514f70a9996d11cfca8906290e6418bd878418 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 28 Jan 2025 19:38:17 +0700 Subject: [PATCH 46/63] Update video requirements --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f0a20074e..076691240 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,8 +81,8 @@ video = [ # Use 'av<14' because of incompatibility with imageio # See https://github.com/PyAV-Org/PyAV/discussions/1700 "av<14", + "ffmpeg-python", "imageio[ffmpeg]", - "moviepy<2", "opencv-python" ] tests = [ From 8a8dd640ffade6cc44a5c1df55e6866c4b72e2e8 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 28 Jan 2025 20:50:20 +0700 Subject: [PATCH 47/63] Code review updates --- src/datachain/lib/file.py | 35 ++++++++++++++++------------------- src/datachain/lib/video.py | 4 ++-- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 8304e650f..66f16c963 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -195,30 +195,20 @@ def __init__(self, **kwargs): def upload( cls, path: str, data: bytes, catalog: Optional["Catalog"] = None ) -> "File": - if catalog is None: - from datachain.catalog.loader import get_catalog - - catalog = get_catalog() - parent, name = posixpath.split(path) - - client = catalog.get_client(parent) + catalog, client = get_client_from_path(parent, catalog=catalog) file = client.upload(name, data) file._set_stream(catalog) return file @classmethod def from_local_path(cls, path: str, catalog: Optional["Catalog"] = None) -> "File": - if catalog is None: - from datachain.catalog.loader import get_catalog - - catalog = get_catalog() - parent, name = posixpath.split(path) - client = catalog.get_client(parent) - + catalog, client = get_client_from_path(parent, catalog=catalog) file_info = client.fs.info(path) - return client.info_to_file(file_info, name) + file = client.info_to_file(file_info, name) + file._set_stream(catalog) + return file @classmethod def _from_row(cls, row: "RowDict") -> "Self": @@ -262,10 +252,6 @@ def read_text(self): with self.open(mode="r") as stream: return stream.read() - def stream(self) -> BytesIO: - """Returns file contents as BytesIO stream.""" - return BytesIO(self.read()) - def save(self, destination: str): """Writes it's content to destination""" with open(destination, mode="wb") as f: @@ -760,3 +746,14 @@ def get_file_type(type_: FileType = "binary") -> type[File]: file = VideoFile return file + + +def get_client_from_path( + path: str, catalog: Optional["Catalog"] = None +) -> tuple["Catalog", "Client"]: + if catalog is None: + from datachain.catalog.loader import get_catalog + + catalog = get_catalog() + + return catalog, catalog.get_client(path) diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index b327dd49f..b21ad0370 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -103,7 +103,7 @@ def video_frame_np(file: "File", frame: int) -> "ndarray": if frame < 0: raise ValueError("frame must be a non-negative integer.") - return iio.imread(file.stream(), index=frame, plugin="pyav") + return iio.imread(file.open(), index=frame, plugin="pyav") # type: ignore[arg-type] def video_frame(file: "File", frame: int, format: str = "jpg") -> bytes: @@ -187,7 +187,7 @@ def video_frames_np( frame_shift = start_frame % step # Iterate over video frames and yield only those within the specified range and step - for frame, img in enumerate(iio.imiter(file.stream(), plugin="pyav")): + for frame, img in enumerate(iio.imiter(file.open(), plugin="pyav")): # type: ignore[arg-type] if frame < start_frame: continue if (frame - frame_shift) % step != 0: From e55405da7d1b594f49a5e0d6a30bb2417c79b50d Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 29 Jan 2025 22:30:24 +0700 Subject: [PATCH 48/63] Code review updates + tests --- pyproject.toml | 2 +- src/datachain/lib/file.py | 66 +++---- src/datachain/lib/video.py | 107 ++++++----- .../lib/data/Big_Buck_Bunny_360_10s_1MB.mp4 | Bin 0 -> 991017 bytes tests/unit/lib/test_video.py | 180 ++++++++++++++++++ 5 files changed, 262 insertions(+), 93 deletions(-) create mode 100644 tests/unit/lib/data/Big_Buck_Bunny_360_10s_1MB.mp4 create mode 100644 tests/unit/lib/test_video.py diff --git a/pyproject.toml b/pyproject.toml index 1d1c5d6df..098c70a1c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,7 +86,7 @@ video = [ "opencv-python" ] tests = [ - "datachain[torch,remote,vector,hf]", + "datachain[torch,remote,vector,hf,video]", "pytest>=8,<9", "pytest-sugar>=0.9.6", "pytest-cov>=4.1.0", diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index b1fbff5b0..4f9ea9c85 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -194,19 +194,18 @@ def __init__(self, **kwargs): @classmethod def upload( cls, data: bytes, path: str, catalog: Optional["Catalog"] = None - ) -> "File": - parent, name = posixpath.split(path) - catalog, client = get_client_from_path(parent, catalog=catalog) - file = client.upload(data, name) - file._set_stream(catalog) - return file + ) -> "Self": + if catalog is None: + from datachain.catalog.loader import get_catalog + + catalog = get_catalog() - @classmethod - def from_local_path(cls, path: str, catalog: Optional["Catalog"] = None) -> "File": parent, name = posixpath.split(path) - catalog, client = get_client_from_path(parent, catalog=catalog) - file_info = client.fs.info(path) - file = client.info_to_file(file_info, name) + + client = catalog.get_client(parent) + file = client.upload(data, name) + if not isinstance(file, cls): + file = cls(**file.model_dump()) file._set_stream(catalog) return file @@ -543,20 +542,26 @@ def get_frame(self, frame: int, format: str = "jpg") -> bytes: return video_frame(self, frame, format) - def save_frame(self, frame: int, output_file: str) -> "VideoFrame": + def save_frame( + self, + frame: int, + output_file: str, + format: Optional[str] = None, + ) -> "VideoFrame": """ Saves video frame as an image file. Args: frame (int): Frame number to read. output_file (str): Output file path. + format (str): Image format (default: use output file extension). Returns: VideoFrame: Video frame model. """ from .video import save_video_frame - return save_video_frame(self, frame, output_file) + return save_video_frame(self, frame, output_file, format=format) def get_frames_np( self, @@ -577,7 +582,7 @@ def get_frames_np( """ from .video import video_frames_np - return video_frames_np(self, start_frame, end_frame, step) + yield from video_frames_np(self, start_frame, end_frame, step) def get_frames( self, @@ -600,7 +605,7 @@ def get_frames( """ from .video import video_frames - return video_frames(self, start_frame, end_frame, step, format) + yield from video_frames(self, start_frame, end_frame, step, format) def save_frames( self, @@ -625,7 +630,9 @@ def save_frames( """ from .video import save_video_frames - return save_video_frames(self, output_dir, start_frame, end_frame, step, format) + yield from save_video_frames( + self, output_dir, start_frame, end_frame, step, format + ) def save_fragment( self, @@ -666,7 +673,7 @@ def save_fragments( """ from .video import save_video_fragments - return save_video_fragments(self, intervals, output_dir) + yield from save_video_fragments(self, intervals, output_dir) class VideoFragment(VideoFile): @@ -674,15 +681,13 @@ class VideoFragment(VideoFile): start: float = Field(default=-1.0) end: float = Field(default=-1.0) - orig: File -class VideoFrame(VideoFile): +class VideoFrame(ImageFile): """`DataModel` for reading video frames.""" frame: int = Field(default=-1) timestamp: float = Field(default=-1.0) - orig: File class Video(DataModel): @@ -697,16 +702,6 @@ class Video(DataModel): codec: str = Field(default="") -class Frame(DataModel): - """`DataModel` for video frame image meta information.""" - - frame: int = Field(default=-1) - timestamp: float = Field(default=-1.0) - width: int = Field(default=-1) - height: int = Field(default=-1) - format: str = Field(default="") - - class ArrowRow(DataModel): """`DataModel` for reading row from Arrow-supported file.""" @@ -746,14 +741,3 @@ def get_file_type(type_: FileType = "binary") -> type[File]: file = VideoFile return file - - -def get_client_from_path( - path: str, catalog: Optional["Catalog"] = None -) -> tuple["Catalog", "Client"]: - if catalog is None: - from datachain.catalog.loader import get_catalog - - catalog = get_catalog() - - return catalog, catalog.get_client(path) diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index b21ad0370..96753ea9b 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -8,6 +8,8 @@ from numpy import ndarray + from datachain.lib.file import VideoFile + try: import ffmpeg import imageio.v3 as iio @@ -19,7 +21,7 @@ ) from exc -def _video_probe(file: "File") -> tuple[dict, dict, float]: +def _video_probe(file: "VideoFile") -> tuple[dict, dict, float]: """Probes video file for video stream, video format and fps.""" try: probe = ffmpeg.probe(file.get_local_path()) @@ -52,18 +54,12 @@ def _video_probe(file: "File") -> tuple[dict, dict, float]: return video_stream, video_format, fps -def _video_fps(file: "File") -> float: - """Returns video file frames per second.""" - _, _, fps = _video_probe(file) - return fps - - -def video_info(file: "File") -> "Video": +def video_info(file: "VideoFile") -> "Video": """ Returns video file information. Args: - file (File): File object. + file (VideoFile): Video file object. Returns: Video: Video file information. @@ -89,12 +85,12 @@ def video_info(file: "File") -> "Video": ) -def video_frame_np(file: "File", frame: int) -> "ndarray": +def video_frame_np(file: "VideoFile", frame: int) -> "ndarray": """ Reads video frame from a file. Args: - file (File): File object. + file (VideoFile): Video file object. frame (int): Frame number to read. Returns: @@ -103,15 +99,16 @@ def video_frame_np(file: "File", frame: int) -> "ndarray": if frame < 0: raise ValueError("frame must be a non-negative integer.") - return iio.imread(file.open(), index=frame, plugin="pyav") # type: ignore[arg-type] + with file.open() as f: + return iio.imread(f, index=frame, plugin="pyav") # type: ignore[arg-type] -def video_frame(file: "File", frame: int, format: str = "jpg") -> bytes: +def video_frame(file: "VideoFile", frame: int, format: str = "jpg") -> bytes: """ Reads video frame from a file and returns as image bytes. Args: - file (File): File object. + file (VideoFile): Video file object. frame (int): Frame number to read. format (str): Image format (default: 'jpg'). @@ -123,39 +120,42 @@ def video_frame(file: "File", frame: int, format: str = "jpg") -> bytes: def save_video_frame( - file: "File", + file: "VideoFile", frame: int, output_file: str, + format: Optional[str] = None, ) -> "VideoFrame": """ Saves video frame as an image file. Args: - file (File): File object. + file (VideoFile): Video file object. frame (int): Frame number to read. output_file (str): Output file path. + format (str): Image format (default: use output file extension). Returns: VideoFrame: Video frame model. """ _, _, fps = _video_probe(file) - ext = os.path.splitext(output_file)[1] + if format is None: + format = os.path.splitext(output_file)[1][1:] - img = video_frame_np(file, frame) - iio.imwrite(output_file, img, extension=f".{ext}") + img = video_frame(file, frame, format=format) + uploaded_file = File.upload(img, output_file) - frame_file = File.from_local_path(output_file) - return VideoFrame( - **frame_file.model_dump(), + frame_file = VideoFrame( + **uploaded_file.model_dump(), frame=frame, timestamp=float(frame) / fps, - orig=file, ) + frame_file._set_stream(uploaded_file._catalog) + return frame_file def video_frames_np( - file: "File", + file: "VideoFile", start_frame: int = 0, end_frame: Optional[int] = None, step: int = 1, @@ -164,7 +164,7 @@ def video_frames_np( Reads video frames from a file. Args: - file (File): File object. + file (VideoFile): Video file object. start_frame (int): Frame number to start reading from (default: 0). end_frame (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). @@ -187,18 +187,19 @@ def video_frames_np( frame_shift = start_frame % step # Iterate over video frames and yield only those within the specified range and step - for frame, img in enumerate(iio.imiter(file.open(), plugin="pyav")): # type: ignore[arg-type] - if frame < start_frame: - continue - if (frame - frame_shift) % step != 0: - continue - if end_frame is not None and frame > end_frame: - break - yield img + with file.open() as f: + for frame, img in enumerate(iio.imiter(f.read(), plugin="pyav")): # type: ignore[arg-type] + if frame < start_frame: + continue + if (frame - frame_shift) % step != 0: + continue + if end_frame is not None and frame > end_frame: + break + yield img def video_frames( - file: "File", + file: "VideoFile", start_frame: int = 0, end_frame: Optional[int] = None, step: int = 1, @@ -208,7 +209,7 @@ def video_frames( Reads video frames from a file and returns as bytes. Args: - file (File): File object. + file (VideoFile): Video file object. start_frame (int): Frame number to start reading from (default: 0). end_frame (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). @@ -222,7 +223,7 @@ def video_frames( def save_video_frames( - file: "File", + file: "VideoFile", output_dir: str, start_frame: int = 0, end_frame: Optional[int] = None, @@ -233,7 +234,7 @@ def save_video_frames( Saves video frames as image files. Args: - file (File): File object. + file (VideoFile): Video file object. output_dir (str): Output directory path. start_frame (int): Frame number to start reading from (default: 0). end_frame (int): Frame number to stop reading at (default: None). @@ -250,19 +251,20 @@ def save_video_frames( frame = start_frame + i * step output_file = os.path.join(output_dir, f"{file_stem}_{frame:06d}.{format}") - iio.imwrite(output_file, img, extension=f".{format}") + raw = iio.imwrite("", img, extension=f".{format}") + uploaded_file = File.upload(raw, output_file) - frame_file = File.from_local_path(output_file) - yield VideoFrame( - **frame_file.model_dump(), + frame_file = VideoFrame( + **uploaded_file.model_dump(), frame=frame, - timestamp=frame / fps, - orig=file, + timestamp=float(frame) / fps, ) + frame_file._set_stream(uploaded_file._catalog) + yield frame_file def save_video_fragment( - file: "File", + file: "VideoFile", start_time: float, end_time: float, output_file: str, @@ -271,7 +273,7 @@ def save_video_fragment( Saves video interval as a new video file. Args: - file (File): File object. + file (VideoFile): Video file object. start_time (float): Start time in seconds. end_time (float): End time in seconds. output_file (str): Output file path. @@ -288,17 +290,20 @@ def save_video_fragment( .run(quiet=True) ) - clip_file = File.from_local_path(output_file) - return VideoFragment( - **clip_file.model_dump(), + with open(output_file, "rb") as f: + uploaded_file = File.upload(f.read(), output_file) + + fragment = VideoFragment( + **uploaded_file.model_dump(), start=start_time, end=end_time, - orig=file, ) + fragment._set_stream(uploaded_file._catalog) + return fragment def save_video_fragments( - file: "File", + file: "VideoFile", intervals: list[tuple[float, float]], output_dir: str, ) -> "Iterator[VideoFragment]": @@ -306,7 +311,7 @@ def save_video_fragments( Saves video intervals as new video files. Args: - file (File): File object. + file (VideoFile): Video file object. intervals (list[tuple[float, float]]): List of start and end times in seconds. output_dir (str): Output directory path. diff --git a/tests/unit/lib/data/Big_Buck_Bunny_360_10s_1MB.mp4 b/tests/unit/lib/data/Big_Buck_Bunny_360_10s_1MB.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9b6d89da00a2df9082ec980387a79a441911d88f GIT binary patch literal 991017 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

6_v7S>Q75fe)x?S0VQa({)+q@%v#$&M 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%0Aaby}!__grJ&*cq4%cihK0VAWl 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�GsBfGBf1UGu(fnKo;T;CG}nKPeKMx9t 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
qy|7nzm;jFY|0;K10Vr305kAW!Ep;b#TP|Di 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
fC0AX4!nnh8N?0R9%P26rpLuH}Mu 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

e{pR-!&6G9g4{c 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 VideoFile: + data_path = os.path.join(os.path.dirname(__file__), "data") + file_name = "Big_Buck_Bunny_360_10s_1MB.mp4" + + with open(os.path.join(data_path, file_name), "rb") as f: + file = VideoFile.upload(f.read(), file_name) + + file.ensure_cached() + return file + + +def test_get_info(video_file): + info = video_file.get_info() + assert info.model_dump() == { + "width": 640, + "height": 360, + "fps": 30.0, + "duration": 10.0, + "frames": 300, + "format": "mov,mp4,m4a,3gp,3g2,mj2", + "codec": "h264", + } + + +def test_get_info_error(): + # upload current Python file as video file to get an error while getting video meta + with open(__file__, "rb") as f: + file = VideoFile.upload(f.read(), "test.mp4") + + file.ensure_cached() + with pytest.raises(FileError): + file.get_info() + + +def test_get_frame_np(video_file): + frame = video_file.get_frame_np(0) + assert isinstance(frame, ndarray) + assert frame.shape == (360, 640, 3) + + +def test_get_frame_np_error(video_file): + with pytest.raises(ValueError): + video_file.get_frame_np(-1) + + +@pytest.mark.parametrize( + "format,img_format,header", + [ + ("jpg", "JPEG", [b"\xff\xd8\xff\xe0"]), + ("png", "PNG", [b"\x89PNG\r\n\x1a\n"]), + ("gif", "GIF", [b"GIF87a", b"GIF89a"]), + ], +) +def test_get_frame(video_file, format, img_format, header): + frame = video_file.get_frame(0, format=format) + assert isinstance(frame, bytes) + assert any(frame.startswith(h) for h in header) + + img = Image.open(io.BytesIO(frame)) + assert img.format == img_format + assert img.size == (640, 360) + + +@pytest.mark.parametrize("use_format", [True, False]) +def test_save_frame_ext(tmp_path, video_file, use_format): + filename = "frame" if use_format else "frame.jpg" + format = "jpg" if use_format else None + + with tmp_path.joinpath(filename) as output_file: + frame_file = video_file.save_frame(3, str(output_file), format=format) + assert frame_file.frame == 3 + assert frame_file.timestamp == 3 / 30 + + frame_file.ensure_cached() + img = Image.open(frame_file.get_local_path()) + assert img.format == "JPEG" + assert img.size == (640, 360) + + +def test_get_frames_np(video_file): + frames = list(video_file.get_frames_np(10, 200, 5)) + assert len(frames) == 39 + assert all(isinstance(frame, ndarray) for frame in frames) + assert all(frame.shape == (360, 640, 3) for frame in frames) + + +@pytest.mark.parametrize( + "start_frame,end_frame,step", + [ + (-1, None, None), + (0, -1, None), + (1, 0, None), + (0, 1, -1), + ], +) +def test_get_frames_np_error(video_file, start_frame, end_frame, step): + with pytest.raises(ValueError): + list(video_file.get_frames_np(start_frame, end_frame, step)) + + +def test_get_frames(video_file): + frames = list(video_file.get_frames(10, 200, 5, format="jpg")) + assert len(frames) == 39 + assert all(isinstance(frame, bytes) for frame in frames) + assert all(Image.open(io.BytesIO(frame)).format == "JPEG" for frame in frames) + + +def test_save_frames(tmp_path, video_file): + frame_files = list(video_file.save_frames(str(tmp_path), 10, 200, 5, format="jpg")) + assert len(frame_files) == 39 + + for i, frame_file in enumerate(frame_files): + assert frame_file.frame == 10 + 5 * i + assert frame_file.timestamp == (10 + 5 * i) / 30 + + frame_file.ensure_cached() + img = Image.open(frame_file.get_local_path()) + assert img.format == "JPEG" + assert img.size == (640, 360) + + +def test_save_fragment(tmp_path, video_file): + with tmp_path.joinpath("fragment.mp4") as output_file: + fragment = video_file.save_fragment(2.5, 5, str(output_file)) + assert fragment.start == 2.5 + assert fragment.end == 5 + + fragment.ensure_cached() + assert fragment.get_info().model_dump() == { + "width": 640, + "height": 360, + "fps": 30.0, + "duration": 2.5, + "frames": 75, + "format": "mov,mp4,m4a,3gp,3g2,mj2", + "codec": "h264", + } + + +def test_save_fragment_error(video_file): + with pytest.raises(ValueError): + video_file.save_fragment(5, 2.5, "fragment.mp4") + + +def test_save_fragments(tmp_path, video_file): + intervals = [(1, 2), (3, 4), (5, 6)] + + fragments = list(video_file.save_fragments(intervals, str(tmp_path))) + assert len(fragments) == 3 + + for i, fragment in enumerate(fragments): + assert fragment.start == 1 + 2 * i + assert fragment.end == 2 + 2 * i + + fragment.ensure_cached() + assert fragment.get_info().model_dump() == { + "width": 640, + "height": 360, + "fps": 30.0, + "duration": 1, + "frames": 30, + "format": "mov,mp4,m4a,3gp,3g2,mj2", + "codec": "h264", + } + + +def test_save_fragments_error(video_file): + fragments = list(video_file.save_fragments([(2, 1)], "fragments")) + assert len(fragments) == 0 From 8e2a673459e20ac8a2a026c4492527866635bc4f Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 29 Jan 2025 22:57:34 +0700 Subject: [PATCH 49/63] Set up ffmpeg in tests --- .github/workflows/tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3b96a12fd..ba8f2795b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -78,6 +78,9 @@ jobs: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha || github.ref }} + - name: Set up FFmpeg + uses: FedericoCarboni/setup-ffmpeg@v3 + - name: Set up Python ${{ matrix.pyv }} uses: actions/setup-python@v5 with: From 9c910ec5649adc1735deafb00164e7f3262c618d Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 29 Jan 2025 23:05:06 +0700 Subject: [PATCH 50/63] Set up ffmpeg in tests --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ba8f2795b..6a807e29f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -79,7 +79,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha || github.ref }} - name: Set up FFmpeg - uses: FedericoCarboni/setup-ffmpeg@v3 + uses: AnimMouse/setup-ffmpeg@v1 - name: Set up Python ${{ matrix.pyv }} uses: actions/setup-python@v5 From a2b8c9acb57a1dd7e50924f7d4020392d125ad3f Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 29 Jan 2025 23:10:34 +0700 Subject: [PATCH 51/63] Set up ffmpeg in tests --- .github/workflows/tests-studio.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tests-studio.yml b/.github/workflows/tests-studio.yml index 923731fef..76358ecca 100644 --- a/.github/workflows/tests-studio.yml +++ b/.github/workflows/tests-studio.yml @@ -75,6 +75,9 @@ jobs: path: './backend/datachain' fetch-depth: 0 + - name: Set up FFmpeg + uses: AnimMouse/setup-ffmpeg@v1 + - name: Set up Python ${{ matrix.pyv }} uses: actions/setup-python@v5 with: From 63448d9b14ebf1dc242103b77b41a61ee6059e88 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 29 Jan 2025 23:32:34 +0700 Subject: [PATCH 52/63] Update 'ensure_cached' test --- tests/unit/lib/test_file.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/lib/test_file.py b/tests/unit/lib/test_file.py index df784c9e9..fd1626d8f 100644 --- a/tests/unit/lib/test_file.py +++ b/tests/unit/lib/test_file.py @@ -1,4 +1,5 @@ import json +import os from pathlib import Path from unittest.mock import Mock @@ -338,6 +339,7 @@ def test_get_local_path(tmp_path, catalog): assert file.get_local_path() is None file.ensure_cached() assert file.get_local_path() is not None + assert os.path.exists(file.get_local_path()) @pytest.mark.parametrize("use_cache", (True, False)) From abe39f536973b400dc3606f6faffd65b790c511e Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 30 Jan 2025 00:02:23 +0700 Subject: [PATCH 53/63] Revert 'ensure_cached' test --- tests/unit/lib/test_file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/lib/test_file.py b/tests/unit/lib/test_file.py index fd1626d8f..8ccd156bd 100644 --- a/tests/unit/lib/test_file.py +++ b/tests/unit/lib/test_file.py @@ -339,7 +339,6 @@ def test_get_local_path(tmp_path, catalog): assert file.get_local_path() is None file.ensure_cached() assert file.get_local_path() is not None - assert os.path.exists(file.get_local_path()) @pytest.mark.parametrize("use_cache", (True, False)) From 3b7b8294f605d62e47d1b73ae5abc30d72d03052 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:02:37 +0000 Subject: [PATCH 54/63] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/unit/lib/test_file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/lib/test_file.py b/tests/unit/lib/test_file.py index 8ccd156bd..df784c9e9 100644 --- a/tests/unit/lib/test_file.py +++ b/tests/unit/lib/test_file.py @@ -1,5 +1,4 @@ import json -import os from pathlib import Path from unittest.mock import Mock From 55f0478f9b690cb3bbfe2e9b97a49b381852d2aa Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 30 Jan 2025 08:34:18 +0700 Subject: [PATCH 55/63] Fix tests --- src/datachain/lib/video.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 96753ea9b..857cece1d 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -1,4 +1,5 @@ -import os.path +import posixpath +from pathlib import PurePosixPath from typing import TYPE_CHECKING, Optional from datachain.lib.file import File, FileError, Video, VideoFragment, VideoFrame @@ -140,7 +141,7 @@ def save_video_frame( _, _, fps = _video_probe(file) if format is None: - format = os.path.splitext(output_file)[1][1:] + format = PurePosixPath(output_file).suffix.strip(".") img = video_frame(file, frame, format=format) uploaded_file = File.upload(img, output_file) @@ -249,7 +250,7 @@ def save_video_frames( for i, img in enumerate(video_frames_np(file, start_frame, end_frame, step)): frame = start_frame + i * step - output_file = os.path.join(output_dir, f"{file_stem}_{frame:06d}.{format}") + output_file = posixpath.join(output_dir, f"{file_stem}_{frame:06d}.{format}") raw = iio.imwrite("", img, extension=f".{format}") uploaded_file = File.upload(raw, output_file) @@ -327,7 +328,7 @@ def save_video_fragments( continue # Define the output file name - output_file = os.path.join(output_dir, f"{file_stem}_{i + 1}.{file_ext}") + output_file = posixpath.join(output_dir, f"{file_stem}_{i + 1}.{file_ext}") # Write the video fragment to file and yield it yield save_video_fragment(file, start, end, output_file) From 99b9490779676d9cb94eed6fae9dbc444eb9797a Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 30 Jan 2025 08:51:37 +0700 Subject: [PATCH 56/63] Fix tests --- tests/unit/lib/test_video.py | 45 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/tests/unit/lib/test_video.py b/tests/unit/lib/test_video.py index 0d4791aef..6d371cf7f 100644 --- a/tests/unit/lib/test_video.py +++ b/tests/unit/lib/test_video.py @@ -1,5 +1,6 @@ import io import os +import posixpath import pytest from numpy import ndarray @@ -76,16 +77,16 @@ def test_get_frame(video_file, format, img_format, header): def test_save_frame_ext(tmp_path, video_file, use_format): filename = "frame" if use_format else "frame.jpg" format = "jpg" if use_format else None + output_file = posixpath.join(tmp_path, filename) - with tmp_path.joinpath(filename) as output_file: - frame_file = video_file.save_frame(3, str(output_file), format=format) - assert frame_file.frame == 3 - assert frame_file.timestamp == 3 / 30 + frame_file = video_file.save_frame(3, str(output_file), format=format) + assert frame_file.frame == 3 + assert frame_file.timestamp == 3 / 30 - frame_file.ensure_cached() - img = Image.open(frame_file.get_local_path()) - assert img.format == "JPEG" - assert img.size == (640, 360) + frame_file.ensure_cached() + img = Image.open(frame_file.get_local_path()) + assert img.format == "JPEG" + assert img.size == (640, 360) def test_get_frames_np(video_file): @@ -131,21 +132,21 @@ def test_save_frames(tmp_path, video_file): def test_save_fragment(tmp_path, video_file): - with tmp_path.joinpath("fragment.mp4") as output_file: - fragment = video_file.save_fragment(2.5, 5, str(output_file)) - assert fragment.start == 2.5 - assert fragment.end == 5 + output_file = posixpath.join(tmp_path, "fragment.mp4") + fragment = video_file.save_fragment(2.5, 5, str(output_file)) + assert fragment.start == 2.5 + assert fragment.end == 5 - fragment.ensure_cached() - assert fragment.get_info().model_dump() == { - "width": 640, - "height": 360, - "fps": 30.0, - "duration": 2.5, - "frames": 75, - "format": "mov,mp4,m4a,3gp,3g2,mj2", - "codec": "h264", - } + fragment.ensure_cached() + assert fragment.get_info().model_dump() == { + "width": 640, + "height": 360, + "fps": 30.0, + "duration": 2.5, + "frames": 75, + "format": "mov,mp4,m4a,3gp,3g2,mj2", + "codec": "h264", + } def test_save_fragment_error(video_file): From c28cd6675c90dc1de3bc5c2374ed748f962f315a Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 30 Jan 2025 20:51:17 +0700 Subject: [PATCH 57/63] Update video models --- src/datachain/__init__.py | 10 +++ src/datachain/lib/file.py | 42 ++++++----- src/datachain/lib/video.py | 143 ++++++++++++++++++++----------------- 3 files changed, 109 insertions(+), 86 deletions(-) diff --git a/src/datachain/__init__.py b/src/datachain/__init__.py index e8bbc00bf..659b2ce5d 100644 --- a/src/datachain/__init__.py +++ b/src/datachain/__init__.py @@ -4,9 +4,14 @@ ArrowRow, File, FileError, + Image, ImageFile, TarVFile, TextFile, + Video, + VideoFile, + VideoFragment, + VideoFrame, ) from datachain.lib.model_store import ModelStore from datachain.lib.udf import Aggregator, Generator, Mapper @@ -27,6 +32,7 @@ "File", "FileError", "Generator", + "Image", "ImageFile", "Mapper", "ModelStore", @@ -34,6 +40,10 @@ "Sys", "TarVFile", "TextFile", + "Video", + "VideoFile", + "VideoFragment", + "VideoFrame", "is_chain_type", "metrics", "param", diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 4f9ea9c85..65101e4ca 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -565,16 +565,16 @@ def save_frame( def get_frames_np( self, - start_frame: int = 0, - end_frame: Optional[int] = None, + start: int = 0, + end: Optional[int] = None, step: int = 1, ) -> "Iterator[ndarray]": """ Reads video frames from a file. Args: - start_frame (int): Frame number to start reading from (default: 0). - end_frame (int): Frame number to stop reading at (default: None). + start (int): Frame number to start reading from (default: 0). + end (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). Returns: @@ -582,12 +582,12 @@ def get_frames_np( """ from .video import video_frames_np - yield from video_frames_np(self, start_frame, end_frame, step) + yield from video_frames_np(self, start, end, step) def get_frames( self, - start_frame: int = 0, - end_frame: Optional[int] = None, + start: int = 0, + end: Optional[int] = None, step: int = 1, format: str = "jpg", ) -> "Iterator[bytes]": @@ -595,8 +595,8 @@ def get_frames( Reads video frames from a file and returns as bytes. Args: - start_frame (int): Frame number to start reading from (default: 0). - end_frame (int): Frame number to stop reading at (default: None). + start (int): Frame number to start reading from (default: 0). + end (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). format (str): Image format (default: 'jpg'). @@ -605,13 +605,13 @@ def get_frames( """ from .video import video_frames - yield from video_frames(self, start_frame, end_frame, step, format) + yield from video_frames(self, start, end, step, format) def save_frames( self, output_dir: str, - start_frame: int = 0, - end_frame: Optional[int] = None, + start: int = 0, + end: Optional[int] = None, step: int = 1, format: str = "jpg", ) -> "Iterator[VideoFrame]": @@ -620,8 +620,8 @@ def save_frames( Args: output_dir (str): Output directory path. - start_frame (int): Frame number to start reading from (default: 0). - end_frame (int): Frame number to stop reading at (default: None). + start (int): Frame number to start reading from (default: 0). + end (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). format (str): Image format (default: 'jpg'). @@ -630,22 +630,20 @@ def save_frames( """ from .video import save_video_frames - yield from save_video_frames( - self, output_dir, start_frame, end_frame, step, format - ) + yield from save_video_frames(self, output_dir, start, end, step, format) def save_fragment( self, - start_time: float, - end_time: float, + start: float, + end: float, output_file: str, ) -> "VideoFragment": """ Saves video interval as a new video file. Args: - start_time (float): Start time in seconds. - end_time (float): End time in seconds. + start (float): Start time in seconds. + end (float): End time in seconds. output_file (str): Output file path. Returns: @@ -653,7 +651,7 @@ def save_fragment( """ from .video import save_video_fragment - return save_video_fragment(self, start_time, end_time, output_file) + return save_video_fragment(self, start, end, output_file) def save_fragments( self, diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 857cece1d..0be3755dd 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -1,15 +1,20 @@ import posixpath +import shutil +import tempfile +from collections.abc import Iterator from pathlib import PurePosixPath -from typing import TYPE_CHECKING, Optional +from typing import Optional -from datachain.lib.file import File, FileError, Video, VideoFragment, VideoFrame +from numpy import ndarray -if TYPE_CHECKING: - from collections.abc import Iterator - - from numpy import ndarray - - from datachain.lib.file import VideoFile +from datachain.lib.file import ( + File, + FileError, + Video, + VideoFile, + VideoFragment, + VideoFrame, +) try: import ffmpeg @@ -22,7 +27,7 @@ ) from exc -def _video_probe(file: "VideoFile") -> tuple[dict, dict, float]: +def _video_probe(file: VideoFile) -> tuple[dict, dict, float]: """Probes video file for video stream, video format and fps.""" try: probe = ffmpeg.probe(file.get_local_path()) @@ -55,7 +60,7 @@ def _video_probe(file: "VideoFile") -> tuple[dict, dict, float]: return video_stream, video_format, fps -def video_info(file: "VideoFile") -> "Video": +def video_info(file: VideoFile) -> Video: """ Returns video file information. @@ -86,7 +91,7 @@ def video_info(file: "VideoFile") -> "Video": ) -def video_frame_np(file: "VideoFile", frame: int) -> "ndarray": +def video_frame_np(file: VideoFile, frame: int) -> "ndarray": """ Reads video frame from a file. @@ -104,7 +109,7 @@ def video_frame_np(file: "VideoFile", frame: int) -> "ndarray": return iio.imread(f, index=frame, plugin="pyav") # type: ignore[arg-type] -def video_frame(file: "VideoFile", frame: int, format: str = "jpg") -> bytes: +def video_frame(file: VideoFile, frame: int, format: str = "jpg") -> bytes: """ Reads video frame from a file and returns as image bytes. @@ -121,11 +126,11 @@ def video_frame(file: "VideoFile", frame: int, format: str = "jpg") -> bytes: def save_video_frame( - file: "VideoFile", + file: VideoFile, frame: int, output_file: str, format: Optional[str] = None, -) -> "VideoFrame": +) -> VideoFrame: """ Saves video frame as an image file. @@ -156,89 +161,89 @@ def save_video_frame( def video_frames_np( - file: "VideoFile", - start_frame: int = 0, - end_frame: Optional[int] = None, + file: VideoFile, + start: int = 0, + end: Optional[int] = None, step: int = 1, -) -> "Iterator[ndarray]": +) -> Iterator[ndarray]: """ Reads video frames from a file. Args: file (VideoFile): Video file object. - start_frame (int): Frame number to start reading from (default: 0). - end_frame (int): Frame number to stop reading at (default: None). + start (int): Frame number to start reading from (default: 0). + end (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). Returns: Iterator[ndarray]: Iterator of video frames. """ - if start_frame < 0: + if start < 0: raise ValueError("start_frame must be a non-negative integer.") - if end_frame is not None: - if end_frame < 0: + if end is not None: + if end < 0: raise ValueError("end_frame must be a non-negative integer.") - if start_frame > end_frame: + if start > end: raise ValueError("start_frame must be less than or equal to end_frame.") if step < 1: raise ValueError("step must be a positive integer.") # Compute the frame shift to determine the number of frames to skip, # considering the start frame and step size - frame_shift = start_frame % step + frame_shift = start % step # Iterate over video frames and yield only those within the specified range and step with file.open() as f: for frame, img in enumerate(iio.imiter(f.read(), plugin="pyav")): # type: ignore[arg-type] - if frame < start_frame: + if frame < start: continue if (frame - frame_shift) % step != 0: continue - if end_frame is not None and frame > end_frame: + if end is not None and frame > end: break yield img def video_frames( - file: "VideoFile", - start_frame: int = 0, - end_frame: Optional[int] = None, + file: VideoFile, + start: int = 0, + end: Optional[int] = None, step: int = 1, format: str = "jpg", -) -> "Iterator[bytes]": +) -> Iterator[bytes]: """ Reads video frames from a file and returns as bytes. Args: file (VideoFile): Video file object. - start_frame (int): Frame number to start reading from (default: 0). - end_frame (int): Frame number to stop reading at (default: None). + start (int): Frame number to start reading from (default: 0). + end (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). format (str): Image format (default: 'jpg'). Returns: Iterator[bytes]: Iterator of video frames. """ - for img in video_frames_np(file, start_frame, end_frame, step): + for img in video_frames_np(file, start, end, step): yield iio.imwrite("", img, extension=f".{format}") def save_video_frames( - file: "VideoFile", + file: VideoFile, output_dir: str, - start_frame: int = 0, - end_frame: Optional[int] = None, + start: int = 0, + end: Optional[int] = None, step: int = 1, format: str = "jpg", -) -> "Iterator[VideoFrame]": +) -> Iterator[VideoFrame]: """ Saves video frames as image files. Args: file (VideoFile): Video file object. output_dir (str): Output directory path. - start_frame (int): Frame number to start reading from (default: 0). - end_frame (int): Frame number to stop reading at (default: None). + start (int): Frame number to start reading from (default: 0). + end (int): Frame number to stop reading at (default: None). step (int): Step size for reading frames (default: 1). format (str): Image format (default: 'jpg'). @@ -248,8 +253,8 @@ def save_video_frames( _, _, fps = _video_probe(file) file_stem = file.get_file_stem() - for i, img in enumerate(video_frames_np(file, start_frame, end_frame, step)): - frame = start_frame + i * step + for i, img in enumerate(video_frames_np(file, start, end, step)): + frame = start + i * step output_file = posixpath.join(output_dir, f"{file_stem}_{frame:06d}.{format}") raw = iio.imwrite("", img, extension=f".{format}") @@ -265,49 +270,54 @@ def save_video_frames( def save_video_fragment( - file: "VideoFile", - start_time: float, - end_time: float, + file: VideoFile, + start: float, + end: float, output_file: str, -) -> "VideoFragment": +) -> VideoFragment: """ Saves video interval as a new video file. Args: file (VideoFile): Video file object. - start_time (float): Start time in seconds. - end_time (float): End time in seconds. + start (float): Start time in seconds. + end (float): End time in seconds. output_file (str): Output file path. Returns: VideoFragment: Video fragment model. """ - if start_time < 0 or start_time >= end_time: - raise ValueError(f"Invalid time range: ({start_time}, {end_time}).") + if start < 0 or start >= end: + raise ValueError(f"Invalid time range: ({start}, {end}).") - ( - ffmpeg.input(file.get_local_path(), ss=start_time, to=end_time) - .output(output_file) - .run(quiet=True) - ) + temp_dir = tempfile.mkdtemp() + try: + output_file_tmp = posixpath.join(temp_dir, posixpath.basename(output_file)) + ( + ffmpeg.input(file.get_local_path(), ss=start, to=end) + .output(output_file_tmp) + .run(quiet=True) + ) - with open(output_file, "rb") as f: - uploaded_file = File.upload(f.read(), output_file) + with open(output_file_tmp, "rb") as f: + uploaded_file = File.upload(f.read(), output_file) + finally: + shutil.rmtree(temp_dir) fragment = VideoFragment( **uploaded_file.model_dump(), - start=start_time, - end=end_time, + start=start, + end=end, ) fragment._set_stream(uploaded_file._catalog) return fragment def save_video_fragments( - file: "VideoFile", + file: VideoFile, intervals: list[tuple[float, float]], output_dir: str, -) -> "Iterator[VideoFragment]": +) -> Iterator[VideoFragment]: """ Saves video intervals as new video files. @@ -322,13 +332,18 @@ def save_video_fragments( file_stem = file.get_file_stem() file_ext = file.get_file_ext() - for i, (start, end) in enumerate(intervals): + for start, end in intervals: if start < 0 or start >= end: print(f"Invalid time range: ({start}, {end}). Skipping this segment.") continue - # Define the output file name - output_file = posixpath.join(output_dir, f"{file_stem}_{i + 1}.{file_ext}") + # Output file name + start_ms = int(start * 1000) + end_ms = int(end * 1000) + output_file = posixpath.join( + output_dir, + f"{file_stem}_{start_ms:03d}_{end_ms:03d}.{file_ext}", + ) # Write the video fragment to file and yield it yield save_video_fragment(file, start, end, output_file) From 0f2e12cef244289c261d1c2a68a78586ad0e75df Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 4 Feb 2025 01:23:30 +0700 Subject: [PATCH 58/63] Update video models --- src/datachain/lib/file.py | 198 ++++++++++++------------ src/datachain/lib/video.py | 285 ++++++++--------------------------- tests/unit/lib/test_video.py | 126 +++++++++------- 3 files changed, 223 insertions(+), 386 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 65101e4ca..c8fe9774a 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -513,165 +513,142 @@ def get_info(self) -> "Video": return video_info(self) - def get_frame_np(self, frame: int) -> "ndarray": + def get_frame(self, frame: int) -> "VideoFrame": """ - Reads video frame from a file. + Returns VideoFrame model for a video frame. Args: frame (int): Frame number to read. Returns: - ndarray: Video frame. + VideoFrame: Video frame model. """ - from .video import video_frame_np + if frame < 0: + raise ValueError("frame must be a non-negative integer") - return video_frame_np(self, frame) + frame_file = VideoFrame(**self.model_dump(), frame=frame) + frame_file._set_stream(self._catalog) + return frame_file - def get_frame(self, frame: int, format: str = "jpg") -> bytes: + def get_frames( + self, + start: int = 0, + end: Optional[int] = None, + step: int = 1, + ) -> "Iterator[VideoFrame]": """ - Reads video frame from a file and returns as image bytes. + Returns VideoFrame models for a video frame. Args: - frame (int): Frame number to read. - format (str): Image format (default: 'jpg'). + start (int): Frame number to start reading from (default: 0). + end (Optional[int]): Frame number to stop reading at, non-inclusive + (default: None, read until the end). + step (int): Step size for reading frames (default: 1). Returns: - bytes: Video frame image as bytes. - """ - from .video import video_frame - - return video_frame(self, frame, format) + Iterator[VideoFrame]: List of video frame models. - def save_frame( - self, - frame: int, - output_file: str, - format: Optional[str] = None, - ) -> "VideoFrame": + Note: + If end is not specified, number of frames will be taken from the video file. """ - Saves video frame as an image file. + if start < 0: + raise ValueError("start_frame must be a non-negative integer.") - Args: - frame (int): Frame number to read. - output_file (str): Output file path. - format (str): Image format (default: use output file extension). + if end is None: + end = self.get_info().frames - Returns: - VideoFrame: Video frame model. - """ - from .video import save_video_frame + if end < 0: + raise ValueError("end_frame must be a non-negative integer.") + if start > end: + raise ValueError("start_frame must be less than or equal to end_frame.") - return save_video_frame(self, frame, output_file, format=format) + if step < 1: + raise ValueError("step must be a positive integer.") - def get_frames_np( - self, - start: int = 0, - end: Optional[int] = None, - step: int = 1, - ) -> "Iterator[ndarray]": + for frame in range(start, end, step): + yield self.get_frame(frame) + + def get_fragment(self, start: float, end: float) -> "VideoFragment": """ - Reads video frames from a file. + Returns VideoFragment model for a video interval. Args: - start (int): Frame number to start reading from (default: 0). - end (int): Frame number to stop reading at (default: None). - step (int): Step size for reading frames (default: 1). + start (float): Start time in seconds. + end (float): End time in seconds. Returns: - Iterator[ndarray]: Iterator of video frames. + VideoFragment: Video fragment model. """ - from .video import video_frames_np + if start < 0 or end < 0 or start >= end: + raise ValueError(f"Invalid time range: ({start:.3f}, {end:.3f})") - yield from video_frames_np(self, start, end, step) + fragment_file = VideoFragment(**self.model_dump(), start=start, end=end) + fragment_file._set_stream(self._catalog) + return fragment_file - def get_frames( + def get_fragments( self, - start: int = 0, - end: Optional[int] = None, - step: int = 1, - format: str = "jpg", - ) -> "Iterator[bytes]": + intervals: list[tuple[float, float]], + ) -> "Iterator[VideoFragment]": """ - Reads video frames from a file and returns as bytes. + Returns VideoFragment models for video intervals. Args: - start (int): Frame number to start reading from (default: 0). - end (int): Frame number to stop reading at (default: None). - step (int): Step size for reading frames (default: 1). - format (str): Image format (default: 'jpg'). + intervals (list[tuple[float, float]]): List of start and end times + in seconds. Returns: - Iterator[bytes]: Iterator of video frames. + Iterator[VideoFragment]: List of video fragment models. """ - from .video import video_frames + for start, end in intervals: + yield self.get_fragment(start, end) - yield from video_frames(self, start, end, step, format) - def save_frames( - self, - output_dir: str, - start: int = 0, - end: Optional[int] = None, - step: int = 1, - format: str = "jpg", - ) -> "Iterator[VideoFrame]": - """ - Saves video frames as image files. +class VideoFrame(VideoFile): + """`DataModel` for reading video frames.""" - Args: - output_dir (str): Output directory path. - start (int): Frame number to start reading from (default: 0). - end (int): Frame number to stop reading at (default: None). - step (int): Step size for reading frames (default: 1). - format (str): Image format (default: 'jpg'). + frame: int = Field(default=-1) + + def get_np(self) -> "ndarray": + """ + Reads video frame from a video file and returns as numpy array. Returns: - Iterator[VideoFrame]: List of video frame models. + ndarray: Video frame. """ - from .video import save_video_frames + from .video import video_frame_np - yield from save_video_frames(self, output_dir, start, end, step, format) + return video_frame_np(self) - def save_fragment( - self, - start: float, - end: float, - output_file: str, - ) -> "VideoFragment": + def read_bytes(self, format: str = "jpg") -> bytes: """ - Saves video interval as a new video file. + Reads video frame from a video file and returns as image bytes. Args: - start (float): Start time in seconds. - end (float): End time in seconds. - output_file (str): Output file path. + format (str): Image format (default: 'jpg'). Returns: - VideoFragment: Video fragment model. + bytes: Video frame image as bytes. """ - from .video import save_video_fragment + from .video import video_frame_bytes - return save_video_fragment(self, start, end, output_file) + return video_frame_bytes(self, format) - def save_fragments( - self, - intervals: list[tuple[float, float]], - output_dir: str, - ) -> "Iterator[VideoFragment]": + def save(self, output: str, format: str = "jpg") -> "ImageFile": """ - Saves video intervals as new video files. + Saves video frame as a new image file. If output is a remote path, + the image file will be uploaded to the remote storage. Args: - intervals (list[tuple[float, float]]): List of start and end times - in seconds. - output_dir (str): Output directory path. + output (str): Output path, can be a local path or a remote path. + format (str): Image format (default: 'jpg'). Returns: - Iterator[VideoFragment]: List of video fragment models. + ImageFile: Image file model. """ - from .video import save_video_fragments + from .video import save_video_frame - yield from save_video_fragments(self, intervals, output_dir) + return save_video_frame(self, output, format) class VideoFragment(VideoFile): @@ -680,12 +657,23 @@ class VideoFragment(VideoFile): start: float = Field(default=-1.0) end: float = Field(default=-1.0) + def save(self, output: str, format: Optional[str] = None) -> "VideoFile": + """ + Saves video interval as a new video file. If output is a remote path, + the video file will be uploaded to the remote storage. -class VideoFrame(ImageFile): - """`DataModel` for reading video frames.""" + Args: + output (str): Output path, can be a local path or a remote path. + format (Optional[str]): Output format (default: None). If not provided, + the format will be inferred from the video fragment + file extension. - frame: int = Field(default=-1) - timestamp: float = Field(default=-1.0) + Returns: + VideoFile: Video fragment model. + """ + from .video import save_video_fragment + + return save_video_fragment(self, output, format) class Video(DataModel): diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 0be3755dd..33444bc75 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -1,15 +1,13 @@ import posixpath import shutil import tempfile -from collections.abc import Iterator -from pathlib import PurePosixPath from typing import Optional from numpy import ndarray from datachain.lib.file import ( - File, FileError, + ImageFile, Video, VideoFile, VideoFragment, @@ -27,8 +25,16 @@ ) from exc -def _video_probe(file: VideoFile) -> tuple[dict, dict, float]: - """Probes video file for video stream, video format and fps.""" +def video_info(file: VideoFile) -> Video: + """ + Returns video file information. + + Args: + file (VideoFile): Video file object. + + Returns: + Video: Video file information. + """ try: probe = ffmpeg.probe(file.get_local_path()) except ffmpeg.Error as exc: @@ -57,21 +63,6 @@ def _video_probe(file: VideoFile) -> tuple[dict, dict, float]: else: fps = float(r_frame_rate) - return video_stream, video_format, fps - - -def video_info(file: VideoFile) -> Video: - """ - Returns video file information. - - Args: - file (VideoFile): Video file object. - - Returns: - Video: Video file information. - """ - video_stream, video_format, fps = _video_probe(file) - width = int(video_stream.get("width", 0)) height = int(video_stream.get("height", 0)) duration = float(video_format.get("duration", 0)) @@ -91,259 +82,101 @@ def video_info(file: VideoFile) -> Video: ) -def video_frame_np(file: VideoFile, frame: int) -> "ndarray": +def video_frame_np(file: VideoFrame) -> ndarray: """ - Reads video frame from a file. + Reads video frame from a file and returns as numpy array. Args: - file (VideoFile): Video file object. - frame (int): Frame number to read. + file (VideoFrame): VideoFrame file object. Returns: ndarray: Video frame. """ - if frame < 0: - raise ValueError("frame must be a non-negative integer.") + if file.frame < 0: + raise ValueError("frame must be a non-negative integer") with file.open() as f: - return iio.imread(f, index=frame, plugin="pyav") # type: ignore[arg-type] + return iio.imread(f, index=file.frame, plugin="pyav") # type: ignore[arg-type] -def video_frame(file: VideoFile, frame: int, format: str = "jpg") -> bytes: +def video_frame_bytes(file: VideoFrame, format: str = "jpg") -> bytes: """ Reads video frame from a file and returns as image bytes. Args: - file (VideoFile): Video file object. - frame (int): Frame number to read. + file (VideoFrame): VideoFrame file object. format (str): Image format (default: 'jpg'). Returns: bytes: Video frame image as bytes. """ - img = video_frame_np(file, frame) + img = video_frame_np(file) return iio.imwrite("", img, extension=f".{format}") def save_video_frame( - file: VideoFile, - frame: int, - output_file: str, - format: Optional[str] = None, -) -> VideoFrame: - """ - Saves video frame as an image file. - - Args: - file (VideoFile): Video file object. - frame (int): Frame number to read. - output_file (str): Output file path. - format (str): Image format (default: use output file extension). - - Returns: - VideoFrame: Video frame model. - """ - _, _, fps = _video_probe(file) - - if format is None: - format = PurePosixPath(output_file).suffix.strip(".") - - img = video_frame(file, frame, format=format) - uploaded_file = File.upload(img, output_file) - - frame_file = VideoFrame( - **uploaded_file.model_dump(), - frame=frame, - timestamp=float(frame) / fps, - ) - frame_file._set_stream(uploaded_file._catalog) - return frame_file - - -def video_frames_np( - file: VideoFile, - start: int = 0, - end: Optional[int] = None, - step: int = 1, -) -> Iterator[ndarray]: - """ - Reads video frames from a file. - - Args: - file (VideoFile): Video file object. - start (int): Frame number to start reading from (default: 0). - end (int): Frame number to stop reading at (default: None). - step (int): Step size for reading frames (default: 1). - - Returns: - Iterator[ndarray]: Iterator of video frames. - """ - if start < 0: - raise ValueError("start_frame must be a non-negative integer.") - if end is not None: - if end < 0: - raise ValueError("end_frame must be a non-negative integer.") - if start > end: - raise ValueError("start_frame must be less than or equal to end_frame.") - if step < 1: - raise ValueError("step must be a positive integer.") - - # Compute the frame shift to determine the number of frames to skip, - # considering the start frame and step size - frame_shift = start % step - - # Iterate over video frames and yield only those within the specified range and step - with file.open() as f: - for frame, img in enumerate(iio.imiter(f.read(), plugin="pyav")): # type: ignore[arg-type] - if frame < start: - continue - if (frame - frame_shift) % step != 0: - continue - if end is not None and frame > end: - break - yield img - - -def video_frames( - file: VideoFile, - start: int = 0, - end: Optional[int] = None, - step: int = 1, + file: VideoFrame, + output: str, format: str = "jpg", -) -> Iterator[bytes]: +) -> ImageFile: """ - Reads video frames from a file and returns as bytes. + Saves video frame as a new image file. If output is a remote path, + the image file will be uploaded to the remote storage. Args: - file (VideoFile): Video file object. - start (int): Frame number to start reading from (default: 0). - end (int): Frame number to stop reading at (default: None). - step (int): Step size for reading frames (default: 1). + file (VideoFrame): VideoFrame file object. + output (str): Output path, can be a local path or a remote path. format (str): Image format (default: 'jpg'). Returns: - Iterator[bytes]: Iterator of video frames. + ImageFile: Image file model. """ - for img in video_frames_np(file, start, end, step): - yield iio.imwrite("", img, extension=f".{format}") + img = video_frame_bytes(file, format=format) + output_file = posixpath.join( + output, f"{file.get_file_stem()}_{file.frame:04d}.{format}" + ) + return ImageFile.upload(img, output_file) -def save_video_frames( - file: VideoFile, - output_dir: str, - start: int = 0, - end: Optional[int] = None, - step: int = 1, - format: str = "jpg", -) -> Iterator[VideoFrame]: +def save_video_fragment( + file: VideoFragment, + output: str, + format: Optional[str] = None, +) -> VideoFile: """ - Saves video frames as image files. + Saves video interval as a new video file. If output is a remote path, + the video file will be uploaded to the remote storage. Args: - file (VideoFile): Video file object. - output_dir (str): Output directory path. - start (int): Frame number to start reading from (default: 0). - end (int): Frame number to stop reading at (default: None). - step (int): Step size for reading frames (default: 1). - format (str): Image format (default: 'jpg'). + file (VideoFragment): VideoFragment file object. + output (str): Output path, can be a local path or a remote path. + format (Optional[str]): Output format (default: None). If not provided, + the format will be inferred from the video fragment + file extension. Returns: - Iterator[VideoFrame]: List of video frame models. + VideoFile: Video fragment model. """ - _, _, fps = _video_probe(file) - file_stem = file.get_file_stem() + if file.start < 0 or file.end < 0 or file.start >= file.end: + raise ValueError(f"Invalid time range: ({file.start:.3f}, {file.end:.3f})") - for i, img in enumerate(video_frames_np(file, start, end, step)): - frame = start + i * step - output_file = posixpath.join(output_dir, f"{file_stem}_{frame:06d}.{format}") - - raw = iio.imwrite("", img, extension=f".{format}") - uploaded_file = File.upload(raw, output_file) - - frame_file = VideoFrame( - **uploaded_file.model_dump(), - frame=frame, - timestamp=float(frame) / fps, - ) - frame_file._set_stream(uploaded_file._catalog) - yield frame_file - - -def save_video_fragment( - file: VideoFile, - start: float, - end: float, - output_file: str, -) -> VideoFragment: - """ - Saves video interval as a new video file. - - Args: - file (VideoFile): Video file object. - start (float): Start time in seconds. - end (float): End time in seconds. - output_file (str): Output file path. + if format is None: + format = file.get_file_ext() - Returns: - VideoFragment: Video fragment model. - """ - if start < 0 or start >= end: - raise ValueError(f"Invalid time range: ({start}, {end}).") + start_ms = int(file.start * 1000) + end_ms = int(file.end * 1000) + output_file = posixpath.join( + output, f"{file.get_file_stem()}_{start_ms:06d}_{end_ms:06d}.{format}" + ) temp_dir = tempfile.mkdtemp() try: output_file_tmp = posixpath.join(temp_dir, posixpath.basename(output_file)) - ( - ffmpeg.input(file.get_local_path(), ss=start, to=end) - .output(output_file_tmp) - .run(quiet=True) - ) + ffmpeg.input(file.get_local_path(), ss=file.start, to=file.end).output( + output_file_tmp + ).run(quiet=True) with open(output_file_tmp, "rb") as f: - uploaded_file = File.upload(f.read(), output_file) + return VideoFile.upload(f.read(), output_file) finally: shutil.rmtree(temp_dir) - - fragment = VideoFragment( - **uploaded_file.model_dump(), - start=start, - end=end, - ) - fragment._set_stream(uploaded_file._catalog) - return fragment - - -def save_video_fragments( - file: VideoFile, - intervals: list[tuple[float, float]], - output_dir: str, -) -> Iterator[VideoFragment]: - """ - Saves video intervals as new video files. - - Args: - file (VideoFile): Video file object. - intervals (list[tuple[float, float]]): List of start and end times in seconds. - output_dir (str): Output directory path. - - Returns: - Iterator[VideoFragment]: List of video fragment models. - """ - file_stem = file.get_file_stem() - file_ext = file.get_file_ext() - - for start, end in intervals: - if start < 0 or start >= end: - print(f"Invalid time range: ({start}, {end}). Skipping this segment.") - continue - - # Output file name - start_ms = int(start * 1000) - end_ms = int(end * 1000) - output_file = posixpath.join( - output_dir, - f"{file_stem}_{start_ms:03d}_{end_ms:03d}.{file_ext}", - ) - - # Write the video fragment to file and yield it - yield save_video_fragment(file, start, end, output_file) diff --git a/tests/unit/lib/test_video.py b/tests/unit/lib/test_video.py index 6d371cf7f..a8dd465ff 100644 --- a/tests/unit/lib/test_video.py +++ b/tests/unit/lib/test_video.py @@ -1,12 +1,12 @@ import io import os -import posixpath import pytest from numpy import ndarray from PIL import Image -from datachain.lib.file import FileError, VideoFile +from datachain import VideoFragment, VideoFrame +from datachain.lib.file import FileError, ImageFile, VideoFile @pytest.fixture(autouse=True) @@ -44,15 +44,21 @@ def test_get_info_error(): file.get_info() -def test_get_frame_np(video_file): - frame = video_file.get_frame_np(0) - assert isinstance(frame, ndarray) - assert frame.shape == (360, 640, 3) +def test_get_frame(video_file): + frame = video_file.get_frame(37) + assert isinstance(frame, VideoFrame) + assert frame.frame == 37 -def test_get_frame_np_error(video_file): +def test_get_frame_error(video_file): with pytest.raises(ValueError): - video_file.get_frame_np(-1) + video_file.get_frame(-1) + + +def test_get_frame_np(video_file): + frame = video_file.get_frame(0).get_np() + assert isinstance(frame, ndarray) + assert frame.shape == (360, 640, 3) @pytest.mark.parametrize( @@ -63,8 +69,8 @@ def test_get_frame_np_error(video_file): ("gif", "GIF", [b"GIF87a", b"GIF89a"]), ], ) -def test_get_frame(video_file, format, img_format, header): - frame = video_file.get_frame(0, format=format) +def test_get_frame_bytes(video_file, format, img_format, header): + frame = video_file.get_frame(0).read_bytes(format) assert isinstance(frame, bytes) assert any(frame.startswith(h) for h in header) @@ -74,14 +80,13 @@ def test_get_frame(video_file, format, img_format, header): @pytest.mark.parametrize("use_format", [True, False]) -def test_save_frame_ext(tmp_path, video_file, use_format): - filename = "frame" if use_format else "frame.jpg" - format = "jpg" if use_format else None - output_file = posixpath.join(tmp_path, filename) - - frame_file = video_file.save_frame(3, str(output_file), format=format) - assert frame_file.frame == 3 - assert frame_file.timestamp == 3 / 30 +def test_save_frame(tmp_path, video_file, use_format): + frame = video_file.get_frame(3) + if use_format: + frame_file = frame.save(str(tmp_path), format="jpg") + else: + frame_file = frame.save(str(tmp_path)) + assert isinstance(frame_file, ImageFile) frame_file.ensure_cached() img = Image.open(frame_file.get_local_path()) @@ -89,11 +94,16 @@ def test_save_frame_ext(tmp_path, video_file, use_format): assert img.size == (640, 360) -def test_get_frames_np(video_file): - frames = list(video_file.get_frames_np(10, 200, 5)) - assert len(frames) == 39 - assert all(isinstance(frame, ndarray) for frame in frames) - assert all(frame.shape == (360, 640, 3) for frame in frames) +def test_get_frames(video_file): + frames = list(video_file.get_frames(10, 200, 5)) + assert len(frames) == 38 + assert all(isinstance(frame, VideoFrame) for frame in frames) + + +def test_get_all_frames(video_file): + frames = list(video_file.get_frames()) + assert len(frames) == 300 + assert all(isinstance(frame, VideoFrame) for frame in frames) @pytest.mark.parametrize( @@ -105,38 +115,56 @@ def test_get_frames_np(video_file): (0, 1, -1), ], ) -def test_get_frames_np_error(video_file, start_frame, end_frame, step): +def test_get_frames_error(video_file, start_frame, end_frame, step): with pytest.raises(ValueError): - list(video_file.get_frames_np(start_frame, end_frame, step)) + list(video_file.get_frames(start_frame, end_frame, step)) -def test_get_frames(video_file): - frames = list(video_file.get_frames(10, 200, 5, format="jpg")) - assert len(frames) == 39 - assert all(isinstance(frame, bytes) for frame in frames) - assert all(Image.open(io.BytesIO(frame)).format == "JPEG" for frame in frames) +def test_get_frames_bytes(video_file): + frames = list(video_file.get_frames(10, 200, 5)) + frame_bytes = [frame.read_bytes("jpg") for frame in frames] + assert len(frame_bytes) == 38 + assert all(isinstance(frame, bytes) for frame in frame_bytes) + assert all(Image.open(io.BytesIO(frame)).format == "JPEG" for frame in frame_bytes) def test_save_frames(tmp_path, video_file): - frame_files = list(video_file.save_frames(str(tmp_path), 10, 200, 5, format="jpg")) - assert len(frame_files) == 39 - - for i, frame_file in enumerate(frame_files): - assert frame_file.frame == 10 + 5 * i - assert frame_file.timestamp == (10 + 5 * i) / 30 + frames = list(video_file.get_frames(10, 200, 5)) + frame_files = [frame.save(str(tmp_path), format="jpg") for frame in frames] + assert len(frame_files) == 38 + for frame_file in frame_files: frame_file.ensure_cached() img = Image.open(frame_file.get_local_path()) assert img.format == "JPEG" assert img.size == (640, 360) -def test_save_fragment(tmp_path, video_file): - output_file = posixpath.join(tmp_path, "fragment.mp4") - fragment = video_file.save_fragment(2.5, 5, str(output_file)) +def test_get_fragment(video_file): + fragment = video_file.get_fragment(2.5, 5) + assert isinstance(fragment, VideoFragment) assert fragment.start == 2.5 assert fragment.end == 5 + +@pytest.mark.parametrize( + "start,end", + [ + (-1, -1), + (-1, 2.5), + (5, -1), + (5, 2.5), + (5, 5), + ], +) +def test_save_fragment_error(video_file, start, end): + with pytest.raises(ValueError): + video_file.get_fragment(start, end) + + +def test_save_fragment(tmp_path, video_file): + fragment = video_file.get_fragment(2.5, 5).save(str(tmp_path)) + fragment.ensure_cached() assert fragment.get_info().model_dump() == { "width": 640, @@ -149,21 +177,14 @@ def test_save_fragment(tmp_path, video_file): } -def test_save_fragment_error(video_file): - with pytest.raises(ValueError): - video_file.save_fragment(5, 2.5, "fragment.mp4") - - def test_save_fragments(tmp_path, video_file): intervals = [(1, 2), (3, 4), (5, 6)] - fragments = list(video_file.save_fragments(intervals, str(tmp_path))) - assert len(fragments) == 3 - - for i, fragment in enumerate(fragments): - assert fragment.start == 1 + 2 * i - assert fragment.end == 2 + 2 * i + fragments = list(video_file.get_fragments(intervals)) + fragment_files = [fragment.save(str(tmp_path)) for fragment in fragments] + assert len(fragment_files) == 3 + for fragment in fragment_files: fragment.ensure_cached() assert fragment.get_info().model_dump() == { "width": 640, @@ -174,8 +195,3 @@ def test_save_fragments(tmp_path, video_file): "format": "mov,mp4,m4a,3gp,3g2,mj2", "codec": "h264", } - - -def test_save_fragments_error(video_file): - fragments = list(video_file.save_fragments([(2, 1)], "fragments")) - assert len(fragments) == 0 From e2477232ef6f7d626886706f1905d975dadf37d1 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Tue, 4 Feb 2025 23:00:51 +0700 Subject: [PATCH 59/63] Update video models --- src/datachain/lib/video.py | 7 +- src/datachain/toolkit/__init__.py | 3 +- src/datachain/toolkit/ultralytics.py | 141 +++++++++++++++++++++++++++ src/datachain/toolkit/video.py | 43 ++++++++ 4 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 src/datachain/toolkit/ultralytics.py create mode 100644 src/datachain/toolkit/video.py diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 33444bc75..e40f61593 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -66,8 +66,11 @@ def video_info(file: VideoFile) -> Video: width = int(video_stream.get("width", 0)) height = int(video_stream.get("height", 0)) duration = float(video_format.get("duration", 0)) - start_time = float(video_format.get("start_time", 0)) - frames = round((duration - start_time) * fps) + if "nb_frames" in video_stream: + frames = int(video_stream.get("nb_frames", 0)) + else: + start_time = float(video_format.get("start_time", 0)) + frames = int((duration - start_time) * fps) format_name = video_format.get("format_name", "") codec_name = video_stream.get("codec_name", "") diff --git a/src/datachain/toolkit/__init__.py b/src/datachain/toolkit/__init__.py index 0bcb55a4e..38c8ac1b0 100644 --- a/src/datachain/toolkit/__init__.py +++ b/src/datachain/toolkit/__init__.py @@ -1,3 +1,4 @@ from .split import train_test_split +from .video import split_video_to_frames -__all__ = ["train_test_split"] +__all__ = ["split_video_to_frames", "train_test_split"] diff --git a/src/datachain/toolkit/ultralytics.py b/src/datachain/toolkit/ultralytics.py new file mode 100644 index 000000000..e97fad95a --- /dev/null +++ b/src/datachain/toolkit/ultralytics.py @@ -0,0 +1,141 @@ +from typing import Union + +import numpy as np +import torch +from PIL import Image +from ultralytics.engine.results import Results + +from datachain.model.ultralytics.bbox import YoloBBox, YoloBBoxes +from datachain.model.ultralytics.pose import YoloPose, YoloPoses +from datachain.model.ultralytics.segment import YoloSegment, YoloSegments + +YoloSignal = Union[YoloBBox, YoloBBoxes, YoloPose, YoloPoses, YoloSegment, YoloSegments] + + +def _signal_to_results(img: np.ndarray, signal: YoloSignal) -> Results: + # Convert RGB to BGR + if img.ndim == 3 and img.shape[2] == 3: + bgr_array = img[:, :, ::-1] + else: + # If the image is not RGB (e.g., grayscale or RGBA), use as is + bgr_array = img + + names = {} + boxes_list = [] + keypoints_list = [] + masks_list = [] + + # Get the boxes, keypoints, and masks from the signal + if isinstance(signal, YoloBBox): + names[signal.cls] = signal.name + boxes_list.append( + torch.tensor([[*signal.box.coords, signal.confidence, signal.cls]]) + ) + elif isinstance(signal, YoloBBoxes): + for i, _ in enumerate(signal.cls): + names[signal.cls[i]] = signal.name[i] + boxes_list.append( + torch.tensor( + [[*signal.box[i].coords, signal.confidence[i], signal.cls[i]]] + ) + ) + elif isinstance(signal, YoloPose): + names[signal.cls] = signal.name + boxes_list.append( + torch.tensor([[*signal.box.coords, signal.confidence, signal.cls]]) + ) + keypoints_list.append( + torch.tensor([list(zip(signal.pose.x, signal.pose.y, signal.pose.visible))]) + ) + elif isinstance(signal, YoloPoses): + for i, _ in enumerate(signal.cls): + names[signal.cls[i]] = signal.name[i] + boxes_list.append( + torch.tensor( + [[*signal.box[i].coords, signal.confidence[i], signal.cls[i]]] + ) + ) + keypoints_list.append( + torch.tensor( + [ + list( + zip( + signal.pose[i].x, + signal.pose[i].y, + signal.pose[i].visible, + ) + ) + ] + ) + ) + elif isinstance(signal, YoloSegment): + names[signal.cls] = signal.name + boxes_list.append( + torch.tensor([[*signal.box.coords, signal.confidence, signal.cls]]) + ) + masks_list.append(torch.tensor([list(zip(signal.segment.x, signal.segment.y))])) + elif isinstance(signal, YoloSegments): + for i, _ in enumerate(signal.cls): + names[signal.cls[i]] = signal.name[i] + boxes_list.append( + torch.tensor( + [[*signal.box[i].coords, signal.confidence[i], signal.cls[i]]] + ) + ) + masks_list.append( + torch.tensor([list(zip(signal.segment[i].x, signal.segment[i].y))]) + ) + + boxes = torch.cat(boxes_list, dim=0) if len(boxes_list) > 0 else None + keypoints = torch.cat(keypoints_list, dim=0) if len(keypoints_list) > 0 else None + masks = torch.cat(masks_list, dim=0) if len(masks_list) > 0 else None + + return Results( + bgr_array, + path="", + names=names, + boxes=boxes, + keypoints=keypoints, + masks=masks, + ) + + +def visualize_yolo( + img: np.ndarray, + signal: YoloSignal, + scale: float = 1.0, + line_width: int = 1, + font_size: int = 20, + kpt_radius: int = 3, +) -> Image.Image: + """ + Visualize signals detected by YOLO. + + Args: + image (ndarray): The image to visualize as a NumPy array. + signal: The signal detected by YOLO. Possible signals are YoloBBox, YoloBBoxes, + YoloPose, YoloPoses, YoloSegment, and YoloSegments. + scale (float): The scale factor for the image. Default is 1.0. + line_width (int): The line width for drawing boxes and lines. Default is 1. + font_size (int): The font size for text. Default is 20. + kpt_radius (int): The radius for drawing keypoints. Default is 3. + + Returns: + PIL.Image.Image: The image with the detected signals visualized. + """ + results = _signal_to_results(img, signal) + + im_bgr = results.plot( + line_width=line_width, + font_size=font_size, + kpt_radius=kpt_radius, + ) + + im_rgb = Image.fromarray(im_bgr[..., ::-1]) + + if scale != 1.0: + orig_height, orig_width = results.orig_shape + new_size = (int(orig_width * scale), int(orig_height * scale)) + im_rgb = im_rgb.resize(new_size, Image.Resampling.LANCZOS) + + return im_rgb diff --git a/src/datachain/toolkit/video.py b/src/datachain/toolkit/video.py new file mode 100644 index 000000000..b5efe73e9 --- /dev/null +++ b/src/datachain/toolkit/video.py @@ -0,0 +1,43 @@ +from collections.abc import Iterator +from typing import Callable + +from datachain.lib.video import VideoFile, VideoFrame + + +def split_video_to_frames( + start=0, + end=None, + step=1, +) -> Callable[[VideoFile], Iterator[VideoFrame]]: + """ + Returns a UDF function that splits a video file into frames. + + Args: + start (int): Start frame index (inclusive, default: first frame). + end (Optional[int]): End frame index (exclusive, default: last frame). + step (int): Step between frames (default: 1). + + Returns: + Callable[[VideoFile], Iterator[VideoFrame]]: UDF function with VideoFile input + and VideoFrame iterator output. + + Usage: + Split videos from the "videos" dataset into frames and save them + to the "frames" dataset: + + ```python + from datachain import DataChain + from datachain.toolkit.video import split_video_to_frames + + ( + DataChain.from_dataset("videos") + .gen(frame=split_video_to_frames(step=5)) + .save("frames") + ) + ``` + """ + + def _split_frames(file: VideoFile) -> Iterator[VideoFrame]: + yield from file.get_frames(start=start, end=end, step=step) + + return _split_frames From ea65af407ce32846ae7a6a5698300dad4abb8d18 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Wed, 5 Feb 2025 17:34:47 +0700 Subject: [PATCH 60/63] Update video models docstrings --- src/datachain/lib/file.py | 176 ++++++++++++++++++++++++--------- src/datachain/lib/video.py | 13 +-- src/datachain/toolkit/video.py | 56 +++++++++-- 3 files changed, 184 insertions(+), 61 deletions(-) diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index c8fe9774a..77384e713 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -497,7 +497,15 @@ def save(self, destination: str): class Image(DataModel): - """`DataModel` for image file meta information.""" + """ + A data model representing metadata for an image file. + + Attributes: + width (int): The width of the image in pixels. Defaults to -1 if unknown. + height (int): The height of the image in pixels. Defaults to -1 if unknown. + format (str): The format of the image file (e.g., 'jpg', 'png'). + Defaults to an empty string. + """ width: int = Field(default=-1) height: int = Field(default=-1) @@ -505,20 +513,32 @@ class Image(DataModel): class VideoFile(File): - """`DataModel` for reading video files.""" + """ + A data model for handling video files. + + This model inherits from the `File` model and provides additional functionality + for reading video files, extracting video frames, and splitting videos into + fragments. + """ def get_info(self) -> "Video": - """Returns video file information.""" + """ + Retrieves metadata and information about the video file. + + Returns: + Video: A Model containing video metadata such as duration, + resolution, frame rate, and codec details. + """ from .video import video_info return video_info(self) def get_frame(self, frame: int) -> "VideoFrame": """ - Returns VideoFrame model for a video frame. + Returns a specific video frame by its frame number. Args: - frame (int): Frame number to read. + frame (int): The frame number to read. Returns: VideoFrame: Video frame model. @@ -537,22 +557,26 @@ def get_frames( step: int = 1, ) -> "Iterator[VideoFrame]": """ - Returns VideoFrame models for a video frame. + Returns video frames from the specified range in the video. Args: - start (int): Frame number to start reading from (default: 0). - end (Optional[int]): Frame number to stop reading at, non-inclusive - (default: None, read until the end). - step (int): Step size for reading frames (default: 1). + start (int, optional): The starting frame number (default: 0). + end (int, optional): The ending frame number (exclusive). If None, + frames are read until the end of the video + (default: None). + step (int, optional): The interval between frames to read (default: 1). Returns: - Iterator[VideoFrame]: List of video frame models. + Iterator[VideoFrame]: An iterator yielding video frames. Note: - If end is not specified, number of frames will be taken from the video file. + If end is not specified, number of frames will be taken from the video file, + this means video file needs to be downloaded. """ if start < 0: raise ValueError("start_frame must be a non-negative integer.") + if step < 1: + raise ValueError("step must be a positive integer.") if end is None: end = self.get_info().frames @@ -562,22 +586,19 @@ def get_frames( if start > end: raise ValueError("start_frame must be less than or equal to end_frame.") - if step < 1: - raise ValueError("step must be a positive integer.") - for frame in range(start, end, step): yield self.get_frame(frame) def get_fragment(self, start: float, end: float) -> "VideoFragment": """ - Returns VideoFragment model for a video interval. + Returns a video fragment from the specified time range. Args: - start (float): Start time in seconds. - end (float): End time in seconds. + start (float): The start time of the fragment in seconds. + end (float): The end time of the fragment in seconds. Returns: - VideoFragment: Video fragment model. + VideoFragment: A Model representing the video fragment. """ if start < 0 or end < 0 or start >= end: raise ValueError(f"Invalid time range: ({start:.3f}, {end:.3f})") @@ -588,33 +609,66 @@ def get_fragment(self, start: float, end: float) -> "VideoFragment": def get_fragments( self, - intervals: list[tuple[float, float]], + duration: float, + start: float = 0, + end: Optional[float] = None, ) -> "Iterator[VideoFragment]": """ - Returns VideoFragment models for video intervals. + Splits the video into multiple fragments of a specified duration. Args: - intervals (list[tuple[float, float]]): List of start and end times - in seconds. + duration (float): The duration of each video fragment in seconds. + start (float, optional): The starting time in seconds (default: 0). + end (float, optional): The ending time in seconds. If None, the entire + remaining video is processed (default: None). Returns: - Iterator[VideoFragment]: List of video fragment models. + Iterator[VideoFragment]: An iterator yielding video fragments. + + Note: + If end is not specified, number of frames will be taken from the video file, + this means video file needs to be downloaded. """ - for start, end in intervals: - yield self.get_fragment(start, end) + if duration <= 0: + raise ValueError("duration must be a positive float") + if start < 0: + raise ValueError("start must be a non-negative float") + + if end is None: + end = self.get_info().duration + + if end < 0: + raise ValueError("end must be a non-negative float") + if start >= end: + raise ValueError("start must be less than end") + + while start < end: + yield self.get_fragment(start, min(start + duration, end)) + start += duration class VideoFrame(VideoFile): - """`DataModel` for reading video frames.""" + """ + A data model for representing a video frame. + + This model inherits from the `VideoFile` model and adds a `frame` attribute, + which represents a specific frame within a video file. It allows access + to individual frames and provides functionality for reading and saving + video frames as image files. + + Attributes: + frame (int): The frame number referencing a specific frame in the video file. + """ frame: int = Field(default=-1) def get_np(self) -> "ndarray": """ - Reads video frame from a video file and returns as numpy array. + Returns a video frame from the video file as a NumPy array. Returns: - ndarray: Video frame. + ndarray: A NumPy array representing the video frame, + in the shape (height, width, channels). """ from .video import video_frame_np @@ -622,13 +676,14 @@ def get_np(self) -> "ndarray": def read_bytes(self, format: str = "jpg") -> bytes: """ - Reads video frame from a video file and returns as image bytes. + Returns a video frame from the video file as image bytes. Args: - format (str): Image format (default: 'jpg'). + format (str, optional): The desired image format (e.g., 'jpg', 'png'). + Defaults to 'jpg'. Returns: - bytes: Video frame image as bytes. + bytes: The encoded video frame as image bytes. """ from .video import video_frame_bytes @@ -636,15 +691,18 @@ def read_bytes(self, format: str = "jpg") -> bytes: def save(self, output: str, format: str = "jpg") -> "ImageFile": """ - Saves video frame as a new image file. If output is a remote path, - the image file will be uploaded to the remote storage. + Saves the current video frame as an image file. + + If `output` is a remote path, the image file will be uploaded to remote storage. Args: - output (str): Output path, can be a local path or a remote path. - format (str): Image format (default: 'jpg'). + output (str): The destination path, which can be a local file path + or a remote URL. + format (str, optional): The image format (e.g., 'jpg', 'png'). + Defaults to 'jpg'. Returns: - ImageFile: Image file model. + ImageFile: A Model representing the saved image file. """ from .video import save_video_frame @@ -652,24 +710,37 @@ def save(self, output: str, format: str = "jpg") -> "ImageFile": class VideoFragment(VideoFile): - """`DataModel` for reading video fragments.""" + """ + A data model for representing a video fragment. + + This model inherits from the `VideoFile` model and adds `start` + and `end` attributes, which represent a specific fragment within a video file. + It allows access to individual fragments and provides functionality for reading + and saving video fragments as separate video files. + + Attributes: + start (float): The starting time of the video fragment in seconds. + end (float): The ending time of the video fragment in seconds. + """ start: float = Field(default=-1.0) end: float = Field(default=-1.0) def save(self, output: str, format: Optional[str] = None) -> "VideoFile": """ - Saves video interval as a new video file. If output is a remote path, - the video file will be uploaded to the remote storage. + Saves the video fragment as a new video file. + + If `output` is a remote path, the video file will be uploaded to remote storage. Args: - output (str): Output path, can be a local path or a remote path. - format (Optional[str]): Output format (default: None). If not provided, - the format will be inferred from the video fragment + output (str): The destination path, which can be a local file path + or a remote URL. + format (str, optional): The output video format (e.g., 'mp4', 'avi'). + If None, the format is inferred from the file extension. Returns: - VideoFile: Video fragment model. + VideoFile: A Model representing the saved video file. """ from .video import save_video_fragment @@ -677,7 +748,22 @@ def save(self, output: str, format: Optional[str] = None) -> "VideoFile": class Video(DataModel): - """`DataModel` for video file meta information.""" + """ + A data model representing metadata for a video file. + + Attributes: + width (int): The width of the video in pixels. Defaults to -1 if unknown. + height (int): The height of the video in pixels. Defaults to -1 if unknown. + fps (float): The frame rate of the video (frames per second). + Defaults to -1.0 if unknown. + duration (float): The total duration of the video in seconds. + Defaults to -1.0 if unknown. + frames (int): The total number of frames in the video. + Defaults to -1 if unknown. + format (str): The format of the video file (e.g., 'mp4', 'avi'). + Defaults to an empty string. + codec (str): The codec used for encoding the video. Defaults to an empty string. + """ width: int = Field(default=-1) height: int = Field(default=-1) diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index e40f61593..b5c22fc22 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -37,22 +37,17 @@ def video_info(file: VideoFile) -> Video: """ try: probe = ffmpeg.probe(file.get_local_path()) - except ffmpeg.Error as exc: - raise FileError(file, f"unable to probe video file: {exc.stderr}") from exc - except Exception as exc: - raise FileError(file, f"unable to probe video file: {exc}") from exc - - if not probe: - raise FileError(file, "unable to probe video file") + except Exception: # noqa: BLE001 + probe = {} all_streams = probe.get("streams") video_format = probe.get("format") if not all_streams or not video_format: - raise FileError(file, "unable to probe video file") + raise FileError(file, "unable to extract metadata from video file") video_streams = [s for s in all_streams if s["codec_type"] == "video"] if len(video_streams) == 0: - raise FileError(file, "no video streams found in video file") + raise FileError(file, "unable to extract metadata from video file") video_stream = video_streams[0] diff --git a/src/datachain/toolkit/video.py b/src/datachain/toolkit/video.py index b5efe73e9..a6834acc1 100644 --- a/src/datachain/toolkit/video.py +++ b/src/datachain/toolkit/video.py @@ -1,21 +1,23 @@ from collections.abc import Iterator -from typing import Callable +from typing import Callable, Optional from datachain.lib.video import VideoFile, VideoFrame def split_video_to_frames( - start=0, - end=None, - step=1, + start: int = 0, + end: Optional[int] = None, + step: int = 1, ) -> Callable[[VideoFile], Iterator[VideoFrame]]: """ Returns a UDF function that splits a video file into frames. Args: - start (int): Start frame index (inclusive, default: first frame). - end (Optional[int]): End frame index (exclusive, default: last frame). - step (int): Step between frames (default: 1). + start (int, optional): The starting frame number (default: 0). + end (int, optional): The ending frame number (exclusive). If None, + frames are read until the end of the video + (default: None). + step (int, optional): The interval between frames to read (default: 1). Returns: Callable[[VideoFile], Iterator[VideoFrame]]: UDF function with VideoFile input @@ -41,3 +43,43 @@ def _split_frames(file: VideoFile) -> Iterator[VideoFrame]: yield from file.get_frames(start=start, end=end, step=step) return _split_frames + + +def split_video_to_fragments( + duration: float, + start: float = 0, + end: Optional[float] = None, +) -> Callable[[VideoFile], Iterator[VideoFile]]: + """ + Returns a UDF function that splits a video file into fragments. + + Args: + duration (float): The duration of each video fragment in seconds. + start (float, optional): The starting time in seconds (default: 0). + end (float, optional): The ending time in seconds. If None, the entire + remaining video is processed (default: None). + + Returns: + Callable[[VideoFile], Iterator[VideoFile]]: UDF function with VideoFile input + and VideoFile iterator output. + + Usage: + Split videos from the "videos" dataset into fragments and save them + to the "fragments" dataset: + + ```python + from datachain import DataChain + from datachain.toolkit.video import split_video_to_fragments + + ( + DataChain.from_dataset("videos") + .gen(fragment=split_video_to_fragments(duration=1.0)) + .save("fragments") + ) + ``` + """ + + def _split_fragments(file: VideoFile) -> Iterator[VideoFile]: + yield from file.get_fragments(duration=duration, start=start, end=end) + + return _split_fragments From 34b135b9ae362f3f2621af0fcb7fb0c2d99e225f Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 6 Feb 2025 19:52:05 +0700 Subject: [PATCH 61/63] Update video models --- src/datachain/lib/file.py | 56 ++++++++---------- src/datachain/lib/video.py | 101 ++++++++++++++++++++++----------- src/datachain/toolkit/video.py | 85 --------------------------- tests/unit/lib/test_video.py | 68 ++++++++++++++++------ 4 files changed, 142 insertions(+), 168 deletions(-) delete mode 100644 src/datachain/toolkit/video.py diff --git a/src/datachain/lib/file.py b/src/datachain/lib/file.py index 77384e713..1f4431371 100644 --- a/src/datachain/lib/file.py +++ b/src/datachain/lib/file.py @@ -546,9 +546,7 @@ def get_frame(self, frame: int) -> "VideoFrame": if frame < 0: raise ValueError("frame must be a non-negative integer") - frame_file = VideoFrame(**self.model_dump(), frame=frame) - frame_file._set_stream(self._catalog) - return frame_file + return VideoFrame(video=self, frame=frame) def get_frames( self, @@ -560,11 +558,11 @@ def get_frames( Returns video frames from the specified range in the video. Args: - start (int, optional): The starting frame number (default: 0). + start (int): The starting frame number (default: 0). end (int, optional): The ending frame number (exclusive). If None, frames are read until the end of the video (default: None). - step (int, optional): The interval between frames to read (default: 1). + step (int): The interval between frames to read (default: 1). Returns: Iterator[VideoFrame]: An iterator yielding video frames. @@ -573,18 +571,9 @@ def get_frames( If end is not specified, number of frames will be taken from the video file, this means video file needs to be downloaded. """ - if start < 0: - raise ValueError("start_frame must be a non-negative integer.") - if step < 1: - raise ValueError("step must be a positive integer.") - - if end is None: - end = self.get_info().frames + from .video import validate_frame_range - if end < 0: - raise ValueError("end_frame must be a non-negative integer.") - if start > end: - raise ValueError("start_frame must be less than or equal to end_frame.") + start, end, step = validate_frame_range(self, start, end, step) for frame in range(start, end, step): yield self.get_frame(frame) @@ -603,9 +592,7 @@ def get_fragment(self, start: float, end: float) -> "VideoFragment": if start < 0 or end < 0 or start >= end: raise ValueError(f"Invalid time range: ({start:.3f}, {end:.3f})") - fragment_file = VideoFragment(**self.model_dump(), start=start, end=end) - fragment_file._set_stream(self._catalog) - return fragment_file + return VideoFragment(video=self, start=start, end=end) def get_fragments( self, @@ -618,7 +605,7 @@ def get_fragments( Args: duration (float): The duration of each video fragment in seconds. - start (float, optional): The starting time in seconds (default: 0). + start (float): The starting time in seconds (default: 0). end (float, optional): The ending time in seconds. If None, the entire remaining video is processed (default: None). @@ -647,7 +634,7 @@ def get_fragments( start += duration -class VideoFrame(VideoFile): +class VideoFrame(DataModel): """ A data model for representing a video frame. @@ -657,10 +644,12 @@ class VideoFrame(VideoFile): video frames as image files. Attributes: + video (VideoFile): The video file containing the video frame. frame (int): The frame number referencing a specific frame in the video file. """ - frame: int = Field(default=-1) + video: VideoFile + frame: int def get_np(self) -> "ndarray": """ @@ -672,22 +661,22 @@ def get_np(self) -> "ndarray": """ from .video import video_frame_np - return video_frame_np(self) + return video_frame_np(self.video, self.frame) def read_bytes(self, format: str = "jpg") -> bytes: """ Returns a video frame from the video file as image bytes. Args: - format (str, optional): The desired image format (e.g., 'jpg', 'png'). - Defaults to 'jpg'. + format (str): The desired image format (e.g., 'jpg', 'png'). + Defaults to 'jpg'. Returns: bytes: The encoded video frame as image bytes. """ from .video import video_frame_bytes - return video_frame_bytes(self, format) + return video_frame_bytes(self.video, self.frame, format) def save(self, output: str, format: str = "jpg") -> "ImageFile": """ @@ -698,18 +687,17 @@ def save(self, output: str, format: str = "jpg") -> "ImageFile": Args: output (str): The destination path, which can be a local file path or a remote URL. - format (str, optional): The image format (e.g., 'jpg', 'png'). - Defaults to 'jpg'. + format (str): The image format (e.g., 'jpg', 'png'). Defaults to 'jpg'. Returns: ImageFile: A Model representing the saved image file. """ from .video import save_video_frame - return save_video_frame(self, output, format) + return save_video_frame(self.video, self.frame, output, format) -class VideoFragment(VideoFile): +class VideoFragment(DataModel): """ A data model for representing a video fragment. @@ -719,12 +707,14 @@ class VideoFragment(VideoFile): and saving video fragments as separate video files. Attributes: + video (VideoFile): The video file containing the video fragment. start (float): The starting time of the video fragment in seconds. end (float): The ending time of the video fragment in seconds. """ - start: float = Field(default=-1.0) - end: float = Field(default=-1.0) + video: VideoFile + start: float + end: float def save(self, output: str, format: Optional[str] = None) -> "VideoFile": """ @@ -744,7 +734,7 @@ def save(self, output: str, format: Optional[str] = None) -> "VideoFile": """ from .video import save_video_fragment - return save_video_fragment(self, output, format) + return save_video_fragment(self.video, self.start, self.end, output, format) class Video(DataModel): diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index b5c22fc22..867826fe8 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -5,14 +5,7 @@ from numpy import ndarray -from datachain.lib.file import ( - FileError, - ImageFile, - Video, - VideoFile, - VideoFragment, - VideoFrame, -) +from datachain.lib.file import FileError, ImageFile, Video, VideoFile try: import ffmpeg @@ -80,40 +73,77 @@ def video_info(file: VideoFile) -> Video: ) -def video_frame_np(file: VideoFrame) -> ndarray: +def video_frame_np(video: VideoFile, frame: int) -> ndarray: """ Reads video frame from a file and returns as numpy array. Args: - file (VideoFrame): VideoFrame file object. + video (VideoFile): Video file object. + frame (int): Frame index. Returns: ndarray: Video frame. """ - if file.frame < 0: + if frame < 0: raise ValueError("frame must be a non-negative integer") - with file.open() as f: - return iio.imread(f, index=file.frame, plugin="pyav") # type: ignore[arg-type] + with video.open() as f: + return iio.imread(f, index=frame, plugin="pyav") # type: ignore[arg-type] -def video_frame_bytes(file: VideoFrame, format: str = "jpg") -> bytes: +def validate_frame_range( + video: VideoFile, + start: int = 0, + end: Optional[int] = None, + step: int = 1, +) -> tuple[int, int, int]: + """ + Validates frame range for a video file. + + Args: + video (VideoFile): Video file object. + start (int): Start frame index (default: 0). + end (int, optional): End frame index (default: None). + step (int): Step between frames (default: 1). + + Returns: + tuple[int, int, int]: Start frame index, end frame index, and step. + """ + if start < 0: + raise ValueError("start_frame must be a non-negative integer.") + if step < 1: + raise ValueError("step must be a positive integer.") + + if end is None: + end = video_info(video).frames + + if end < 0: + raise ValueError("end_frame must be a non-negative integer.") + if start > end: + raise ValueError("start_frame must be less than or equal to end_frame.") + + return start, end, step + + +def video_frame_bytes(video: VideoFile, frame: int, format: str = "jpg") -> bytes: """ Reads video frame from a file and returns as image bytes. Args: - file (VideoFrame): VideoFrame file object. + video (VideoFile): Video file object. + frame (int): Frame index. format (str): Image format (default: 'jpg'). Returns: bytes: Video frame image as bytes. """ - img = video_frame_np(file) + img = video_frame_np(video, frame) return iio.imwrite("", img, extension=f".{format}") def save_video_frame( - file: VideoFrame, + video: VideoFile, + frame: int, output: str, format: str = "jpg", ) -> ImageFile: @@ -122,22 +152,25 @@ def save_video_frame( the image file will be uploaded to the remote storage. Args: - file (VideoFrame): VideoFrame file object. + video (VideoFile): Video file object. + frame (int): Frame index. output (str): Output path, can be a local path or a remote path. format (str): Image format (default: 'jpg'). Returns: ImageFile: Image file model. """ - img = video_frame_bytes(file, format=format) + img = video_frame_bytes(video, frame, format=format) output_file = posixpath.join( - output, f"{file.get_file_stem()}_{file.frame:04d}.{format}" + output, f"{video.get_file_stem()}_{frame:04d}.{format}" ) return ImageFile.upload(img, output_file) def save_video_fragment( - file: VideoFragment, + video: VideoFile, + start: float, + end: float, output: str, format: Optional[str] = None, ) -> VideoFile: @@ -146,33 +179,37 @@ def save_video_fragment( the video file will be uploaded to the remote storage. Args: - file (VideoFragment): VideoFragment file object. + video (VideoFile): Video file object. + start (float): Start time in seconds. + end (float): End time in seconds. output (str): Output path, can be a local path or a remote path. - format (Optional[str]): Output format (default: None). If not provided, + format (str, optional): Output format (default: None). If not provided, the format will be inferred from the video fragment file extension. Returns: VideoFile: Video fragment model. """ - if file.start < 0 or file.end < 0 or file.start >= file.end: - raise ValueError(f"Invalid time range: ({file.start:.3f}, {file.end:.3f})") + if start < 0 or end < 0 or start >= end: + raise ValueError(f"Invalid time range: ({start:.3f}, {end:.3f})") if format is None: - format = file.get_file_ext() + format = video.get_file_ext() - start_ms = int(file.start * 1000) - end_ms = int(file.end * 1000) + start_ms = int(start * 1000) + end_ms = int(end * 1000) output_file = posixpath.join( - output, f"{file.get_file_stem()}_{start_ms:06d}_{end_ms:06d}.{format}" + output, f"{video.get_file_stem()}_{start_ms:06d}_{end_ms:06d}.{format}" ) temp_dir = tempfile.mkdtemp() try: output_file_tmp = posixpath.join(temp_dir, posixpath.basename(output_file)) - ffmpeg.input(file.get_local_path(), ss=file.start, to=file.end).output( - output_file_tmp - ).run(quiet=True) + ffmpeg.input( + video.get_local_path(), + ss=start, + to=end, + ).output(output_file_tmp).run(quiet=True) with open(output_file_tmp, "rb") as f: return VideoFile.upload(f.read(), output_file) diff --git a/src/datachain/toolkit/video.py b/src/datachain/toolkit/video.py deleted file mode 100644 index a6834acc1..000000000 --- a/src/datachain/toolkit/video.py +++ /dev/null @@ -1,85 +0,0 @@ -from collections.abc import Iterator -from typing import Callable, Optional - -from datachain.lib.video import VideoFile, VideoFrame - - -def split_video_to_frames( - start: int = 0, - end: Optional[int] = None, - step: int = 1, -) -> Callable[[VideoFile], Iterator[VideoFrame]]: - """ - Returns a UDF function that splits a video file into frames. - - Args: - start (int, optional): The starting frame number (default: 0). - end (int, optional): The ending frame number (exclusive). If None, - frames are read until the end of the video - (default: None). - step (int, optional): The interval between frames to read (default: 1). - - Returns: - Callable[[VideoFile], Iterator[VideoFrame]]: UDF function with VideoFile input - and VideoFrame iterator output. - - Usage: - Split videos from the "videos" dataset into frames and save them - to the "frames" dataset: - - ```python - from datachain import DataChain - from datachain.toolkit.video import split_video_to_frames - - ( - DataChain.from_dataset("videos") - .gen(frame=split_video_to_frames(step=5)) - .save("frames") - ) - ``` - """ - - def _split_frames(file: VideoFile) -> Iterator[VideoFrame]: - yield from file.get_frames(start=start, end=end, step=step) - - return _split_frames - - -def split_video_to_fragments( - duration: float, - start: float = 0, - end: Optional[float] = None, -) -> Callable[[VideoFile], Iterator[VideoFile]]: - """ - Returns a UDF function that splits a video file into fragments. - - Args: - duration (float): The duration of each video fragment in seconds. - start (float, optional): The starting time in seconds (default: 0). - end (float, optional): The ending time in seconds. If None, the entire - remaining video is processed (default: None). - - Returns: - Callable[[VideoFile], Iterator[VideoFile]]: UDF function with VideoFile input - and VideoFile iterator output. - - Usage: - Split videos from the "videos" dataset into fragments and save them - to the "fragments" dataset: - - ```python - from datachain import DataChain - from datachain.toolkit.video import split_video_to_fragments - - ( - DataChain.from_dataset("videos") - .gen(fragment=split_video_to_fragments(duration=1.0)) - .save("fragments") - ) - ``` - """ - - def _split_fragments(file: VideoFile) -> Iterator[VideoFile]: - yield from file.get_fragments(duration=duration, start=start, end=end) - - return _split_fragments diff --git a/tests/unit/lib/test_video.py b/tests/unit/lib/test_video.py index a8dd465ff..851c14abe 100644 --- a/tests/unit/lib/test_video.py +++ b/tests/unit/lib/test_video.py @@ -7,6 +7,7 @@ from datachain import VideoFragment, VideoFrame from datachain.lib.file import FileError, ImageFile, VideoFile +from datachain.lib.video import save_video_fragment, video_frame_np @pytest.fixture(autouse=True) @@ -61,6 +62,11 @@ def test_get_frame_np(video_file): assert frame.shape == (360, 640, 3) +def test_get_frame_np_error(video_file): + with pytest.raises(ValueError): + video_frame_np(video_file, -1) + + @pytest.mark.parametrize( "format,img_format,header", [ @@ -107,25 +113,17 @@ def test_get_all_frames(video_file): @pytest.mark.parametrize( - "start_frame,end_frame,step", + "start,end,step", [ - (-1, None, None), - (0, -1, None), - (1, 0, None), + (-1, None, 1), + (0, -1, 1), + (1, 0, 1), (0, 1, -1), ], ) -def test_get_frames_error(video_file, start_frame, end_frame, step): +def test_get_frames_error(video_file, start, end, step): with pytest.raises(ValueError): - list(video_file.get_frames(start_frame, end_frame, step)) - - -def test_get_frames_bytes(video_file): - frames = list(video_file.get_frames(10, 200, 5)) - frame_bytes = [frame.read_bytes("jpg") for frame in frames] - assert len(frame_bytes) == 38 - assert all(isinstance(frame, bytes) for frame in frame_bytes) - assert all(Image.open(io.BytesIO(frame)).format == "JPEG" for frame in frame_bytes) + list(video_file.get_frames(start, end, step)) def test_save_frames(tmp_path, video_file): @@ -147,6 +145,29 @@ def test_get_fragment(video_file): assert fragment.end == 5 +def test_get_fragments(video_file): + fragments = list(video_file.get_fragments(duration=1.5)) + for i, fragment in enumerate(fragments): + assert isinstance(fragment, VideoFragment) + assert fragment.start == i * 1.5 + duration = 1.5 if i < 6 else 1.0 + assert fragment.end == fragment.start + duration + + +@pytest.mark.parametrize( + "duration,start,end", + [ + (-1, 0, 10), + (1, -1, 10), + (1, 0, -1), + (1, 2, 1), + ], +) +def test_get_fragments_error(video_file, duration, start, end): + with pytest.raises(ValueError): + list(video_file.get_fragments(duration=duration, start=start, end=end)) + + @pytest.mark.parametrize( "start,end", [ @@ -177,12 +198,23 @@ def test_save_fragment(tmp_path, video_file): } -def test_save_fragments(tmp_path, video_file): - intervals = [(1, 2), (3, 4), (5, 6)] +@pytest.mark.parametrize( + "start,end", + [ + (-1, 2), + (1, -1), + (2, 1), + ], +) +def test_save_video_fragment_error(video_file, start, end): + with pytest.raises(ValueError): + save_video_fragment(video_file, start, end, ".") + - fragments = list(video_file.get_fragments(intervals)) +def test_save_fragments(tmp_path, video_file): + fragments = list(video_file.get_fragments(duration=1)) fragment_files = [fragment.save(str(tmp_path)) for fragment in fragments] - assert len(fragment_files) == 3 + assert len(fragment_files) == 10 for fragment in fragment_files: fragment.ensure_cached() From 198955f4860882611fdb68d901201d84b8f52b3c Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 6 Feb 2025 19:55:59 +0700 Subject: [PATCH 62/63] More Yolo toolkit functions to separate PR --- src/datachain/toolkit/ultralytics.py | 141 --------------------------- 1 file changed, 141 deletions(-) delete mode 100644 src/datachain/toolkit/ultralytics.py diff --git a/src/datachain/toolkit/ultralytics.py b/src/datachain/toolkit/ultralytics.py deleted file mode 100644 index e97fad95a..000000000 --- a/src/datachain/toolkit/ultralytics.py +++ /dev/null @@ -1,141 +0,0 @@ -from typing import Union - -import numpy as np -import torch -from PIL import Image -from ultralytics.engine.results import Results - -from datachain.model.ultralytics.bbox import YoloBBox, YoloBBoxes -from datachain.model.ultralytics.pose import YoloPose, YoloPoses -from datachain.model.ultralytics.segment import YoloSegment, YoloSegments - -YoloSignal = Union[YoloBBox, YoloBBoxes, YoloPose, YoloPoses, YoloSegment, YoloSegments] - - -def _signal_to_results(img: np.ndarray, signal: YoloSignal) -> Results: - # Convert RGB to BGR - if img.ndim == 3 and img.shape[2] == 3: - bgr_array = img[:, :, ::-1] - else: - # If the image is not RGB (e.g., grayscale or RGBA), use as is - bgr_array = img - - names = {} - boxes_list = [] - keypoints_list = [] - masks_list = [] - - # Get the boxes, keypoints, and masks from the signal - if isinstance(signal, YoloBBox): - names[signal.cls] = signal.name - boxes_list.append( - torch.tensor([[*signal.box.coords, signal.confidence, signal.cls]]) - ) - elif isinstance(signal, YoloBBoxes): - for i, _ in enumerate(signal.cls): - names[signal.cls[i]] = signal.name[i] - boxes_list.append( - torch.tensor( - [[*signal.box[i].coords, signal.confidence[i], signal.cls[i]]] - ) - ) - elif isinstance(signal, YoloPose): - names[signal.cls] = signal.name - boxes_list.append( - torch.tensor([[*signal.box.coords, signal.confidence, signal.cls]]) - ) - keypoints_list.append( - torch.tensor([list(zip(signal.pose.x, signal.pose.y, signal.pose.visible))]) - ) - elif isinstance(signal, YoloPoses): - for i, _ in enumerate(signal.cls): - names[signal.cls[i]] = signal.name[i] - boxes_list.append( - torch.tensor( - [[*signal.box[i].coords, signal.confidence[i], signal.cls[i]]] - ) - ) - keypoints_list.append( - torch.tensor( - [ - list( - zip( - signal.pose[i].x, - signal.pose[i].y, - signal.pose[i].visible, - ) - ) - ] - ) - ) - elif isinstance(signal, YoloSegment): - names[signal.cls] = signal.name - boxes_list.append( - torch.tensor([[*signal.box.coords, signal.confidence, signal.cls]]) - ) - masks_list.append(torch.tensor([list(zip(signal.segment.x, signal.segment.y))])) - elif isinstance(signal, YoloSegments): - for i, _ in enumerate(signal.cls): - names[signal.cls[i]] = signal.name[i] - boxes_list.append( - torch.tensor( - [[*signal.box[i].coords, signal.confidence[i], signal.cls[i]]] - ) - ) - masks_list.append( - torch.tensor([list(zip(signal.segment[i].x, signal.segment[i].y))]) - ) - - boxes = torch.cat(boxes_list, dim=0) if len(boxes_list) > 0 else None - keypoints = torch.cat(keypoints_list, dim=0) if len(keypoints_list) > 0 else None - masks = torch.cat(masks_list, dim=0) if len(masks_list) > 0 else None - - return Results( - bgr_array, - path="", - names=names, - boxes=boxes, - keypoints=keypoints, - masks=masks, - ) - - -def visualize_yolo( - img: np.ndarray, - signal: YoloSignal, - scale: float = 1.0, - line_width: int = 1, - font_size: int = 20, - kpt_radius: int = 3, -) -> Image.Image: - """ - Visualize signals detected by YOLO. - - Args: - image (ndarray): The image to visualize as a NumPy array. - signal: The signal detected by YOLO. Possible signals are YoloBBox, YoloBBoxes, - YoloPose, YoloPoses, YoloSegment, and YoloSegments. - scale (float): The scale factor for the image. Default is 1.0. - line_width (int): The line width for drawing boxes and lines. Default is 1. - font_size (int): The font size for text. Default is 20. - kpt_radius (int): The radius for drawing keypoints. Default is 3. - - Returns: - PIL.Image.Image: The image with the detected signals visualized. - """ - results = _signal_to_results(img, signal) - - im_bgr = results.plot( - line_width=line_width, - font_size=font_size, - kpt_radius=kpt_radius, - ) - - im_rgb = Image.fromarray(im_bgr[..., ::-1]) - - if scale != 1.0: - orig_height, orig_width = results.orig_shape - new_size = (int(orig_width * scale), int(orig_height * scale)) - im_rgb = im_rgb.resize(new_size, Image.Resampling.LANCZOS) - - return im_rgb From a5e2e47154d228747625ce95ca5873386c012607 Mon Sep 17 00:00:00 2001 From: Vladimir Rudnyh Date: Thu, 6 Feb 2025 23:02:48 +0700 Subject: [PATCH 63/63] Update video models --- src/datachain/lib/video.py | 12 +++++++++--- src/datachain/toolkit/__init__.py | 3 +-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/datachain/lib/video.py b/src/datachain/lib/video.py index 867826fe8..d007fd30e 100644 --- a/src/datachain/lib/video.py +++ b/src/datachain/lib/video.py @@ -28,10 +28,16 @@ def video_info(file: VideoFile) -> Video: Returns: Video: Video file information. """ + if not (file_path := file.get_local_path()): + file.ensure_cached() + file_path = file.get_local_path() + if not file_path: + raise FileError(file, "unable to download video file") + try: - probe = ffmpeg.probe(file.get_local_path()) - except Exception: # noqa: BLE001 - probe = {} + probe = ffmpeg.probe(file_path) + except Exception as exc: + raise FileError(file, "unable to extract metadata from video file") from exc all_streams = probe.get("streams") video_format = probe.get("format") diff --git a/src/datachain/toolkit/__init__.py b/src/datachain/toolkit/__init__.py index 38c8ac1b0..0bcb55a4e 100644 --- a/src/datachain/toolkit/__init__.py +++ b/src/datachain/toolkit/__init__.py @@ -1,4 +1,3 @@ from .split import train_test_split -from .video import split_video_to_frames -__all__ = ["split_video_to_frames", "train_test_split"] +__all__ = ["train_test_split"]