Skip to content

Commit 96fc287

Browse files
authored
Fix the ability to provide multiple optional step in API #1454 (#1455)
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent 6e46957 commit 96fc287

File tree

4 files changed

+44
-37
lines changed

4 files changed

+44
-37
lines changed

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ v34.9.1 (unreleased)
1010
parameters.
1111
https://github.com/aboutcode-org/scancode.io/issues/1449
1212

13+
- Fix the ability to provide multiple optional step when defining pipelines in the
14+
REST API.
15+
The support for providing pipeline names as a comma-separated single string was
16+
remove as the comma is used as the optional step separator.
17+
Use a list of pipeline names instead.
18+
https://github.com/aboutcode-org/scancode.io/issues/1454
19+
1320
v34.9.0 (2024-11-14)
1421
--------------------
1522

docs/rest-api.rst

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,9 @@ Using cURL:
129129
.. tip::
130130

131131
You can declare multiple pipelines to be executed at the project creation using a
132-
list of pipeline names or a comma-separated string:
132+
list of pipeline names:
133133

134-
- ``"pipeline": ["scan_single_package", "scan_for_virus"]``
135-
- ``"pipeline": "scan_single_package,scan_for_virus"``
134+
``"pipeline": ["scan_single_package", "scan_for_virus"]``
136135

137136
.. tip::
138137

scanpipe/api/serializers.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ def to_internal_value(self, data):
8484
if not self.allow_empty and len(data) == 0:
8585
self.fail("empty")
8686

87-
# Adds support for providing pipeline names as a comma-separated single string.
88-
data = [item.strip() for value in data for item in value.split(",")]
89-
9087
# Pipeline validation
9188
for pipeline in data:
9289
pipeline_name, _ = scanpipe_app.extract_group_from_pipeline(pipeline)

scanpipe/tests/test_api.py

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -442,44 +442,23 @@ def test_scanpipe_api_project_create_multiple_pipelines(self):
442442
"scan_single_package", response.data["runs"][1]["pipeline_name"]
443443
)
444444

445+
# Not supported as the comma `,` is used as the separator for optional steps.
445446
data = {
446447
"name": "Multi string",
447448
"pipeline": "analyze_docker_image,scan_single_package",
448449
}
449450
response = self.csrf_client.post(self.project_list_url, data)
450-
self.assertEqual(status.HTTP_201_CREATED, response.status_code)
451-
self.assertEqual(2, len(response.data["runs"]))
452-
self.assertEqual(
453-
"analyze_docker_image", response.data["runs"][0]["pipeline_name"]
454-
)
455-
self.assertEqual(
456-
"scan_single_package", response.data["runs"][1]["pipeline_name"]
457-
)
458-
459-
data = {
460-
"name": "Mix of string and list plus selected groups",
451+
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
452+
expected = {
461453
"pipeline": [
462-
"analyze_docker_image",
463-
"inspect_packages:StaticResolver,scan_single_package",
464-
],
454+
ErrorDetail(
455+
string='"analyze_docker_image,scan_single_package" is not a valid '
456+
"choice.",
457+
code="invalid_choice",
458+
)
459+
]
465460
}
466-
response = self.csrf_client.post(self.project_list_url, data)
467-
self.assertEqual(status.HTTP_201_CREATED, response.status_code)
468-
self.assertEqual(
469-
"analyze_docker_image", response.data["runs"][0]["pipeline_name"]
470-
)
471-
self.assertEqual("inspect_packages", response.data["runs"][1]["pipeline_name"])
472-
self.assertEqual(
473-
"scan_single_package", response.data["runs"][2]["pipeline_name"]
474-
)
475-
self.assertEqual(
476-
["StaticResolver"], response.data["runs"][1]["selected_groups"]
477-
)
478-
runs = Project.objects.get(name=data["name"]).runs.all()
479-
self.assertEqual("analyze_docker_image", runs[0].pipeline_name)
480-
self.assertEqual("inspect_packages", runs[1].pipeline_name)
481-
self.assertEqual("scan_single_package", runs[2].pipeline_name)
482-
self.assertEqual(["StaticResolver"], runs[1].selected_groups)
461+
self.assertEqual(expected, response.data)
483462

484463
def test_scanpipe_api_project_create_pipeline_old_name_compatibility(self):
485464
data = {
@@ -532,6 +511,31 @@ def test_scanpipe_api_project_create_pipeline_groups(self):
532511
self.assertEqual("inspect_packages", run.pipeline_name)
533512
self.assertEqual(["StaticResolver"], run.selected_groups)
534513

514+
data = {
515+
"name": "Mix of string and list plus selected groups",
516+
"pipeline": [
517+
"map_deploy_to_develop:Java,JavaScript",
518+
"inspect_packages:StaticResolver",
519+
],
520+
}
521+
response = self.csrf_client.post(self.project_list_url, data)
522+
self.assertEqual(status.HTTP_201_CREATED, response.status_code)
523+
self.assertEqual(
524+
"map_deploy_to_develop", response.data["runs"][0]["pipeline_name"]
525+
)
526+
self.assertEqual("inspect_packages", response.data["runs"][1]["pipeline_name"])
527+
self.assertEqual(
528+
["Java", "JavaScript"], response.data["runs"][0]["selected_groups"]
529+
)
530+
self.assertEqual(
531+
["StaticResolver"], response.data["runs"][1]["selected_groups"]
532+
)
533+
runs = Project.objects.get(name=data["name"]).runs.all()
534+
self.assertEqual("map_deploy_to_develop", runs[0].pipeline_name)
535+
self.assertEqual("inspect_packages", runs[1].pipeline_name)
536+
self.assertEqual(["Java", "JavaScript"], runs[0].selected_groups)
537+
self.assertEqual(["StaticResolver"], runs[1].selected_groups)
538+
535539
def test_scanpipe_api_project_create_webhooks(self):
536540
data = {
537541
"name": "Project1",

0 commit comments

Comments
 (0)