Skip to content

Commit

Permalink
Merge pull request #478 from shaikh-ma/feature/allow_fork_to_parse_fo…
Browse files Browse the repository at this point in the history
…lderIDs_instead_of_using_URLS

Updates to fork function for allowing Projects ID instead of URLs
  • Loading branch information
jjdelc authored Feb 13, 2025
2 parents 7294ad2 + c69785e commit ec9ef20
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 19 deletions.
13 changes: 10 additions & 3 deletions scrunch/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2425,9 +2425,16 @@ def fork(self, description=None, name=None, is_published=False,
else:
if project:
# Create fork in given Project path.
body["project"] = (
project if project.startswith("http") else get_project(project).url
)
try:
project_url = get_project(project).url
except KeyError:
# Creating full project URL for sub-folders
project_url = "{}/projects/{}/".format(
self.resource.session.site_url,
project
)
finally:
body["project"] = project_url
else:
raise ValueError(
"Project parameter should be provided when preserve_owner=False."
Expand Down
34 changes: 18 additions & 16 deletions scrunch/tests/test_datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -1781,7 +1781,7 @@ def _create(*args):


def test_fork_project(self):
project = 'https://test.crunch.io/api/projects/1234/'
project = '1234'
sess = MagicMock()
body = JSONObject({
'name': 'ds name',
Expand All @@ -1798,46 +1798,45 @@ def test_fork_project(self):
'body': {
'name': 'FORK #1 of ds name',
'description': 'ds description',
'project': project, # Project added
'project': "https://test.crunch.io/api/projects/{}/".format(project), # Project added
'is_published': False,
}
}
# Using project parameter
ds.fork(preserve_owner=False, project=project)
ds_res.forks.create.assert_called_with(expected_payload)

# Using owner parameter
ds.fork(preserve_owner=False, owner=project)
ds_res.forks.create.assert_called_with(expected_payload)
with mock.patch('scrunch.datasets.get_project') as mock_get_project:
mock_get_project.return_value.url = project
ds.fork(preserve_owner=False, project=project)


# Validations
err_msg1 = (
"Cannot pass both 'project' & 'owner' parameters together. "
"Please try again by passing only 'project' parameter."
)
with pytest.raises(ValueError, match=err_msg1):
ds.fork(owner="ABCD", project="1234")
ds.fork(owner="ABCD", project=project)

err_msg2 = ("Cannot pass 'project' or 'owner' when preserve_owner=True.")
with pytest.raises(ValueError, match=err_msg2):
ds.fork(preserve_owner=True, project="1234")
ds.fork(preserve_owner=True, project=project)

with pytest.raises(ValueError, match=err_msg2):
ds.fork(preserve_owner=True, owner="1234")
ds.fork(preserve_owner=True, owner=project)


def test_fork_preserve_owner(self):
project = "http://test.crunch.io/api/projects/123/"
project_url = "http://test.crunch.io/api/projects/123/"
sess = MagicMock()
sess.site_url = "http://test.crunch.io/api/"
body = JSONObject(
{
"name": "ds name",
"description": "ds description",
"owner": project,
"owner": project_url,
}
)
ds_res = MagicMock(session=sess, body=body)
ds_res.project.self = project
ds_res.project.self = project_url
ds_res.forks = MagicMock()
ds_res.forks.index = {}
ds = BaseDataset(ds_res)
Expand All @@ -1849,14 +1848,17 @@ def test_fork_preserve_owner(self):
):
ds.fork(preserve_owner=False, project=None)

ds.fork(preserve_owner=False, owner=project)
with mock.patch('scrunch.datasets.get_project') as mock_get_project:
mock_get_project.return_value.url = project_url
ds.fork(preserve_owner=False, project="123")

ds_res.forks.create.assert_called_with(
{
"element": "shoji:entity",
"body": {
"name": "FORK #1 of ds name",
"description": "ds description",
"project": project, # Project preserved
"project": project_url,
"is_published": False,
},
}
Expand Down

0 comments on commit ec9ef20

Please sign in to comment.