return f"<multipart/{self.subtype}> children={len(self.children)}"
-def convert_markdown_to_html(maildraft, *, extensions=None):
- draftpath = pathlib.Path(maildraft)
- with open(draftpath, "r", encoding="utf-8") as textmarkdown:
- text = textmarkdown.read()
+def convert_markdown_to_html(
+ origtext, draftpath, *, filewriter_fn=None, extensions=None
+):
mdwn = markdown.Markdown(extensions=extensions)
+ if not filewriter_fn:
+
+ def filewriter_fn(path, content, mode="w", **kwargs):
+ with open(path, mode, **kwargs) as out_f:
+ out_f.write(content)
- with open(draftpath, "w", encoding="utf-8") as textplain:
- textplain.write(text)
+ filewriter_fn(draftpath, origtext, encoding="utf-8")
textpart = Part(
"text", "plain", draftpath, "Plain-text version", orig=True
)
- html = mdwn.convert(text)
+ htmltext = mdwn.convert(origtext)
+
htmlpath = draftpath.with_suffix(".html")
- with open(
- htmlpath, "w", encoding="utf-8", errors="xmlcharrefreplace"
- ) as texthtml:
- texthtml.write(html)
+ filewriter_fn(
+ htmlpath, htmltext, encoding="utf-8", errors="xmlcharrefreplace"
+ )
htmlpart = Part("text", "html", htmlpath, "HTML version")
logopart = Part(
editor = f"{sys.argv[0]} massage --write-commands-to {temppath}"
if extensions:
editor = f'{editor} --extensions {",".join(extensions)}'
+ if debug_commands:
+ editor = f'{editor} --debug-commands'
cmds.cmd('set my_editor="$editor"')
cmds.cmd('set my_edit_headers="$edit_headers"')
def do_massage(
- maildraft,
+ draft_f,
+ draftpath,
cmd_f,
*,
extensions=None,
cmds.flush()
extensions = extensions.split(",") if extensions else []
- tree = converter(maildraft, extensions=extensions)
+ tree = converter(draft_f.read(), draftpath, extensions=extensions)
mimetree = MIMETreeDFWalker(debug=debug_walk)
do_setup(args.extensions, debug_commands=args.debug_commands)
elif args.mode == "massage":
- with open(args.cmdpath, "w") as cmd_f:
+ with open(args.MAILDRAFT, "r") as draft_f, open(
+ args.cmdpath, "w"
+ ) as cmd_f:
do_massage(
- args.MAILDRAFT,
+ draft_f,
+ pathlib.Path(args.MAILDRAFT),
cmd_f,
extensions=args.extensions,
debug_commands=args.debug_commands,
try:
import pytest
+ from io import StringIO
class Tests:
@pytest.fixture
assert lines[2].endswith(f'{const2},{const1}"')
assert lines[4].endswith(const1)
- def test_do_massage_basic(self, const1, capsys):
- def converter(maildraft, extensions):
- return Part("text", "plain", "/dev/null", orig=True)
+ @pytest.fixture
+ def string_io(self, const1, text=None):
+ return StringIO(text or const1)
- do_massage(maildraft=const1, cmd_f=sys.stdout, converter=converter)
- captured = capsys.readouterr()
- assert (
- captured.out.strip()
- == """\
- set editor="$my_editor"
- set edit_headers="$my_edit_headers"
- unset my_editor
- unset my_edit_headers
- source 'rm -f pytest_internal_file|'
- unset my_mdwn_postprocess_cmd_file
- """.replace(
- " ", ""
- ).strip()
+ def test_do_massage_basic(self, const1, string_io, capsys):
+ def converter(drafttext, draftpath, extensions):
+ return Part("text", "plain", draftpath, orig=True)
+
+ do_massage(
+ draft_f=string_io,
+ draftpath=const1,
+ cmd_f=sys.stdout,
+ converter=converter,
)
- def test_do_massage_fulltree(self, const1, basic_mime_tree, capsys):
- def converter(maildraft, extensions):
+ captured = capsys.readouterr()
+ lines = captured.out.splitlines()
+ assert '="$my_editor"' in lines.pop(0)
+ assert '="$my_edit_headers"' in lines.pop(0)
+ assert "unset my_editor" == lines.pop(0)
+ assert "unset my_edit_headers" == lines.pop(0)
+ assert "update-encoding" in lines.pop(0)
+ assert "source 'rm -f " in lines.pop(0)
+ assert "unset my_mdwn_postprocess_cmd_file" == lines.pop(0)
+
+ def test_do_massage_fulltree(
+ self, string_io, const1, basic_mime_tree, capsys
+ ):
+ def converter(drafttext, draftpath, extensions):
return basic_mime_tree
- do_massage(maildraft=const1, cmd_f=sys.stdout, converter=converter)
+ do_massage(
+ draft_f=string_io,
+ draftpath=const1,
+ cmd_f=sys.stdout,
+ converter=converter,
+ )
+
captured = capsys.readouterr()
lines = captured.out.splitlines()[4:][::-1]
assert "Related" in lines.pop()