lightning/tests/tests_app/source_code/test_copytree.py

108 lines
3.7 KiB
Python

import os
from lightning.app.source_code.copytree import _copytree, _read_lightningignore
def test_read_lightningignore(tmpdir):
"""_read_lightningignore() removes comments from ignore files."""
test_path = tmpdir.join(".lightningignore")
expected = "test"
not_expected = "# comment"
with open(test_path, "a") as f:
f.write(not_expected)
f.write(expected)
result = _read_lightningignore(test_path)
assert not_expected not in result
assert expected not in result
def test_read_lightningignore_excludes_empty_lines(tmpdir):
"""_read_lightningignore() excludes empty lines."""
test_path = tmpdir.join(".lightningignore")
gitignore = """
foo
bar
"""
test_path.write(gitignore)
# results exclude all empty lines
result = _read_lightningignore(test_path)
assert len(result) == 2
def test_copytree_ignoring_files(tmp_path_factory):
# lightningignore for ignoring txt file in dir2, the whole dir1 and .zip file everywhere
test_dir = tmp_path_factory.mktemp("lightningignore-test")
source = test_dir / "source"
source.mkdir()
# lightningignore at root
source.joinpath(".lightningignore").write_text("dir1/*.txt\ndir0\n*.zip")
# not creating the destination directory
dest = test_dir / "dest"
# # setting up test files and nested lightningignore in dir4
source.joinpath("dir3").mkdir()
source.joinpath("dir3").joinpath(".lightningignore").write_text("*.pt")
source.joinpath("dir3").joinpath("model.pt").write_text("")
source.joinpath("dir3").joinpath("model.non-pt").write_text("")
source.joinpath("dir0").mkdir() # dir0 is ignored
source.joinpath("dir0/file1").write_text("") # ignored because the parent dir is ignored
source.joinpath("dir1").mkdir()
source.joinpath("dir1/file.tar.gz").write_text("")
source.joinpath("dir1/file.txt").write_text("") # .txt in dir1 is ignored
source.joinpath("dir2").mkdir()
source.joinpath("dir2/file.txt").write_text("")
source.joinpath("dir2/file.zip").write_text("") # .zip everywhere is ignored
files_copied = _copytree(source, dest)
relative_names = set()
for file in files_copied:
relative_names.add(file.split("source")[1].strip("/").strip("\\"))
if os.name == "nt":
assert {
".lightningignore",
"dir2\\file.txt",
"dir3\\.lightningignore",
"dir3\\model.non-pt",
"dir1\\file.tar.gz",
} == relative_names
else:
assert {
".lightningignore",
"dir2/file.txt",
"dir3/.lightningignore",
"dir3/model.non-pt",
"dir1/file.tar.gz",
} == relative_names
first_level_dirs = list(dest.iterdir())
assert len(first_level_dirs) == 4 # .lightningignore, dir2, dir1 and dir3
assert {".lightningignore", "dir2", "dir1", "dir3"} == {d.name for d in first_level_dirs}
for d in first_level_dirs:
if d.name == "dir1":
assert "file.txt" not in [file.name for file in d.iterdir()]
assert "file.tar.gz" in [file.name for file in d.iterdir()]
assert len([file.name for file in d.iterdir()]) == 1
if d.name == "dir2":
assert "file.zip" not in [file.name for file in d.iterdir()]
assert "file.txt" in [file.name for file in d.iterdir()]
assert len([file.name for file in d.iterdir()]) == 1
if d.name == "dir3":
assert "model.pt" not in [file.name for file in d.iterdir()]
assert "model.non-pt" in [file.name for file in d.iterdir()]
assert ".lightningignore" in [file.name for file in d.iterdir()]
assert len([file.name for file in d.iterdir()]) == 2