def decorated( dirname: str, populate: bool, hash_empty: bool, fast: bool, resume: bool, threads: int, ): dirname = os.path.abspath(dirname) if resume or not populate: dirinfo = DirInfo.cached(dirname) if dirinfo.file_count == 0: populate = True else: dirinfo = DirInfo(dirname) if populate: dirinfo.populate( no_empty=not hash_empty, fast=fast, resume=resume, threads=threads, progress=tqdm, ) filename = dirinfo.save() tqdm.write(f'Written {filename}') return func(dirinfo)
def test_serialisation(tmp_path): """ Test failure modes. Success is tested in check_everything. """ subdir = (tmp_path / 'sub') jsonfile = (tmp_path / 'sub.dirinfo.json') (subdir / 'dir').mkdir(parents=True) dirinfo = DirInfo(subdir) assert dirinfo.save() == os.fspath(jsonfile) # Not exactly a requirement, but for the tests to work we need this. assert jsonfile.exists() # If this fails, then testing that the bad cases fail is kind of pointless. assert DirInfo.load(subdir).base == os.fspath(subdir) # Make sure the encoder isn't accidentally used for something it can't handle. with pytest.raises(TypeError): json.dumps(object(), cls=Encoder) # Make sure bad json file contents are rejected def bad_jsonfile(jsondata): with open(jsonfile, 'w', encoding='utf8') as outfile: json.dump(jsondata, outfile) with pytest.raises(ValueError): DirInfo.load(subdir) bad_jsonfile({'foo': 'bar'}) bad_jsonfile(None) # If the serialised base doesn't match the actual location, then something # is wrong and we should refuse to load it. assert dirinfo.save() == os.fspath(jsonfile) with open(jsonfile, 'r', encoding='utf8') as infile: jsondata = json.load(infile) jsondata['base'] += 'X' bad_jsonfile(jsondata) # If there's no data then load() fails, but cached() succeeds. jsonfile.unlink() with pytest.raises(FileNotFoundError): DirInfo.load(subdir) assert DirInfo.cached(subdir).base == subdir