Source code for examples.dogpile_caching.environment

"""Establish data / cache file paths, and configurations,
bootstrap fixture data if necessary.

from hashlib import md5
import os
import sys

from dogpile.cache.region import make_region

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
from . import caching_query

py2k = sys.version_info < (3, 0)

if py2k:
    input = raw_input  # noqa

# dogpile cache regions.  A home base for cache configurations.
regions = {}

# scoped_session.
Session = scoped_session(sessionmaker())

cache = caching_query.ORMCache(regions)

# global declarative base class.
Base = declarative_base()

root = "./dogpile_data/"

if not os.path.exists(root):
        "Will create datafiles in %r.\n"
        "To reset the cache + database, delete this directory.\n"
        "Press enter to continue.\n" % root

dbfile = os.path.join(root, "dogpile_demo.db")
engine = create_engine("sqlite:///%s" % dbfile, echo=True)

def md5_key_mangler(key):
    """Receive cache keys as long concatenated strings;
    distill them into an md5 hash.

    return md5(key.encode("ascii")).hexdigest()

# configure the "default" cache region.
regions["default"] = make_region(
    # the "dbm" backend needs
    # string-encoded keys
    # using type 'file' to illustrate
    # serialized persistence.  Normally
    # memcached or similar is a better choice
    # for caching.
    arguments={"filename": os.path.join(root, "cache.dbm")},

# optional; call invalidate() on the region
# once created so that all data is fresh when
# the app is restarted.  Good for development,
# on a production system needs to be used carefully
# regions['default'].invalidate()

installed = False

def bootstrap():
    global installed
    from . import fixture_data

    if not os.path.exists(dbfile):
        installed = True