From 48a48ab4a297d604f5b3d4ac3ca9ec360099b415 Mon Sep 17 00:00:00 2001 From: "changjun.zhu" Date: Wed, 22 Dec 2021 15:20:05 +0800 Subject: [PATCH] feat(client): delete squash_and_merge in VersionMixin PR Closed: https://github.com/Graviti-AI/tensorbay-python-sdk/pull/1179 --- docs/code/squash_and_merge.py | 56 ------ .../source/features/version_control/index.rst | 1 - .../version_control/squash_and_merge.rst | 42 ----- tensorbay/client/dataset.py | 2 +- tensorbay/client/tests/test_version.py | 23 --- tensorbay/client/version.py | 61 ------- tests/test_squash_and_merge.py | 162 ------------------ 7 files changed, 1 insertion(+), 346 deletions(-) delete mode 100644 docs/code/squash_and_merge.py delete mode 100644 docs/source/features/version_control/squash_and_merge.rst delete mode 100644 tests/test_squash_and_merge.py diff --git a/docs/code/squash_and_merge.py b/docs/code/squash_and_merge.py deleted file mode 100644 index d177ea9df..000000000 --- a/docs/code/squash_and_merge.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright 2021 Graviti. Licensed under MIT License. -# - -# pylint: disable=wrong-import-position -# pylint: disable=pointless-string-statement -# pylint: disable=invalid-name - - -"""This file includes the python code of squash_and_merge.rst.""" - -"""Authorize a Dataset Client Instance""" -from tensorbay import GAS - -ACCESS_KEY = "Accesskey-*****" -gas = GAS(ACCESS_KEY) -dataset_client = gas.create_dataset("DatasetName") - -dataset_client.create_draft("draft-1") -dataset_client.commit("commit-1") - -dataset_client.create_branch("dev") -dataset_client.create_draft("draft-2") -dataset_client.commit("commit-2") - -dataset_client.create_draft("draft-3") -dataset_client.commit("commit-3") - -dataset_client.checkout("main") -dataset_client.create_draft("draft-4") -dataset_client.commit("commit-4") -"""""" - -"""Squash and Merge""" -draft_number = dataset_client.squash_and_merge( - "draft-5", - description="description", - source_branch_name="dev", - target_branch_name="main", - strategy="override", -) -dataset_client.checkout(draft_number=draft_number) -dataset_client.commit("commit-5") -"""""" - -"""Checkout First""" -draft_number = dataset_client.squash_and_merge( - "draft-5", - description="description", - source_branch_name="dev", - strategy="override", -) -dataset_client.checkout(draft_number=draft_number) -dataset_client.commit("commit-5") -"""""" diff --git a/docs/source/features/version_control/index.rst b/docs/source/features/version_control/index.rst index 1bc749d18..f8f45aeea 100644 --- a/docs/source/features/version_control/index.rst +++ b/docs/source/features/version_control/index.rst @@ -26,4 +26,3 @@ TensorBay supports dataset version control. There can be multiple versions in on :caption: Advanced Operations diff - squash_and_merge diff --git a/docs/source/features/version_control/squash_and_merge.rst b/docs/source/features/version_control/squash_and_merge.rst deleted file mode 100644 index a5c414804..000000000 --- a/docs/source/features/version_control/squash_and_merge.rst +++ /dev/null @@ -1,42 +0,0 @@ -################## - Squash and Merge -################## - -TensorBay supports squashing and merging between different branches. - -Before :func:`~tensorbay.client.version.VersionControlMixin.squash_and_merge`, a dataset client instance with commits on different branches is needed. -See more details in :doc:`/features/version_control/draft_and_commit`. - -.. figure:: /images/squash_and_merge.png - :scale: 40 % - :align: center - - The graphical gas log about the squash and merge operation below. - -.. literalinclude:: ../../../../docs/code/squash_and_merge.py - :language: python - :start-after: """Authorize a Dataset Client Instance""" - :end-before: """""" - -TensorBay SDK allows :func:`~tensorbay.client.version.VersionControlMixin.squash_and_merge` by giving the ``target_branch_name``: - -.. literalinclude:: ../../../../docs/code/squash_and_merge.py - :language: python - :start-after: """Squash and Merge""" - :end-before: """""" - -Or ``checkout`` to the target_branch first. In this case, the current branch is ``main``, so we can do squash_and_merge operation directly. - -.. literalinclude:: ../../../../docs/code/squash_and_merge.py - :language: python - :start-after: """Checkout First""" - :end-before: """""" - -.. note:: - There are three strategies for handling the branch conflict: - - #. "abort": abort the opetation; - - #. "override": the squashed branch will override the target branch; - - #. "skip": keep the origin branch. diff --git a/tensorbay/client/dataset.py b/tensorbay/client/dataset.py index e9a941ed7..c67e0ffdd 100644 --- a/tensorbay/client/dataset.py +++ b/tensorbay/client/dataset.py @@ -219,7 +219,7 @@ def cache_enabled(self) -> bool: @property # type: ignore[misc] @functools.lru_cache() - def squash_and_merges(self) -> SquashAndMerge: + def squash_and_merge(self) -> SquashAndMerge: """Get class :class:`~tensorbay.client.version.SquashAndMerge`. Returns: diff --git a/tensorbay/client/tests/test_version.py b/tensorbay/client/tests/test_version.py index 3910100a6..efa035adc 100644 --- a/tensorbay/client/tests/test_version.py +++ b/tensorbay/client/tests/test_version.py @@ -21,26 +21,3 @@ class TestVersionControlMixin: alias="", is_public=DEFAULT_IS_PUBLIC, ) - - def test_squash_and_merge(self, mocker): - post_data = { - "title": "squash_merge-1", - "sourceBranchName": "branch-1", - "targetBranchName": "branch-2", - "strategy": "abort", - } - response_data = {"draftNumber": 2} - open_api_do = mocker.patch( - f"{gas.__name__}.Client.open_api_do", - return_value=mock_response(data=response_data), - ) - draft_number = self.dataset_client.squash_and_merge( - "squash_merge-1", - source_branch_name="branch-1", - target_branch_name="branch-2", - strategy="abort", - ) - open_api_do.assert_called_once_with( - "POST", "squashAndMerge", self.dataset_client.dataset_id, json=post_data - ) - assert draft_number == 2 diff --git a/tensorbay/client/version.py b/tensorbay/client/version.py index 34517608a..85bb412e1 100644 --- a/tensorbay/client/version.py +++ b/tensorbay/client/version.py @@ -309,67 +309,6 @@ def close_draft(self, number: int) -> None: self._close_draft(number) - def squash_and_merge( - self, - title: str, - description: str = "", - *, - source_branch_name: str, - target_branch_name: Optional[str] = None, - strategy: Optional[str] = "abort", - ) -> int: - """Squash and merge. - - Squash commits in source branch, then merge into target branch by creating a new draft. - If the target branch name is not given, the draft will be based on the branch name stored - in the dataset client. And during merging, the conflicts between branches can be resolved - in three different strategies: "abort", "override" and "skip". - - Arguments: - title: The draft title. - description: The draft description. - source_branch_name: The name of the branch to be squashed. - target_branch_name: The target branch name of the merge operation. - strategy: The strategy of handling the branch conflict. There are three options: - - 1. "abort": abort the opetation; - 2. "override": the squashed branch will override the target branch; - 3. "skip": keep the origin branch. - - Raises: - StatusError: When squashing and merging without basing on a branch. - - Returns: - The draft number of the new draft. - - """ - if not target_branch_name: - target_branch_name = self._status.branch_name - if not target_branch_name: - raise StatusError( - message="Squash and merge without basing on a branch is not allowed" - ) - self._status.check_authority_for_commit() - - post_data: Dict[str, Any] = { - "title": title, - "sourceBranchName": source_branch_name, - "targetBranchName": target_branch_name, - "strategy": strategy, - } - - if description: - post_data["description"] = description - - response = self._client.open_api_do( - "POST", "squashAndMerge", self._dataset_id, json=post_data - ) - draft_number: int = response.json()["draftNumber"] - - self._status.checkout(draft_number=draft_number) - self._status.branch_name = target_branch_name - return draft_number - def get_commit(self, revision: Optional[str] = None) -> Commit: """Get the certain commit with the given revision. diff --git a/tests/test_squash_and_merge.py b/tests/test_squash_and_merge.py deleted file mode 100644 index 1441a1e88..000000000 --- a/tests/test_squash_and_merge.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright 2021 Graviti. Licensed under MIT License. -# - -import os -import time - -import pytest - -from tensorbay.client import GAS -from tensorbay.client.gas import DEFAULT_BRANCH -from tensorbay.dataset import Data, Dataset -from tensorbay.label import Catalog, Label -from tests.utility import get_dataset_name - -CATALOG = { - "BOX2D": { - "categories": [ - {"name": "01"}, - {"name": "02"}, - {"name": "03"}, - {"name": "04"}, - {"name": "05"}, - {"name": "06"}, - {"name": "07"}, - {"name": "08"}, - {"name": "09"}, - {"name": "10"}, - {"name": "11"}, - {"name": "12"}, - {"name": "13"}, - {"name": "14"}, - {"name": "15"}, - ], - } -} - -LABEL_1 = { - "BOX2D": [ - { - "category": "01", - "box2d": {"xmin": 639.85, "ymin": 175.24, "xmax": 667.59, "ymax": 200.41}, - } - ] -} -LABEL_2 = { - "BOX2D": [ - { - "category": "02", - "box2d": {"xmin": 639.85, "ymin": 175.24, "xmax": 667.59, "ymax": 200.41}, - } - ] -} - - -@pytest.fixture(scope="class", name="dataset_client") -def init_dataset_client(accesskey, url, tmp_path_factory): - gas_client = GAS(access_key=accesskey, url=url) - dataset_name = get_dataset_name() - dataset_client = gas_client.create_dataset(dataset_name) - - dataset_client.create_draft("draft-1") - dataset_client.commit("commit-1") - - dataset_client.create_branch("dev") - dataset = Dataset(name=dataset_name) - segment = dataset.create_segment("Segment1") - dataset._catalog = Catalog.loads(CATALOG) - path = tmp_path_factory.mktemp("sub") - os.makedirs(path, exist_ok=True) - for i in range(10): - local_path = path / f"hello{i}.txt" - local_path.write_text(f"CONTENT_{i}") - data = Data(local_path=str(local_path)) - data.label = Label.loads(LABEL_2) - segment.append(data) - dataset_client = gas_client.upload_dataset(dataset, branch_name="dev") - dataset_client.commit("commit-2") - - dataset_client.checkout(DEFAULT_BRANCH) - dataset = Dataset(name=dataset_name) - segment = dataset.create_segment("Segment1") - dataset._catalog = Catalog.loads(CATALOG) - path = tmp_path_factory.mktemp("sub") - os.makedirs(path, exist_ok=True) - for i in range(4): - local_path = path / f"hello{i}.txt" - local_path.write_text(f"CONTENT_{i}") - data = Data(local_path=str(local_path)) - data.label = Label.loads(LABEL_1) - segment.append(data) - dataset_client = gas_client.upload_dataset(dataset, branch_name=DEFAULT_BRANCH) - dataset_client.commit("commit-3") - yield dataset_client - - gas_client.delete_dataset(dataset_name) - - -class TestSquashAndMerge: - def test_squash_and_merge_abort(self, dataset_client): - draft_number = dataset_client.squash_and_merge( - "draft-4", - description="description", - source_branch_name="dev", - target_branch_name=DEFAULT_BRANCH, - strategy="abort", - ) - time.sleep(5) - dataset_client.checkout(draft_number=draft_number) - assert dataset_client.status.branch_name == DEFAULT_BRANCH - segment_data = dataset_client.get_segment("Segment1").list_data() - assert len(segment_data) == 4 - for i in range(4): - data = segment_data[i] - assert data.path == f"hello{i}.txt" - assert data.label == Label.loads(LABEL_1) - dataset_client.checkout(DEFAULT_BRANCH) - dataset_client.close_draft(draft_number) - - def test_squash_and_merge_override(self, dataset_client): - draft_number = dataset_client.squash_and_merge( - "draft-5", - description="description", - source_branch_name="dev", - target_branch_name=DEFAULT_BRANCH, - strategy="override", - ) - time.sleep(5) - dataset_client.checkout(draft_number=draft_number) - assert dataset_client.status.branch_name == DEFAULT_BRANCH - segment_data = dataset_client.get_segment("Segment1").list_data() - assert len(segment_data) == 10 - for i in range(10): - data = segment_data[i] - assert data.path == f"hello{i}.txt" - assert data.label == Label.loads(LABEL_2) - dataset_client.checkout(DEFAULT_BRANCH) - dataset_client.close_draft(draft_number) - - def test_squash_and_merge_skip(self, dataset_client): - draft_number = dataset_client.squash_and_merge( - "draft-6", - description="description", - source_branch_name="dev", - target_branch_name=DEFAULT_BRANCH, - strategy="skip", - ) - time.sleep(5) - dataset_client.checkout(draft_number=draft_number) - assert dataset_client.status.branch_name == DEFAULT_BRANCH - segment_data = dataset_client.get_segment("Segment1").list_data() - assert len(segment_data) == 10 - for i in range(10): - data = segment_data[i] - assert data.path == f"hello{i}.txt" - if i < 4: - assert data.label == Label.loads(LABEL_1) - else: - assert data.label == Label.loads(LABEL_2) - dataset_client.checkout(DEFAULT_BRANCH) - dataset_client.close_draft(draft_number)