Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update high-level SDK used for exporting project|task|job datasets|backups #8255

Merged
merged 20 commits into from
Aug 30, 2024

Conversation

Marishka17
Copy link
Contributor

@Marishka17 Marishka17 commented Aug 2, 2024

Motivation and context

How has this been tested?

Checklist

  • I submit my changes into the develop branch
  • I have created a changelog fragment
    - [ ] I have updated the documentation accordingly
  • I have added tests to cover my changes
  • I have linked related issues (see GitHub docs)
    - [ ] I have increased versions of npm packages if it is necessary
    (cvat-canvas,
    cvat-core,
    cvat-data and
    cvat-ui)

License

  • I submit my code changes under the same MIT License that covers the project.
    Feel free to contact the maintainers if that's a concern.

Summary by CodeRabbit

  • New Features

    • Introduced mixins for exporting datasets and downloading backups, enhancing functionality across multiple classes.
    • Added a new fixture for testing tasks with specified target storage, improving test coverage.
  • Bug Fixes

    • Improved error handling in the file download process to ensure validity before proceeding.
  • Refactor

    • Restructured the downloading mechanism for better modularity and maintainability.
    • Removed outdated methods in favor of mixin functionality, streamlining class design.
  • Tests

    • Enhanced the test suite with additional scenarios and flexibility for task management and dataset downloading.

Copy link
Contributor

coderabbitai bot commented Aug 2, 2024

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

The recent changes to the CVAT SDK enhance modularity and functionality by introducing mixins for dataset export and backup download capabilities. Key methods have been refactored or removed to streamline operations, while new testing fixtures improve coverage for cloud storage scenarios. The overall design now promotes better code organization, allowing for greater flexibility in file handling and error management.

Changes

Files Change Summaries
cvat_sdk/core/downloading.py Splits prepare_and_download_file_from_endpoint into prepare_file and a revised method, enhancing flexibility and error handling.
cvat_sdk/core/proxies/jobs.py Introduces ExportDatasetMixin, removing the old export_dataset method, indicating a shift to a mixin-based design for exports.
cvat_sdk/core/proxies/model_proxy.py Adds ExportDatasetMixin and DownloadBackupMixin, providing new methods for exporting datasets and downloading backups, improving modularity.
cvat_sdk/core/proxies/projects.py Adds mixins for dataset export and backup, removes old methods, streamlining project data management.
cvat_sdk/core/proxies/tasks.py Integrates new mixins into the Task class, removing direct method calls for exports and backups, encouraging a more modular design.
tests/python/sdk/test_tasks.py Introduces a fixture for tasks with cloud storage, modifies tests for dataset downloads, and adds flexibility for frame downloads with an optional parameter.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Downloader
    participant Endpoint

    Client->>Downloader: Request file
    Downloader->>Endpoint: Prepare file request
    Endpoint->>Downloader: Return request object
    Downloader->>Endpoint: Check status and URL
    Endpoint->>Downloader: Confirm URL
    Downloader->>Client: Download file
Loading

🐰 In a world of bytes and code,
A rabbit hops, where changes flowed.
Mixin magic, tasks anew,
Exporting dreams in cloud-born dew.
With every leap, the SDK sings,
Flexibility in its newfound wings! 🌈✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Outside diff range, codebase verification and nitpick comments (5)
cvat-sdk/cvat_sdk/core/downloading.py (2)

Line range hint 72-108:
Ensure robust error handling and logging.

The prepare_file method is well-structured, but consider adding more detailed logging and handling potential exceptions during the request and response processing to enhance robustness.

+        try:
            response = client.api_client.rest_client.request(
                method=endpoint.settings["http_method"],
                url=url,
                headers=client.api_client.get_common_headers(),
            )
+        except Exception as e:
+            client.logger.error(f"Failed to initialize background process: {e}")
+            raise

109-132: Ensure robust error handling and logging.

The prepare_and_download_file_from_endpoint method is well-structured, but consider adding more detailed logging and handling potential exceptions during the file preparation and download process to enhance robustness.

+        try:
            bg_request = self.prepare_file(
                endpoint,
                url_params=url_params,
                query_params=query_params,
                status_check_period=status_check_period,
            )
+        except Exception as e:
+            client.logger.error(f"Failed to prepare file: {e}")
+            raise

        assert bg_request.result_url, "Result url was not found in server response"
cvat-sdk/cvat_sdk/core/proxies/model_proxy.py (3)

238-239: Validate location parameter.

The validation for the location parameter is correct, but consider using a set for better performance.

- if location not in ("local", "cloud_storage", None):
+ if location not in {"local", "cloud_storage", None}:

258-260: Check for cloud storage usage.

The check for default cloud storage usage is appropriate but could be simplified for readability.

- is_cloud_used_by_default = (
-     self.target_storage and self.target_storage.location.value == "cloud_storage"
- )
+ is_cloud_used_by_default = self.target_storage?.location.value == "cloud_storage"

