Skrpio sam neku skripticu za sebe, pa da podelim :)
Skripta nalazi iz druge .py skripte sve (bar se nadam) Qt klase i pomocu dokumentacije na http://doc.trolltech.com/4.4/ odredjuje koju Qt klasu iz kog Qt modula treba importovati. Cisto da se ne radi from PyQt4.QtCore import * :)
Ako se ode na stranicu neke klase, primera radi http://doc.trolltech.com/4.4/qaction.html ispod glavnog naslova stoji kom modulu pripada data klasa. U html source-u je to red 15.
Kod:
Code:
#!/usr/bin python
'''pyqtdependency.py a script to grab all Qt classes from a .py script
and see from which Qt module should those classes be imported'''
import sys
import os
import re
import urllib2
import string
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Bah! I need a file to process!"
sys.exit()
modules = {}
classes = []
'''patt finds from rows like:
class Spam(QWidget):
qidget = QWidget()
action = QAction(QIcon(...))'''
patt = re.compile('.*(Q[A-Z]{1}[a-zA-Z]+)[(.*]')
'''On row 15 there's only 1 anchor tag with the module name in it'''
patt2 = re.compile('(Q[a-zA-Z]+)</a>')
file = sys.argv[1]
fp = open(file, 'rb')
lines = fp.readlines()
fp.close()
for line in lines:
match = patt.search(line)
if match is not None:
match = match.group(1)
if match not in classes:
classes.append(match)
for cl in classes:
url = 'http://doc.trolltech.com/4.4/%s.html' % string.lower(cl)
resp = urllib2.urlopen(url)
'''The module name is in row 15, go there'''
for i in range(0,15):
if i < 14:
resp.next()
elif i == 14:
match = patt2.search(resp.readline())
match = match.group(1)
else:
break
if match in modules:
modules[match].append(cl)
else:
modules[match] = [cl]
print modules
#!/usr/bin python
'''pyqtdependency.py a script to grab all Qt classes from a .py script
and see from which Qt module should those classes be imported'''
import sys
import os
import re
import urllib2
import string
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Bah! I need a file to process!"
sys.exit()
modules = {}
classes = []
'''patt finds from rows like:
class Spam(QWidget):
qidget = QWidget()
action = QAction(QIcon(...))'''
patt = re.compile('.*(Q[A-Z]{1}[a-zA-Z]+)[(.*]')
'''On row 15 there's only 1 anchor tag with the module name in it'''
patt2 = re.compile('(Q[a-zA-Z]+)</a>')
file = sys.argv[1]
fp = open(file, 'rb')
lines = fp.readlines()
fp.close()
for line in lines:
match = patt.search(line)
if match is not None:
match = match.group(1)
if match not in classes:
classes.append(match)
for cl in classes:
url = 'http://doc.trolltech.com/4.4/%s.html' % string.lower(cl)
resp = urllib2.urlopen(url)
'''The module name is in row 15, go there'''
for i in range(0,15):
if i < 14:
resp.next()
elif i == 14:
match = patt2.search(resp.readline())
match = match.group(1)
else:
break
if match in modules:
modules[match].append(cl)
else:
modules[match] = [cl]
print modules
Skripta je dosta gruba, nema nikakvih provera na greske, ali radi :) Pozivanje je jednostavno: ./qtDependency.py imeskripte.py
Primer output-a:
Code:
{'QtCore': ['QTranslator'], 'QtGui': ['QMainWindow', 'QMessageBox', 'QApplication']}
{'QtCore': ['QTranslator'], 'QtGui': ['QMainWindow', 'QMessageBox', 'QApplication']}
Za sada sam proveravao samo sa skriptama koje imaju QtCore i QtGui module, mada, trebalo bi da radi i sa ostalima.
Osim provere na greske, moze jos da se ubaci da koristi dokumentaciju sa file sistema, da nalazi stvari kao sto su Qt.WA_DeleteOnClose itd.
Interesuje me, da li ima (a mora da ima :D) neki efikasniji nacin citanja 15og reda iz html-a?
Svako dobro :)
Edit: promenio sam ime u pyqtdependency.py, da bude jasnije.
Takodje, nabacio sam na Google Code http://code.google.com/p/pyqtdependency/
[Ovu poruku je menjao kazil dana 18.03.2009. u 21:51 GMT+1]
[Ovu poruku je menjao kazil dana 18.03.2009. u 21:51 GMT+1]