Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5e98ff4

Browse files
committed
Python: Add script to process results from MRVA (bqrs files)
Also makes `empty.model.yml` empty once again
1 parent 451a210 commit 5e98ff4

2 files changed

Lines changed: 69 additions & 28 deletions

File tree

python/ql/lib/semmle/python/frameworks/data/internal/empty.model.yml

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,34 +23,7 @@ extensions:
2323
- addsTo:
2424
pack: codeql/python-all
2525
extensible: typeModel
26-
data:
27-
- ["flask.MethodView~Subclass","flask_restplus","Member[api].Member[SwaggerView]"]
28-
- ["flask.MethodView~Subclass","flask_restplus","Member[resource].Member[Resource]"]
29-
- ["flask.MethodView~Subclass","flask_restplus","Member[api].Member[Resource]"]
30-
- ["flask.MethodView~Subclass","flask_restplus","Member[resource].Member[MethodView]"]
31-
- ["flask.MethodView~Subclass","flask_restplus","Member[Resource]"]
32-
33-
- ["flask.MethodView~Subclass","flask_restx","Member[api].Member[SwaggerView]"]
34-
- ["flask.MethodView~Subclass","flask_restx","Member[resource].Member[Resource]"]
35-
- ["flask.MethodView~Subclass","flask_restx","Member[api].Member[Resource]"]
36-
- ["flask.MethodView~Subclass","flask_restx","Member[resource].Member[MethodView]"]
37-
- ["flask.MethodView~Subclass","flask_restx","Member[Resource]"]
38-
39-
- ["flask.MethodView~Subclass", "flask_restful", "Member[Resource]"]
40-
41-
- ["fastapi.APIRouter~Subclass","fastapi_utils","Member[inferring_router].Member[InferringRouter]"]
42-
- ["fastapi.APIRouter~Subclass","fastapi_utils","Member[inferring_router].Member[APIRouter]"]
43-
- ["fastapi.APIRouter~Subclass","fastapi_utils","Member[cbv].Member[APIRouter]"]
44-
45-
- ["django.forms.BaseForm~Subclass","haystack","Member[forms].Member[ModelSearchForm]"]
46-
- ["django.forms.BaseForm~Subclass","haystack","Member[forms].Member[SearchForm]"]
47-
- ["django.forms.BaseForm~Subclass","haystack","Member[forms].Member[FacetedSearchForm]"]
48-
- ["django.forms.BaseForm~Subclass","haystack","Member[forms].Member[HighlightedSearchForm]"]
49-
- ["django.forms.BaseForm~Subclass","haystack","Member[forms].Member[HighlightedModelSearchForm]"]
50-
- ["django.forms.BaseForm~Subclass","haystack","Member[forms].Member[FacetedModelSearchForm]"]
51-
- ["django.forms.BaseForm~Subclass","haystack","Member[views].Member[FacetedSearchForm]"]
52-
- ["django.forms.BaseForm~Subclass","haystack","Member[views].Member[ModelSearchForm]"]
53-
26+
data: []
5427

5528
- addsTo:
5629
pack: codeql/python-all
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env python3
2+
3+
import sys
4+
import glob
5+
from pathlib import Path
6+
import json
7+
import subprocess
8+
from collections import defaultdict
9+
import yaml
10+
11+
VERSION = "process-mrva-results 0.0.1"
12+
13+
mad_path = Path(__file__).parent.parent.parent.parent / "lib/semmle/python/frameworks/data/internal/"
14+
15+
assert mad_path.exists(), mad_path
16+
17+
package_data = defaultdict(set)
18+
19+
# gather data
20+
for f in glob.glob(f"{sys.argv[1]}/**/results/results.bqrs", recursive=True):
21+
print(f"Processing {f}")
22+
23+
json_data = subprocess.check_output(["codeql", "bqrs", "decode", "--format=json", f])
24+
select = json.loads(json_data)
25+
26+
for t in select["#select"]["tuples"]:
27+
pkg = t[1]
28+
package_data[pkg].add(tuple(t))
29+
30+
# process data
31+
32+
def wrap_in_template(data):
33+
return {
34+
"extensions": [
35+
{
36+
"addsTo": {
37+
"pack": "codeql/python-all",
38+
"extensible": "typeModel",
39+
},
40+
"data": data,
41+
}
42+
]
43+
}
44+
45+
def parse_from_file(path):
46+
if not path.exists():
47+
return set()
48+
49+
text = path.read_text()
50+
assert text.startswith(f"# {VERSION}\n"), f"{path}: {text[:100]}"
51+
52+
raw_data = yaml.safe_load(text)
53+
assert len(raw_data["extensions"]) == 1, path
54+
assert raw_data["extensions"][0]["addsTo"]["extensible"] == "typeModel", path
55+
56+
return set(tuple(x) for x in raw_data["extensions"][0]["data"])
57+
58+
for pkg in package_data:
59+
pkg_path = mad_path / f"auto-{pkg}.model.yml"
60+
61+
all_data = parse_from_file(pkg_path)
62+
all_data.update(package_data[pkg])
63+
64+
as_lists = [list(t) for t in all_data]
65+
66+
data_for_yaml = wrap_in_template(as_lists)
67+
68+
pkg_path.write_text(f"# {VERSION}\n" + yaml.dump(data_for_yaml, indent=2))

0 commit comments

Comments
 (0)