mirror of
https://github.com/NCBM/plyngent.git
synced 2026-11-07 23:47:54 +08:00
core/tools: allow edit_lineno append to an empty file
Appending via edit_lineno required the last line to be read, which made writing to an empty file impossible (line 0 does not exist). An empty file has nothing to clobber, so the append needs no prior read.
This commit is contained in:
@@ -60,10 +60,11 @@ def _unread_lines_in_range(
|
|||||||
"""Lines in ``start_line..end_line`` that were not read with line numbers.
|
"""Lines in ``start_line..end_line`` that were not read with line numbers.
|
||||||
|
|
||||||
Appending (``start_line == n + 1``) requires the last line to be read, so
|
Appending (``start_line == n + 1``) requires the last line to be read, so
|
||||||
line numbers stay truthful; the append point itself is not a line.
|
line numbers stay truthful; the append point itself is not a line. An empty
|
||||||
|
file (``n == 0``) has nothing to clobber, so appending needs no read.
|
||||||
"""
|
"""
|
||||||
if start_line == n + 1:
|
if start_line == n + 1:
|
||||||
return [] if n in read_lines else [n]
|
return [] if n == 0 or n in read_lines else [n]
|
||||||
return sorted(set(range(start_line, end_line + 1)) - read_lines)
|
return sorted(set(range(start_line, end_line + 1)) - read_lines)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,16 @@ def test_edit_lineno_requires_all_lines_read(workspace: object) -> None:
|
|||||||
assert "replaced lines 2-3" in out
|
assert "replaced lines 2-3" in out
|
||||||
|
|
||||||
|
|
||||||
|
def test_edit_lineno_append_to_empty_file(workspace: object) -> None:
|
||||||
|
"""An empty file has nothing to clobber, so appending needs no read."""
|
||||||
|
del workspace
|
||||||
|
_ = call_sync(write_file, "empty.txt", "")
|
||||||
|
_ = reset_lineno_tracker()
|
||||||
|
out = call_sync(edit_lineno, "empty.txt", 1, 1, "first\n")
|
||||||
|
assert "appended" in out
|
||||||
|
assert call_sync(read_file, "empty.txt") == "L1-1\nfirst\n"
|
||||||
|
|
||||||
|
|
||||||
def test_edit_lineno_append_requires_last_line_read(workspace: object) -> None:
|
def test_edit_lineno_append_requires_last_line_read(workspace: object) -> None:
|
||||||
del workspace
|
del workspace
|
||||||
_ = call_sync(write_file, "ap.txt", "a\nb\nc\n")
|
_ = call_sync(write_file, "ap.txt", "a\nb\nc\n")
|
||||||
|
|||||||
Reference in New Issue
Block a user