diff --git a/docs/conf.py b/docs/conf.py index d35af6ec1..fc6d621a7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -371,7 +371,7 @@ def expand_opt_references(conf_name: str, text: str) -> str: ref = m.group(1) if '<' not in ref and '.' not in ref: full_ref = conf_name + ref - return ':opt:`{} <{}>`'.format(ref, full_ref) + return f':opt:`{ref} <{full_ref}>`' return str(m.group()) return re.sub(r':opt:`(.+?)`', expand, text) @@ -399,7 +399,7 @@ def parse_opt_node(env: Any, sig: str, signode: Any) -> str: opt_aliases[optname] = firstname count += 1 if not firstname: - raise ValueError('{} is not a valid opt'.format(sig)) + raise ValueError(f'{sig} is not a valid opt') return firstname @@ -426,7 +426,7 @@ def process_shortcut_link(env: Any, refnode: Any, has_explicit_title: bool, titl try: target, stitle = shortcut_slugs[full_name] except KeyError: - logger.warning('Unknown shortcut: {}'.format(target), location=refnode) + logger.warning(f'Unknown shortcut: {target}', location=refnode) else: if not has_explicit_title: title = stitle diff --git a/docs/graphics-protocol.rst b/docs/graphics-protocol.rst index e918f29e1..ed7aefcd7 100644 --- a/docs/graphics-protocol.rst +++ b/docs/graphics-protocol.rst @@ -108,7 +108,7 @@ features of the graphics protocol: def serialize_gr_command(**cmd): payload = cmd.pop('payload', None) - cmd = ','.join('{}={}'.format(k, v) for k, v in cmd.items()) + cmd = ','.join(f'{k}={v}' for k, v in cmd.items()) ans = [] w = ans.append w(b'\033_G'), w(cmd.encode('ascii')) diff --git a/glfw/glfw.py b/glfw/glfw.py index fc06b6b9a..6cfb89650 100755 --- a/glfw/glfw.py +++ b/glfw/glfw.py @@ -67,7 +67,7 @@ class Env: def wayland_protocol_file_name(base: str, ext: str = 'c') -> str: base = os.path.basename(base).rpartition('.')[0] - return 'wayland-{}-client-protocol.{}'.format(base, ext) + return f'wayland-{base}-client-protocol.{ext}' def init_env( @@ -150,14 +150,14 @@ def build_wayland_protocols( for protocol in env.wayland_protocols: src = os.path.join(env.wayland_packagedir, protocol) if not os.path.exists(src): - raise SystemExit('The wayland-protocols package on your system is missing the {} protocol definition file'.format(protocol)) + raise SystemExit(f'The wayland-protocols package on your system is missing the {protocol} protocol definition file') for ext in 'hc': dest = wayland_protocol_file_name(src, ext) dest = os.path.join(dest_dir, dest) if newer(dest, src): q = 'client-header' if ext == 'h' else env.wayland_scanner_code items.append(Command( - 'Generating {} ...'.format(emphasis(os.path.basename(dest))), + f'Generating {emphasis(os.path.basename(dest))} ...', [env.wayland_scanner, q, src, dest], lambda: True)) if items: parallel_run(items) @@ -174,7 +174,7 @@ class Arg: self.type = self.type + '*' def __repr__(self) -> str: - return 'Arg({}, {})'.format(self.type, self.name) + return f'Arg({self.type}, {self.name})' class Function: diff --git a/kittens/diff/collect.py b/kittens/diff/collect.py index 0f39659c4..2380de75c 100644 --- a/kittens/diff/collect.py +++ b/kittens/diff/collect.py @@ -32,8 +32,7 @@ class Segment: self.end_code: Optional[str] = None def __repr__(self) -> str: - return 'Segment(start={!r}, start_code={!r}, end={!r}, end_code={!r})'.format( - self.start, self.start_code, self.end, self.end_code) + return f'Segment(start={self.start!r}, start_code={self.start_code!r}, end={self.end!r}, end_code={self.end_code!r})' class Collection: diff --git a/kitty/conf/utils.py b/kitty/conf/utils.py index 6a940cd2d..5a190f537 100644 --- a/kitty/conf/utils.py +++ b/kitty/conf/utils.py @@ -323,8 +323,7 @@ def parse_kittens_func_args(action: str, args_funcs: Dict[str, KeyFunc[Tuple[str parser = args_funcs[func] except KeyError as e: raise KeyError( - 'Unknown action: {}. Check if map action: ' - '{} is valid'.format(func, action) + f'Unknown action: {func}. Check if map action: {action} is valid' ) from e try: diff --git a/kitty/config.py b/kitty/config.py index 1dab637a9..1df21c944 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -49,8 +49,7 @@ def atomic_save(data: bytes, path: str) -> None: except FileNotFoundError: pass except Exception as err: - log_error('Failed to delete temp file {} for atomic save with error: {}'.format( - p, err)) + log_error(f'Failed to delete temp file {p} for atomic save with error: {err}') @contextmanager @@ -63,8 +62,7 @@ def cached_values_for(name: str) -> Generator[Dict[str, Any], None, None]: except FileNotFoundError: pass except Exception as err: - log_error('Failed to load cached in {} values with error: {}'.format( - name, err)) + log_error(f'Failed to load cached in {name} values with error: {err}') yield cached_values @@ -72,8 +70,7 @@ def cached_values_for(name: str) -> Generator[Dict[str, Any], None, None]: data = json.dumps(cached_values).encode('utf-8') atomic_save(data, cached_path) except Exception as err: - log_error('Failed to save cached values with error: {}'.format( - err)) + log_error(f'Failed to save cached values with error: {err}') def commented_out_default_config() -> str: diff --git a/kitty/fonts/render.py b/kitty/fonts/render.py index 2e3aa7768..500acb950 100644 --- a/kitty/fonts/render.py +++ b/kitty/fonts/render.py @@ -323,8 +323,7 @@ def render_special( try: f(ans, cell_width, *a) except Exception as e: - log_error('Failed to render {} at cell_width={} and cell_height={} with error: {}'.format( - f.__name__, cell_width, cell_height, e)) + log_error(f'Failed to render {f.__name__} at cell_width={cell_width} and cell_height={cell_height} with error: {e}') if underline: t = underline_thickness diff --git a/kitty/options/utils.py b/kitty/options/utils.py index a0de71533..1a735b62d 100644 --- a/kitty/options/utils.py +++ b/kitty/options/utils.py @@ -1104,8 +1104,7 @@ def deprecated_send_text(key: str, val: str, ans: Dict[str, Any]) -> None: parts = val.split(' ') def abort(msg: str) -> None: - log_error('Send text: {} is invalid ({}), ignoring'.format( - val, msg)) + log_error(f'Send text: {val} is invalid ({msg}), ignoring') if len(parts) < 3: return abort('Incomplete') diff --git a/kitty/rc/disable_ligatures.py b/kitty/rc/disable_ligatures.py index 2fe35400b..8f05231d9 100644 --- a/kitty/rc/disable_ligatures.py +++ b/kitty/rc/disable_ligatures.py @@ -43,7 +43,7 @@ cause ligatures to be changed in all windows. ' never, always or cursor') strategy = args[0] if strategy not in ('never', 'always', 'cursor'): - self.fatal('{} is not a valid disable_ligatures strategy'.format('strategy')) + self.fatal(f'{strategy} is not a valid disable_ligatures strategy') return { 'strategy': strategy, 'match_window': opts.match, 'match_tab': opts.match_tab, 'all': opts.all, diff --git a/kitty/window.py b/kitty/window.py index 01aef69b1..2ae72652f 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -449,8 +449,7 @@ class Window: return self.override_title or self.child_title def __repr__(self) -> str: - return 'Window(title={}, id={})'.format( - self.title, self.id) + return f'Window(title={self.title}, id={self.id})' def as_dict(self, is_focused: bool = False, is_self: bool = False) -> WindowDict: return dict( diff --git a/logo/make.py b/logo/make.py index 6b6085e35..27270952c 100755 --- a/logo/make.py +++ b/logo/make.py @@ -19,7 +19,7 @@ def run(*args): try: subprocess.check_call(args) except OSError: - raise SystemExit('You are missing the {} program needed to generate the kitty logo'.format(args[0])) + raise SystemExit(f'You are missing the {args[0]} program needed to generate the kitty logo') def render(output, sz=256, src=unframed_src): diff --git a/publish.py b/publish.py index 79af31a8f..063862c14 100755 --- a/publish.py +++ b/publish.py @@ -249,7 +249,7 @@ class GitHub(Base): # {{{ self.requests = s = requests.Session() s.auth = (self.username, self.password) s.headers.update({'Accept': 'application/vnd.github.v3+json'}) - self.url_base = self.API + f'repos/{self.username}/{self.reponame}/releases/' + self.url_base = f'{self.API}repos/{self.username}/{self.reponame}/releases/' def patch(self, url: str, fail_msg: str, **data: Any) -> None: rdata = json.dumps(data) @@ -283,7 +283,7 @@ class GitHub(Base): # {{{ self.info(f'Deleting {fname} from GitHub') r = self.requests.delete(asset_url.format(existing_assets[fname])) if r.status_code not in (204, 404): - self.fail(r, 'Failed to delete %s from GitHub' % fname) + self.fail(r, f'Failed to delete {fname} from GitHub') self.update_nightly_description(release['id']) for path, desc in self.files.items(): self.info('') @@ -305,17 +305,12 @@ class GitHub(Base): # {{{ if release.get( 'assets', None) and release['tag_name'] != self.current_tag_name: - self.info('\nDeleting old released installers from: %s' % - release['tag_name']) + self.info(f'\nDeleting old released installers from: {release["tag_name"]}') for asset in release['assets']: r = self.requests.delete( - self.API + 'repos/{}/{}/releases/assets/{}'.format( - self.username, self.reponame, asset['id'])) + f'{self.API}repos/{self.username}/{self.reponame}/releases/assets/{asset["id"]}') if r.status_code != 204: - self.fail( - r, - 'Failed to delete obsolete asset: %s for release: %s' - % (asset['name'], release['tag_name'])) + self.fail(r, f'Failed to delete obsolete asset: {asset["name"]} for release: {release["tag_name"]}') def do_upload(self, url: str, path: str, desc: str, fname: str) -> requests.Response: mime_type = mimetypes.guess_type(fname)[0] or 'application/octet-stream' @@ -331,8 +326,8 @@ class GitHub(Base): # {{{ data=cast(IO[bytes], f)) def fail(self, r: requests.Response, msg: str) -> None: - print(msg, ' Status Code: %s' % r.status_code, file=sys.stderr) - print("JSON from response:", file=sys.stderr) + print(msg, f' Status Code: {r.status_code}', file=sys.stderr) + print('JSON from response:', file=sys.stderr) pprint.pprint(dict(r.json()), stream=sys.stderr) raise SystemExit(1) @@ -341,8 +336,7 @@ class GitHub(Base): # {{{ return bool(error_code == 'already_exists') def existing_assets(self, release_id: str) -> Dict[str, str]: - url = self.API + 'repos/{}/{}/releases/{}/assets'.format( - self.username, self.reponame, release_id) + url = f'{self.API}repos/{self.username}/{self.reponame}/releases/{release_id}/assets' r = self.requests.get(url) if r.status_code != 200: self.fail(r, 'Failed to get assets for release') @@ -357,13 +351,13 @@ class GitHub(Base): # {{{ return dict(r.json()) if self.is_nightly: raise SystemExit('No existing nightly release found on GitHub') - url = self.API + f'repos/{self.username}/{self.reponame}/releases' + url = f'{self.API}repos/{self.username}/{self.reponame}/releases' r = self.requests.post( url, data=json.dumps({ 'tag_name': self.current_tag_name, 'target_commitish': 'master', - 'name': 'version %s' % self.version, + 'name': f'version {self.version}', 'body': f'Release version {self.version}.' ' For changelog, see https://sw.kovidgoyal.net/kitty/changelog/' ' GPG key used for signing tarballs is: https://calibre-ebook.com/signatures/kovid.gpg', @@ -371,8 +365,7 @@ class GitHub(Base): # {{{ 'prerelease': False })) if r.status_code != 201: - self.fail(r, 'Failed to create release for version: %s' % - self.version) + self.fail(r, f'Failed to create release for version: {self.version}') return dict(r.json()) # }}} diff --git a/setup.py b/setup.py index 26dac7092..f931b94bf 100755 --- a/setup.py +++ b/setup.py @@ -130,11 +130,7 @@ def at_least_version(package: str, major: int, minor: int = 0) -> None: except Exception: ver = 'not found' if qmajor < major or (qmajor == major and qminor < minor): - raise SystemExit( - '{} >= {}.{} is required, found version: {}'.format( - error(package), major, minor, ver - ) - ) + raise SystemExit(f'{error(package)} >= {major}.{minor} is required, found version: {ver}') def cc_version() -> Tuple[List[str], Tuple[int, int]]: @@ -880,7 +876,7 @@ def build_launcher(args: Options, launcher_dir: str = '.', bundle_type: str = 's cmd = env.cc + cppflags + cflags + [ src, '-o', dest] + ldflags + libs + pylib key = CompileKey('launcher.c', 'kitty') - desc = 'Building {}...'.format(emphasis('launcher')) + desc = f'Building {emphasis("launcher")} ...' args.compilation_database.add_command(desc, cmd, partial(newer, dest, src), key=key, keyfile=src) args.compilation_database.build_all() @@ -948,7 +944,7 @@ def compile_python(base_path: str) -> None: def create_linux_bundle_gunk(ddir: str, libdir_name: str) -> None: if not os.path.exists('docs/_build/html'): - make = "gmake" if is_freebsd else "make" + make = 'gmake' if is_freebsd else 'make' run_tool([make, 'docs']) copy_man_pages(ddir) copy_html_docs(ddir) diff --git a/update-on-ox b/update-on-ox index f03a641a5..8fc195fbe 100755 --- a/update-on-ox +++ b/update-on-ox @@ -16,17 +16,17 @@ if False: dmg = sys.argv[-1] mp = tempfile.mkdtemp() atexit.register(os.rmdir, mp) - subprocess.check_call('hdiutil attach {} -mountpoint {}'.format(dmg, mp).split()) + subprocess.check_call(f'hdiutil attach {dmg} -mountpoint {mp}'.split()) try: os.chdir(mp) for app in glob.glob('*.app'): d = os.path.join('/Applications', app) if os.path.exists(d): shutil.rmtree(d) - subprocess.check_call('ditto -v {} {}'.format(app, os.path.join('/Applications', app)).split()) + subprocess.check_call(f'ditto -v {app} {d}'.split()) finally: os.chdir('/') - subprocess.check_call('hdiutil detach {}'.format(mp).split()) + subprocess.check_call(f'hdiutil detach {mp}'.split()) # EOF_REMOTE