diff --git a/scanpipe/pipes/__init__.py b/scanpipe/pipes/__init__.py index 7fd885c36f..f1cb46c629 100644 --- a/scanpipe/pipes/__init__.py +++ b/scanpipe/pipes/__init__.py @@ -171,6 +171,20 @@ def update_or_create_resource(project, resource_data): def _clean_package_data(package_data): """Clean provided `package_data` to make it compatible with the model.""" package_data = package_data.copy() + boolean_fields = { + field.name + for field in DiscoveredPackage._meta.fields + if field.get_internal_type() == "BooleanField" + } + + for key in boolean_fields: + value = package_data.get(key) + if isinstance(value, str): + lower = value.lower() + if lower == "true": + package_data[key] = True + elif lower == "false": + package_data[key] = False if release_date := package_data.get("release_date"): if type(release_date) is str: release_date = release_date.removesuffix("Z") diff --git a/scanpipe/tests/pipes/test_pipes.py b/scanpipe/tests/pipes/test_pipes.py index ee0ab3a88f..167f346cb6 100644 --- a/scanpipe/tests/pipes/test_pipes.py +++ b/scanpipe/tests/pipes/test_pipes.py @@ -33,6 +33,7 @@ from scanpipe.models import CodebaseResource from scanpipe.models import DiscoveredPackage from scanpipe.models import Project +from scanpipe.pipes import _clean_package_data from scanpipe.pipes import flag from scanpipe.pipes import get_resource_diff_ratio from scanpipe.pipes import get_text_str_diff_ratio @@ -448,3 +449,15 @@ def test_scanpipe_pipes_collect_and_create_codebase_resources(self): self.assertEqual("from", from_resource.tag) to_resource = p1.codebaseresources.get(path="to/a.txt") self.assertEqual("to", to_resource.tag) + + def test_clean_package_data_normalizes_boolean_strings(self): + package_data = { + "type": "npm", + "name": "react", + "version": "1.0", + "is_virtual": "true", + } + + cleaned = _clean_package_data(package_data) + + self.assertTrue(cleaned["is_virtual"])