import os import pickle from sigal.gallery import Gallery, Image from sigal.plugins import extended_caching CURRENT_DIR = os.path.dirname(__file__) def test_save_cache(settings, tmpdir): settings["destination"] = str(tmpdir) gal = Gallery(settings, ncpu=1) extended_caching.save_cache(gal) cachePath = os.path.join(settings["destination"], ".metadata_cache") assert os.path.isfile(cachePath) with open(cachePath, "rb") as cacheFile: cache = pickle.load(cacheFile) # test exif album = gal.albums["exifTest"] media = next(m for m in album.medias if m.src_filename == "21.jpg") cache_img = cache["exifTest/21.jpg"] assert cache_img["exif"] == media.exif assert "markdown_metadata" not in cache_img assert cache_img["file_metadata"] == media.file_metadata media = next(m for m in album.medias if m.src_filename == "22.jpg") cache_img = cache["exifTest/22.jpg"] assert cache_img["exif"] == media.exif assert "markdown_metadata" not in cache_img assert cache_img["file_metadata"] == media.file_metadata media = next(m for m in album.medias if m.src_filename == "noexif.png") cache_img = cache["exifTest/noexif.png"] assert cache_img["exif"] == media.exif assert "markdown_metadata" not in cache_img assert cache_img["file_metadata"] == media.file_metadata # test iptc and md album = gal.albums["iptcTest"] assert cache["iptcTest/_index"]["markdown_metadata"] == album.markdown_metadata cache_img = cache["iptcTest/1.jpg"] assert cache_img["file_metadata"] == album.medias[0].file_metadata assert "markdown_metadata" not in cache_img cache_img = cache["iptcTest/2.jpg"] assert cache_img["markdown_metadata"] == album.medias[1].markdown_metadata # test if file disappears gal.albums["exifTest"].medias.append(Image("foooo.jpg", "exifTest", settings)) extended_caching.save_cache(gal) with open(cachePath, "rb") as cacheFile: cache = pickle.load(cacheFile) assert "exifTest/foooo.jpg" not in cache def test_restore_cache(settings, tmpdir): settings["destination"] = str(tmpdir) gal1 = Gallery(settings, ncpu=1) gal2 = Gallery(settings, ncpu=1) extended_caching.save_cache(gal1) extended_caching._restore_cache(gal2) assert gal1.metadataCache == gal2.metadataCache # test bad cache cachePath = os.path.join(settings["destination"], ".metadata_cache") with open(cachePath, "w") as f: f.write("bad pickle file") extended_caching._restore_cache(gal2) assert gal2.metadataCache == {} def test_load_exif(settings, tmpdir): settings["destination"] = str(tmpdir) gal1 = Gallery(settings, ncpu=1) gal1.albums["exifTest"].medias[3].exif = "blafoo" # set mod_date in future, to force these values gal1.metadataCache = { "exifTest/21.jpg": {"exif": "Foo", "mod_date": 100000000000}, "exifTest/22.jpg": {"exif": "Bar", "mod_date": 100000000000}, "exifTest/22-nodate.jpg": {"exif": "Baz", "mod_date": 100000000000}, } extended_caching.load_metadata(gal1.albums["exifTest"]) def get_media(gal, filename): return next( m for m in gal.albums["exifTest"].medias if m.src_filename == filename ) assert get_media(gal1, "21.jpg").exif == "Foo" assert get_media(gal1, "22.jpg").exif == "Bar" assert get_media(gal1, "noexif.png").exif == "blafoo" # check if setting gallery.metadataCache works gal2 = Gallery(settings, ncpu=1) extended_caching.save_cache(gal1) extended_caching.load_metadata(gal2.albums["exifTest"]) assert get_media(gal2, "21.jpg").exif == "Foo" assert get_media(gal2, "22.jpg").exif == "Bar" assert get_media(gal2, "noexif.png").exif == "blafoo" def test_load_metadata_missing(settings, tmpdir): settings["destination"] = str(tmpdir) gal = Gallery(settings, ncpu=1) extended_caching.save_cache(gal) assert gal.metadataCache # test if file disappears gal.albums["exifTest"].medias.append(Image("foooo.jpg", "exifTest", settings)) # set mod_date to -1 to force cache update gal.metadataCache = { "exifTest/_index": { "mod_date": -1, }, "exifTest/21.jpg": {"exif": "Foo", "mod_date": -1}, "exifTest/foooo.jpg": {"exif": "Foo"}, "dir1/test2/22.jpg": { "exif": "Bar", "mod_date": 100000000000, "meta_mod_date": -1, "markdown_metadata": "Bar", }, } # errors should all be caught extended_caching.load_metadata(gal.albums["exifTest"]) assert gal.albums["exifTest"].medias[0].exif != "Foo" assert gal.albums["exifTest"].medias[-1].exif != "Foo" extended_caching.load_metadata(gal.albums["dir1/test2"]) assert gal.albums["dir1/test2"].medias[1].exif == "Bar" assert gal.albums["dir1/test2"].medias[1].markdown_metadata != "Bar"