300-301: Validate location parameter.

The validation for the location parameter is correct, but consider using a set for better performance.

- if location not in ("local", "cloud_storage", None):
+ if location not in {"local", "cloud_storage", None}:
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between f3dcc3e and 80491e3.

Files selected for processing (6)
  • cvat-sdk/cvat_sdk/core/downloading.py (3 hunks)
  • cvat-sdk/cvat_sdk/core/proxies/jobs.py (3 hunks)
  • cvat-sdk/cvat_sdk/core/proxies/model_proxy.py (2 hunks)
  • cvat-sdk/cvat_sdk/core/proxies/projects.py (3 hunks)
  • cvat-sdk/cvat_sdk/core/proxies/tasks.py (3 hunks)
  • tests/python/sdk/test_tasks.py (4 hunks)
Additional comments not posted (14)
cvat-sdk/cvat_sdk/core/proxies/jobs.py (1)

Line range hint 24-42:
Verify the integration of ExportDatasetMixin.

The inclusion of ExportDatasetMixin should be verified to ensure it integrates well with the existing class functionality. Ensure that the mixin methods do not conflict with existing methods in the Job class.

Verification successful

Integration of ExportDatasetMixin verified.

The ExportDatasetMixin class, which contains the export_dataset method, does not conflict with any methods in the Job class. The integration is correct and should function as intended.

  • ExportDatasetMixin is defined in cvat-sdk/cvat_sdk/core/proxies/model_proxy.py.
  • The Job class in cvat-sdk/cvat_sdk/core/proxies/jobs.py does not have any conflicting methods.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the integration of `ExportDatasetMixin` in the `Job` class.

# Test: Search for the methods provided by `ExportDatasetMixin` and ensure there are no conflicts.
rg --type python -A 5 $'class ExportDatasetMixin'

Length of output: 81


Script:

#!/bin/bash
# Step 1: Search for the definition of `ExportDatasetMixin` without specifying the file type.
rg 'class ExportDatasetMixin' -A 10

# Step 2: List the methods in `ExportDatasetMixin`.
rg 'class ExportDatasetMixin' -A 50 | rg 'def '

# Step 3: List the methods in the `Job` class.
rg 'class Job' -A 50 | rg 'def '

Length of output: 9242

cvat-sdk/cvat_sdk/core/proxies/projects.py (1)

Line range hint 22-43:
Verify the integration of ExportDatasetMixin and DownloadBackupMixin.

The inclusion of ExportDatasetMixin and DownloadBackupMixin should be verified to ensure they integrate well with the existing class functionality. Ensure that the mixin methods do not conflict with existing methods in the Project class.

Verification successful

Integration of ExportDatasetMixin and DownloadBackupMixin verified.

The ExportDatasetMixin and DownloadBackupMixin mixins have been successfully integrated into the Project class without any method conflicts.

  • No export_dataset method found in the Project class.
  • No download_backup method found in the Project class.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the integration of `ExportDatasetMixin` and `DownloadBackupMixin` in the `Project` class.

# Test: Search for the methods provided by the mixins and ensure there are no conflicts.
rg --type python -A 5 $'class ExportDatasetMixin'
rg --type python -A 5 $'class DownloadBackupMixin'

Length of output: 164


Script:

#!/bin/bash
# Description: Verify the integration of `ExportDatasetMixin` and `DownloadBackupMixin` in the `Project` class.

# Test: Search for the methods provided by the mixins and ensure there are no conflicts.
rg --glob '*.py' -A 5 $'class ExportDatasetMixin'
rg --glob '*.py' -A 5 $'class DownloadBackupMixin'

Length of output: 965


Script:

#!/bin/bash
# Description: Verify that there are no method conflicts in the `Project` class.

# Test: Search for `export_dataset` and `download_backup` methods in the `Project` class.
rg --glob '*.py' -A 5 'class Project' | rg 'def export_dataset'
rg --glob '*.py' -A 5 'class Project' | rg 'def download_backup'

Length of output: 132

cvat-sdk/cvat_sdk/core/proxies/model_proxy.py (8)

219-219: Class ExportDatasetMixin added.

The addition of this mixin class enhances modularity by encapsulating dataset export functionality.


247-251: Handle missing cloud_storage_id.

The code correctly raises an error if cloud_storage_id is not provided when location is cloud_storage.


272-277: Assert result_url based on location.

The assertions ensure that result_url is correctly handled based on the location.


278-283: Download file if result_url is available.

The code correctly handles file downloading using the Downloader class.


286-286: Class DownloadBackupMixin added.

The addition of this mixin class enhances modularity by encapsulating backup download functionality.


313-317: Handle missing cloud_storage_id.

The code correctly raises an error if cloud_storage_id is not provided when location is cloud_storage.


332-336: Assert result_url based on location.

The assertions ensure that result_url is correctly handled based on the location.


338-343: Download file if result_url is available.

The code correctly handles file downloading using the Downloader class.

