PK4LH?sandpiper/util.pyimport unittest from .storage import Storage class StandardTests(unittest.TestCase): def get_driver(self): return None def ready_driver(self): pass def kill_driver(self): pass def setUp(self): self.driver = self.get_driver() self.ready_driver() if not self.driver: raise unittest.SkipTest('The driver is not defined.') self.storage = Storage(self.driver) def tearDown(self): self.kill_driver() del self.storage del self.driver def test_set_and_get_simple(self): self.storage.set('panda', 'something') self.assertEqual('something', self.storage.get('panda')) def test_set_and_get_document(self): expected = { 'job': 'Detective', 'location': 'London, UK', } self.storage.set('holmes', expected) self.assertEqual(expected['job'], self.storage.get('holmes')['job']) def test_set_twice(self): self.storage.set('panda', 'something') self.assertEqual('something', self.storage.get('panda')) self.storage.set('panda', 'python') self.assertEqual('python', self.storage.get('panda')) def test_get_nothing(self): self.assertEqual(None, self.storage.get('panda')) def test_remove_once(self): self.storage.set('panda', 'something') self.storage.remove('panda') self.assertEqual(None, self.storage.get('panda')) def test_remove_twice(self): self.storage.set('panda', 'something') self.storage.remove('panda') self.storage.remove('panda') # ensure that there is no error. self.assertEqual(None, self.storage.get('panda')) def test_dictionary_access(self): self.storage['panda'] = 'something' self.assertEqual('something', self.storage['panda']) del self.storage['panda'] self.assertEqual(None, self.storage['panda']) PKs2LHG=sandpiper/__init__.pyfrom .storage import Storage PKLHDB4sandpiper/cache.pyfrom .adapter import InMemory from .mixin import DictionaryAccess class Cache(DictionaryAccess): def __init__(self, driver=InMemory()): self.driver = driver def get(self, key): return self.driver.get(key) def set(self, key, value): self.driver.set(key, value) def remove(self, key): self.driver.remove(key) def find(self, pattern): return self.driver.find(pattern) PKV2LHw9sandpiper/storage.pyfrom .adapter import InMemory from .mixin import DictionaryAccess class Storage(DictionaryAccess): def __init__(self, driver=InMemory()): self.driver = driver def get(self, key): return self.driver.get(key) def set(self, key, value): self.driver.set(key, value) def remove(self, key): self.driver.remove(key) def find(self, pattern): return self.driver.find(pattern) PK!LHR&sandpiper/mixin.pyclass DictionaryAccess(object): def __getitem__(self, key): return self.get(key) def __setitem__(self, key, value): self.set(key, value) def __delitem__(self, key): self.remove(key) PKLHkVsandpiper/adapter/abstract.pyclass Abstract(object): def get(self, key): raise NotImplementedError() def set(self, key, value): raise NotImplementedError() def remove(self, key): raise NotImplementedError() def find(self, pattern): raise NotImplementedError() PK},LHO|sandpiper/adapter/dynamodb.pyimport decimal import json from .abstract import Abstract class DynamoDB(object): def __init__(self, storage, namespace = 'default'): self._namespace = namespace self._storage = storage def get(self, key): response = self._table().get_item(Key = {'key': key}) item = response['Item'] if 'Item' in response else None return item['value'] if item else None def set(self, key, value): self._table().put_item(Item = self._prepare_for_setter({ 'key': key, 'value': value, })) def remove(self, key): self._table().delete_item(Key = {'key': key}) def _table_name(self): return 'sandpiper.cache.{}'.format(self._namespace) def _table(self): return self._storage.Table(self._table_name()) def _prepare_for_setter(self, data): return self._decode(json.dumps(data)) def _decode(self, data): return json.loads(data, parse_float = decimal.Decimal) def prepare(self, **kwargs): throughput = { 'ReadCapacityUnits': kwargs['io_read'] if 'io_read' in kwargs else 5, 'WriteCapacityUnits': kwargs['io_write'] if 'io_write' in kwargs else 4, } self._storage.create_table( TableName = self._table_name(), KeySchema = [ { 'AttributeName': 'key', 'KeyType': 'HASH' } ], AttributeDefinitions = [ { 'AttributeName': 'key', 'AttributeType': 'S' } ], ProvisionedThroughput = throughput ) PK LHxo>>sandpiper/adapter/__init__.pyfrom .dynamodb import DynamoDB from .inmemory import InMemory PKLHQ[Esandpiper/adapter/inmemory.pyfrom .abstract import Abstract class InMemory(object): def __init__(self, storage=None): self._storage = storage or {} def get(self, key): if key not in self._storage: return None return self._storage[key] def set(self, key, value): self._storage[key] = value def remove(self, key): if key not in self._storage: return del self._storage[key] PK4LH^- )sandpiper-0.2.0.dist-info/DESCRIPTION.rstUNKNOWN PK4LHRz7>'sandpiper-0.2.0.dist-info/metadata.json{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries"], "extensions": {"python.details": {"contacts": [{"email": "juti_n@yahoo.co.jp", "name": "Juti Noppornpitak", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/shiroyuki/sandpiper"}}}, "generator": "bdist_wheel (0.26.0)", "license": "MIT", "metadata_version": "2.0", "name": "sandpiper", "summary": "A Generic/Extendible Key-value Store Interface Library", "version": "0.2.0"}PK4LHZH 'sandpiper-0.2.0.dist-info/top_level.txtsandpiper PK4LH}\\sandpiper-0.2.0.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py3-none-any PK4LHC}dd"sandpiper-0.2.0.dist-info/METADATAMetadata-Version: 2.0 Name: sandpiper Version: 0.2.0 Summary: A Generic/Extendible Key-value Store Interface Library Home-page: https://github.com/shiroyuki/sandpiper Author: Juti Noppornpitak Author-email: juti_n@yahoo.co.jp License: MIT Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Software Development :: Libraries UNKNOWN PK4LHa sandpiper-0.2.0.dist-info/RECORDsandpiper/__init__.py,sha256=1C0UWGm0G4cQkJsX4XzMMflnC8-KDa6PRxlySw9_54c,29 sandpiper/cache.py,sha256=MjgkzChNzVlgPJUWcKv1uEKJIvT3cBycAX9Aer0K-aI,432 sandpiper/mixin.py,sha256=V-MqR6VNw98TFjNQ8yOQ9MTiq0yMP91cDufJDN59cJ4,220 sandpiper/storage.py,sha256=cSxk5lNwTCPub67vioRm4bBjdE3sBBj5mgCdajHVZ88,434 sandpiper/util.py,sha256=XItVz24TaTJSmhAiHSKTJiSfNZ4ZZt4v-M8ZLb9LuFc,1968 sandpiper/adapter/__init__.py,sha256=MpKJPsFwOaC6ufDOdcZWpyIvd8P0iy2o4M9eK0LoysA,62 sandpiper/adapter/abstract.py,sha256=cQg5wkPFZ29P9NApUhOqQjXCQywm10lM9pIcV_VrDrQ,282 sandpiper/adapter/dynamodb.py,sha256=w7gTKJt3pKc6oUwWl0VZ4jodaIX-qer-QGhwyVo0hfQ,1709 sandpiper/adapter/inmemory.py,sha256=B3_woJ6K5frakHuqyfmDFGpA8X2gTF9vQ3R3lKSsGUE,436 sandpiper-0.2.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 sandpiper-0.2.0.dist-info/METADATA,sha256=6bPXLxS-Vvtv4F91sZuswFOKFHvBkI4YD_SPj7XdWg8,612 sandpiper-0.2.0.dist-info/RECORD,, sandpiper-0.2.0.dist-info/WHEEL,sha256=zX7PHtH_7K-lEzyK75et0UBa3Bj8egCBMXe1M4gc6SU,92 sandpiper-0.2.0.dist-info/metadata.json,sha256=m0lHNaTJn1ri3X1enT3J2H-9j_Hd3ckEndUahG3VvuE,742 sandpiper-0.2.0.dist-info/top_level.txt,sha256=fpXsErbRBrxn1zW4_5cH9RmqV1r0ZYE_QuwbQo1YJeg,10 PK4LH?sandpiper/util.pyPKs2LHG=sandpiper/__init__.pyPKLHDB4/sandpiper/cache.pyPKV2LHw9 sandpiper/storage.pyPK!LHR& sandpiper/mixin.pyPKLHkV sandpiper/adapter/abstract.pyPK},LHO|Tsandpiper/adapter/dynamodb.pyPK LHxo>><sandpiper/adapter/__init__.pyPKLHQ[Esandpiper/adapter/inmemory.pyPK4LH^- )sandpiper-0.2.0.dist-info/DESCRIPTION.rstPK4LHRz7>'sandpiper-0.2.0.dist-info/metadata.jsonPK4LHZH ' sandpiper-0.2.0.dist-info/top_level.txtPK4LH}\\osandpiper-0.2.0.dist-info/WHEELPK4LHC}dd"sandpiper-0.2.0.dist-info/METADATAPK4LHa sandpiper-0.2.0.dist-info/RECORDPK\#