77import sys
88import tempfile
99
10+
1011def quote_if_needed (v ):
1112 # string columns
1213 if type (v ) is str :
13- return " \" " + v + " \" "
14+ return '"' + v + '"'
1415 # bool column
1516 return str (v )
1617
18+
1719def parseData (data ):
18- rows = [{ }, { }]
20+ rows = [{}, {}]
1921 for row in data :
2022 d = map (quote_if_needed , row )
2123 provenance = row [- 1 ]
2224 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 " )
2426
2527 return rows
2628
29+
2730class Converter :
2831 def __init__ (self , language , dbDir ):
2932 self .language = language
3033 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+ )
3239 self .extDir = os .path .join (self .codeQlRoot , f"{ self .language } /ql/lib/ext/" )
3340 self .dirname = "modelconverter"
3441 self .modelFileExtension = ".model.yml"
3542 self .workDir = tempfile .mkdtemp ()
3643
37-
3844 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+ )
4149 resultBqrs = os .path .join (self .workDir , "out.bqrs" )
4250
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+ )
4464 return helpers .readData (self .workDir , resultBqrs )
4565
46-
4766 def asAddsTo (self , rows , predicate ):
48- extensions = [{ }, { }]
67+ extensions = [{}, {}]
4968 for i in range (2 ):
5069 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+ )
5473
74+ return extensions
5575
5676 def getAddsTo (self , query , predicate ):
5777 data = self .runQuery (query )
5878 rows = parseData (data )
5979 return self .asAddsTo (rows , predicate )
6080
61-
6281 def makeContent (self ):
6382 summaries = self .getAddsTo ("ExtractSummaries.ql" , helpers .summaryModelPredicate )
6483 sources = self .getAddsTo ("ExtractSources.ql" , helpers .sourceModelPredicate )
6584 sinks = self .getAddsTo ("ExtractSinks.ql" , helpers .sinkModelPredicate )
6685 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+ ]
6990
7091 def save (self , extensions ):
7192 # Create directory if it doesn't exist
@@ -77,9 +98,11 @@ def save(self, extensions):
7798 for entry in extensions [0 ]:
7899 with open (self .extDir + "/" + entry + self .modelFileExtension , "w" ) as f :
79100 f .write (extensionTemplate .format (extensions [0 ][entry ]))
80-
101+
81102 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 :
83106 f .write (extensionTemplate .format (extensions [1 ][entry ]))
84107
85108 def run (self ):
0 commit comments