cvat-sdk/cvat_sdk/core/proxies/tasks.py (1)

64-65: Mixins ExportDatasetMixin and DownloadBackupMixin added to Task.

The addition of these mixins enhances the modularity and reusability of the Task class by encapsulating dataset export and backup download functionalities.

tests/python/sdk/test_tasks.py (3)

68-84: Fixture fxt_new_task_with_target_storage added.

The fixture correctly creates a task with specified target storage parameters, enhancing test coverage for cloud storage scenarios.


296-350: Test test_can_download_dataset modified.

The test correctly accommodates the new fixture and parameterized approach, enhancing flexibility and coverage for different task configurations and download locations.


381-383: Test test_can_download_frames modified.

The test correctly includes an optional image_extension parameter, enhancing flexibility in testing frame downloads.

@davidrs
Copy link

davidrs commented Aug 2, 2024

👋 @Marishka17 Your PR may already cover it, but since it seems directly relevant to the high level SDK downloading I wanted to flag this issue I just filed this morning: #8256

@Marishka17
Copy link
Contributor Author

/check

Copy link
Contributor

github-actions bot commented Aug 21, 2024

✔️ All checks completed successfully
📄 See logs here

Copy link
Contributor

github-actions bot commented Aug 26, 2024

🚫 Workflows has been canceled
📄 See logs here

@Marishka17
Copy link
Contributor Author

/check

Copy link
Contributor

github-actions bot commented Aug 26, 2024

❌ Some checks failed
📄 See logs here

@Marishka17 Marishka17 changed the title [WIP] Update high-level SDK used for exporting project|task|job datasets|backups Update high-level SDK used for exporting project|task|job datasets|backups Aug 27, 2024
@Marishka17 Marishka17 force-pushed the mk/update_high_level_export_sdk branch 2 times, most recently from c5fc945 to a7f1027 Compare August 27, 2024 09:34
tests/python/sdk/common.py Outdated Show resolved Hide resolved
tests/python/sdk/common.py Outdated Show resolved Hide resolved
tests/python/sdk/common.py Outdated Show resolved Hide resolved
@Marishka17 Marishka17 force-pushed the mk/update_high_level_export_sdk branch from a7f1027 to 29dd818 Compare August 27, 2024 09:36
Copy link
Contributor

@zhiltsov-max zhiltsov-max left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add anything in the PR description and the changelog.

@codecov-commenter
Copy link

codecov-commenter commented Aug 27, 2024

Codecov Report

Attention: Patch coverage is 80.00000% with 10 lines in your changes missing coverage. Please review.

Project coverage is 83.51%. Comparing base (9fc70ef) to head (5df7838).
Report is 4 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #8255      +/-   ##
===========================================
+ Coverage    83.46%   83.51%   +0.04%     
===========================================
  Files          395      396       +1     
  Lines        41826    41830       +4     
  Branches      3881     3881              
===========================================
+ Hits         34909    34933      +24     
+ Misses        6917     6897      -20     
Components Coverage Δ
cvat-ui 79.43% <ø> (+0.04%) ⬆️
cvat-server 87.14% <80.00%> (+0.05%) ⬆️

@Marishka17 Marishka17 force-pushed the mk/update_high_level_export_sdk branch from afbecc7 to 0a478d5 Compare August 27, 2024 15:33
Co-authored-by: Maxim Zhiltsov <zhiltsov.max35@gmail.com>
Copy link

sonarcloud bot commented Aug 30, 2024

Quality Gate Failed Quality Gate failed

Failed conditions
12.8% Duplication on New Code (required ≤ 3%)

See analysis details on SonarCloud

@Marishka17 Marishka17 merged commit 878bb41 into develop Aug 30, 2024
32 of 33 checks passed
@Marishka17 Marishka17 deleted the mk/update_high_level_export_sdk branch August 30, 2024 10:37
This was referenced Sep 9, 2024
bschultz96 pushed a commit to bschultz96/cvat that referenced this pull request Sep 12, 2024
…sets`|`backups` (cvat-ai#8255)

- Fixed exporting the same dataset or backup twice in a row using
high-level SDK (switched to new export API version) (related
cvat-ai#8256)
- Fixed exporting a dataset or backup using high-level SDK when the
default project or task location refers to cloud storage
- Added ability to explicitly specify location when exporting datasets
and backups using high-level SDK

## Summary by CodeRabbit

- **New Features**
- Introduced mixins for exporting datasets and downloading backups,
enhancing functionality across multiple classes.
- Added a new fixture for testing tasks with specified target storage,
improving test coverage.

- **Bug Fixes**
- Improved error handling in the file download process to ensure
validity before proceeding.

- **Refactor**
- Restructured the downloading mechanism for better modularity and
maintainability.
- Removed outdated methods in favor of mixin functionality, streamlining
class design.

- **Tests**
- Enhanced the test suite with additional scenarios and flexibility for
task management and dataset downloading.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Maxim Zhiltsov <zhiltsov.max35@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants