diff options
author | JensDiemer <git@jensdiemer.de> | 2020-01-19 10:48:42 +0100 |
---|---|---|
committer | JensDiemer <git@jensdiemer.de> | 2020-01-19 10:48:42 +0100 |
commit | 748b8a55d227066602699836078b3032c55b6f6b (patch) | |
tree | ec8c9b7c20af32799640ccc941f7847e68428031 | |
parent | 842c244de2a81b39cde9994e67a000e7bef75f15 (diff) | |
download | creole-748b8a55d227066602699836078b3032c55b6f6b.tar.gz |
convert old "%-formatted" and .format(...) strings into "f-strings" with flynt
-rw-r--r-- | .github/workflows/pythonapp.yml | 8 | ||||
-rw-r--r-- | .travis.yml | 1 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | creole/cmdline.py | 16 | ||||
-rw-r--r-- | creole/emitter/creol2html_emitter.py | 44 | ||||
-rw-r--r-- | creole/emitter/html2creole_emitter.py | 6 | ||||
-rw-r--r-- | creole/emitter/html2rest_emitter.py | 20 | ||||
-rw-r--r-- | creole/emitter/html2textile_emitter.py | 8 | ||||
-rw-r--r-- | creole/html_tools/deentity.py | 2 | ||||
-rw-r--r-- | creole/parser/creol2html_parser.py | 6 | ||||
-rw-r--r-- | creole/parser/html_parser.py | 28 | ||||
-rw-r--r-- | creole/rest_tools/clean_writer.py | 10 | ||||
-rw-r--r-- | creole/setup_utils.py | 8 | ||||
-rw-r--r-- | creole/shared/base_emitter.py | 24 | ||||
-rw-r--r-- | creole/shared/document_tree.py | 8 | ||||
-rw-r--r-- | creole/shared/markup_table.py | 2 | ||||
-rw-r--r-- | creole/shared/unknown_tags.py | 16 | ||||
-rw-r--r-- | creole/shared/utils.py | 2 | ||||
-rw-r--r-- | creole/tests/test_cli.py | 6 | ||||
-rw-r--r-- | creole/tests/test_creole2html.py | 2 | ||||
-rw-r--r-- | creole/tests/test_macros.py | 2 | ||||
-rw-r--r-- | creole/tests/test_setup_utils.py | 4 | ||||
-rw-r--r-- | creole/tests/utils/base_unittest.py | 4 |
23 files changed, 108 insertions, 126 deletions
diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index a244f20..620ca27 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -28,10 +28,10 @@ jobs: source $HOME/.poetry/env make tox-listenvs -# - name: Run linters -# run: | -# source $HOME/.poetry/env -# make lint + - name: Run linters + run: | + source $HOME/.poetry/env + make lint - name: Run tests with Python v3.8 run: | diff --git a/.travis.yml b/.travis.yml index c2d158e..5ff3ee0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ install: script: - make pytest + - make lint after_success: - coveralls @@ -29,14 +29,15 @@ install: check-poetry ## install python-creole via poetry poetry install lint: ## Run code formatters and linter + poetry run flynt --fail-on-change --line_length=119 creole # poetry run isort --check-only --recursive creole # poetry run black --line-length=119 --check creole - poetry run flake8 creole +# poetry run flake8 creole fix-code-style: ## Fix code formatting -# poetry run flynt --line_length=119 creole + poetry run flynt --line_length=119 creole # poetry run isort --apply --recursive creole - poetry run autopep8 --ignore-local-config --max-line-length=${MAX_LINE_LENGTH} --aggressive --aggressive --in-place --recursive creole +# poetry run autopep8 --ignore-local-config --max-line-length=${MAX_LINE_LENGTH} --aggressive --aggressive --in-place --recursive creole tox-listenvs: check-poetry ## List all tox test environments poetry run tox --listenvs diff --git a/creole/cmdline.py b/creole/cmdline.py index 78f4eb4..66e49be 100644 --- a/creole/cmdline.py +++ b/creole/cmdline.py @@ -1,11 +1,10 @@ -#!/usr/bin/env python -# coding: utf-8 +#!/usr/bin/env python3 """ python-creole commandline interface ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyleft: 2013 by the python-creole team, see AUTHORS for more details. + :copyleft: 2013-2020 by the python-creole team, see AUTHORS for more details. :license: GNU GPL v3 or above, see LICENSE for more details. """ @@ -27,8 +26,9 @@ class CreoleCLI(object): " creole2html, html2creole, html2ReSt, html2textile" ), ) - self.parser.add_argument('--version', action='version', - version='%%(prog)s from python-creole v%s' % VERSION_STRING + self.parser.add_argument( + '--version', action='version', + version='%%(prog)s from python-creole v%s' % VERSION_STRING # noqa flynt ) self.parser.add_argument("sourcefile", help="source file to convert") self.parser.add_argument("destination", help="Output filename") @@ -46,16 +46,14 @@ class CreoleCLI(object): self.convert(sourcefile, destination, encoding) def convert(self, sourcefile, destination, encoding): - print("Convert %r to %r with %s (codec: %s)" % ( - sourcefile, destination, self.convert_func.__name__, encoding - )) + print(f"Convert {sourcefile!r} to {destination!r} with {self.convert_func.__name__} (codec: {encoding})") with codecs.open(sourcefile, "r", encoding=encoding) as infile: with codecs.open(destination, "w", encoding=encoding) as outfile: content = infile.read() converted = self.convert_func(content) outfile.write(converted) - print("done. %r created." % destination) + print(f"done. {destination!r} created.") def cli_creole2html(): diff --git a/creole/emitter/creol2html_emitter.py b/creole/emitter/creol2html_emitter.py index 76f6997..e583567 100644 --- a/creole/emitter/creol2html_emitter.py +++ b/creole/emitter/creol2html_emitter.py @@ -66,12 +66,12 @@ class TableOfContent(object): """Convert a python nested list like the one representing the toc to an html equivalent.""" indent = "\t"*level if isinstance(nested_headlines, str): - return '%s<li><a href="#%s">%s</a></li>\n' % (indent, nested_headlines, nested_headlines) + return f'{indent}<li><a href="#{nested_headlines}">{nested_headlines}</a></li>\n' elif isinstance(nested_headlines, list): - html = '%s<ul>\n' % indent + html = f'{indent}<ul>\n' for elt in nested_headlines: html += self.nested_headlines2html(elt, level + 1) - html += '%s</ul>' % indent + html += f'{indent}</ul>' if level > 0: html += "\n" return html @@ -239,15 +239,11 @@ class HtmlEmitter(object): #-------------------------------------------------------------------------- def header_emit(self, node): - header = '<h%d>%s</h%d>' % ( - node.level, self.html_escape(node.content), node.level - ) + header = f'<h{node.level:d}>{self.html_escape(node.content)}</h{node.level:d}>' if self.toc is not None: self.toc.add_headline(node.level, node.content) # add link attribute for toc navigation - header = '<a name="%s">%s</a>' % ( - self.html_escape(node.content), header - ) + header = f'<a name="{self.html_escape(node.content)}">{header}</a>' header += "\n" return header @@ -262,8 +258,7 @@ class HtmlEmitter(object): else: inside = self.html_escape(target) - return '<a href="%s">%s</a>' % ( - self.attr_escape(target), inside) + return f'<a href="{self.attr_escape(target)}">{inside}</a>' def image_emit(self, node): target = node.content @@ -281,8 +276,7 @@ class HtmlEmitter(object): self.attr_escape(target), title, title, width, height) except: pass - return '<img src="%s" title="%s" alt="%s" />' % ( - self.attr_escape(target), text, text) + return f'<img src="{self.attr_escape(target)}" title="{text}" alt="{text}" />' def macro_emit(self, node): #print(node.debug()) @@ -296,9 +290,7 @@ class HtmlEmitter(object): except ValueError as e: exc_info = sys.exc_info() return self.error( - "Wrong macro arguments: %s for macro '%s' (maybe wrong macro tag syntax?)" % ( - json.dumps(args), macro_name - ), + f"Wrong macro arguments: {json.dumps(args)} for macro '{macro_name}' (maybe wrong macro tag syntax?)", exc_info ) @@ -318,14 +310,14 @@ class HtmlEmitter(object): if macro == None: return self.error( - "Macro '%s' doesn't exist" % macro_name, + f"Macro '{macro_name}' doesn't exist", exc_info ) try: result = macro(**macro_kwargs) except TypeError as err: - msg = "Macro '%s' error: %s" % (macro_name, err) + msg = f"Macro '{macro_name}' error: {err}" exc_info = sys.exc_info() if self.verbose > 1: if self.verbose > 2: @@ -342,22 +334,22 @@ class HtmlEmitter(object): try: sourceline = inspect.getsourcelines(macro)[0][0].strip() except IOError as err: - evalue = etype("%s (error getting sourceline: %s from %s)" % (evalue, err, filename)) + evalue = etype(f"{evalue} (error getting sourceline: {err} from {filename})") else: - evalue = etype("%s (sourceline: %r from %s)" % (evalue, sourceline, filename)) + evalue = etype(f"{evalue} (sourceline: {sourceline!r} from {filename})") exc_info = etype, evalue, etb return self.error(msg, exc_info) except Exception as err: return self.error( - "Macro '%s' error: %s" % (macro_name, err), + f"Macro '{macro_name}' error: {err}", exc_info=sys.exc_info() ) if not isinstance(result, str): - msg = "Macro '%s' doesn't return a unicode string!" % macro_name + msg = f"Macro '{macro_name}' doesn't return a unicode string!" if self.verbose > 1: - msg += " - returns: %r, type %r" % (result, type(result)) + msg += f" - returns: {result!r}, type {type(result)!r}" return self.error(msg) if node.kind == "macro_block": @@ -388,7 +380,7 @@ class HtmlEmitter(object): def default_emit(self, node): """Fallback function for emitting unknown nodes.""" - raise NotImplementedError("Node '%s' unknown" % node.kind) + raise NotImplementedError(f"Node '{node.kind}' unknown") def emit_children(self, node): """Emit all the children of a node.""" @@ -397,7 +389,7 @@ class HtmlEmitter(object): def emit_node(self, node): """Emit a single node.""" #print("%s_emit: %r" % (node.kind, node.content)) - emit = getattr(self, '%s_emit' % node.kind, self.default_emit) + emit = getattr(self, f'{node.kind}_emit', self.default_emit) return emit(node) def emit(self): @@ -418,7 +410,7 @@ class HtmlEmitter(object): self.stderr.write(exception) if self.verbose > 0: - return "[Error: %s]\n" % text + return f"[Error: {text}]\n" else: # No error output return "" diff --git a/creole/emitter/html2creole_emitter.py b/creole/emitter/html2creole_emitter.py index 00fd142..4a191b3 100644 --- a/creole/emitter/html2creole_emitter.py +++ b/creole/emitter/html2creole_emitter.py @@ -43,7 +43,7 @@ class CreoleEmitter(BaseEmitter): return "{{{%s}}}" % self.deentity.replace_all(node.content) def blockdata_pass_emit(self, node): - return "%s\n\n" % node.content + return f"{node.content}\n\n" return node.content #-------------------------------------------------------------------------- @@ -101,9 +101,9 @@ class CreoleEmitter(BaseEmitter): # e.g.: <a name="anchor-one">foo</a> return link_text if link_text == url: - return "[[%s]]" % url + return f"[[{url}]]" else: - return "[[%s|%s]]" % (url, link_text) + return f"[[{url}|{link_text}]]" def img_emit(self, node): src = node.attrs["src"] diff --git a/creole/emitter/html2rest_emitter.py b/creole/emitter/html2rest_emitter.py index 0e0b663..9c46313 100644 --- a/creole/emitter/html2rest_emitter.py +++ b/creole/emitter/html2rest_emitter.py @@ -61,14 +61,14 @@ class ReStructuredTextEmitter(BaseEmitter): """ pre block -> with newline at the end """ pre_block = self.deentity.replace_all(node.content).strip() pre_block = "\n".join([" %s" % line for line in pre_block.splitlines()]) - return "::\n\n%s\n\n" % pre_block + return f"::\n\n{pre_block}\n\n" def inlinedata_pre_emit(self, node): """ a pre inline block -> no newline at the end """ return "<pre>%s</pre>" % self.deentity.replace_all(node.content) def blockdata_pass_emit(self, node): - return "%s\n\n" % node.content + return f"{node.content}\n\n" return node.content #-------------------------------------------------------------------------- @@ -212,16 +212,16 @@ class ReStructuredTextEmitter(BaseEmitter): if not old_url: # new substitution self._substitution_data.append( - ".. _%s: %s" % (link_text, url) + f".. _{link_text}: {url}" ) - return "`%s`_" % link_text + return f"`{link_text}`_" if old_url: # reuse a existing substitution - return "`%s`_" % link_text + return f"`{link_text}`_" else: # create a inline hyperlink - return "`%s <%s>`_" % (link_text, url) + return f"`{link_text} <{url}>`_" def img_emit(self, node): src = node.attrs["src"] @@ -244,10 +244,10 @@ class ReStructuredTextEmitter(BaseEmitter): ) if not old_src: self._substitution_data.append( - ".. |%s| image:: %s" % (substitution_text, src) + f".. |{substitution_text}| image:: {src}" ) - return "|%s|" % substitution_text + return f"|{substitution_text}|" #-------------------------------------------------------------------------- @@ -270,7 +270,7 @@ class ReStructuredTextEmitter(BaseEmitter): if node.level == 1: # FIXME: This should be made easier and better complete_list = "\n\n".join([i.strip("\n") for i in content.split("\n") if i]) - content = "%s\n\n" % complete_list + content = f"{complete_list}\n\n" return content @@ -291,7 +291,7 @@ class ReStructuredTextEmitter(BaseEmitter): ) self.emit_children(node) content = self._table.get_rest_table() - return "%s\n\n" % content + return f"{content}\n\n" if __name__ == '__main__': diff --git a/creole/emitter/html2textile_emitter.py b/creole/emitter/html2textile_emitter.py index e43b0df..0326ec9 100644 --- a/creole/emitter/html2textile_emitter.py +++ b/creole/emitter/html2textile_emitter.py @@ -43,7 +43,7 @@ class TextileEmitter(BaseEmitter): return "<pre>%s</pre>" % self.deentity.replace_all(node.content) def blockdata_pass_emit(self, node): - return "%s\n\n" % node.content + return f"{node.content}\n\n" return node.content @@ -53,7 +53,7 @@ class TextileEmitter(BaseEmitter): return "%s\n\n" % self.emit_children(node) def headline_emit(self, node): - return "h%i. %s\n\n" % (node.level, self.emit_children(node)) + return f"h{node.level:d}. {self.emit_children(node)}\n\n" #-------------------------------------------------------------------------- @@ -96,7 +96,7 @@ class TextileEmitter(BaseEmitter): def a_emit(self, node): link_text = self.emit_children(node) url = node.attrs["href"] - return '"%s":%s' % (link_text, url) + return f'"{link_text}":{url}' def img_emit(self, node): src = node.attrs["src"] @@ -114,7 +114,7 @@ class TextileEmitter(BaseEmitter): if text == "": # Use filename as picture text text = posixpath.basename(src) - return "!%s(%s)!" % (src, text) + return f"!{src}({text})!" #-------------------------------------------------------------------------- diff --git a/creole/html_tools/deentity.py b/creole/html_tools/deentity.py index fd23782..1f706ae 100644 --- a/creole/html_tools/deentity.py +++ b/creole/html_tools/deentity.py @@ -67,7 +67,7 @@ class Deentity(object): groups = match.groupdict() for name, text in groups.items(): if text is not None: - replace_method = getattr(self, 'replace_%s' % name) + replace_method = getattr(self, f'replace_{name}') return replace_method(text) # Should never happen: diff --git a/creole/parser/creol2html_parser.py b/creole/parser/creol2html_parser.py index 7c519d8..9e97031 100644 --- a/creole/parser/creol2html_parser.py +++ b/creole/parser/creol2html_parser.py @@ -357,7 +357,7 @@ class CreoleParser(object): self.cur = DocNode(key, self.cur) self.text = None - text = groups["%s_text" % key] + text = groups[f"{key}_text"] self.parse_inline(text) self.cur = self._upto(self.cur, (key,)).parent @@ -431,7 +431,7 @@ class CreoleParser(object): if self.debug and name != "char": # TODO: use logging debug(groups) - replace_method = getattr(self, '_%s_repl' % name) + replace_method = getattr(self, f'_{name}_repl') replace_method(groups) return @@ -465,7 +465,7 @@ class CreoleParser(object): start_node = self.root print(" document tree:") else: - print(" tree from %s:" % start_node) + print(f" tree from {start_node}:") print("=" * 80) def emit(node, ident=0): diff --git a/creole/parser/html_parser.py b/creole/parser/html_parser.py index 6cd1c88..741754f 100644 --- a/creole/parser/html_parser.py +++ b/creole/parser/html_parser.py @@ -96,11 +96,11 @@ class HtmlParser(HTMLParser): def _pre_cut(self, data, type, placeholder): if self.debugging: - print("append blockdata: %r" % data) + print(f"append blockdata: {data!r}") assert isinstance(data, str), "blockdata is not unicode" self.blockdata.append(data) id = len(self.blockdata) - 1 - return '<%s type="%s" id="%s" />' % (placeholder, type, id) + return f'<{placeholder} type="{type}" id="{id}" />' def _pre_pre_inline_cut(self, groups): return self._pre_cut(groups["pre_inline"], "pre", self._inline_placeholder) @@ -120,7 +120,7 @@ class HtmlParser(HTMLParser): if text is not None: if self.debugging: print("%15s: %r (%r)" % (name, text, match.group(0))) - method = getattr(self, '_pre_%s_cut' % name) + method = getattr(self, f'_pre_{name}_cut') return method(groups) # data = match.group("data") @@ -175,7 +175,7 @@ class HtmlParser(HTMLParser): #------------------------------------------------------------------------- def handle_starttag(self, tag, attrs): - self.debug_msg("starttag", "%r atts: %s" % (tag, attrs)) + self.debug_msg("starttag", f"{tag!r} atts: {attrs}") if tag in IGNORE_TAGS: return @@ -200,26 +200,26 @@ class HtmlParser(HTMLParser): self.cur = DocNode(tag, self.cur, None, attrs) def handle_data(self, data): - self.debug_msg("data", "%r" % data) + self.debug_msg("data", f"{data!r}") assert isinstance(data, str) DocNode("data", self.cur, content=data) def handle_charref(self, name): - self.debug_msg("charref", "%r" % name) + self.debug_msg("charref", f"{name!r}") DocNode("charref", self.cur, content=name) def handle_entityref(self, name): - self.debug_msg("entityref", "%r" % name) + self.debug_msg("entityref", f"{name!r}") DocNode("entityref", self.cur, content=name) def handle_startendtag(self, tag, attrs): - self.debug_msg("startendtag", "%r atts: %s" % (tag, attrs)) + self.debug_msg("startendtag", f"{tag!r} atts: {attrs}") attr_dict = dict(attrs) if tag in (self._block_placeholder, self._inline_placeholder): id = int(attr_dict["id"]) # block_type = attr_dict["type"] DocNode( - "%s_%s" % (tag, attr_dict["type"]), + f"{tag}_{attr_dict['type']}", self.cur, content=self.blockdata[id], # attrs = attr_dict @@ -231,7 +231,7 @@ class HtmlParser(HTMLParser): if tag in IGNORE_TAGS: return - self.debug_msg("endtag", "%r" % tag) + self.debug_msg("endtag", f"{tag!r}") if tag == "br": # handled in starttag return @@ -263,7 +263,7 @@ class HtmlParser(HTMLParser): start_node = self.root print(" document tree:") else: - print(" tree from %s:" % start_node) + print(f" tree from {start_node}:") print("=" * 80) def emit(node, ident=0): @@ -271,13 +271,13 @@ class HtmlParser(HTMLParser): txt = "%s%s" % (" " * ident, child.kind) if child.content: - txt += ": %r" % child.content + txt += f": {child.content!r}" if child.attrs: - txt += " - attrs: %r" % child.attrs + txt += f" - attrs: {child.attrs!r}" if child.level != None: - txt += " - level: %r" % child.level + txt += f" - level: {child.level!r}" print(txt) emit(child, ident + 4) diff --git a/creole/rest_tools/clean_writer.py b/creole/rest_tools/clean_writer.py index b6272ab..c56e44b 100644 --- a/creole/rest_tools/clean_writer.py +++ b/creole/rest_tools/clean_writer.py @@ -74,7 +74,7 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object): if tagname in IGNORE_TAGS: if DEBUG: - print("ignore tag %r" % tagname) + print(f"ignore tag {tagname!r}") return "" parts = [tagname] @@ -91,7 +91,7 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object): if isinstance(value, list): value = ' '.join([str(x) for x in value]) - part = '%s="%s"' % (name.lower(), self.attval(str(value))) + part = f'{name.lower()}="{self.attval(str(value))}"' parts.append(part) if DEBUG: @@ -105,7 +105,7 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object): infix = '' html = '<%s%s>%s' % (' '.join(parts), infix, suffix) if DEBUG: - print("startag html: %r" % html) + print(f"startag html: {html!r}") return html def visit_section(self, node): @@ -180,7 +180,7 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object): align = node.parent['align'] if align: - self.body[-1] = self.body[-1].replace(' />', ' align="%s" />' % align) + self.body[-1] = self.body[-1].replace(' />', f' align="{align}" />') @@ -199,7 +199,7 @@ def rest2html(content, enable_exit_status=None, **kwargs): ... SystemExit: 13 """ - assert isinstance(content, str), "rest2html content must be %s, but it's %s" % (str, type(content)) + assert isinstance(content, str), f"rest2html content must be {str}, but it's {type(content)}" settings_overrides = { "input_encoding": "unicode", diff --git a/creole/setup_utils.py b/creole/setup_utils.py index 36e30e1..2eb28ab 100644 --- a/creole/setup_utils.py +++ b/creole/setup_utils.py @@ -105,9 +105,7 @@ def get_long_description(package_root, filename="README.creole", raise_errors=No raise # Don't raise the error e.g. in ./setup install process evalue = sys.exc_info()[1] - long_description_rest = "[Error: %s]\n%s" % ( - evalue, long_description_origin - ) + long_description_rest = f"[Error: {evalue}]\n{long_description_origin}" else: if raise_errors: # Test created ReSt code like PyPi does it. @@ -115,11 +113,11 @@ def get_long_description(package_root, filename="README.creole", raise_errors=No try: pypi_rest2html(long_description_rest) except SystemExit as e: - msg = "Error creole2rest self test failed: rest2html() exist with status code: %s\n" % e.args[0] + msg = f"Error creole2rest self test failed: rest2html() exist with status code: {e.args[0]}\n" sys.stderr.write(msg) sys.exit(msg) except Exception as e: - sys.exit("ReSt2html error: %s" % e) + sys.exit(f"ReSt2html error: {e}") else: if "check" in sys.argv: print("Generating creole to ReSt to html, ok.") diff --git a/creole/shared/base_emitter.py b/creole/shared/base_emitter.py index a29c224..8113de1 100644 --- a/creole/shared/base_emitter.py +++ b/creole/shared/base_emitter.py @@ -38,7 +38,7 @@ class BaseEmitter(object): #-------------------------------------------------------------------------- def blockdata_pass_emit(self, node): - return "%s\n\n" % node.content + return f"{node.content}\n\n" return node.content #-------------------------------------------------------------------------- @@ -57,11 +57,11 @@ class BaseEmitter(object): return self.deentity.replace_named(entity) except KeyError as err: if self.debugging: - print("unknown html entity found: %r" % entity) - return "&%s" % entity # FIXME + print(f"unknown html entity found: {entity!r}") + return f"&{entity}" # FIXME except UnicodeDecodeError as err: raise UnicodeError( - "Error handling entity %r: %s" % (entity, err) + f"Error handling entity {entity!r}: {err}" ) def charref_emit(self, node): @@ -98,7 +98,7 @@ class BaseEmitter(object): def li_emit(self, node): content = self.emit_children(node) - return "\n%s %s" % (self._inner_list, content) + return f"\n{self._inner_list} {content}" def _list_emit(self, node, list_type): start_newline = False @@ -133,7 +133,7 @@ class BaseEmitter(object): ) self.emit_children(node) content = self._table.get_table_markup() - return "%s\n" % content + return f"{content}\n" def tr_emit(self, node): self._table.add_tr() @@ -167,7 +167,7 @@ class BaseEmitter(object): content = self.emit_children(node) content = self._escape_linebreaks(content) if node.kind in BLOCK_TAGS: - content = "%s\n\n" % content + content = f"{content}\n\n" return content def div_emit(self, node): @@ -201,17 +201,15 @@ class BaseEmitter(object): def unicode_error(method_name, method, node, content): node.debug() raise AssertionError( - "Method '%s' (%s) returns no unicode - returns: %s (%s)" % ( - method_name, method, repr(content), type(content) - ) + f"Method '{method_name}' ({method}) returns no unicode - returns: {repr(content)} ({type(content)})" ) if node.level: - self.debug_msg("emit_node", "%s (level: %i): %r" % (node.kind, node.level, node.content)) + self.debug_msg("emit_node", f"{node.kind} (level: {node.level:d}): {node.content!r}") else: - self.debug_msg("emit_node", "%s: %r" % (node.kind, node.content)) + self.debug_msg("emit_node", f"{node.kind}: {node.content!r}") - method_name = "%s_emit" % node.kind + method_name = f"{node.kind}_emit" emit_method = getattr(self, method_name, None) if emit_method: diff --git a/creole/shared/document_tree.py b/creole/shared/document_tree.py index e5b7bcf..6198c8a 100644 --- a/creole/shared/document_tree.py +++ b/creole/shared/document_tree.py @@ -32,9 +32,7 @@ class DocNode: self.attrs = dict(attrs) if content: - assert isinstance(content, str), "Given content %r is not unicode, it's type: %s" % ( - content, type(content) - ) + assert isinstance(content, str), f"Given content {content!r} is not unicode, it's type: {type(content)}" self.content = content self.level = level @@ -57,7 +55,7 @@ class DocNode: return str(self.__repr__()) def __repr__(self): - return "<DocNode %s: %r>" % (self.kind, self.content) + return f"<DocNode {self.kind}: {self.content!r}>" # return "<DocNode %s (parent: %r): %r>" % (self.kind, self.parent, self.content) def debug(self): @@ -77,7 +75,7 @@ class DocNode: """ print("_" * 80) print("\tDocNode - debug:") - print("str(): %s" % self) + print(f"str(): {self}") print("attributes:") for i in dir(self): if i.startswith("_") or i == "debug": diff --git a/creole/shared/markup_table.py b/creole/shared/markup_table.py index ec59e66..3cddccc 100644 --- a/creole/shared/markup_table.py +++ b/creole/shared/markup_table.py @@ -46,7 +46,7 @@ class MarkupTable(object): if self.head_prefix and cell.startswith(self.head_prefix): cell += " " # Headline else: - cell = " %s " % cell # normal cell + cell = f" {cell} " # normal cell line_cells.append(cell) cells.append(line_cells) diff --git a/creole/shared/unknown_tags.py b/creole/shared/unknown_tags.py index fe231f0..cf4aa4a 100644 --- a/creole/shared/unknown_tags.py +++ b/creole/shared/unknown_tags.py @@ -30,10 +30,10 @@ def _mask_content(emitter, node, mask_tag): content = emitter.emit_children(node) if not content: # single tag - return "<<%(mask_tag)s>><%(tag)s%(attrs)s /><</%(mask_tag)s>>" % tag_data + return f"<<{tag_data['mask_tag']}>><{tag_data['tag']}{tag_data['attrs']} /><</{tag_data['mask_tag']}>>" - start_tag = "<<%(mask_tag)s>><%(tag)s%(attrs)s><</%(mask_tag)s>>" % tag_data - end_tag = "<<%(mask_tag)s>></%(tag)s><</%(mask_tag)s>>" % tag_data + start_tag = f"<<{tag_data['mask_tag']}>><{tag_data['tag']}{tag_data['attrs']}><</{tag_data['mask_tag']}>>" + end_tag = f"<<{tag_data['mask_tag']}>></{tag_data['tag']}><</{tag_data['mask_tag']}>>" return start_tag + content + end_tag @@ -47,9 +47,7 @@ def raise_unknown_node(emitter, node): """ content = emitter.emit_children(node) raise NotImplementedError( - "Node from type '%s' is not implemented! (child content: %r)" % ( - node.kind, content - ) + f"Node from type '{node.kind}' is not implemented! (child content: {content!r})" ) @@ -89,10 +87,10 @@ def escape_unknown_nodes(emitter, node): content = emitter.emit_children(node) if not content: # single tag - return escape("<%(tag)s%(attrs)s />" % tag_data) + return escape(f"<{tag_data['tag']}{tag_data['attrs']} />") - start_tag = escape("<%(tag)s%(attrs)s>" % tag_data) - end_tag = escape("</%(tag)s>" % tag_data) + start_tag = escape(f"<{tag_data['tag']}{tag_data['attrs']}>") + end_tag = escape(f"</{tag_data['tag']}>") return start_tag + content + end_tag diff --git a/creole/shared/utils.py b/creole/shared/utils.py index cb55299..f80a8ef 100644 --- a/creole/shared/utils.py +++ b/creole/shared/utils.py @@ -79,7 +79,7 @@ def dict2string(d): attr_list = [] for key, value in sorted(d.items()): value_string = json.dumps(value) - attr_list.append("%s=%s" % (key, value_string)) + attr_list.append(f"{key}={value_string}") return " ".join(attr_list) diff --git a/creole/tests/test_cli.py b/creole/tests/test_cli.py index 74fc7d7..be5f944 100644 --- a/creole/tests/test_cli.py +++ b/creole/tests/test_cli.py @@ -93,9 +93,7 @@ class CreoleCLITests(BaseCreoleTest, SubprocessMixin, CliTestMixins): def test_version(self): for cmd in CMDS: - version_info = "%s from python-creole v%s" % ( - cmd, VERSION_STRING - ) + version_info = f"{cmd} from python-creole v{VERSION_STRING}" self.assertSubprocess( popen_args=[cmd, "--version"], retcode=0, @@ -125,7 +123,7 @@ class CreoleCLITestsDirect(BaseCreoleTest, CliTestMixins): destfilepath = dest_file.name sys.argv = [cli_str, sourcefilepath, destfilepath] - cli = getattr(cmdline, "cli_%s" % cli_str) + cli = getattr(cmdline, f"cli_{cli_str}") cli() dest_file.seek(0) diff --git a/creole/tests/test_creole2html.py b/creole/tests/test_creole2html.py index b6f9ed0..dfa1246 100644 --- a/creole/tests/test_creole2html.py +++ b/creole/tests/test_creole2html.py @@ -70,7 +70,7 @@ class TestCreole2html(BaseCreoleTest): tb_lines += error_msg.splitlines() tb_lines += [" -"*40] tb = "\n".join([" >>> %s" % l for l in tb_lines]) - msg = "%r not found in:\n%s" % (part, tb) + msg = f"{part!r} not found in:\n{tb}" # TODO: use assertIn if python 2.6 will be not support anymore. if part not in error_msg: raise self.failureException(msg) diff --git a/creole/tests/test_macros.py b/creole/tests/test_macros.py index 2a036be..5069a27 100644 --- a/creole/tests/test_macros.py +++ b/creole/tests/test_macros.py @@ -28,7 +28,7 @@ def unittest_macro1(**kwargs): '[test macro1 - kwargs: a=1,b=2]' """ kwargs = ','.join(['%s=%s' % (k, json.dumps(v)) for k, v in sorted(kwargs.items())]) - return "[test macro1 - kwargs: %s]" % kwargs + return f"[test macro1 - kwargs: {kwargs}]" def unittest_macro2(char, text): diff --git a/creole/tests/test_setup_utils.py b/creole/tests/test_setup_utils.py index 30a532e..b912f92 100644 --- a/creole/tests/test_setup_utils.py +++ b/creole/tests/test_setup_utils.py @@ -44,12 +44,12 @@ class SetupUtilsTests(BaseCreoleTest): def test_creole_package_path(self): self.assertTrue( os.path.isdir(CREOLE_PACKAGE_ROOT), - "CREOLE_PACKAGE_ROOT %r is not a existing direcotry!" % CREOLE_PACKAGE_ROOT + f"CREOLE_PACKAGE_ROOT {CREOLE_PACKAGE_ROOT!r} is not a existing direcotry!" ) filepath = os.path.join(CREOLE_PACKAGE_ROOT, "README.creole") self.assertTrue( os.path.isfile(filepath), - "README file %r not found!" % filepath + f"README file {filepath!r} not found!" ) def test_get_long_description_without_raise_errors(self): diff --git a/creole/tests/utils/base_unittest.py b/creole/tests/utils/base_unittest.py index 26b67fa..4feb3b9 100644 --- a/creole/tests/utils/base_unittest.py +++ b/creole/tests/utils/base_unittest.py @@ -36,7 +36,7 @@ try: from creole.rest_tools.clean_writer import rest2html except DocutilsImportError as err: REST_INSTALLED = False - warnings.warn("Can't run all ReSt unittests: %s" % err) + warnings.warn(f"Can't run all ReSt unittests: {err}") else: REST_INSTALLED = True @@ -85,7 +85,7 @@ class BaseCreoleTest(MarkupTest): print() print("_" * 79) - print(" Debug Text: %s:" % msg) + print(f" Debug Text: {msg}:") print(text) print("-" * 79) |