From f6df73471f82a13f14180b8b12ec5859f7e36869 Mon Sep 17 00:00:00 2001 From: ChanBong Date: Thu, 28 Mar 2024 23:07:01 +0530 Subject: [PATCH 01/10] feature: allow downloading video frames in custom extension --- cvat-sdk/cvat_sdk/core/proxies/tasks.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/tasks.py b/cvat-sdk/cvat_sdk/core/proxies/tasks.py index 0bebcc6507d..7384beba65b 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/tasks.py +++ b/cvat-sdk/cvat_sdk/core/proxies/tasks.py @@ -219,31 +219,24 @@ def download_chunk( def download_frames( self, frame_ids: Sequence[int], + image_extension: str, *, - outdir: StrPath = ".", + outdir: str = ".", quality: str = "original", filename_pattern: str = "frame_{frame_id:06d}{frame_ext}", ) -> Optional[List[Image.Image]]: """ - Download the requested frame numbers for a task and save images as outdir/filename_pattern + Download the requested frame numbers for a job and save images as outdir/filename_pattern """ - # TODO: add arg descriptions in schema outdir = Path(outdir) - outdir.mkdir(exist_ok=True) + outdir.mkdir(parents=True, exist_ok=True) for frame_id in frame_ids: frame_bytes = self.get_frame(frame_id, quality=quality) im = Image.open(frame_bytes) - mime_type = im.get_format_mimetype() or "image/jpg" - im_ext = mimetypes.guess_extension(mime_type) - - # FIXME It is better to use meta information from the server - # to determine the extension - # replace '.jpe' or '.jpeg' with a more used '.jpg' - if im_ext in (".jpe", ".jpeg", None): - im_ext = ".jpg" + im_ext = f".{image_extension.strip('.')}" outfile = filename_pattern.format(frame_id=frame_id, frame_ext=im_ext) im.save(outdir / outfile) From 78ac70fb5b4e77eef134e4c756ba31f4878c70ad Mon Sep 17 00:00:00 2001 From: ChanBong Date: Fri, 29 Mar 2024 15:49:11 +0530 Subject: [PATCH 02/10] fix: unnecessary changes --- cvat-sdk/cvat_sdk/core/proxies/tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/tasks.py b/cvat-sdk/cvat_sdk/core/proxies/tasks.py index 7384beba65b..e2e167ed7e6 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/tasks.py +++ b/cvat-sdk/cvat_sdk/core/proxies/tasks.py @@ -221,12 +221,12 @@ def download_frames( frame_ids: Sequence[int], image_extension: str, *, - outdir: str = ".", + outdir: StrPath = ".", quality: str = "original", filename_pattern: str = "frame_{frame_id:06d}{frame_ext}", ) -> Optional[List[Image.Image]]: """ - Download the requested frame numbers for a job and save images as outdir/filename_pattern + Download the requested frame numbers for a task and save images as outdir/filename_pattern """ outdir = Path(outdir) From 116b85eb1ea9756082f73746ce95a70695ed2d29 Mon Sep 17 00:00:00 2001 From: ChanBong Date: Fri, 29 Mar 2024 18:46:06 +0530 Subject: [PATCH 03/10] handle case when no specific ext is requested --- cvat-sdk/cvat_sdk/core/proxies/tasks.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/tasks.py b/cvat-sdk/cvat_sdk/core/proxies/tasks.py index e2e167ed7e6..509928f4dd5 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/tasks.py +++ b/cvat-sdk/cvat_sdk/core/proxies/tasks.py @@ -219,8 +219,8 @@ def download_chunk( def download_frames( self, frame_ids: Sequence[int], - image_extension: str, *, + image_extension: Optional[str] = None, outdir: StrPath = ".", quality: str = "original", filename_pattern: str = "frame_{frame_id:06d}{frame_ext}", @@ -236,7 +236,17 @@ def download_frames( frame_bytes = self.get_frame(frame_id, quality=quality) im = Image.open(frame_bytes) - im_ext = f".{image_extension.strip('.')}" + if image_extension is None: + mime_type = im.get_format_mimetype() or "image/jpg" + im_ext = mimetypes.guess_extension(mime_type) + + # FIXME It is better to use meta information from the server + # to determine the extension + # replace '.jpe' or '.jpeg' with a more used '.jpg' + if im_ext in (".jpe", ".jpeg", None): + im_ext = ".jpg" + else: + im_ext = f".{image_extension.strip('.')}" outfile = filename_pattern.format(frame_id=frame_id, frame_ext=im_ext) im.save(outdir / outfile) From f50acaf5dc316ec6b4740159b60c95b2d5857997 Mon Sep 17 00:00:00 2001 From: ChanBong Date: Tue, 9 Apr 2024 22:35:33 +0530 Subject: [PATCH 04/10] Modify similar function in jobs.py. Add test --- cvat-sdk/cvat_sdk/core/proxies/jobs.py | 8 ++++++-- tests/python/sdk/test_tasks.py | 12 ++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/jobs.py b/cvat-sdk/cvat_sdk/core/proxies/jobs.py index b995be49ac9..4fb22e62b6e 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/jobs.py +++ b/cvat-sdk/cvat_sdk/core/proxies/jobs.py @@ -119,6 +119,7 @@ def download_frames( self, frame_ids: Sequence[int], *, + image_extension: Optional[str] = None, outdir: StrPath = ".", quality: str = "original", filename_pattern: str = "frame_{frame_id:06d}{frame_ext}", @@ -135,14 +136,17 @@ def download_frames( frame_bytes = self.get_frame(frame_id, quality=quality) im = Image.open(frame_bytes) - mime_type = im.get_format_mimetype() or "image/jpg" - im_ext = mimetypes.guess_extension(mime_type) + if image_extension is None: + mime_type = im.get_format_mimetype() or "image/jpg" + im_ext = mimetypes.guess_extension(mime_type) # FIXME It is better to use meta information from the server # to determine the extension # replace '.jpe' or '.jpeg' with a more used '.jpg' if im_ext in (".jpe", ".jpeg", None): im_ext = ".jpg" + else: + im_ext = f".{image_extension.strip('.')}" outfile = filename_pattern.format(frame_id=frame_id, frame_ext=im_ext) im.save(outdir / outfile) diff --git a/tests/python/sdk/test_tasks.py b/tests/python/sdk/test_tasks.py index f5da9494bd7..09a2f4c9d1d 100644 --- a/tests/python/sdk/test_tasks.py +++ b/tests/python/sdk/test_tasks.py @@ -322,18 +322,22 @@ def test_can_download_frame(self, fxt_new_task: Task, quality: str): assert self.stdout.getvalue() == "" @pytest.mark.parametrize("quality", ("compressed", "original")) - def test_can_download_frames(self, fxt_new_task: Task, quality: str): + def test_can_download_frames(self, fxt_new_task: Task, quality: str, image_extension: str): fxt_new_task.download_frames( [0], + image_extension = image_extension, quality=quality, outdir=self.tmp_path, filename_pattern="frame-{frame_id}{frame_ext}", ) - if quality == "original": - expected_frame_ext = "png" + if image_extension is not None: + expected_frame_ext = image_extension else: - expected_frame_ext = "jpg" + if quality == "original": + expected_frame_ext = "png" + else: + expected_frame_ext = "jpg" assert (self.tmp_path / f"frame-0.{expected_frame_ext}").is_file() assert self.stdout.getvalue() == "" From 52322b60ee7607227f27ad501435622ff2b90aa9 Mon Sep 17 00:00:00 2001 From: Harsh Kumar <73221930+ChanBong@users.noreply.github.com> Date: Tue, 9 Apr 2024 22:58:48 +0530 Subject: [PATCH 05/10] Update tests/python/sdk/test_tasks.py Co-authored-by: Maxim Zhiltsov --- tests/python/sdk/test_tasks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/python/sdk/test_tasks.py b/tests/python/sdk/test_tasks.py index 7499f5aa20e..763f1797703 100644 --- a/tests/python/sdk/test_tasks.py +++ b/tests/python/sdk/test_tasks.py @@ -322,6 +322,7 @@ def test_can_download_frame(self, fxt_new_task: Task, quality: str): assert self.stdout.getvalue() == "" @pytest.mark.parametrize("quality", ("compressed", "original")) + @pytest.mark.parametrize("image_extension", (None, "bmp")) def test_can_download_frames(self, fxt_new_task: Task, quality: str, image_extension: str): fxt_new_task.download_frames( [0], From 7722e840864e999187534066efde5c25bb46a67e Mon Sep 17 00:00:00 2001 From: ChanBong Date: Tue, 9 Apr 2024 23:07:06 +0530 Subject: [PATCH 06/10] add test in jobs --- tests/python/sdk/test_jobs.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/python/sdk/test_jobs.py b/tests/python/sdk/test_jobs.py index 4604ab060fc..a3e3b9d8516 100644 --- a/tests/python/sdk/test_jobs.py +++ b/tests/python/sdk/test_jobs.py @@ -141,18 +141,23 @@ def test_can_download_frame(self, fxt_new_task: Task, quality: str): assert self.stdout.getvalue() == "" @pytest.mark.parametrize("quality", ("compressed", "original")) - def test_can_download_frames(self, fxt_new_task: Task, quality: str): + @pytest.mark.parametrize("image_extension", (None, "bmp")) + def test_can_download_frames(self, fxt_new_task: Task, quality: str, image_extension: str): fxt_new_task.get_jobs()[0].download_frames( [0], + image_extension=image_extension, quality=quality, outdir=self.tmp_path, filename_pattern="frame-{frame_id}{frame_ext}", ) - if quality == "original": - expected_frame_ext = "png" + if image_extension is not None: + expected_frame_ext = image_extension else: - expected_frame_ext = "jpg" + if quality == "original": + expected_frame_ext = "png" + else: + expected_frame_ext = "jpg" assert (self.tmp_path / f"frame-0.{expected_frame_ext}").is_file() assert self.stdout.getvalue() == "" From 3f275a3d30500fa222526c9d4bbec2faeba0305f Mon Sep 17 00:00:00 2001 From: ChanBong Date: Tue, 9 Apr 2024 23:55:07 +0530 Subject: [PATCH 07/10] fix linter errors --- cvat-sdk/cvat_sdk/core/proxies/annotations.py | 3 ++- cvat-sdk/cvat_sdk/core/proxies/model_proxy.py | 12 ++++++++---- cvat-sdk/cvat_sdk/core/utils.py | 8 ++++---- cvat-sdk/cvat_sdk/datasets/caching.py | 18 ++++++++++++------ .../report/primary_metrics/base.py | 6 ++++-- tests/python/rest_api/test_jobs.py | 1 - tests/python/rest_api/utils.py | 3 ++- tests/python/sdk/test_tasks.py | 2 +- 8 files changed, 33 insertions(+), 20 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/annotations.py b/cvat-sdk/cvat_sdk/core/proxies/annotations.py index e9353888119..96c50b692d0 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/annotations.py +++ b/cvat-sdk/cvat_sdk/core/proxies/annotations.py @@ -20,7 +20,8 @@ class AnnotationCrudMixin(ABC): # TODO: refactor @property - def _put_annotations_data_param(self) -> str: ... + def _put_annotations_data_param(self) -> str: + ... def get_annotations(self: _EntityT) -> models.ILabeledData: (annotations, _) = self.api.retrieve_annotations(getattr(self, self._model_id_field)) diff --git a/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py b/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py index fa25035a418..9a761771af7 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py +++ b/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py @@ -39,7 +39,8 @@ class ModelProxy(ABC, Generic[ModelType, ApiType]): _client: Client @property - def _api_member_name(self) -> str: ... + def _api_member_name(self) -> str: + ... def __init__(self, client: Client) -> None: self.__dict__["_client"] = client @@ -141,10 +142,12 @@ def retrieve(self: Repo, obj_id: int) -> _EntityT: class ModelListMixin(Generic[_EntityT]): @overload - def list(self: Repo, *, return_json: Literal[False] = False) -> List[_EntityT]: ... + def list(self: Repo, *, return_json: Literal[False] = False) -> List[_EntityT]: + ... @overload - def list(self: Repo, *, return_json: Literal[True] = False) -> List[Any]: ... + def list(self: Repo, *, return_json: Literal[True] = False) -> List[Any]: + ... def list(self: Repo, *, return_json: bool = False) -> List[Union[_EntityT, Any]]: """ @@ -163,7 +166,8 @@ def list(self: Repo, *, return_json: bool = False) -> List[Union[_EntityT, Any]] class ModelUpdateMixin(ABC, Generic[IModel]): @property - def _model_partial_update_arg(self: Entity) -> str: ... + def _model_partial_update_arg(self: Entity) -> str: + ... def _export_update_fields( self: Entity, overrides: Optional[Union[Dict[str, Any], IModel]] = None diff --git a/cvat-sdk/cvat_sdk/core/utils.py b/cvat-sdk/cvat_sdk/core/utils.py index 0706a2eec61..9aadd90cc8c 100644 --- a/cvat-sdk/cvat_sdk/core/utils.py +++ b/cvat-sdk/cvat_sdk/core/utils.py @@ -29,15 +29,15 @@ def filter_dict( @overload -def atomic_writer( - path: Union[os.PathLike, str], mode: Literal["wb"] -) -> ContextManager[BinaryIO]: ... +def atomic_writer(path: Union[os.PathLike, str], mode: Literal["wb"]) -> ContextManager[BinaryIO]: + ... @overload def atomic_writer( path: Union[os.PathLike, str], mode: Literal["w"], encoding: str = "UTF-8" -) -> ContextManager[TextIO]: ... +) -> ContextManager[TextIO]: + ... @contextlib.contextmanager diff --git a/cvat-sdk/cvat_sdk/datasets/caching.py b/cvat-sdk/cvat_sdk/datasets/caching.py index 08e0c123bfe..deaa8abf872 100644 --- a/cvat-sdk/cvat_sdk/datasets/caching.py +++ b/cvat-sdk/cvat_sdk/datasets/caching.py @@ -44,11 +44,13 @@ class UpdatePolicy(Enum): class _CacheObjectModel(metaclass=ABCMeta): @abstractmethod - def dump(self) -> _CacheObject: ... + def dump(self) -> _CacheObject: + ... @classmethod @abstractmethod - def load(cls, obj: _CacheObject): ... + def load(cls, obj: _CacheObject): + ... _ModelType = TypeVar("_ModelType", bound=Union[OpenApiModel, _CacheObjectModel]) @@ -113,7 +115,8 @@ def save_model(self, path: Path, model: _ModelType) -> None: return self._save_object(path, self._serialize_model(model)) @abstractmethod - def retrieve_task(self, task_id: int) -> Task: ... + def retrieve_task(self, task_id: int) -> Task: + ... @abstractmethod def ensure_task_model( @@ -123,13 +126,16 @@ def ensure_task_model( model_type: Type[_ModelType], downloader: Callable[[], _ModelType], model_description: str, - ) -> _ModelType: ... + ) -> _ModelType: + ... @abstractmethod - def ensure_chunk(self, task: Task, chunk_index: int) -> None: ... + def ensure_chunk(self, task: Task, chunk_index: int) -> None: + ... @abstractmethod - def retrieve_project(self, project_id: int) -> Project: ... + def retrieve_project(self, project_id: int) -> Project: + ... class _CacheManagerOnline(CacheManager): diff --git a/cvat/apps/analytics_report/report/primary_metrics/base.py b/cvat/apps/analytics_report/report/primary_metrics/base.py index 2de8bd606ba..eb8321862fa 100644 --- a/cvat/apps/analytics_report/report/primary_metrics/base.py +++ b/cvat/apps/analytics_report/report/primary_metrics/base.py @@ -51,10 +51,12 @@ def is_filterable_by_date(cls): return cls._is_filterable_by_date @abstractmethod - def calculate(self): ... + def calculate(self): + ... @abstractmethod - def get_empty(self): ... + def get_empty(self): + ... def _make_clickhouse_query(self, parameters): return make_clickhouse_query(query=self._query, parameters=parameters) diff --git a/tests/python/rest_api/test_jobs.py b/tests/python/rest_api/test_jobs.py index e6a4842ba0f..cc5766ad5d4 100644 --- a/tests/python/rest_api/test_jobs.py +++ b/tests/python/rest_api/test_jobs.py @@ -576,7 +576,6 @@ def test_get_gt_job_in_org_task( "restore_db_per_class" ) class TestGetGtJobData: - def _delete_gt_job(self, user, gt_job_id): with make_api_client(user) as api_client: api_client.jobs_api.destroy(gt_job_id) diff --git a/tests/python/rest_api/utils.py b/tests/python/rest_api/utils.py index 4e17932efd8..64d48cdd932 100644 --- a/tests/python/rest_api/utils.py +++ b/tests/python/rest_api/utils.py @@ -56,7 +56,8 @@ class CollectionSimpleFilterTestBase(metaclass=ABCMeta): cmp_ignore_keys: List[str] = ["updated_date"] @abstractmethod - def _get_endpoint(self, api_client: ApiClient) -> Endpoint: ... + def _get_endpoint(self, api_client: ApiClient) -> Endpoint: + ... def _retrieve_collection(self, **kwargs) -> List: kwargs["return_json"] = True diff --git a/tests/python/sdk/test_tasks.py b/tests/python/sdk/test_tasks.py index 763f1797703..f97e88a2924 100644 --- a/tests/python/sdk/test_tasks.py +++ b/tests/python/sdk/test_tasks.py @@ -326,7 +326,7 @@ def test_can_download_frame(self, fxt_new_task: Task, quality: str): def test_can_download_frames(self, fxt_new_task: Task, quality: str, image_extension: str): fxt_new_task.download_frames( [0], - image_extension = image_extension, + image_extension=image_extension, quality=quality, outdir=self.tmp_path, filename_pattern="frame-{frame_id}{frame_ext}", From 0e8873e53b9a87ac05a8f7eb6b74be2b895c845c Mon Sep 17 00:00:00 2001 From: ChanBong Date: Wed, 10 Apr 2024 08:08:42 +0530 Subject: [PATCH 08/10] fix minor bug --- cvat-sdk/cvat_sdk/core/proxies/jobs.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/jobs.py b/cvat-sdk/cvat_sdk/core/proxies/jobs.py index 4fb22e62b6e..3457078621e 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/jobs.py +++ b/cvat-sdk/cvat_sdk/core/proxies/jobs.py @@ -140,11 +140,11 @@ def download_frames( mime_type = im.get_format_mimetype() or "image/jpg" im_ext = mimetypes.guess_extension(mime_type) - # FIXME It is better to use meta information from the server - # to determine the extension - # replace '.jpe' or '.jpeg' with a more used '.jpg' - if im_ext in (".jpe", ".jpeg", None): - im_ext = ".jpg" + # FIXME It is better to use meta information from the server + # to determine the extension + # replace '.jpe' or '.jpeg' with a more used '.jpg' + if im_ext in (".jpe", ".jpeg", None): + im_ext = ".jpg" else: im_ext = f".{image_extension.strip('.')}" From 0ba7c364c086481a44cc1a6153d77fae66be0d0c Mon Sep 17 00:00:00 2001 From: ChanBong Date: Wed, 10 Apr 2024 19:29:42 +0530 Subject: [PATCH 09/10] fix linting issues --- cvat-sdk/cvat_sdk/core/proxies/annotations.py | 3 +-- cvat-sdk/cvat_sdk/core/proxies/model_proxy.py | 12 ++++-------- cvat-sdk/cvat_sdk/core/utils.py | 8 ++++---- cvat-sdk/cvat_sdk/datasets/caching.py | 18 ++++++------------ .../report/primary_metrics/base.py | 6 ++---- tests/python/rest_api/utils.py | 3 +-- 6 files changed, 18 insertions(+), 32 deletions(-) diff --git a/cvat-sdk/cvat_sdk/core/proxies/annotations.py b/cvat-sdk/cvat_sdk/core/proxies/annotations.py index 96c50b692d0..e9353888119 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/annotations.py +++ b/cvat-sdk/cvat_sdk/core/proxies/annotations.py @@ -20,8 +20,7 @@ class AnnotationCrudMixin(ABC): # TODO: refactor @property - def _put_annotations_data_param(self) -> str: - ... + def _put_annotations_data_param(self) -> str: ... def get_annotations(self: _EntityT) -> models.ILabeledData: (annotations, _) = self.api.retrieve_annotations(getattr(self, self._model_id_field)) diff --git a/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py b/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py index 9a761771af7..fa25035a418 100644 --- a/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py +++ b/cvat-sdk/cvat_sdk/core/proxies/model_proxy.py @@ -39,8 +39,7 @@ class ModelProxy(ABC, Generic[ModelType, ApiType]): _client: Client @property - def _api_member_name(self) -> str: - ... + def _api_member_name(self) -> str: ... def __init__(self, client: Client) -> None: self.__dict__["_client"] = client @@ -142,12 +141,10 @@ def retrieve(self: Repo, obj_id: int) -> _EntityT: class ModelListMixin(Generic[_EntityT]): @overload - def list(self: Repo, *, return_json: Literal[False] = False) -> List[_EntityT]: - ... + def list(self: Repo, *, return_json: Literal[False] = False) -> List[_EntityT]: ... @overload - def list(self: Repo, *, return_json: Literal[True] = False) -> List[Any]: - ... + def list(self: Repo, *, return_json: Literal[True] = False) -> List[Any]: ... def list(self: Repo, *, return_json: bool = False) -> List[Union[_EntityT, Any]]: """ @@ -166,8 +163,7 @@ def list(self: Repo, *, return_json: bool = False) -> List[Union[_EntityT, Any]] class ModelUpdateMixin(ABC, Generic[IModel]): @property - def _model_partial_update_arg(self: Entity) -> str: - ... + def _model_partial_update_arg(self: Entity) -> str: ... def _export_update_fields( self: Entity, overrides: Optional[Union[Dict[str, Any], IModel]] = None diff --git a/cvat-sdk/cvat_sdk/core/utils.py b/cvat-sdk/cvat_sdk/core/utils.py index 9aadd90cc8c..0706a2eec61 100644 --- a/cvat-sdk/cvat_sdk/core/utils.py +++ b/cvat-sdk/cvat_sdk/core/utils.py @@ -29,15 +29,15 @@ def filter_dict( @overload -def atomic_writer(path: Union[os.PathLike, str], mode: Literal["wb"]) -> ContextManager[BinaryIO]: - ... +def atomic_writer( + path: Union[os.PathLike, str], mode: Literal["wb"] +) -> ContextManager[BinaryIO]: ... @overload def atomic_writer( path: Union[os.PathLike, str], mode: Literal["w"], encoding: str = "UTF-8" -) -> ContextManager[TextIO]: - ... +) -> ContextManager[TextIO]: ... @contextlib.contextmanager diff --git a/cvat-sdk/cvat_sdk/datasets/caching.py b/cvat-sdk/cvat_sdk/datasets/caching.py index deaa8abf872..08e0c123bfe 100644 --- a/cvat-sdk/cvat_sdk/datasets/caching.py +++ b/cvat-sdk/cvat_sdk/datasets/caching.py @@ -44,13 +44,11 @@ class UpdatePolicy(Enum): class _CacheObjectModel(metaclass=ABCMeta): @abstractmethod - def dump(self) -> _CacheObject: - ... + def dump(self) -> _CacheObject: ... @classmethod @abstractmethod - def load(cls, obj: _CacheObject): - ... + def load(cls, obj: _CacheObject): ... _ModelType = TypeVar("_ModelType", bound=Union[OpenApiModel, _CacheObjectModel]) @@ -115,8 +113,7 @@ def save_model(self, path: Path, model: _ModelType) -> None: return self._save_object(path, self._serialize_model(model)) @abstractmethod - def retrieve_task(self, task_id: int) -> Task: - ... + def retrieve_task(self, task_id: int) -> Task: ... @abstractmethod def ensure_task_model( @@ -126,16 +123,13 @@ def ensure_task_model( model_type: Type[_ModelType], downloader: Callable[[], _ModelType], model_description: str, - ) -> _ModelType: - ... + ) -> _ModelType: ... @abstractmethod - def ensure_chunk(self, task: Task, chunk_index: int) -> None: - ... + def ensure_chunk(self, task: Task, chunk_index: int) -> None: ... @abstractmethod - def retrieve_project(self, project_id: int) -> Project: - ... + def retrieve_project(self, project_id: int) -> Project: ... class _CacheManagerOnline(CacheManager): diff --git a/cvat/apps/analytics_report/report/primary_metrics/base.py b/cvat/apps/analytics_report/report/primary_metrics/base.py index eb8321862fa..2de8bd606ba 100644 --- a/cvat/apps/analytics_report/report/primary_metrics/base.py +++ b/cvat/apps/analytics_report/report/primary_metrics/base.py @@ -51,12 +51,10 @@ def is_filterable_by_date(cls): return cls._is_filterable_by_date @abstractmethod - def calculate(self): - ... + def calculate(self): ... @abstractmethod - def get_empty(self): - ... + def get_empty(self): ... def _make_clickhouse_query(self, parameters): return make_clickhouse_query(query=self._query, parameters=parameters) diff --git a/tests/python/rest_api/utils.py b/tests/python/rest_api/utils.py index 64d48cdd932..4e17932efd8 100644 --- a/tests/python/rest_api/utils.py +++ b/tests/python/rest_api/utils.py @@ -56,8 +56,7 @@ class CollectionSimpleFilterTestBase(metaclass=ABCMeta): cmp_ignore_keys: List[str] = ["updated_date"] @abstractmethod - def _get_endpoint(self, api_client: ApiClient) -> Endpoint: - ... + def _get_endpoint(self, api_client: ApiClient) -> Endpoint: ... def _retrieve_collection(self, **kwargs) -> List: kwargs["return_json"] = True From b44645062cebcdef4d71047ebdc3dd8d5561c0f5 Mon Sep 17 00:00:00 2001 From: ChanBong Date: Wed, 10 Apr 2024 20:04:51 +0530 Subject: [PATCH 10/10] add changelog --- .../20240410_200046_harsh_k_feature_custom_extension.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog.d/20240410_200046_harsh_k_feature_custom_extension.md diff --git a/changelog.d/20240410_200046_harsh_k_feature_custom_extension.md b/changelog.d/20240410_200046_harsh_k_feature_custom_extension.md new file mode 100644 index 00000000000..037957eff9d --- /dev/null +++ b/changelog.d/20240410_200046_harsh_k_feature_custom_extension.md @@ -0,0 +1,4 @@ +### Changed + +- Job and task `download_frames` now accepts custom extension for images + ()