Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions src/kaggle/api/kaggle_api_extended.py
Original file line number Diff line number Diff line change
Expand Up @@ -4018,7 +4018,7 @@ def dataset_create_version_cli(
else:
print("Dataset version creation error: " + result.error)

def dataset_delete(self, owner_slug: str, dataset_slug: str, no_confirm: bool = False) -> None:
def dataset_delete(self, owner_slug: str, dataset_slug: str, no_confirm: bool = False) -> bool:
"""Deletes a dataset.

Args:
Expand All @@ -4027,7 +4027,7 @@ def dataset_delete(self, owner_slug: str, dataset_slug: str, no_confirm: bool =
no_confirm (bool): If True, skip confirmation (default is False).

Returns:
None:
bool: True if deleted, False if cancelled.
"""

if not owner_slug:
Expand All @@ -4036,13 +4036,14 @@ def dataset_delete(self, owner_slug: str, dataset_slug: str, no_confirm: bool =
if not no_confirm:
if not self.confirmation(f"delete the dataset: {owner_slug}/{dataset_slug}"):
print("Deletion cancelled")
return
return False

with self.build_kaggle_client() as kaggle:
request = ApiDeleteDatasetRequest()
request.owner_slug = owner_slug
request.dataset_slug = dataset_slug
kaggle.datasets.dataset_api_client.delete_dataset(request)
return True

def kernels_delete(self, kernel: str, no_confirm: bool = False) -> None:
"""Deletes a kernel.
Expand Down Expand Up @@ -4099,8 +4100,8 @@ def dataset_delete_cli(self, dataset: str, no_confirm: bool = False) -> None:
raise ValueError("A dataset must be specified")
owner_slug, dataset_slug, _ = self.split_dataset_string(dataset)

self.dataset_delete(owner_slug, dataset_slug, no_confirm)
print(f'Dataset "{dataset}" deleted successfully.')
if self.dataset_delete(owner_slug, dataset_slug, no_confirm):
print(f'Dataset "{dataset}" deleted successfully.')

def dataset_initialize(self, folder: str) -> str:
"""Initializes a folder with a dataset configuration (metadata) file.
Expand Down
64 changes: 64 additions & 0 deletions tests/unit/test_dataset_delete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# coding=utf-8
import unittest
from unittest.mock import MagicMock, patch
import sys
from io import StringIO

sys.path.insert(0, "../..")

from kaggle.api.kaggle_api_extended import KaggleApi


def _make_api():
api = KaggleApi.__new__(KaggleApi)
api.already_printed_version_warning = True
api.config_values = {"username": "owner"}
return api


class TestDatasetDelete(unittest.TestCase):
"""Tests for dataset_delete_cli() and dataset_delete()."""

def setUp(self):
self.api = _make_api()

@patch("builtins.print")
@patch.object(KaggleApi, "confirmation", return_value=False)
def test_dataset_delete_cli_cancelled(self, mock_confirmation, mock_print):
"""When confirmation is cancelled (returns False), print 'Deletion cancelled' and no success message."""
self.api.dataset_delete_cli("owner/dataset-slug")

# Verify confirmation was called
mock_confirmation.assert_called_once_with("delete the dataset: owner/dataset-slug")

# Verify that print("Deletion cancelled") was called
mock_print.assert_any_call("Deletion cancelled")

# Verify that the success message was NOT printed
for call_args in mock_print.call_args_list:
printed_str = call_args[0][0]
if "deleted successfully" in printed_str:
self.fail("Success message was printed on cancellation!")

@patch("builtins.print")
@patch.object(KaggleApi, "confirmation", return_value=True)
@patch.object(KaggleApi, "build_kaggle_client")
def test_dataset_delete_cli_success(self, mock_build, mock_confirmation, mock_print):
"""When confirmation is approved (returns True), call backend and print success message."""
mock_kaggle = MagicMock()
mock_build.return_value.__enter__ = MagicMock(return_value=mock_kaggle)
mock_build.return_value.__exit__ = MagicMock(return_value=False)

self.api.dataset_delete_cli("owner/dataset-slug")

mock_confirmation.assert_called_once_with("delete the dataset: owner/dataset-slug")

# Verify backend client delete_dataset was called
mock_kaggle.datasets.dataset_api_client.delete_dataset.assert_called_once()

# Verify success message was printed
mock_print.assert_any_call('Dataset "owner/dataset-slug" deleted successfully.')


if __name__ == "__main__":
unittest.main()