Source code for bmtk.utils.brain_observatory.cache

import os
import json

from .manifest import Manifest, ManifestBuilder, ManifestVersionError


[docs] class Cache: def __init__(self, manifest=None, cache=True, version=None, **kwargs): self.cache = cache if version is None and hasattr(self, 'MANIFEST_VERSION'): version = self.MANIFEST_VERSION self.load_manifest(manifest, version)
[docs] def load_manifest(self, file_name, version=None): if file_name is not None: if not os.path.exists(file_name): # make the directory if it doesn't exist already dirname = os.path.dirname(file_name) if dirname: Manifest.safe_mkdir(dirname) self.build_manifest(file_name) try: with open(file_name, "rb") as f: json_string = f.read().decode("utf-8") if len(json_string) == 0: json_string = "{}" json_obj = json.loads(json_string) self.manifest = Manifest( json_obj['manifest'], os.path.dirname(file_name), version=version) except ManifestVersionError as e: if e.outdated is True: intro = "is out of date" elif e.outdated is False: intro = "was made with a newer version of the AllenSDK" elif e.outdated is None: intro = "version did not match the expected version" ref_url = "https://github.com/alleninstitute/allensdk/wiki" raise ManifestVersionError(("Your manifest file (%s) %s" + " (its version is '%s', but" + " version '%s' is expected). " + " Please remove this file" + " and it will be regenerated for" + " you the next time you" + " instantiate this class." + " WARNING: There may be new data" + " files available that replace" + " the ones you already have" + " downloaded. Read the notes" + " for this release for more" + " details on what has changed" + " (%s).") % (file_name, intro, e.found_version, e.version, ref_url), e.version, e.found_version) self.manifest_path = file_name else: self.manifest = None
[docs] def build_manifest(self, file_name): manifest_builder = ManifestBuilder() manifest_builder.set_version(self.MANIFEST_VERSION) manifest_builder = self.add_manifest_paths(manifest_builder) manifest_builder.write_json_file(file_name)
[docs] def add_manifest_paths(self, manifest_builder): manifest_builder.add_path('BASEDIR', '.') if hasattr(self, 'MANIFEST_CONFIG'): for key, config in self.MANIFEST_CONFIG.items(): manifest_builder.add_path(key, **config) return manifest_builder
[docs] def get_cache_path(self, file_name, manifest_key, *args): if self.cache: if file_name: return file_name elif self.manifest: return self.manifest.get_path(manifest_key, *args) return None
[docs] def get_default_manifest_file(cache_name): return os.environ.get( '{}_MANIFEST'.format(cache_name.upper()), '{}/manifest.json'.format(cache_name.lower()) )