Collect stats on how many plugins have been ported to Qt 5

This commit is contained in:
Kovid Goyal 2014-07-18 12:41:12 +05:30
parent aa4a24f2f0
commit 9289d6a4eb

View File

@ -229,7 +229,18 @@ def parse_metadata(raw, namelist, zf):
raise ValueError('Could not find plugin class')
def get_plugin_info(raw):
def check_qt5_compatibility(zf, names):
uses_qt = False
for name in names:
if name.endswith('.py'):
raw = zf.read(name)
has_qt4 = b'PyQt4' in raw
uses_qt = uses_qt or has_qt4
if uses_qt and has_qt4 and b'PyQt5' not in raw:
return False
return True
def get_plugin_info(raw, check_for_qt5=False):
metadata = None
with zipfile.ZipFile(io.BytesIO(raw)) as zf:
names = {x.decode('utf-8') if isinstance(x, bytes) else x : x for x in zf.namelist()}
@ -248,6 +259,8 @@ def get_plugin_info(raw):
raw = zf.open(metadata).read()
ans = parse_metadata(raw, names, zf)
if isinstance(ans, dict):
if check_for_qt5:
ans['qt5'] = check_qt5_compatibility(zf, names)
return ans
# The plugin is importing its base class from somewhere else, le sigh
for mod, _ in ans:
@ -259,6 +272,8 @@ def get_plugin_info(raw):
raw = zf.open(names[mod]).read()
ans = parse_metadata(raw, names, zf)
if isinstance(ans, dict):
if check_for_qt5:
ans['qt5'] = check_qt5_compatibility(zf, names)
return ans
raise ValueError('Failed to find plugin class')
@ -498,6 +513,43 @@ def update_stats():
json.dump(stats, f, indent=2)
return stats
def check_for_qt5_incompatibility():
ok_plugins, bad_plugins = [], []
for name in os.listdir('.'):
if name.endswith('.zip') and not name.endswith('-deprecated.zip'):
with open(name, 'rb') as f:
info = get_plugin_info(f.read(), check_for_qt5=True)
if info['qt5']:
ok_plugins.append(info)
else:
bad_plugins.append(info)
plugs = ['<li>%s</li>' % x['name'] for x in bad_plugins]
stats = '''
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Stats for porting of calibre plugins to Qt 5</title>
<link rel="icon" type="image/x-icon" href="http://calibre-ebook.com/favicon.ico" />
<style type="text/css">
body { background-color: #eee; }
h1 img, h3 img { vertical-align: middle; margin-right: 0.5em; }
h1 { text-align: center }
</style>
</head>
<body>
<h1><img src="http://manual.calibre-ebook.com/_static/logo.png">Stats for porting of calibre plugins to Qt 5</h1>
<p>Number of Qt 5 compatible plugins: %s<br>Number of Qt 5 incompatible plugins: %s<br>Percentage of plugins ported: %.0f%%</p>
<h2>Plugins still to be ported</h2>
<ul>
%s
</ul>
</body>
</html>
''' % (len(ok_plugins), len(bad_plugins), len(ok_plugins)/(len(ok_plugins) + len(bad_plugins)) * 100,
'\n'.join(sorted(plugs, key=lambda x:x.lower())))
with open('porting.html', 'wb') as f:
f.write(stats.encode('utf-8'))
def main():
try:
os.chdir(WORKDIR)
@ -519,6 +571,7 @@ def main():
plugins_index = load_plugins_index()
plugins_index = fetch_plugins(plugins_index)
create_index(plugins_index, stats)
check_for_qt5_incompatibility()
except:
import traceback
log('Failed to run at:', datetime.utcnow().isoformat())