from contextlib import contextmanager
from os import remove
from shutil import rmtree
from tempfile import NamedTemporaryFile
from pytest import raises
from piptools.cache import read_cache_file, CorruptCacheError, DependencyCache
@contextmanager
def _read_cache_file_helper(to_write):
try:
cache_file = NamedTemporaryFile(mode="w", delete=False)
cache_file.write(to_write)
cache_file.close()
yield cache_file.name
finally:
remove(cache_file.name)
def test_read_cache_file_not_json():
with _read_cache_file_helper("not json") as cache_file_name:
with raises(CorruptCacheError):
read_cache_file(cache_file_name)
def test_read_cache_file_wrong_format():
with _read_cache_file_helper('{"__format__": 2}') as cache_file_name:
with raises(AssertionError):
read_cache_file(cache_file_name)
def test_read_cache_file_successful():
with _read_cache_file_helper('{"__format__": 1, "dependencies": "success"}') as cache_file_name:
assert "success" == read_cache_file(cache_file_name)
def test_reverse_dependencies(from_line, tmpdir):
tmp_dir_path = str(tmpdir)
cache = DependencyCache(cache_dir=tmp_dir_path)
cache[from_line("top==1.2")] = ["middle>=0.3", "bottom>=5.1.2"]
cache[from_line("top[xtra]==1.2")] = ["middle>=0.3", "bottom>=5.1.2", "bonus==0.4"]
cache[from_line("middle==0.4")] = ["bottom<6"]
cache[from_line("bottom==5.3.5")] = []
cache[from_line("bonus==0.4")] = []
reversed_no_extra = cache.reverse_dependencies([
from_line("top==1.2"),
from_line("middle==0.4"),
from_line("bottom==5.3.5"),
from_line("bonus==0.4")
])
assert reversed_no_extra == {
'middle': {'top'},
'bottom': {'middle', 'top'}
}
reversed_extra = cache.reverse_dependencies([
from_line("top[xtra]==1.2"),
from_line("middle==0.4"),
from_line("bottom==5.3.5"),
from_line("bonus==0.4")
])
assert reversed_extra == {
'middle': {'top'},
'bottom': {'middle', 'top'},
'bonus': {'top'}
}
rmtree(tmp_dir_path)