diff options
-rw-r--r-- | hazwaz/__init__.py | 1 | ||||
-rw-r--r-- | hazwaz/mixins.py | 42 | ||||
-rw-r--r-- | tests/test_mixins.py | 37 |
3 files changed, 80 insertions, 0 deletions
diff --git a/hazwaz/__init__.py b/hazwaz/__init__.py index 883ffe2..e328bee 100644 --- a/hazwaz/__init__.py +++ b/hazwaz/__init__.py @@ -1 +1,2 @@ +from . import mixins # noqa: F401 from .command import Command, MainCommand # noqa: F401 diff --git a/hazwaz/mixins.py b/hazwaz/mixins.py new file mode 100644 index 0000000..5720a38 --- /dev/null +++ b/hazwaz/mixins.py @@ -0,0 +1,42 @@ +import logging +import os +import subprocess + + +class ExternalEditorMixin: + """ + Add facilities to open a file in an external editor to a Command. + """ + editors = [ + (os.environ.get("EDITOR"), "$EDITOR (set to {editor})"), + ("sensible-editor", "sensible-editor"), + ("vi", "vi"), + ] + + def edit_file_in_external_editor(self, filepath): + """ + Open filepath in an external editor and wait for it to be closed. + + Return whether opening the file was succesful. + This tries to cycle through all editors listed in self.editors. + """ + for editor, e_name in self.editors: + if editor: + try: + res = subprocess.call([editor, filepath]) + except FileNotFoundError as e: + if editor in str(e): + logging.info('Could not open file {} with {}'.format( + filepath, e_name + )) + else: + logging.warning("Could not open file {}".format( + filepath + )) + return False + else: + if res == 0: + return True + else: + return False + return False diff --git a/tests/test_mixins.py b/tests/test_mixins.py new file mode 100644 index 0000000..1e2f91d --- /dev/null +++ b/tests/test_mixins.py @@ -0,0 +1,37 @@ +import unittest + +import hazwaz + + +class testEditorMixin(unittest.TestCase): + def test_open_with_cat_existing_file(self): + subcmd = hazwaz.mixins.ExternalEditorMixin() + subcmd.editors = [("cat", "cat")] + # TODO: suppress this output in the tests (we can't use + # contextlib.redirect_stdout because that doesn't redirect the + # stdout used by subprocess. + res = subcmd.edit_file_in_external_editor("/bin/fgrep") + self.assertTrue(res) + + def test_open_with_cat_missing_file(self): + subcmd = hazwaz.mixins.ExternalEditorMixin() + subcmd.editors = [("cat", "cat")] + # TODO: suppress this output in the tests (we can't use + # contextlib.redirect_stderr because that doesn't redirect the + # stderr used by subprocess. + res = subcmd.edit_file_in_external_editor("no_such_file") + self.assertFalse(res) + + def test_open_with_non_existing_editor(self): + subcmd = hazwaz.mixins.ExternalEditorMixin() + subcmd.editors = [("no_such_command", "no_such_command")] + with self.assertLogs() as cm: + subcmd.edit_file_in_external_editor("no_such_file") + self.assertIn( + "Could not open file no_such_file with no_such_command", + cm.output[0] + ) + + +if __name__ == '__main__': + unittest.main() |