Source code for dynamo_consistency.cache

# pylint: disable=missing-docstring
# We don't really need the docstring for the functions inside the decorator

import os
import time
import datetime
import logging

from functools import wraps
from . import config
from . import datatypes


LOG = logging.getLogger(__name__)


[docs]def cache_tree(config_age, location_suffix): """ A decorator for caching pickle files based on the configuration file. It is currently set up to decorate a function that has a single parameter ``site``. The returned function also can be passed keyword arguments to override the ``location_suffix`` argument. This is done with the ``cache`` argument to the function. :param str config_age: The key from the config file to read the max age from :param str location_suffix: The ending of the main part of the file name where the cached file is saved. :returns: A function that uses the caching configuration :rtype: func """ def func_decorator(func): @wraps(func) def do_function(site, callback=None, **kwargs): config_dict = config.config_dict() # Make cache directory if it doesn't exist first cache_dir = os.path.join(config_dict['VarLocation'], 'cache', site) if not os.path.exists(cache_dir): os.makedirs(cache_dir) # Overwrite location_suffix if that's desired cache_location = os.path.join( cache_dir, '%s.pkl' % kwargs.get('cache', location_suffix)) LOG.info('Checking for cache at %s', cache_location) if not os.path.exists(cache_location) or \ (time.time() - os.stat(cache_location).st_mtime) > \ float(config_dict.get(config_age, 0)) * 24 * 3600: if int(config_dict.get('SaveCache')) and os.path.exists(cache_location): os.rename(cache_location, '%s.%s' % (cache_location, datetime.datetime.fromtimestamp( os.stat(cache_location).st_mtime).strftime('%y%m%d') ) ) LOG.info('Cache is no good, getting new tree') if callback is None: tree = func(site) else: tree = func(site, callback) LOG.info('Making hash') tree.setup_hash() LOG.info('Saving tree at %s', cache_location) tree.save(cache_location) else: LOG.info('Loading tree from cache') tree = datatypes.get_info(cache_location) return tree return do_function return func_decorator