Skip to content

Commit 744259b

Browse files
committed
Refactor importer/improver registry
Signed-off-by: Hritik Vijay <hritikxx8@gmail.com>
1 parent 12c842e commit 744259b

5 files changed

Lines changed: 32 additions & 23 deletions

File tree

vulnerabilities/import_runner.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import datetime
2626
import json
2727
import logging
28-
from typing import Set
28+
from typing import List
2929
from typing import Iterable
3030

3131

@@ -55,18 +55,22 @@ def run(self) -> None:
5555
"""
5656
Create a data source for the given importer and store the data retrieved in the database.
5757
"""
58-
logger.info(f"Starting import for {self.importer.qualified_name}")
59-
advisory_datas = self.importer().advisory_data()
6058
importer_name = self.importer.qualified_name
61-
process_advisories(advisory_datas=advisory_datas, importer_name=importer_name)
62-
logger.info(f"Finished import for {self.importer.qualified_name}.")
59+
importer_class = self.importer
60+
logger.info(f"Starting import for {importer_name}")
61+
advisory_datas = importer_class().advisory_data()
62+
count = process_advisories(advisory_datas=advisory_datas, importer_name=importer_name)
63+
logger.info(
64+
f"Finished import for {importer_name}. Imported {count} advisories."
65+
)
6366

6467

65-
def process_advisories(advisory_datas: Iterable[AdvisoryData], importer_name: str) -> None:
68+
def process_advisories(advisory_datas: Iterable[AdvisoryData], importer_name: str) -> List:
6669
"""
6770
Insert advisories into the database
71+
Return list of ids of inserted advisories
6872
"""
69-
73+
count = 0
7074
for data in advisory_datas:
7175
obj, created = Advisory.objects.get_or_create(
7276
aliases=data.aliases,
@@ -83,5 +87,8 @@ def process_advisories(advisory_datas: Iterable[AdvisoryData], importer_name: st
8387
logger.info(
8488
f"[*] New Advisory with aliases: {obj.aliases!r}, created_by: {obj.created_by}"
8589
)
90+
count += 1
8691
else:
8792
logger.debug(f"Advisory with aliases: {obj.aliases!r} already exists. Skipped.")
93+
94+
return count

vulnerabilities/importers/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@
2121
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222
from vulnerabilities.importers import nginx
2323

24-
IMPORTER_REGISTRY = [nginx.NginxDataSource]
24+
IMPORTERS = [nginx.NginxDataSource]
2525

26-
importer_mapping = {x.qualified_name: x for x in IMPORTER_REGISTRY}
26+
IMPORTER_REGISTRY = {x.qualified_name: x for x in IMPORTERS}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from vulnerabilities.improvers import default
22
from vulnerabilities import importers
33

4-
IMPROVER_REGISTRY = [default.DefaultImprover, importers.nginx.NginxBasicImprover]
4+
IMPROVERS = [default.DefaultImprover, importers.nginx.NginxBasicImprover]
55

6-
improver_mapping = {x.qualified_name: x for x in IMPROVER_REGISTRY}
6+
IMPROVER_REGISTRY = {x.qualified_name: x for x in IMPROVERS}

vulnerabilities/management/commands/import.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from django.core.management.base import CommandError
2828

2929
from vulnerabilities.importers import IMPORTER_REGISTRY
30-
from vulnerabilities.importers import importer_mapping
3130
from vulnerabilities.import_runner import ImportRunner
3231

3332

@@ -54,7 +53,7 @@ def handle(self, *args, **options):
5453
return
5554

5655
if options["all"]:
57-
self.import_data(IMPORTER_REGISTRY)
56+
self.import_data(IMPORTER_REGISTRY.values())
5857
return
5958

6059
sources = options["sources"]
@@ -63,14 +62,18 @@ def handle(self, *args, **options):
6362
'Please provide at least one data source to import from or use "--all".'
6463
)
6564

66-
self.import_data(valid_sources(sources))
65+
self.import_data(validate_importers(sources))
6766

6867
def list_sources(self):
69-
importers = [importer.qualified_name for importer in IMPORTER_REGISTRY]
68+
importers = list(IMPORTER_REGISTRY)
7069
self.stdout.write("Vulnerability data can be imported from the following sources:")
7170
self.stdout.write("\n".join(importers))
7271

7372
def import_data(self, importers):
73+
"""
74+
Run the given ``importers``. The ``importers`` are expected to be class
75+
names for the importers.
76+
"""
7477
failed_importers = []
7578

7679
for importer in importers:
@@ -95,12 +98,12 @@ def import_data(self, importers):
9598
raise CommandError(f"{len(failed_importers)} failed!: {','.join(failed_importers)}")
9699

97100

98-
def valid_sources(sources):
101+
def validate_importers(sources):
99102
importers = []
100103
unknown_sources = []
101104
for source in sources:
102105
try:
103-
importers.append(importer_mapping[source])
106+
importers.append(IMPORTER_REGISTRY[source])
104107
except KeyError:
105108
unknown_sources.append(source)
106109
if unknown_sources:

vulnerabilities/management/commands/improve.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
from vulnerabilities.import_runner import ImportRunner
3030
from vulnerabilities.improvers import IMPROVER_REGISTRY
31-
from vulnerabilities.improvers import improver_mapping
3231
from vulnerabilities.improve_runner import ImproveRunner
3332

3433

@@ -52,17 +51,17 @@ def handle(self, *args, **options):
5251
return
5352

5453
if options["all"]:
55-
self.improve_data(IMPROVER_REGISTRY)
54+
self.improve_data(IMPROVER_REGISTRY.values())
5655
return
5756

5857
sources = options["sources"]
5958
if not sources:
6059
raise CommandError('Please provide at least one improver to run use "--all".')
6160

62-
self.improve_data(valid_sources(sources))
61+
self.improve_data(validate_improvers(sources))
6362

6463
def list_sources(self):
65-
improvers = [improver.qualified_name for improver in IMPROVER_REGISTRY]
64+
improvers = list(IMPROVER_REGISTRY)
6665
self.stdout.write("Vulnerability data can be processed by these available improvers:\n")
6766
self.stdout.write("\n".join(improvers))
6867

@@ -91,12 +90,12 @@ def improve_data(self, improvers):
9190
raise CommandError(f"{len(failed_improvers)} failed!: {','.join(failed_improvers)}")
9291

9392

94-
def valid_sources(sources):
93+
def validate_improvers(sources):
9594
improvers = []
9695
unknown_sources = []
9796
for source in sources:
9897
try:
99-
improvers.append(improver_mapping[source])
98+
improvers.append(IMPROVER_REGISTRY[source])
10099
except KeyError:
101100
unknown_sources.append(source)
102101
if unknown_sources:

0 commit comments

Comments
 (0)