7
7
import sys
8
8
import tempfile
9
9
10
+
10
11
def quote_if_needed (v ):
11
12
# string columns
12
13
if type (v ) is str :
13
- return " \" " + v + " \" "
14
+ return '"' + v + '"'
14
15
# bool column
15
16
return str (v )
16
17
18
+
17
19
def parseData (data ):
18
- rows = [{ }, { }]
20
+ rows = [{}, {}]
19
21
for row in data :
20
22
d = map (quote_if_needed , row )
21
23
provenance = row [- 1 ]
22
24
targetRows = rows [1 ] if provenance .endswith ("generated" ) else rows [0 ]
23
- helpers .insert_update (targetRows , row [0 ], " - [" + ', ' .join (d ) + ' ]\n ' )
25
+ helpers .insert_update (targetRows , row [0 ], " - [" + ", " .join (d ) + " ]\n " )
24
26
25
27
return rows
26
28
29
+
27
30
class Converter :
28
31
def __init__ (self , language , dbDir ):
29
32
self .language = language
30
33
self .dbDir = dbDir
31
- self .codeQlRoot = subprocess .check_output (["git" , "rev-parse" , "--show-toplevel" ]).decode ("utf-8" ).strip ()
34
+ self .codeQlRoot = (
35
+ subprocess .check_output (["git" , "rev-parse" , "--show-toplevel" ])
36
+ .decode ("utf-8" )
37
+ .strip ()
38
+ )
32
39
self .extDir = os .path .join (self .codeQlRoot , f"{ self .language } /ql/lib/ext/" )
33
40
self .dirname = "modelconverter"
34
41
self .modelFileExtension = ".model.yml"
35
42
self .workDir = tempfile .mkdtemp ()
36
43
37
-
38
44
def runQuery (self , query ):
39
- print ('########## Querying: ' , query )
40
- queryFile = os .path .join (self .codeQlRoot , f"{ self .language } /ql/src/utils/{ self .dirname } " , query )
45
+ print ("########## Querying: " , query )
46
+ queryFile = os .path .join (
47
+ self .codeQlRoot , f"{ self .language } /ql/src/utils/{ self .dirname } " , query
48
+ )
41
49
resultBqrs = os .path .join (self .workDir , "out.bqrs" )
42
50
43
- helpers .run_cmd (['codeql' , 'query' , 'run' , queryFile , '--database' , self .dbDir , '--output' , resultBqrs ], "Failed to generate " + query )
51
+ helpers .run_cmd (
52
+ [
53
+ "codeql" ,
54
+ "query" ,
55
+ "run" ,
56
+ queryFile ,
57
+ "--database" ,
58
+ self .dbDir ,
59
+ "--output" ,
60
+ resultBqrs ,
61
+ ],
62
+ "Failed to generate " + query ,
63
+ )
44
64
return helpers .readData (self .workDir , resultBqrs )
45
65
46
-
47
66
def asAddsTo (self , rows , predicate ):
48
- extensions = [{ }, { }]
67
+ extensions = [{}, {}]
49
68
for i in range (2 ):
50
69
for key in rows [i ]:
51
- extensions [i ][key ] = helpers .addsToTemplate .format (f"codeql/ { self . language } -all" , predicate , rows [ i ][ key ])
52
-
53
- return extensions
70
+ extensions [i ][key ] = helpers .addsToTemplate .format (
71
+ f"codeql/ { self . language } -all" , predicate , rows [ i ][ key ]
72
+ )
54
73
74
+ return extensions
55
75
56
76
def getAddsTo (self , query , predicate ):
57
77
data = self .runQuery (query )
58
78
rows = parseData (data )
59
79
return self .asAddsTo (rows , predicate )
60
80
61
-
62
81
def makeContent (self ):
63
82
summaries = self .getAddsTo ("ExtractSummaries.ql" , helpers .summaryModelPredicate )
64
83
sources = self .getAddsTo ("ExtractSources.ql" , helpers .sourceModelPredicate )
65
84
sinks = self .getAddsTo ("ExtractSinks.ql" , helpers .sinkModelPredicate )
66
85
neutrals = self .getAddsTo ("ExtractNeutrals.ql" , helpers .neutralModelPredicate )
67
- return [helpers .merge (sources [0 ], sinks [0 ], summaries [0 ], neutrals [0 ]), helpers .merge (sources [1 ], sinks [1 ], summaries [1 ], neutrals [1 ])]
68
-
86
+ return [
87
+ helpers .merge (sources [0 ], sinks [0 ], summaries [0 ], neutrals [0 ]),
88
+ helpers .merge (sources [1 ], sinks [1 ], summaries [1 ], neutrals [1 ]),
89
+ ]
69
90
70
91
def save (self , extensions ):
71
92
# Create directory if it doesn't exist
@@ -77,9 +98,11 @@ def save(self, extensions):
77
98
for entry in extensions [0 ]:
78
99
with open (self .extDir + "/" + entry + self .modelFileExtension , "w" ) as f :
79
100
f .write (extensionTemplate .format (extensions [0 ][entry ]))
80
-
101
+
81
102
for entry in extensions [1 ]:
82
- with open (self .extDir + "/generated/" + entry + self .modelFileExtension , "w" ) as f :
103
+ with open (
104
+ self .extDir + "/generated/" + entry + self .modelFileExtension , "w"
105
+ ) as f :
83
106
f .write (extensionTemplate .format (extensions [1 ][entry ]))
84
107
85
108
def run (self ):
0 commit comments