diff options
-rw-r--r-- | lesana/command.py | 110 | ||||
-rw-r--r-- | tests/test_commands.py | 56 |
2 files changed, 111 insertions, 55 deletions
diff --git a/lesana/command.py b/lesana/command.py index 7ca50cf..0054be7 100644 --- a/lesana/command.py +++ b/lesana/command.py @@ -9,58 +9,6 @@ import ruamel.yaml from . import Collection, Entry, TemplatingError -def edit_file_in_external_editor(filepath): - # First we try to use $EDITOR - editor = os.environ.get('EDITOR') - if editor: - try: - subprocess.call([editor, filepath]) - except FileNotFoundError as e: - if editor in str(e): - logging.info( - 'Could not open file {} with $EDITOR (currently {})' - .format( - filepath, editor - ) - ) - else: - logging.warning("Could not open file {}".format(filepath)) - return False - else: - return True - # then we try to use sensible-editor (which should be available on - # debian and derivatives) - try: - subprocess.call(['sensible-editor', filepath]) - except FileNotFoundError as e: - if 'sensible-editor' in e.strerror: - logging.debug( - "Could not open file {} with editor: sensible-editor".format( - filepath - ) - ) - else: - logging.warning("Could not open file {}".format(filepath)) - return False - else: - return True - # and finally we fallback to vi, because ed is the standard editor, - # but that would be way too cruel, and vi is also in posix - try: - subprocess.call(['vi', filepath]) - except FileNotFoundError as e: - if 'vi' in e.strerror: - logging.warning( - "Could not open file {} with any known editor".format(filepath) - ) - return False - else: - logging.warning("Could not open file {}".format(filepath)) - return False - else: - return True - - def _get_first_docstring_line(obj): try: return obj.__doc__.split('\n')[1].strip() @@ -98,6 +46,58 @@ class Command: self.args = args self.main() + def edit_file_in_external_editor(self, filepath): + # First we try to use $EDITOR + editor = os.environ.get('EDITOR') + if editor: + try: + subprocess.call([editor, filepath]) + except FileNotFoundError as e: + if editor in str(e): + logging.info( + 'Could not open file {} with $EDITOR (currently {})' + .format( + filepath, editor + ) + ) + else: + logging.warning("Could not open file {}".format(filepath)) + return False + else: + return True + # then we try to use sensible-editor (which should be available on + # debian and derivatives) + try: + subprocess.call(['sensible-editor', filepath]) + except FileNotFoundError as e: + if 'sensible-editor' in e.strerror: + logging.debug( + "Could not open file {} with editor: sensible-editor" + .format(filepath) + ) + else: + logging.warning("Could not open file {}".format(filepath)) + return False + else: + return True + # and finally we fallback to vi, because ed is the standard editor, + # but that would be way too cruel, and vi is also in posix + try: + subprocess.call(['vi', filepath]) + except FileNotFoundError as e: + if 'vi' in e.strerror: + logging.warning( + "Could not open file {} with any known editor".format( + filepath + ) + ) + return False + else: + logging.warning("Could not open file {}".format(filepath)) + return False + else: + return True + class New(Command): """ @@ -123,7 +123,7 @@ class New(Command): new_entry = self.entry_class(collection) collection.save_entries([new_entry]) filepath = os.path.join(collection.itemdir, new_entry.fname) - if edit_file_in_external_editor(filepath): + if self.edit_file_in_external_editor(filepath): collection.update_cache([filepath]) if self.args.git: collection.git_add_files([filepath]) @@ -166,7 +166,7 @@ class Edit(Command): collection.save_entries([entry]) # and then edit the updated file filepath = os.path.join(collection.itemdir, entry.fname) - if edit_file_in_external_editor(filepath): + if self.edit_file_in_external_editor(filepath): collection.update_cache([filepath]) if self.args.git: collection.git_add_files([filepath]) @@ -388,7 +388,7 @@ class Init(Command): self.collection_class.init( self.args.collection, git_enabled=self.args.git, - edit_file=edit_file_in_external_editor, + edit_file=self.edit_file_in_external_editor, ) diff --git a/tests/test_commands.py b/tests/test_commands.py new file mode 100644 index 0000000..c948d69 --- /dev/null +++ b/tests/test_commands.py @@ -0,0 +1,56 @@ +import contextlib +import io +import tempfile +import unittest + +from lesana import command + + +class Args: + def __init__(self, args): + self.args = args + + def __getattribute__(self, k): + try: + return super().__getattribute__(k) + except AttributeError: + try: + return self.args[k] + except KeyError as e: + raise AttributeError(e) + + +class testCommands(unittest.TestCase): + def setUp(self): + self.collection_dir = tempfile.TemporaryDirectory() + + def tearDown(self): + pass + + def _edit_file(self, filepath): + return True + + def _run_command(self, cmd, args): + stream = { + 'stdout': io.StringIO(), + 'stderr': io.StringIO(), + } + cmd.edit_file_in_external_editor = self._edit_file + cmd.args = Args(args) + with contextlib.redirect_stdout(stream['stdout']): + with contextlib.redirect_stderr(stream['stderr']): + cmd.main() + return stream + + def test_init(self): + args = { + 'collection': self.collection_dir.name, + 'git': True, + } + streams = self._run_command(command.Init(), args) + self.assertEqual(streams['stdout'].getvalue(), '') + self.assertEqual(streams['stderr'].getvalue(), '') + + +if __name__ == '__main__': + unittest.main() |