diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..74df230 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.py? +*.egg-info +*.swp diff --git a/beaker_dynomite.py b/beaker_dynomite.py deleted file mode 100644 index 3d3ec98..0000000 --- a/beaker_dynomite.py +++ /dev/null @@ -1,51 +0,0 @@ -import logging -from beaker_nosql import * - -try: - from dynomite import Dynomite - from dynomite.ttypes import * -except ImportError: - raise InvalidCacheBackendError("Dynomite cache backend requires the 'dynomite' library") - -try: - from thrift import Thrift - from thrift.transport import TSocket - from thrift.transport import TTransport - from thrift.protocol import TBinaryProtocol -except ImportError: - raise InvalidCacheBackendError("Dynomite cache backend requires the 'thrift' library") - -log = logging.getLogger(__name__) - -class DynomiteManager(NoSqlManager): - def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): - NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) - - def open_connection(self, host, port): - self.transport = TSocket.TSocket(host, int(port)) - self.transport = TTransport.TBufferedTransport(transport) - self.protocol = TBinaryProtocol.TBinaryProtocol(transport) - self.db_conn = Dynomite.Client(protocol) - self.transport.open() - - def __contains__(self, key): - return self.db_conn.has(self._format_key(key)) - - def has_key(self, key): - return key in self - - def set_value(self, key, value): - self.db_conn.put(self._format_key(key), None, value) - - def __delitem__(self, key): - self.db_conn.remove(self._format_key(key)) - - def do_remove(self): - raise Exception("Unimplemented") - - def keys(self): - raise Exception("Unimplemented") - - -class DynomiteContainer(Container): - namespace_manager = DynomiteManager \ No newline at end of file diff --git a/beaker_extensions/__init__.py b/beaker_extensions/__init__.py new file mode 100644 index 0000000..4287ca8 --- /dev/null +++ b/beaker_extensions/__init__.py @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/beaker_extensions/dynomite_.py b/beaker_extensions/dynomite_.py new file mode 100644 index 0000000..e348c3b --- /dev/null +++ b/beaker_extensions/dynomite_.py @@ -0,0 +1,53 @@ +import logging +from beaker_extensions.nosql import Container +from beaker_extensions.nosql import InvalidCacheBackendError +from beaker_extensions.nosql import NoSqlManager + +try: + from dynomite import Dynomite + from dynomite.ttypes import * +except ImportError: + raise InvalidCacheBackendError("Dynomite cache backend requires the 'dynomite' library") + +try: + from thrift import Thrift + from thrift.transport import TSocket + from thrift.transport import TTransport + from thrift.protocol import TBinaryProtocol +except ImportError: + raise InvalidCacheBackendError("Dynomite cache backend requires the 'thrift' library") + +log = logging.getLogger(__name__) + +class DynomiteManager(NoSqlManager): + def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): + NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) + + def open_connection(self, host, port): + self.transport = TSocket.TSocket(host, int(port)) + self.transport = TTransport.TBufferedTransport(transport) + self.protocol = TBinaryProtocol.TBinaryProtocol(transport) + self.db_conn = Dynomite.Client(protocol) + self.transport.open() + + def __contains__(self, key): + return self.db_conn.has(self._format_key(key)) + + def has_key(self, key): + return key in self + + def set_value(self, key, value): + self.db_conn.put(self._format_key(key), None, value) + + def __delitem__(self, key): + self.db_conn.remove(self._format_key(key)) + + def do_remove(self): + raise Exception("Unimplemented") + + def keys(self): + raise Exception("Unimplemented") + + +class DynomiteContainer(Container): + namespace_manager = DynomiteManager diff --git a/beaker_extensions/nosql.py b/beaker_extensions/nosql.py new file mode 100644 index 0000000..b58011d --- /dev/null +++ b/beaker_extensions/nosql.py @@ -0,0 +1,70 @@ +import logging + +from beaker.container import NamespaceManager, Container +from beaker.synchronization import file_synchronizer +from beaker.util import verify_directory +from beaker.exceptions import MissingCacheParameter + +try: + import cPickle as pickle +except: + import pickle + +log = logging.getLogger(__name__) + +class NoSqlManager(NamespaceManager): + def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): + NamespaceManager.__init__(self, namespace) + + if not url: + raise MissingCacheParameter("url is required") + + if lock_dir: + self.lock_dir = lock_dir + elif data_dir: + self.lock_dir = data_dir + "/container_tcd_lock" + if self.lock_dir: + verify_directory(self.lock_dir) + + host, port = url.split(':') + + self.open_connection(host, int(port)) + + def open_connection(self, host, port): + self.db_conn = None + + def get_creation_lock(self, key): + return file_synchronizer( + identifier ="tccontainer/funclock/%s" % self.namespace, + lock_dir = self.lock_dir) + + def _format_key(self, key): + return self.namespace + '_' + + def __getitem__(self, key): + return pickle.loads(self.db_conn.get(self._format_key(key))) + + def __contains__(self, key): + return self.db_conn.has_key(self._format_key(key)) + + def has_key(self, key): + return key in self + + def set_value(self, key, value): + self.db_conn[self._format_key(key)] = pickle.dumps(value) + + def __setitem__(self, key, value): + self.set_value(key, value) + + def __delitem__(self, key): + del self.db_conn[self._format_key(key)] + + def do_remove(self): + self.db_conn.clear() + + def keys(self): + return self.db_conn.keys() + + +class NoSqlManagerContainer(Container): + namespace_manager = NoSqlManager diff --git a/pytyrant.py b/beaker_extensions/pytyrant.py similarity index 100% rename from pytyrant.py rename to beaker_extensions/pytyrant.py diff --git a/redis.py b/beaker_extensions/redis.py similarity index 100% rename from redis.py rename to beaker_extensions/redis.py diff --git a/beaker_extensions/redis_.py b/beaker_extensions/redis_.py new file mode 100644 index 0000000..a182425 --- /dev/null +++ b/beaker_extensions/redis_.py @@ -0,0 +1,38 @@ +import logging +from beaker_extensions.nosql import Container +from beaker_extensions.nosql import InvalidCacheBackendError +from beaker_extensions.nosql import NoSqlManager +from beaker_extensions.nosql import pickle + +try: + from redis import Redis +except ImportError: + raise InvalidCacheBackendError("PyTyrant cache backend requires the 'pytyrant' library") + +log = logging.getLogger(__name__) + +class RedisManager(NoSqlManager): + def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): + NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) + + def open_connection(self, host, port): + self.db_conn = Redis(host=host, port=int(port)) + + def __contains__(self, key): + return self.db_conn.exists(self._format_key(key)) + + def set_value(self, key, value): + self.db_conn.set(key, pickle.dumps(value)) + + def __delitem__(self, key): + self.db_conn.delete(self._format_key(key)) + + def do_remove(self): + self.db_conn.flush(all_dbs=True) + + def keys(self): + raise self.db_conn.keys('*') + + +class RedisContainer(Container): + namespace_manager = RedisManager diff --git a/beaker_extensions/ringo.py b/beaker_extensions/ringo.py new file mode 100644 index 0000000..cf69cee --- /dev/null +++ b/beaker_extensions/ringo.py @@ -0,0 +1,42 @@ +import logging +from beaker_extensions.nosql import Container +from beaker_extensions.nosql import InvalidCacheBackendError +from beaker_extensions.nosql import NoSqlManager +from beaker_extensions.nosql import pickle + +try: + from ringogw import Ringo +except ImportError: + raise InvalidCacheBackendError("Ringo cache backend requires the 'ringo' library") + +log = logging.getLogger(__name__) + +class RingoManager(NoSqlManager): + def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): + NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) + + def open_connection(self, host, port): + self.domain = 'default' + self.db_conn = Ringo("%s:%s" % (host, port)) + + def __contains__(self, key): + raise Exception("Unimplemented") + + def __getitem__(self, key): + return pickle.loads(self.db_conn.get(self.domain, self._format_key(key))) + + def set_value(self, key, value): + self.db_conn.put(self.domain, self._format_key(key), pickle.dumps(value)) + + def __delitem__(self, key): + raise Exception("Unimplemented") + + def do_remove(self): + raise Exception("Unimplemented") + + def keys(self): + raise Exception("Unimplemented") + + +class RingoContainer(Container): + namespace_manager = RingoManager diff --git a/ringogw.py b/beaker_extensions/ringogw.py similarity index 100% rename from ringogw.py rename to beaker_extensions/ringogw.py diff --git a/beaker_extensions/tyrant_.py b/beaker_extensions/tyrant_.py new file mode 100644 index 0000000..8b189a5 --- /dev/null +++ b/beaker_extensions/tyrant_.py @@ -0,0 +1,39 @@ +# Courtesy of: http://www.jackhsu.com/2009/05/27/pylons-with-tokyo-cabinet-beaker-sessions +import logging +from beaker_extensions.nosql import Container +from beaker_extensions.nosql import InvalidCacheBackendError +from beaker_extensions.nosql import NoSqlManager +from beaker_extensions.nosql import pickle + +try: + from pytyrant import PyTyrant +except ImportError: + raise InvalidCacheBackendError("PyTyrant cache backend requires the 'pytyrant' library") + +log = logging.getLogger(__name__) + +class TokyoTyrantManager(NoSqlManager): + def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): + NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) + + def open_connection(self, host, port): + self.db_conn = PyTyrant.open(host, int(port)) + + def __contains__(self, key): + return self.db_conn.has_key(self._format_key(key)) + + def set_value(self, key, value): + self.db_conn[self._format_key(key)] = pickle.dumps(value) + + def __delitem__(self, key): + del self.db_conn[self._format_key(key)] + + def do_remove(self): + self.db_conn.clear() + + def keys(self): + return self.db_conn.keys() + + +class TokyoTyrantContainer(Container): + namespace_manager = TokyoTyrantManager diff --git a/beaker_nosql.py b/beaker_nosql.py deleted file mode 100644 index 9e17d70..0000000 --- a/beaker_nosql.py +++ /dev/null @@ -1,70 +0,0 @@ -import logging - -from beaker.container import NamespaceManager, Container -from beaker.synchronization import file_synchronizer -from beaker.util import verify_directory -from beaker.exceptions import MissingCacheParameter - -try: - import cPickle as pickle -except: - import pickle - -log = logging.getLogger(__name__) - -class NoSqlManager(NamespaceManager): - def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): - NamespaceManager.__init__(self, namespace) - - if not url: - raise MissingCacheParameter("url is required") - - if lock_dir: - self.lock_dir = lock_dir - elif data_dir: - self.lock_dir = data_dir + "/container_tcd_lock" - if self.lock_dir: - verify_directory(self.lock_dir) - - host, port = url.split(':') - - self.open_connection(host, int(port)) - - def open_connection(self, host, port): - self.db_conn = None - - def get_creation_lock(self, key): - return file_synchronizer( - identifier ="tccontainer/funclock/%s" % self.namespace, - lock_dir = self.lock_dir) - - def _format_key(self, key): - return self.namespace + '_' - - def __getitem__(self, key): - return pickle.loads(self.db_conn.get(self._format_key(key))) - - def __contains__(self, key): - return self.db_conn.has_key(self._format_key(key)) - - def has_key(self, key): - return key in self - - def set_value(self, key, value): - self.db_conn[self._format_key(key)] = pickle.dumps(value) - - def __setitem__(self, key, value): - self.set_value(key, value) - - def __delitem__(self, key): - del self.db_conn[self._format_key(key)] - - def do_remove(self): - self.db_conn.clear() - - def keys(self): - return self.db_conn.keys() - - -class NoSqlManagerContainer(Container): - namespace_manager = NoSqlManager \ No newline at end of file diff --git a/beaker_redis.py b/beaker_redis.py deleted file mode 100644 index e8ad2f2..0000000 --- a/beaker_redis.py +++ /dev/null @@ -1,35 +0,0 @@ -import logging -from beaker_nosql import * - -try: - from redis import Redis -except ImportError: - raise InvalidCacheBackendError("PyTyrant cache backend requires the 'pytyrant' library") - -log = logging.getLogger(__name__) - -class RedisManager(NoSqlManager): - def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): - NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) - - def open_connection(self, host, port): - self.db_conn = Redis(host=host, port=int(port)) - - def __contains__(self, key): - return self.db_conn.exists(self._format_key(key)) - - def set_value(self, key, value): - self.db_conn.set(key, pickle.dumps(value)) - - def __delitem__(self, key): - self.db_conn.delete(self._format_key(key)) - - def do_remove(self): - self.db_conn.flush(all_dbs=True) - - def keys(self): - raise self.db_conn.keys('*') - - -class RedisContainer(Container): - namespace_manager = RedisManager \ No newline at end of file diff --git a/beaker_ringo.py b/beaker_ringo.py deleted file mode 100644 index e9f94e6..0000000 --- a/beaker_ringo.py +++ /dev/null @@ -1,39 +0,0 @@ -import logging -from beaker_nosql import * - -try: - from ringogw import Ringo -except ImportError: - raise InvalidCacheBackendError("Ringo cache backend requires the 'ringo' library") - -log = logging.getLogger(__name__) - -class RingoManager(NoSqlManager): - def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): - NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) - - def open_connection(self, host, port): - self.domain = 'default' - self.db_conn = Ringo("%s:%s" % (host, port)) - - def __contains__(self, key): - raise Exception("Unimplemented") - - def __getitem__(self, key): - return pickle.loads(self.db_conn.get(self.domain, self._format_key(key))) - - def set_value(self, key, value): - self.db_conn.put(self.domain, self._format_key(key), pickle.dumps(value)) - - def __delitem__(self, key): - raise Exception("Unimplemented") - - def do_remove(self): - raise Exception("Unimplemented") - - def keys(self): - raise Exception("Unimplemented") - - -class RingoContainer(Container): - namespace_manager = RingoManager \ No newline at end of file diff --git a/beaker_tyrant.py b/beaker_tyrant.py deleted file mode 100644 index eb012ec..0000000 --- a/beaker_tyrant.py +++ /dev/null @@ -1,36 +0,0 @@ -# Courtesy of: http://www.jackhsu.com/2009/05/27/pylons-with-tokyo-cabinet-beaker-sessions -import logging -from beaker_nosql import * - -try: - from pytyrant import PyTyrant -except ImportError: - raise InvalidCacheBackendError("PyTyrant cache backend requires the 'pytyrant' library") - -log = logging.getLogger(__name__) - -class TokyoTyrantManager(NoSqlManager): - def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params): - NoSqlManager.__init__(self, namespace, url=url, data_dir=data_dir, lock_dir=lock_dir, **params) - - def open_connection(self, host, port): - self.db_conn = PyTyrant.open(host, int(port)) - - def __contains__(self, key): - return self.db_conn.has_key(self._format_key(key)) - - def set_value(self, key, value): - self.db_conn[self._format_key(key)] = pickle.dumps(value) - - def __delitem__(self, key): - del self.db_conn[self._format_key(key)] - - def do_remove(self): - self.db_conn.clear() - - def keys(self): - return self.db_conn.keys() - - -class TokyoTyrantContainer(Container): - namespace_manager = TokyoTyrantManager \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..01bb954 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,3 @@ +[egg_info] +tag_build = dev +tag_svn_revision = true diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..a7e51cd --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +from setuptools import setup, find_packages +import sys, os + +version = '0.1' + +setup(name='beaker_extensions', + version=version, + description="Beaker extensions for additional back-end stores.", + long_description="""\ +""", + classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers + keywords='', + author='Didip Kerabat', + author_email='didpk@gmail.com', + url='', + license='', + packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), + include_package_data=True, + zip_safe=False, + install_requires=[ + # -*- Extra requirements: -*- + ], + entry_points=""" + # -*- Entry points: -*- + """, + )