diff --git a/imgsrc/srv/generate.py b/imgsrc/srv/generate.py
index 7f2d870774..93c2cf9c2d 100644
--- a/imgsrc/srv/generate.py
+++ b/imgsrc/srv/generate.py
@@ -26,7 +26,7 @@ def clone_node(node, parent):
def merge():
base = os.path.dirname(os.path.abspath(__file__))
ans = etree.fromstring(
- '' % (SVG_NS, XLINK_NS),
+ ''.format(SVG_NS, XLINK_NS),
parser=etree.XMLParser(
recover=True, no_network=True, resolve_entities=False
)
@@ -42,7 +42,7 @@ def merge():
recover=True, no_network=True, resolve_entities=False
)
)
- symbol = ans.makeelement('{%s}symbol' % SVG_NS)
+ symbol = ans.makeelement('{{{}}}symbol'.format(SVG_NS))
symbol.set('viewBox', svg.get('viewBox'))
symbol.set('id', 'icon-' + f.rpartition('.')[0])
for child in svg.iterchildren('*'):
diff --git a/manual/conf.py b/manual/conf.py
index fd72148cf3..bf9a699f04 100644
--- a/manual/conf.py
+++ b/manual/conf.py
@@ -97,7 +97,7 @@ today_fmt = '%B %d, %Y'
unused_docs = ['global', 'cli/global']
locale_dirs = ['locale/']
-title = '%s User Manual' % __appname__
+title = '{} User Manual'.format(__appname__)
needs_localization = language not in {'en', 'eng'}
if needs_localization:
import gettext
@@ -253,5 +253,5 @@ latex_show_pagerefs = True
latex_show_urls = 'footnote'
latex_elements = {
'papersize':'letterpaper',
- 'preamble': r'\renewcommand{\pageautorefname}{%s}' % _('page'),
+ 'preamble': r'\renewcommand{{\pageautorefname}}{{{}}}'.format(_('page')),
}
diff --git a/manual/custom.py b/manual/custom.py
index 89a28a279e..2c71fefb3a 100644
--- a/manual/custom.py
+++ b/manual/custom.py
@@ -195,13 +195,13 @@ details and examples.
lines = []
for cmd in COMMANDS:
parser = option_parser_for(cmd)()
- lines += ['.. _calibredb-%s-%s:' % (language, cmd), '']
+ lines += ['.. _calibredb-{}-{}:'.format(language, cmd), '']
lines += [cmd, '~'*20, '']
usage = parser.usage.strip()
usage = [i for i in usage.replace('%prog', 'calibredb').splitlines()]
cmdline = ' '+usage[0]
usage = usage[1:]
- usage = [re.sub(r'(%s)([^a-zA-Z0-9])'%cmd, r':command:`\1`\2', i) for i in usage]
+ usage = [re.sub(r'({})([^a-zA-Z0-9])'.format(cmd), r':command:`\1`\2', i) for i in usage]
lines += ['.. code-block:: none', '', cmdline, '']
lines += usage
groups = [(None, None, parser.option_list)]
@@ -257,7 +257,7 @@ def generate_ebook_convert_help(preamble, app):
def update_cli_doc(name, raw, language):
if isinstance(raw, bytes):
raw = raw.decode('utf-8')
- path = 'generated/%s/%s.rst' % (language, name)
+ path = 'generated/{}/{}.rst'.format(language, name)
old_raw = open(path, encoding='utf-8').read() if os.path.exists(path) else ''
if not os.path.exists(path) or old_raw != raw:
import difflib
@@ -352,7 +352,7 @@ def cli_docs(language):
usage = [mark_options(i) for i in parser.usage.replace('%prog', cmd).splitlines()]
cmdline = usage[0]
usage = usage[1:]
- usage = [i.replace(cmd, ':command:`%s`'%cmd) for i in usage]
+ usage = [i.replace(cmd, ':command:`{}`'.format(cmd)) for i in usage]
usage = '\n'.join(usage)
preamble = CLI_PREAMBLE.format(cmd=cmd, cmdref=cmd + '-' + language, cmdline=cmdline, usage=usage)
if cmd == 'ebook-convert':
@@ -382,7 +382,7 @@ def template_docs(language):
def localized_path(app, langcode, pagename):
href = app.builder.get_target_uri(pagename)
- href = re.sub(r'generated/[a-z]+/', 'generated/%s/' % langcode, href)
+ href = re.sub(r'generated/[a-z]+/', 'generated/{}/'.format(langcode), href)
prefix = '/'
if langcode != 'en':
prefix += langcode + '/'
@@ -405,7 +405,7 @@ def setup_man_pages(app):
documented_cmds = get_cli_docs()[0]
man_pages = []
for cmd, option_parser in documented_cmds:
- path = 'generated/%s/%s' % (app.config.language, cmd)
+ path = 'generated/{}/{}'.format(app.config.language, cmd)
man_pages.append((
path, cmd, cmd, 'Kovid Goyal', 1
))
diff --git a/manual/epub.py b/manual/epub.py
index 9fa088bc78..6b2224a888 100644
--- a/manual/epub.py
+++ b/manual/epub.py
@@ -49,7 +49,7 @@ class EPUBHelpBuilder(EpubBuilder):
imgname = container.href_to_name(img.get('src'), name)
fmt, width, height = identify(container.raw_data(imgname))
if width == -1:
- raise ValueError('Failed to read size of: %s' % imgname)
+ raise ValueError('Failed to read size of: {}'.format(imgname))
img.set('style', 'width: %dpx; height: %dpx' % (width, height))
def fix_opf(self, container):
diff --git a/ruff-strict-pep8.toml b/ruff-strict-pep8.toml
index b2dc7b31c4..2c73e0fe95 100644
--- a/ruff-strict-pep8.toml
+++ b/ruff-strict-pep8.toml
@@ -17,12 +17,13 @@ exclude = [
quote-style = 'single'
[lint]
-ignore = ['E402', 'E722', 'E741', 'UP012', 'UP030', 'UP031', 'UP032', 'UP038']
+ignore = ['E402', 'E722', 'E741', 'UP012', 'UP030', 'UP032', 'UP038']
select = ['E', 'F', 'I', 'W', 'INT', 'Q', 'UP']
[lint.per-file-ignores]
"recipes/*" = ['UP']
"manual/plugin_examples/*" = ['UP']
+"src/calibre/*" = ['UP031']
"src/calibre/ebooks/unihandecode/*codepoints.py" = ['E501']
"src/calibre/ebooks/metadata/sources/*" = ['UP']
"src/calibre/gui2/store/stores/*" = ['UP']
diff --git a/setup/__init__.py b/setup/__init__.py
index 3553fb2dd1..1886deafc1 100644
--- a/setup/__init__.py
+++ b/setup/__init__.py
@@ -126,7 +126,7 @@ def initialize_constants():
with open(os.path.join(SRC, 'calibre/constants.py'), 'rb') as f:
src = f.read().decode('utf-8')
nv = re.search(r'numeric_version\s+=\s+\((\d+), (\d+), (\d+)\)', src)
- __version__ = '%s.%s.%s'%(nv.group(1), nv.group(2), nv.group(3))
+ __version__ = '{}.{}.{}'.format(nv.group(1), nv.group(2), nv.group(3))
__appname__ = re.search(r'__appname__\s+=\s+(u{0,1})[\'"]([^\'"]+)[\'"]',
src).group(2)
with open(os.path.join(SRC, 'calibre/linux.py'), 'rb') as sf:
diff --git a/setup/build.py b/setup/build.py
index 868c419de8..8835a7d7d8 100644
--- a/setup/build.py
+++ b/setup/build.py
@@ -83,7 +83,7 @@ def lazy_load(name):
try:
return getattr(build_environment, name)
except AttributeError:
- raise ImportError('The setup.build_environment module has no symbol named: %s' % name)
+ raise ImportError('The setup.build_environment module has no symbol named: {}'.format(name))
def expand_file_list(items, is_paths=True, cross_compile_for='native'):
@@ -617,8 +617,8 @@ class Build(Command):
try:
subprocess.check_call(*args, **kwargs)
except:
- cmdline = ' '.join(['"%s"' % (arg) if ' ' in arg else arg for arg in args[0]])
- print('Error while executing: %s\n' % (cmdline))
+ cmdline = ' '.join(['"{}"'.format(arg) if ' ' in arg else arg for arg in args[0]])
+ print('Error while executing: {}\n'.format(cmdline))
raise
def build_headless(self):
diff --git a/setup/build_environment.py b/setup/build_environment.py
index 7b656c23e5..db5a17d2d0 100644
--- a/setup/build_environment.py
+++ b/setup/build_environment.py
@@ -113,7 +113,7 @@ qraw = subprocess.check_output([QMAKE, '-query']).decode('utf-8')
def readvar(name):
- return re.search('^%s:(.+)$' % name, qraw, flags=re.M).group(1).strip()
+ return re.search('^{}:(.+)$'.format(name), qraw, flags=re.M).group(1).strip()
qt = {x:readvar(y) for x, y in {'libs':'QT_INSTALL_LIBS', 'plugins':'QT_INSTALL_PLUGINS'}.items()}
diff --git a/setup/git_pre_commit_hook.py b/setup/git_pre_commit_hook.py
index 90fb181d04..62be70ec45 100755
--- a/setup/git_pre_commit_hook.py
+++ b/setup/git_pre_commit_hook.py
@@ -56,11 +56,11 @@ class Bug:
if int(bug) > 100000 and action != 'See':
self.close_bug(bug, action)
return match.group() + f' [{summary}]({LAUNCHPAD_BUG % bug})'
- return match.group() + ' (%s)' % summary
+ return match.group() + ' ({})'.format(summary)
return match.group()
def close_bug(self, bug, action):
- print('Closing bug #%s' % bug)
+ print('Closing bug #{}'.format(bug))
suffix = (
'The fix will be in the next release. '
'calibre is usually released every alternate Friday.'
diff --git a/setup/git_version.py b/setup/git_version.py
index 723067223c..feb3efeae7 100755
--- a/setup/git_version.py
+++ b/setup/git_version.py
@@ -24,7 +24,7 @@ class GitVersion(Command):
nv = nv.replace('-', '.')
except subprocess.CalledProcessError:
raise SystemExit('Error: not a git checkout')
- newsrc = re.sub(r'(git_version = ).*', r'\1%s' % repr(nv), src)
+ newsrc = re.sub(r'(git_version = ).*', r'\1{}'.format(repr(nv)), src)
self.info('new version is:', nv)
with open(constants_file, 'wb') as f:
diff --git a/setup/gui.py b/setup/gui.py
index 22ef575c8b..612bea854e 100644
--- a/setup/gui.py
+++ b/setup/gui.py
@@ -61,8 +61,8 @@ class GUI(Command):
if self.newer(self.QRC, sources):
self.info('Creating images.qrc')
for s in sources:
- files.append('
%s
' % desc + desc = '{}
'.format(desc) return f'{title}\n{desc}\n{block}\n{zipfile}\n\n' @@ -502,25 +502,25 @@ def create_index(index, raw_stats):