diff --git a/babi.py b/babi.py index 615d777..4c263b0 100644 --- a/babi.py +++ b/babi.py @@ -681,14 +681,18 @@ class File: ) @action - def save(self, status: Status) -> None: + def save(self, screen: 'Screen', status: Status) -> None: # TODO: make directories if they don't exist # TODO: maybe use mtime / stat as a shortcut for hashing below # TODO: strip trailing whitespace? # TODO: save atomically? if self.filename is None: - status.update('(no filename, not implemented)') - return + filename = status.prompt(screen, 'enter filename') + if not filename: + status.update('cancelled') + return + else: + self.filename = filename if os.path.isfile(self.filename): with open(self.filename) as f: @@ -920,14 +924,14 @@ def _edit(screen: Screen) -> EditResult: if response == ':q': return EditResult.EXIT elif response == ':w': - screen.file.save(screen.status) + screen.file.save(screen, screen.status) elif response == ':wq': - screen.file.save(screen.status) + screen.file.save(screen, screen.status) return EditResult.EXIT elif response != '': # noop / cancel screen.status.update(f'invalid command: {response}') elif key.keyname == b'^S': - screen.file.save(screen.status) + screen.file.save(screen, screen.status) elif key.keyname == b'^X': return EditResult.EXIT elif key.keyname == b'kLFT3': diff --git a/tests/babi_test.py b/tests/babi_test.py index 55a5127..c723e09 100644 --- a/tests/babi_test.py +++ b/tests/babi_test.py @@ -1100,11 +1100,27 @@ def test_multiple_files(tmpdir): h.await_exit() -def test_saving_with_no_filename_doesnt_exist(): - # TODO: this should prompt but currently refuses +def test_save_no_filename_specified(tmpdir): + f = tmpdir.join('f') + with run() as h, and_exit(h): + h.press('hello world') h.press('^S') - h.await_text('no filename, not implemented') + h.await_text('enter filename:') + h.press_and_enter(str(f)) + h.await_text('saved! (1 line written)') + h.await_text_missing('*') + assert f.read() == 'hello world\n' + + +@pytest.mark.parametrize('k', ('Enter', '^C')) +def test_save_no_filename_specified_cancel(k): + with run() as h, and_exit(h): + h.press('hello world') + h.press('^S') + h.await_text('enter filename:') + h.press(k) + h.await_text('cancelled') def test_saving_file_on_disk_changes(tmpdir):