"""Role cache persistence; cache identity never supplies musical randomness.""" import json import generator.cache import generator.fretboard import generator.validation ENTRYPOINTS = ('generator.composition',) def code_key(): return generator.cache.fingerprint(generator.cache.source_identity(ENTRYPOINTS)) def restore(path, key): if path is None or not path.is_file() or path.is_symlink(): return None try: entry = json.loads(path.read_text()) value = entry['result'] if entry['key'] == key and entry['digest'] == generator.cache.fingerprint(value): generator.validation.validate_document(value['document']) generator.fretboard.validate_document(value['document']) return {**value, 'cache_hit': True} except (OSError, ValueError, KeyError, TypeError): pass return None def store(path, key, value): if path is not None: generator.cache.write_json(path, {'key': key, 'digest': generator.cache.fingerprint(value), 'result': value})