DiskStoredList

Signed-off-by: Václav Valíček <valicek1994@gmail.com>
This commit is contained in:
Václav Valíček 2022-07-31 15:33:35 +02:00
parent d182371520
commit 4cf4c3ff80
Signed by: valicek
GPG Key ID: FF05BDCA0C73BB31
2 changed files with 126 additions and 0 deletions

View File

@ -0,0 +1,43 @@
from typing import Optional
import os
class DiskStoredList:
__file: Optional[str] = None
__items: Optional[list] = None
def __init__(self, file: str):
# file does not have to exist, but parent directory does
if not os.path.exists(file):
if not os.path.isdir(os.path.dirname(file)):
raise NotADirectoryError(f"Parent directory for file {file} does not exist!")
self.__file = file
self.__items = []
if os.path.exists(file):
self._load_from_file()
def _load_from_file(self):
with open(self.__file, 'r') as f:
for line in f.readlines():
line = line.strip()
if len(line):
self.__items.append(line)
def append(self, line: str):
with open(self.__file, 'a') as f:
self.__items.append(line)
f.write(f"{line}\n")
def count(self):
return len(self.__items)
def __contains__(self, line: str) -> bool:
return line in self.__items
def __iter__(self):
return self.__items.__iter__()
def __len__(self):
return len(self.__items)

View File

@ -0,0 +1,83 @@
import pytest
from repo_cloner.lib.disk_stored_list import DiskStoredList
@pytest.fixture
def tmp_test_file(tmp_path):
test_file = tmp_path.joinpath("list")
test_file.write_text(
"Ahoj\n"
"Zkouška\n"
"Item1\n"
"Item2\n"
"\n")
return test_file
def test_init_no_file_no_dir(tmp_path):
with pytest.raises(NotADirectoryError) as e:
pass
DiskStoredList(tmp_path.joinpath("nonexistent_dir", "nonexistent_file").as_posix())
assert "nonexistent_dir/nonexistent_file does not exist!" in e.exconly()
def test_init_dir_exists_no_file(tmp_path):
x = DiskStoredList(tmp_path.joinpath("nonexistent_file").as_posix())
assert isinstance(x, DiskStoredList)
def test_load_from_file(tmp_path):
file = tmp_path.joinpath("list")
file.write_text("line1\nline2\nline3\n")
x = DiskStoredList(file.as_posix())
assert len(x._DiskStoredList__items) == 3
assert x._DiskStoredList__items == [
'line1',
'line2',
'line3',
]
def test_append_empty(tmp_path):
empty = tmp_path.joinpath("empty")
x = DiskStoredList(empty.as_posix())
x.append("test_line")
assert empty.read_text() == "test_line\n"
assert "test_line" in x._DiskStoredList__items
assert len(x._DiskStoredList__items) == 1
def test_append_utilized(tmp_test_file):
x = DiskStoredList(tmp_test_file.as_posix())
x.append("Item3")
assert x._DiskStoredList__items == ['Ahoj', 'Zkouška', 'Item1', 'Item2', 'Item3']
def test_count(tmp_test_file):
x = DiskStoredList(tmp_test_file.as_posix())
assert x.count() == 4
x.append("WTH")
assert x.count() == 5
def test__contains__(tmp_test_file):
x = DiskStoredList(tmp_test_file.parent.joinpath("a"))
x.append("WTF")
assert "WTF" in x
assert "Line2" not in x
y = DiskStoredList(tmp_test_file.as_posix())
assert "Item2" in y
assert "Ahoj" in y
def test__iter__(tmp_test_file):
result = []
for x in DiskStoredList(tmp_test_file.as_posix()):
result.append(x)
assert result == ['Ahoj', 'Zkouška', 'Item1', 'Item2']
def test__len__(tmp_test_file):
assert len(DiskStoredList(tmp_test_file.as_posix())) == 4