Skip to content
Closed
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
14 changes: 14 additions & 0 deletions scanpipe/pipes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
13 changes: 13 additions & 0 deletions scanpipe/tests/pipes/test_pipes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"])