#
# Configuration:
# neomuttrc (needs to be a single line):
+# set my_mdwn_extensions="extra,admonition,codehilite,sane_lists,smarty"
# macro compose B "\
-# <enter-command> source '$my_confdir/buildmimetree.py setup --tempdir $tempdir|'<enter>\
+# <enter-command> source '$my_confdir/buildmimetree.py \
+# --tempdir $tempdir --extensions $my_mdwn_extensions|'<enter>\
# <enter-command> sourc e \$my_mdwn_postprocess_cmd_file<enter>\
# " "Convert message into a modern MIME tree with inline images"
#
)
)
parser.epilog = (
- "Copyright © 2022 martin f. krafft <madduck@madduck.net>.\n"
+ "Copyright © 2023 martin f. krafft <madduck@madduck.net>.\n"
"Released under the MIT licence"
)
- subp = parser.add_subparsers(help="Sub-command parsers", dest="mode")
- parser_setup = subp.add_parser("setup", help="Setup phase")
- parser_massage = subp.add_parser("massage", help="Massaging phase")
-
- parser_setup.add_argument(
- "--extension",
- "-x",
- metavar="EXTENSION",
- dest="extensions",
- nargs="?",
- default=[],
- action="append",
- help="Markdown extension to add to the list of extensions use",
+ parser.add_argument(
+ "--extensions",
+ type=str,
+ default="",
+ help="Markdown extension to use (comma-separated list)"
)
- parser_setup.add_argument(
+ parser.add_argument(
"--only-build",
action="store_true",
help="Only build, don't send the message",
)
- parser_setup.add_argument(
+ parser.add_argument(
"--tempdir",
default=None,
help="Specify temporary directory to use for attachments",
)
- parser_setup.add_argument(
+ parser.add_argument(
"--debug-commands",
action="store_true",
help="Turn on debug logging of commands generated to stderr",
)
- parser_massage.add_argument(
+ subp = parser.add_subparsers(help="Sub-command parsers", dest="mode")
+ massage_p = subp.add_parser("massage", help="Massaging phase (internal use)")
+
+ massage_p.add_argument(
"--write-commands-to",
metavar="PATH",
dest="cmdpath",
help="Temporary file path to write commands to",
)
- parser_massage.add_argument(
- "--extensions",
- metavar="EXTENSIONS",
- type=str,
- default="",
- help="Markdown extension to use (comma-separated list)",
- )
-
- parser_massage.add_argument(
- "--only-build",
- action="store_true",
- help="Only build, don't send the message",
- )
-
- parser_massage.add_argument(
- "--tempdir",
- default=None,
- help="Specify temporary directory to use for attachments",
- )
-
- parser_massage.add_argument(
- "--debug-commands",
- action="store_true",
- help="Turn on debug logging of commands generated to stderr",
- )
-
- parser_massage.add_argument(
+ massage_p.add_argument(
"--debug-walk",
action="store_true",
help="Turn on debugging to stderr of the MIME tree walk",
)
- parser_massage.add_argument(
+ massage_p.add_argument(
"MAILDRAFT",
nargs="?",
help="If provided, the script is invoked as editor on the mail draft",
def do_setup(
- extensions=None,
*,
out_f=sys.stdout,
- only_build=False,
temppath=None,
tempdir=None,
debug_commands=False,
):
- extensions = extensions or []
temppath = temppath or pathlib.Path(
tempfile.mkstemp(prefix="muttmdwn-", dir=tempdir)[1]
)
cmds = MuttCommands(out_f, debug=debug_commands)
- editor = f"{sys.argv[0]} massage --write-commands-to {temppath}"
- if extensions:
- editor = f'{editor} --extensions {",".join(extensions)}'
- if only_build:
- editor = f'{editor} --only-build'
- if tempdir:
- editor = f"{editor} --tempdir {tempdir}"
- if debug_commands:
- editor = f"{editor} --debug-commands"
+ editor = f"{' '.join(sys.argv)} massage --write-commands-to {temppath}"
cmds.cmd('set my_editor="$editor"')
cmds.cmd('set my_edit_headers="$edit_headers"')
if __name__ == "__main__":
args = parse_cli_args()
- if args.mode == "setup":
+ if args.mode is None:
do_setup(
- args.extensions,
- only_build=args.only_build,
tempdir=args.tempdir,
debug_commands=args.debug_commands,
)
mimetree.walk(basic_mime_tree)
assert len(items) == 5
- def test_do_setup_no_extensions(self, const1, capsys):
- "Assert basics about the setup command output"
- do_setup(temppath=const1, out_f=sys.stdout)
- captout = capsys.readouterr()
- lines = captout.out.splitlines()
- assert lines[2].endswith(f'{const1}"')
- assert lines[4].endswith(const1)
- assert "first-entry" in lines[-1]
- assert "edit-file" in lines[-1]
-
- def test_do_setup_extensions(self, const1, const2, capsys):
- "Assert that extensions are passed to editor"
- do_setup(
- temppath=const1, extensions=[const2, const1], out_f=sys.stdout
- )
- captout = capsys.readouterr()
- lines = captout.out.splitlines()
- # assert comma-separated list of extensions passed
- assert lines[2].endswith(f'{const2},{const1}"')
- assert lines[4].endswith(const1)
-
@pytest.fixture
def string_io(self, const1, text=None):
return StringIO(text or const1)