diff --git a/setup/__init__.py b/setup/__init__.py index d8b32ba677..6a45395fc2 100644 --- a/setup/__init__.py +++ b/setup/__init__.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' @@ -92,7 +91,7 @@ def build_cache_dir(): _cache_dir_built = True try: os.mkdir(ans) - except EnvironmentError as err: + except OSError as err: if err.errno != errno.EEXIST: raise return ans @@ -100,7 +99,7 @@ def build_cache_dir(): def require_git_master(branch='master'): if subprocess.check_output(['git', 'symbolic-ref', '--short', 'HEAD']).decode('utf-8').strip() != branch: - raise SystemExit('You must be in the {} git branch'.format(branch)) + raise SystemExit(f'You must be in the {branch} git branch') def require_clean_git(): @@ -225,7 +224,7 @@ class Command: st = time.time() self.running(cmd) cmd.run(opts) - self.info('* %s took %.1f seconds' % (command_names[cmd], time.time() - st)) + self.info(f'* {command_names[cmd]} took {time.time() - st:.1f} seconds') if os.environ.get('CI'): self.info('::endgroup::') diff --git a/setup/browser_data.py b/setup/browser_data.py index 6b17747857..3904feb883 100644 --- a/setup/browser_data.py +++ b/setup/browser_data.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2017, Kovid Goyal diff --git a/setup/build.py b/setup/build.py index b0b093e2f9..aa1013c188 100644 --- a/setup/build.py +++ b/setup/build.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' @@ -28,7 +27,7 @@ def init_symbol_name(name): def absolutize(paths): - return list(set([x if os.path.isabs(x) else os.path.join(SRC, x.replace('/', os.sep)) for x in paths])) + return list({x if os.path.isabs(x) else os.path.join(SRC, x.replace('/', os.sep)) for x in paths}) class Extension: diff --git a/setup/build_environment.py b/setup/build_environment.py index d40842e2cd..fb5135612e 100644 --- a/setup/build_environment.py +++ b/setup/build_environment.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' diff --git a/setup/changelog.py b/setup/changelog.py index 691042be1a..ff37888f21 100644 --- a/setup/changelog.py +++ b/setup/changelog.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2020, Kovid Goyal from datetime import date diff --git a/setup/check.py b/setup/check.py index 176afb1b98..f3e9e7a307 100644 --- a/setup/check.py +++ b/setup/check.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' @@ -16,7 +15,7 @@ class Message: self.filename, self.lineno, self.msg = filename, lineno, msg def __str__(self): - return '%s:%s: %s' % (self.filename, self.lineno, self.msg) + return f'{self.filename}:{self.lineno}: {self.msg}' def checkable_python_files(SRC): @@ -95,7 +94,7 @@ class Check(Command): try: with open(self.cache_file, 'rb') as f: cache = json.load(f) - except EnvironmentError as err: + except OSError as err: if err.errno != errno.ENOENT: raise dirty_files = tuple(f for f in self.get_files() if not self.is_cache_valid(f, cache)) @@ -118,7 +117,7 @@ class Check(Command): def clean(self): try: os.remove(self.cache_file) - except EnvironmentError as err: + except OSError as err: if err.errno != errno.ENOENT: raise @@ -129,6 +128,10 @@ class UpgradeSourceCode(Command): def run(self, opts): files = [] + for f in os.listdir(os.path.dirname(os.path.abspath(__file__))): + q = os.path.join('setup', f) + if f.endswith('.py') and f not in ('linux-installer.py',) and not os.path.isdir(q): + files.append(q) for path in checkable_python_files(self.SRC): q = path.replace(os.sep, '/') if '/metadata/sources/' in q or '/store/stores/' in q: diff --git a/setup/commands.py b/setup/commands.py index 4b34fb5a07..b095e31024 100644 --- a/setup/commands.py +++ b/setup/commands.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' diff --git a/setup/csslint.py b/setup/csslint.py index 97b493829b..4461f3d102 100644 --- a/setup/csslint.py +++ b/setup/csslint.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2020, Kovid Goyal import os diff --git a/setup/file-hosting-bw.py b/setup/file-hosting-bw.py index c6a7a34304..f2ad65c342 100644 --- a/setup/file-hosting-bw.py +++ b/setup/file-hosting-bw.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 __license__ = 'GPL v3' diff --git a/setup/git_post_checkout_hook.py b/setup/git_post_checkout_hook.py index 606f59fedb..000ab43981 100755 --- a/setup/git_post_checkout_hook.py +++ b/setup/git_post_checkout_hook.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' diff --git a/setup/git_post_rewrite_hook.py b/setup/git_post_rewrite_hook.py index 56ca6eadbd..79474bde86 100755 --- a/setup/git_post_rewrite_hook.py +++ b/setup/git_post_rewrite_hook.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' diff --git a/setup/git_pre_commit_hook.py b/setup/git_pre_commit_hook.py index cdcfe1f633..742b88229b 100755 --- a/setup/git_pre_commit_hook.py +++ b/setup/git_pre_commit_hook.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2008, Kovid Goyal @@ -55,7 +54,7 @@ class Bug: print('Working on bug:', summary) if int(bug) > 100000 and action != 'See': self.close_bug(bug, action) - return match.group() + ' [%s](%s)' % (summary, LAUNCHPAD_BUG % bug) + return match.group() + f' [{summary}]({LAUNCHPAD_BUG % bug})' return match.group() + ' (%s)' % summary return match.group() @@ -66,7 +65,7 @@ class Bug: 'calibre is usually released every alternate Friday.' ) action += 'ed' - msg = '%s in branch %s. %s' % (action, 'master', suffix) + msg = '{} in branch {}. {}'.format(action, 'master', suffix) msg = msg.replace('Fixesed', 'Fixed') msg += '\n\n status fixreleased' diff --git a/setup/git_version.py b/setup/git_version.py index 21ceebfdb7..723067223c 100755 --- a/setup/git_version.py +++ b/setup/git_version.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2019, Eli Schwartz diff --git a/setup/gui.py b/setup/gui.py index 8405668c1b..5c88570100 100644 --- a/setup/gui.py +++ b/setup/gui.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' diff --git a/setup/hosting.py b/setup/hosting.py index 62af0fc05e..40d065cc94 100644 --- a/setup/hosting.py +++ b/setup/hosting.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' @@ -150,7 +149,7 @@ class GitHub(Base): # {{{ existing_assets = self.existing_assets(release['id']) for path, desc in self.files.items(): self.info('') - url = self.API + 'repos/%s/%s/releases/assets/{}' % ( + url = self.API + 'repos/{}/{}/releases/assets/{{}}'.format( self.username, self.reponame ) fname = os.path.basename(path) @@ -206,7 +205,7 @@ class GitHub(Base): # {{{ def do_upload(self, url, path, desc, fname): mime_type = mimetypes.guess_type(fname)[0] or 'application/octet-stream' - self.info('Uploading to GitHub: %s (%s)' % (fname, mime_type)) + self.info(f'Uploading to GitHub: {fname} ({mime_type})') with ReadFileWithProgressReporting(path) as f: return self.requests.post( url, @@ -229,7 +228,7 @@ class GitHub(Base): # {{{ return error_code == 'already_exists' def existing_assets(self, release_id): - url = self.API + 'repos/%s/%s/releases/%s/assets' % ( + url = self.API + 'repos/{}/{}/releases/{}/assets'.format( self.username, self.reponame, release_id ) r = self.requests.get(url) @@ -238,7 +237,7 @@ class GitHub(Base): # {{{ return {asset['name']: asset['id'] for asset in r.json()} def releases(self): - url = self.API + 'repos/%s/%s/releases' % (self.username, self.reponame) + url = self.API + f'repos/{self.username}/{self.reponame}/releases' r = self.requests.get(url) if r.status_code != 200: self.fail(r, 'Failed to list releases') @@ -250,7 +249,7 @@ class GitHub(Base): # {{{ # Check for existing release if release['tag_name'] == self.current_tag_name: return release - url = self.API + 'repos/%s/%s/releases' % (self.username, self.reponame) + url = self.API + f'repos/{self.username}/{self.reponame}/releases' r = self.requests.post( url, data=json.dumps({ @@ -275,7 +274,7 @@ def generate_index(): # {{{ releases = set() for x in os.listdir('.'): if os.path.isdir(x) and '.' in x: - releases.add(tuple((int(y) for y in x.split('.')))) + releases.add(tuple(int(y) for y in x.split('.'))) rmap = OrderedDict() for rnum in sorted(releases, reverse=True): series = rnum[:2] if rnum[0] == 0 else rnum[:1] @@ -301,10 +300,10 @@ def generate_index(): # {{{ body.append( '
  • {0}.x\xa0\xa0\xa0[{1} releases]
  • ' .format( # noqa - '.'.join(map(type(''), series)), len(rmap[series]) + '.'.join(map(str, series)), len(rmap[series]) ) ) - body = '
      {0}
    '.format(' '.join(body)) + body = '
      {}
    '.format(' '.join(body)) index = template.format( title='Previous calibre releases', style=style, @@ -315,13 +314,13 @@ def generate_index(): # {{{ f.write(index.encode('utf-8')) for series, releases in rmap.items(): - sname = '.'.join(map(type(''), series)) + sname = '.'.join(map(str, series)) body = [ '
  • {0}
  • '.format( - '.'.join(map(type(''), r)) + '.'.join(map(str, r)) ) for r in releases ] - body = '
      {0}
    '.format(' '.join(body)) + body = '
      {}
    '.format(' '.join(body)) index = template.format( title='Previous calibre releases (%s.x)' % sname, style=style, @@ -332,7 +331,7 @@ def generate_index(): # {{{ f.write(index.encode('utf-8')) for r in releases: - rname = '.'.join(map(type(''), r)) + rname = '.'.join(map(str, r)) os.chdir(rname) try: body = [] @@ -346,7 +345,7 @@ def generate_index(): # {{{ ) for x in windows ] body.append( - '
    Windows
      {0}
    '.format( + '
    Windows
      {}
    '.format( ' '.join(windows) ) ) @@ -373,7 +372,7 @@ def generate_index(): # {{{ ) for x in linux ] body.append( - '
    Linux
      {0}
    '.format( + '
    Linux
      {}
    '.format( ' '.join(linux) ) ) @@ -384,7 +383,7 @@ def generate_index(): # {{{ .format(source[0], 'Source code (all platforms)') ) - body = '
    {0}
    '.format(''.join(body)) + body = '
    {}
    '.format(''.join(body)) index = template.format( title='calibre release (%s)' % rname, style=style, diff --git a/setup/hyphenation.py b/setup/hyphenation.py index 6e3713ffca..66a475054f 100644 --- a/setup/hyphenation.py +++ b/setup/hyphenation.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai # License: GPLv3 Copyright: 2019, Kovid Goyal -from __future__ import absolute_import, division, print_function, unicode_literals import glob import hashlib @@ -100,7 +98,7 @@ class Hyphenation(ReVendor): for dic in dics: with open(os.path.join(output_dir, dic), 'rb') as f: m.update(f.read()) - hsh = type('')(m.hexdigest()) + hsh = str(m.hexdigest()) buf = BytesIO() with tarfile.TarFile(fileobj=buf, mode='w') as tf: for dic in dics: diff --git a/setup/install.py b/setup/install.py index b4b39df7e6..b21f11b34e 100644 --- a/setup/install.py +++ b/setup/install.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai # License: GPLv3 Copyright: 2009, Kovid Goyal @@ -163,7 +162,7 @@ class Develop(Command): try: if not os.path.exists(libdir): os.makedirs(libdir) - except EnvironmentError: + except OSError: self.warn('Cannot install calibre environment module to: '+libdir) else: path = os.path.join(libdir, 'init_calibre.py') @@ -367,7 +366,7 @@ class Bootstrap(Command): def pre_sub_commands(self, opts): tdir = self.j(self.d(self.SRC), 'translations') clone_cmd = [ - 'git', 'clone', 'https://github.com/{}.git'.format(self.TRANSLATIONS_REPO), 'translations'] + 'git', 'clone', f'https://github.com/{self.TRANSLATIONS_REPO}.git', 'translations'] if opts.ephemeral: if os.path.exists(tdir): shutil.rmtree(tdir) diff --git a/setup/installers.py b/setup/installers.py index d48d7f61a9..1b32ca5cba 100644 --- a/setup/installers.py +++ b/setup/installers.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal @@ -86,7 +85,7 @@ def build_single(which='windows', bitness='64', shutdown=True, sign_installers=T dest = os.path.join(base, 'dist', x) try: os.remove(dest) - except EnvironmentError: + except OSError: pass os.link(src, dest) if shutdown: @@ -248,9 +247,9 @@ class ExtDev(Command): try: path = path.format(ext) src = os.path.join(ext_dir, os.path.basename(path)) - subprocess.check_call(['ssh', '-S', control_path, host, 'chmod', '+w', '"{}"'.format(path)]) + subprocess.check_call(['ssh', '-S', control_path, host, 'chmod', '+w', f'"{path}"']) with open(src, 'rb') as f: - p = subprocess.Popen(['ssh', '-S', control_path, host, 'cat - > "{}"'.format(path)], stdin=subprocess.PIPE) + p = subprocess.Popen(['ssh', '-S', control_path, host, f'cat - > "{path}"'], stdin=subprocess.PIPE) p.communicate(f.read()) if p.wait() != 0: raise SystemExit(1) diff --git a/setup/lc_data.py b/setup/lc_data.py index a843bab3bb..f632db152c 100644 --- a/setup/lc_data.py +++ b/setup/lc_data.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# vim:fileencoding=utf-8 __license__ = 'GPL v3' diff --git a/setup/liberation.py b/setup/liberation.py index 509320bc31..2c30db9474 100644 --- a/setup/liberation.py +++ b/setup/liberation.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai # License: GPLv3 Copyright: 2019, Kovid Goyal -from __future__ import absolute_import, division, print_function, unicode_literals import glob import os diff --git a/setup/mathjax.py b/setup/mathjax.py index 7a8cd467b2..fa81f29181 100644 --- a/setup/mathjax.py +++ b/setup/mathjax.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai __license__ = 'GPL v3' diff --git a/setup/parallel_build.py b/setup/parallel_build.py index c93b799a3c..7c53f0791d 100644 --- a/setup/parallel_build.py +++ b/setup/parallel_build.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 __license__ = 'GPL v3' diff --git a/setup/plugins_mirror.py b/setup/plugins_mirror.py index 4d14aecab9..ea580e78bf 100644 --- a/setup/plugins_mirror.py +++ b/setup/plugins_mirror.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2013, Kovid Goyal -from __future__ import absolute_import, division, print_function, unicode_literals # Imports {{{ @@ -128,7 +126,7 @@ def parse_index(raw=None): # {{{ thread_id = url_to_plugin_id(url, deprecated) if thread_id in seen: - raise ValueError('thread_id for %s and %s is the same: %s' % (seen[thread_id], name, thread_id)) + raise ValueError(f'thread_id for {seen[thread_id]} and {name} is the same: {thread_id}') seen[thread_id] = name entry = IndexEntry(name, url, donate, history, uninstall, deprecated, thread_id) yield entry @@ -147,7 +145,7 @@ def load_plugins_index(): try: with open(PLUGINS, 'rb') as f: raw = f.read() - except IOError as err: + except OSError as err: if err.errno == errno.ENOENT: return {} raise @@ -173,13 +171,13 @@ def convert_node(fields, x, names={}, import_data=None): return dict(zip(keys, values)) elif name == 'Call': if len(x.args) != 1 and len(x.keywords) != 0: - raise TypeError('Unsupported function call for fields: %s' % (fields,)) + raise TypeError(f'Unsupported function call for fields: {fields}') return tuple(map(conv, x.args))[0] elif name == 'Name': if x.id not in names: if import_data is not None and x.id in import_data[0]: return get_import_data(x.id, import_data[0][x.id], *import_data[1:]) - raise ValueError('Could not find name %s for fields: %s' % (x.id, fields)) + raise ValueError(f'Could not find name {x.id} for fields: {fields}') return names[x.id] elif name == 'BinOp': if x.right.__class__.__name__ == 'Str': @@ -188,7 +186,7 @@ def convert_node(fields, x, names={}, import_data=None): return x.right.value elif name == 'Attribute': return conv(getattr(conv(x.value), x.attr)) - raise TypeError('Unknown datatype %s for fields: %s' % (x, fields)) + raise TypeError(f'Unknown datatype {x} for fields: {fields}') Alias = namedtuple('Alias', 'name asname') @@ -221,7 +219,7 @@ def get_import_data(name, mod, zf, names): return convert_node({x}, node.value) if is_module_import: return module - raise ValueError('Failed to find name: %r in module: %r' % (name, mod)) + raise ValueError(f'Failed to find name: {name!r} in module: {mod!r}') else: raise ValueError('Failed to find module: %r' % mod) @@ -457,7 +455,7 @@ def fetch_plugins(old_index): def plugin_to_index(plugin, count): - title = '

    %s

    ' % ( # noqa + title = '

    {}

    '.format( # noqa quoteattr(plugin['thread_url']), escape(plugin['name'])) released = datetime(*tuple(map(int, re.split(r'\D', plugin['last_modified'])))[:6]).strftime('%e %b, %Y').lstrip() details = [ @@ -478,12 +476,12 @@ def plugin_to_index(plugin, count): block.append('
  • %s
  • ' % li) block = '
      %s
    ' % ('\n'.join(block)) downloads = ('\xa0[%d total downloads]' % count) if count else '' - zipfile = '' % ( + zipfile = ''.format( quoteattr(plugin['file']), quoteattr(plugin['name'] + '.zip'), downloads) desc = plugin['description'] or '' if desc: desc = '

    %s

    ' % desc - return '%s\n%s\n%s\n%s\n\n' % (title, desc, block, zipfile) + return f'{title}\n{desc}\n{block}\n{zipfile}\n\n' def create_index(index, raw_stats): @@ -526,14 +524,14 @@ h1 { text-align: center } try: with open('index.html', 'rb') as f: oraw = f.read() - except EnvironmentError: + except OSError: oraw = None if raw != oraw: atomic_write(raw, 'index.html') def plugin_stats(x): name, count = x - return '%s%s\n' % (escape(name), count) + return f'{escape(name)}{count}\n' pstats = list(map(plugin_stats, sorted(stats.items(), reverse=True, key=lambda x:x[1]))) stats = '''\ @@ -560,7 +558,7 @@ h1 { text-align: center } try: with open('stats.html', 'rb') as f: oraw = f.read() - except EnvironmentError: + except OSError: oraw = None if raw != oraw: atomic_write(raw, 'stats.html') @@ -574,7 +572,7 @@ def singleinstance(): s = _singleinstance = socket.socket(socket.AF_UNIX) try: s.bind(b'\0calibre-plugins-mirror-singleinstance') - except socket.error as err: + except OSError as err: if getattr(err, 'errno', None) == errno.EADDRINUSE: return False raise @@ -590,7 +588,7 @@ def update_stats(): try: with open('stats.json', 'rb') as f: stats = json.load(f) - except EnvironmentError as err: + except OSError as err: if err.errno != errno.ENOENT: raise if os.geteuid() != 0: @@ -688,7 +686,7 @@ def test_parse(): # {{{ new_entries = tuple(parse_index(raw)) for i, entry in enumerate(old_entries): if entry != new_entries[i]: - print('The new entry: %s != %s' % (new_entries[i], entry)) + print(f'The new entry: {new_entries[i]} != {entry}') raise SystemExit(1) pool = ThreadPool(processes=20) urls = [e.url for e in new_entries] @@ -705,7 +703,7 @@ def test_parse(): # {{{ break new_url, aname = parse_plugin_zip_url(raw) if new_url != full_url: - print('new url (%s): %s != %s for plugin at: %s' % (aname, new_url, full_url, url)) + print(f'new url ({aname}): {new_url} != {full_url} for plugin at: {url}') raise SystemExit(1) # }}} diff --git a/setup/publish.py b/setup/publish.py index 5414c98d96..6856ca8025 100644 --- a/setup/publish.py +++ b/setup/publish.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' @@ -225,7 +224,7 @@ class Manual(Command): orig = self.j(self.d(base), r) try: sz = os.stat(orig).st_size - except EnvironmentError: + except OSError: continue if sz == os.stat(f).st_size and filecmp._do_cmp(f, orig): os.remove(f) @@ -260,7 +259,7 @@ class ManPages(Command): os.environ['ALL_USER_MANUAL_LANGUAGES'] = ' '.join(languages) try: os.makedirs(dest) - except EnvironmentError: + except OSError: pass jobs = [] for l in languages: @@ -268,7 +267,7 @@ class ManPages(Command): [sys.executable, self.j(base, 'build.py'), '--man-pages', l, dest], '\n\n**************** Building translations for: %s' % l) ) - self.info('\tCreating man pages in {} for {} languages...'.format(dest, len(jobs))) + self.info(f'\tCreating man pages in {dest} for {len(jobs)} languages...') subprocess.check_call(jobs[0].cmd) if not parallel_build(jobs[1:], self.info, verbose=False): raise SystemExit(1) @@ -307,4 +306,4 @@ class TagRelease(Command): subprocess.check_call( 'git tag -s v{0} -m "version-{0}"'.format(__version__).split() ) - subprocess.check_call('git push origin v{0}'.format(__version__).split()) + subprocess.check_call(f'git push origin v{__version__}'.split()) diff --git a/setup/resources.py b/setup/resources.py index bbc73b185e..ee60669b8c 100644 --- a/setup/resources.py +++ b/setup/resources.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' @@ -16,17 +15,13 @@ from polyglot.builtins import codepoint_to_chr, itervalues, iteritems, only_unic def get_opts_from_parser(parser): def do_opt(opt): - for x in opt._long_opts: - yield x - for x in opt._short_opts: - yield x + yield from opt._long_opts + yield from opt._short_opts for o in parser.option_list: - for x in do_opt(o): - yield x + yield from do_opt(o) for g in parser.option_groups: for o in g.option_list: - for x in do_opt(o): - yield x + yield from do_opt(o) class Kakasi(Command): # {{{ @@ -145,7 +140,7 @@ class CACerts(Command): # {{{ try: with open(self.CA_PATH, 'rb') as f: raw = f.read() - except EnvironmentError as err: + except OSError as err: if err.errno != errno.ENOENT: raise raw = b'' @@ -298,7 +293,7 @@ class Resources(Command): # {{{ except Exception: continue src = src.replace('def ' + func.__name__, 'def replace') - imports = ['from %s import %s' % (x.__module__, x.__name__) for x in func.imports] + imports = [f'from {x.__module__} import {x.__name__}' for x in func.imports] if imports: src = '\n'.join(imports) + '\n\n' + src function_dict[func.name] = src diff --git a/setup/revendor.py b/setup/revendor.py index 3603d2dd0b..b9786639ec 100755 --- a/setup/revendor.py +++ b/setup/revendor.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2019, Eli Schwartz import os diff --git a/setup/run-calibre-worker.py b/setup/run-calibre-worker.py index c5f6cd7c52..a048e2a9f4 100644 --- a/setup/run-calibre-worker.py +++ b/setup/run-calibre-worker.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal diff --git a/setup/test.py b/setup/test.py index 5225042e61..df04752b91 100644 --- a/setup/test.py +++ b/setup/test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal diff --git a/setup/translations.py b/setup/translations.py index 269a2c24fd..01cbbb656e 100644 --- a/setup/translations.py +++ b/setup/translations.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' @@ -108,7 +107,7 @@ class POT(Command): # {{{ for x in sorted(entries, key=lambda x:name_getter(x).lower()): name = name_getter(x) if name: - ans.append(u'msgid "{}"'.format(name)) + ans.append(f'msgid "{name}"') ans.append('msgstr ""') ans.append('') pot = self.pot_header() + '\n\n' + '\n'.join(ans) @@ -278,7 +277,7 @@ class Translations(POT): # {{{ self.cache_dir_created = True try: os.mkdir(ans) - except EnvironmentError as err: + except OSError as err: if err.errno != errno.EEXIST: raise return ans @@ -293,7 +292,7 @@ class Translations(POT): # {{{ with open(self.j(self.cache_dir, cname), 'rb') as f: data = f.read() return data[:20], data[20:] - except EnvironmentError as err: + except OSError as err: if err.errno != errno.ENOENT: raise return None, None @@ -387,7 +386,7 @@ class Translations(POT): # {{{ self.bad.add(msgstr) return match.group() self.seen.add(self.msgid) - return 'msgstr "{}"'.format(self.msgid) + return f'msgstr "{self.msgid}"' self.seen.add(msgstr) return match.group() @@ -405,7 +404,7 @@ class Translations(POT): # {{{ if msgstr: if msgstr and msgstr in self.bad: self.bad.discard(msgstr) - return 'msgstr "{}"'.format(self.msgid) + return f'msgstr "{self.msgid}"' return match.group() for (po_path, mo_path) in files: @@ -475,7 +474,7 @@ class Translations(POT): # {{{ base = self.d(dest) try: os.mkdir(base) - except EnvironmentError as err: + except OSError as err: if err.errno != errno.EEXIST: raise from calibre.utils.serialize import msgpack_dumps @@ -506,12 +505,12 @@ class Translations(POT): # {{{ po_data = data.decode('utf-8') data = json.loads(msgfmt(po_data)) translated_entries = {k:v for k, v in iteritems(data['entries']) if v and sum(map(len, v))} - data[u'entries'] = translated_entries - data[u'hash'] = h.hexdigest() + data['entries'] = translated_entries + data['hash'] = h.hexdigest() cdata = b'{}' if translated_entries: raw = json.dumps(data, ensure_ascii=False, sort_keys=True) - if isinstance(raw, type(u'')): + if isinstance(raw, str): raw = raw.encode('utf-8') cdata = raw self.write_cache(cdata, current_hash, src) @@ -539,7 +538,7 @@ class Translations(POT): # {{{ cm = langnames_to_langcodes([omsgid, msgid]) if cm[msgid] and cm[omsgid] and cm[msgid] != cm[omsgid]: has_errors = True - self.iso639_errors.append('In file %s the name %s is used as translation for both %s and %s' % ( + self.iso639_errors.append('In file {} the name {} is used as translation for both {} and {}'.format( os.path.basename(path), msgstr, msgid, rmap[msgstr])) # raise SystemExit(1) rmap[msgstr] = msgid @@ -730,8 +729,8 @@ class GetTranslations(Translations): # {{{ if changed: f.save() for slug, languages in iteritems(changes): - print('Pushing fixes for languages: %s in %s' % (', '.join(languages), slug)) - self.tx('push -r calibre.%s -t -l %s' % (slug, ','.join(languages))) + print('Pushing fixes for languages: {} in {}'.format(', '.join(languages), slug)) + self.tx('push -r calibre.{} -t -l {}'.format(slug, ','.join(languages))) def check_for_errors(self): self.info('Checking for errors in .po files...') @@ -750,8 +749,8 @@ class GetTranslations(Translations): # {{{ languages.add(os.path.basename(parts[-1]).partition('.')[0]) if languages: pot = 'main' if group == 'calibre' else group.replace('-', '_') - print('Pushing fixes for %s.pot languages: %s' % (pot, ', '.join(languages))) - self.tx('push -r calibre.{} -t -l '.format(pot) + ','.join(languages)) + print('Pushing fixes for {}.pot languages: {}'.format(pot, ', '.join(languages))) + self.tx(f'push -r calibre.{pot} -t -l ' + ','.join(languages)) def check_group(self, group): files = glob.glob(os.path.join(self.TRANSLATIONS, group, '*.po')) @@ -769,11 +768,11 @@ class GetTranslations(Translations): # {{{ def check_for_control_chars(f): with open(f, 'rb') as f: raw = f.read().decode('utf-8') - pat = re.compile(type(u'')(r'[\0-\x08\x0b\x0c\x0e-\x1f\x7f\x80-\x9f]')) + pat = re.compile(r'[\0-\x08\x0b\x0c\x0e-\x1f\x7f\x80-\x9f]') errs = [] for i, line in enumerate(raw.splitlines()): if pat.search(line) is not None: - errs.append('There are ASCII control codes on line number: {}'.format(i + 1)) + errs.append(f'There are ASCII control codes on line number: {i + 1}') return '\n'.join(errs) for f in files: @@ -848,7 +847,7 @@ class ISO639(Command): # {{{ m3to2 = {} nm = {} codes2, codes3 = set(), set() - unicode_type = type(u'') + unicode_type = str for x in entries: two = x.get('alpha_2') if two: @@ -874,9 +873,9 @@ class ISO639(Command): # {{{ base_name = name.lower() nm[base_name] = threeb - x = {u'by_2':by_2, u'by_3':by_3, u'codes2':codes2, - u'codes3':codes3, u'2to3':m2to3, - u'3to2':m3to2, u'name_map':nm} + x = {'by_2':by_2, 'by_3':by_3, 'codes2':codes2, + 'codes3':codes3, '2to3':m2to3, + '3to2':m3to2, 'name_map':nm} from calibre.utils.serialize import msgpack_dumps with open(dest, 'wb') as f: f.write(msgpack_dumps(x)) @@ -911,7 +910,7 @@ class ISO3166(ISO639): # {{{ codes = set() three_map = {} name_map = {} - unicode_type = type(u'') + unicode_type = str for x in db['3166-1']: two = x.get('alpha_2') if two: @@ -923,7 +922,7 @@ class ISO3166(ISO639): # {{{ three = x.get('alpha_3') if three: three_map[unicode_type(three)] = two - x = {u'names':name_map, u'codes':frozenset(codes), u'three_map':three_map} + x = {'names':name_map, 'codes':frozenset(codes), 'three_map':three_map} from calibre.utils.serialize import msgpack_dumps with open(dest, 'wb') as f: f.write(msgpack_dumps(x)) diff --git a/setup/unix-ci.py b/setup/unix-ci.py index 64e307a952..de4c21bc86 100644 --- a/setup/unix-ci.py +++ b/setup/unix-ci.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2017, Kovid Goyal @@ -119,7 +118,7 @@ def main(): tball = 'macos-64' if ismacos else 'linux-64' download_and_decompress( - 'https://download.calibre-ebook.com/ci/calibre3/{}.tar.xz'.format(tball), SW + f'https://download.calibre-ebook.com/ci/calibre3/{tball}.tar.xz', SW ) if not ismacos: install_linux_deps() @@ -152,7 +151,7 @@ username = api run_python('setup.py test') run_python('setup.py test_rs') else: - raise SystemExit('Unknown action: {}'.format(action)) + raise SystemExit(f'Unknown action: {action}') if __name__ == '__main__': diff --git a/setup/upload.py b/setup/upload.py index 27d596bab9..1d3ce58b13 100644 --- a/setup/upload.py +++ b/setup/upload.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' @@ -34,9 +33,9 @@ def installers(include_source=True): installers.append(installer_name('txz', is64bit=True)) installers.append(installer_name('msi', is64bit=True)) if include_source: - installers.insert(0, 'dist/%s-%s.tar.xz' % (__appname__, __version__)) + installers.insert(0, f'dist/{__appname__}-{__version__}.tar.xz') installers.append( - 'dist/%s-portable-installer-%s.exe' % (__appname__, __version__) + f'dist/{__appname__}-portable-installer-{__version__}.exe' ) return installers @@ -126,7 +125,7 @@ def get_fosshub_data(): def send_data(loc): subprocess.check_call([ 'rsync', '--inplace', '--delete', '-r', '-zz', '-h', '--info=progress2', '-e', - 'ssh -x', loc + '/', '%s@%s:%s' % (STAGING_USER, STAGING_HOST, STAGING_DIR) + 'ssh -x', loc + '/', f'{STAGING_USER}@{STAGING_HOST}:{STAGING_DIR}' ]) @@ -160,7 +159,7 @@ def calibre_cmdline(ver): def run_remote_upload(args): print('Running remotely:', ' '.join(args)) subprocess.check_call([ - 'ssh', '-x', '%s@%s' % (STAGING_USER, STAGING_HOST), 'cd', STAGING_DIR, '&&', + 'ssh', '-x', f'{STAGING_USER}@{STAGING_HOST}', 'cd', STAGING_DIR, '&&', 'python', 'hosting.py' ] + args) @@ -185,7 +184,7 @@ def upload_to_fosshub(): if ans.get('error'): raise SystemExit(ans['error']) if res.getcode() != 200: - raise SystemExit('Request to {} failed with response code: {}'.format(path, res.getcode())) + raise SystemExit(f'Request to {path} failed with response code: {res.getcode()}') # from pprint import pprint # pprint(ans) return ans['status'] if 'status' in ans else ans['data'] @@ -204,7 +203,7 @@ def upload_to_fosshub(): entries = [] for fname in files: desc = installer_description(fname) - url = 'https://download.calibre-ebook.com/%s/%s' % ( + url = 'https://download.calibre-ebook.com/{}/{}'.format( __version__, os.path.basename(fname) ) entries.append({ @@ -221,7 +220,7 @@ def upload_to_fosshub(): data = json.dumps(jq) # print(data) data = data.encode('utf-8') - if not request('projects/{}/releases/'.format(project_id), data=data): + if not request(f'projects/{project_id}/releases/', data=data): raise SystemExit('Failed to queue publish job with fosshub') @@ -263,7 +262,7 @@ class UploadInstallers(Command): # {{{ def record_sizes(self, sizes): print('\nRecording dist sizes') args = [ - '%s:%s:%s' % (__version__, fname, size) + f'{__version__}:{fname}:{size}' for fname, size in iteritems(sizes) ] check_call(['ssh', 'code', '/usr/local/bin/dist_sizes'] + args) @@ -285,7 +284,7 @@ class UploadInstallers(Command): # {{{ with open(os.path.join(tdir, 'fmap'), 'wb') as fo: for f, desc in iteritems(files): - fo.write(('%s: %s\n' % (f, desc)).encode('utf-8')) + fo.write((f'{f}: {desc}\n').encode()) while True: try: @@ -345,7 +344,7 @@ class UploadUserManual(Command): # {{{ for y in os.listdir(x): zf.write(os.path.join(x, y)) bname = self.b(path) + '_plugin.zip' - dest = '%s/%s' % (DOWNLOADS, bname) + dest = f'{DOWNLOADS}/{bname}' subprocess.check_call(['scp', f.name, 'main:' + dest]) def run(self, opts): @@ -387,7 +386,7 @@ class UploadDemo(Command): # {{{ shell=True ) - check_call('scp /tmp/html-demo.zip main:%s/' % (DOWNLOADS, ), shell=True) + check_call(f'scp /tmp/html-demo.zip main:{DOWNLOADS}/', shell=True) # }}} diff --git a/setup/vcvars.py b/setup/vcvars.py index 90f2c32e2d..7fc61ad880 100644 --- a/setup/vcvars.py +++ b/setup/vcvars.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal import ctypes.wintypes @@ -129,7 +128,7 @@ def query_process(cmd, is64bit): def query_vcvarsall(is64bit=True): plat = 'amd64' if is64bit else 'amd64_x86' vcvarsall = find_vcvarsall() - env = query_process('"%s" %s & set' % (vcvarsall, plat), is64bit) + env = query_process(f'"{vcvarsall}" {plat} & set', is64bit) def g(k): try: diff --git a/setup/win-ci.py b/setup/win-ci.py index 076bac12bc..15557ae36e 100644 --- a/setup/win-ci.py +++ b/setup/win-ci.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal