summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJensDiemer <git@jensdiemer.de>2020-01-19 10:48:42 +0100
committerJensDiemer <git@jensdiemer.de>2020-01-19 10:48:42 +0100
commit748b8a55d227066602699836078b3032c55b6f6b (patch)
treeec8c9b7c20af32799640ccc941f7847e68428031
parent842c244de2a81b39cde9994e67a000e7bef75f15 (diff)
downloadcreole-748b8a55d227066602699836078b3032c55b6f6b.tar.gz
convert old "%-formatted" and .format(...) strings into "f-strings" with flynt
-rw-r--r--.github/workflows/pythonapp.yml8
-rw-r--r--.travis.yml1
-rw-r--r--Makefile7
-rw-r--r--creole/cmdline.py16
-rw-r--r--creole/emitter/creol2html_emitter.py44
-rw-r--r--creole/emitter/html2creole_emitter.py6
-rw-r--r--creole/emitter/html2rest_emitter.py20
-rw-r--r--creole/emitter/html2textile_emitter.py8
-rw-r--r--creole/html_tools/deentity.py2
-rw-r--r--creole/parser/creol2html_parser.py6
-rw-r--r--creole/parser/html_parser.py28
-rw-r--r--creole/rest_tools/clean_writer.py10
-rw-r--r--creole/setup_utils.py8
-rw-r--r--creole/shared/base_emitter.py24
-rw-r--r--creole/shared/document_tree.py8
-rw-r--r--creole/shared/markup_table.py2
-rw-r--r--creole/shared/unknown_tags.py16
-rw-r--r--creole/shared/utils.py2
-rw-r--r--creole/tests/test_cli.py6
-rw-r--r--creole/tests/test_creole2html.py2
-rw-r--r--creole/tests/test_macros.py2
-rw-r--r--creole/tests/test_setup_utils.py4
-rw-r--r--creole/tests/utils/base_unittest.py4
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
diff --git a/Makefile b/Makefile
index 669086e..866c16a 100644
--- a/Makefile
+++ b/Makefile
@@ -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)