From e99ab7e002a05375085d496272bc7d3605b11979 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 21 Nov 2021 22:18:20 +0530 Subject: [PATCH] Dont import calibre.gui2 to build forms --- setup/gui.py | 2 +- setup/port.py | 14 ++++--- src/calibre/build_forms.py | 72 ++++++++++++++++++++++++++++++++++++ src/calibre/gui2/__init__.py | 63 +------------------------------ 4 files changed, 83 insertions(+), 68 deletions(-) create mode 100644 src/calibre/build_forms.py diff --git a/setup/gui.py b/setup/gui.py index 17c880d122..8405668c1b 100644 --- a/setup/gui.py +++ b/setup/gui.py @@ -66,7 +66,7 @@ class GUI(Command): os.chdir(cwd) def build_forms(self, summary=False): - from calibre.gui2 import build_forms + from calibre.build_forms import build_forms build_forms(self.SRC, info=self.info, summary=summary) def clean(self): diff --git a/setup/port.py b/setup/port.py index 7449f7b6ea..34c5518099 100644 --- a/setup/port.py +++ b/setup/port.py @@ -13,9 +13,13 @@ class To6(Command): description = 'Toggle between the Qt6 and master branches building everything needed' + def ccall(self, *a): + self.info(*a) + subprocess.check_call(a) + def run(self, opts): - subprocess.check_call(['git', 'switch', '-']) - subprocess.check_call([sys.executable, 'setup.py', 'build', '--clean']) - subprocess.check_call([sys.executable, 'setup.py', 'build']) - subprocess.check_call([sys.executable, 'setup.py', 'gui', '--clean']) - subprocess.check_call([sys.executable, 'setup.py', 'gui']) + self.ccall('git', 'switch', '-') + self.ccall(sys.executable, 'setup.py', 'build', '--clean') + self.ccall(sys.executable, 'setup.py', 'build') + self.ccall(sys.executable, 'setup.py', 'gui', '--clean') + self.ccall(sys.executable, 'setup.py', 'gui', '--summary') diff --git a/src/calibre/build_forms.py b/src/calibre/build_forms.py new file mode 100644 index 0000000000..3db1d2ea58 --- /dev/null +++ b/src/calibre/build_forms.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2021, Kovid Goyal + +import os +import importlib + + +def form_to_compiled_form(form): + return form.rpartition('.')[0]+'_ui.py' + + +def find_forms(srcdir): + base = os.path.join(srcdir, 'calibre', 'gui2') + forms = [] + for root, _, files in os.walk(base): + for name in files: + if name.endswith('.ui'): + forms.append(os.path.abspath(os.path.join(root, name))) + + return forms + + +def build_forms(srcdir, info=None, summary=False, check_for_migration=False): + import re + from qt.core import QT_VERSION_STR + qt_major = QT_VERSION_STR.split('.')[0] + m = importlib.import_module(f'PyQt{qt_major}.uic') + + from polyglot.io import PolyglotStringIO + forms = find_forms(srcdir) + if info is None: + info = print + pat = re.compile(r'''(['"]):/images/([^'"]+)\1''') + + def sub(match): + ans = 'I(%s%s%s)'%(match.group(1), match.group(2), match.group(1)) + return ans + + num = 0 + transdef_pat = re.compile(r'^\s+_translate\s+=\s+QtCore.QCoreApplication.translate$', flags=re.M) + transpat = re.compile(r'_translate\s*\(.+?,\s+"(.+?)(? os.stat(compiled_form).st_mtime: + if not summary: + info('\tCompiling form', form) + buf = PolyglotStringIO() + m.compileUi(form, buf) + dat = buf.getvalue() + dat = dat.replace('import images_rc', '') + dat = transdef_pat.sub('', dat) + dat = transpat.sub(r'_("\1")', dat) + dat = dat.replace('_("MMM yyyy")', '"MMM yyyy"') + dat = dat.replace('_("d MMM yyyy")', '"d MMM yyyy"') + dat = pat.sub(sub, dat) + if not isinstance(dat, bytes): + dat = dat.encode('utf-8') + open(compiled_form, 'wb').write(dat) + num += 1 + if num: + info('Compiled %d forms' % num) + if force_compile: + gprefs.set(f'migrated_forms_to_qt{qt_major}', True) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 1e028d48b0..895b0ba5ca 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1422,69 +1422,8 @@ def elided_text(text, font=None, width=300, pos='middle'): return str(text) -def find_forms(srcdir): - base = os.path.join(srcdir, 'calibre', 'gui2') - forms = [] - for root, _, files in os.walk(base): - for name in files: - if name.endswith('.ui'): - forms.append(os.path.abspath(os.path.join(root, name))) - - return forms - - -def form_to_compiled_form(form): - return form.rpartition('.')[0]+'_ui.py' - - -def build_forms(srcdir, info=None, summary=False, check_for_migration=False): - import re - from PyQt5.uic import compileUi - - from polyglot.io import PolyglotStringIO - forms = find_forms(srcdir) - if info is None: - from calibre import prints - info = prints - pat = re.compile(r'''(['"]):/images/([^'"]+)\1''') - - def sub(match): - ans = 'I(%s%s%s)'%(match.group(1), match.group(2), match.group(1)) - return ans - - num = 0 - transdef_pat = re.compile(r'^\s+_translate\s+=\s+QtCore.QCoreApplication.translate$', flags=re.M) - transpat = re.compile(r'_translate\s*\(.+?,\s+"(.+?)(? os.stat(compiled_form).st_mtime: - if not summary: - info('\tCompiling form', form) - buf = PolyglotStringIO() - compileUi(form, buf) - dat = buf.getvalue() - dat = dat.replace('import images_rc', '') - dat = transdef_pat.sub('', dat) - dat = transpat.sub(r'_("\1")', dat) - dat = dat.replace('_("MMM yyyy")', '"MMM yyyy"') - dat = dat.replace('_("d MMM yyyy")', '"d MMM yyyy"') - dat = pat.sub(sub, dat) - if not isinstance(dat, bytes): - dat = dat.encode('utf-8') - open(compiled_form, 'wb').write(dat) - num += 1 - if num: - info('Compiled %d forms' % num) - if force_compile: - gprefs.set('migrated_forms_to_qt5', True) - - if is_running_from_develop: + from calibre.build_forms import build_forms build_forms(os.environ['CALIBRE_DEVELOP_FROM'], check_for_migration=True)