{ "info": { "author": "Matt Pizzimenti", "author_email": "mjpizz+stockpyle@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Database :: Front-Ends", "Topic :: Software Development", "Topic :: Software Development :: Object Brokering", "Topic :: System :: Distributed Computing" ], "description": "Overview\n===========\n\nThe central concept of stockpyle is the *Store* objects. You can find a variety of these objects\nin stockpyle.stores:\n\n* ThreadLocalStore\n* ProcessMemoryStore\n* ChainedStore\n* MemcacheStore - http://pypi.python.org/pypi/python-memcached\n* ShoveStore - http://pypi.python.org/pypi/shove\n* SqlAlchemyStore - http://pypi.python.org/pypi/SQLAlchemy\n \nStores can perform 6 operations on objects:\n\n* put\n* get\n* delete\n* batch_put\n* batch_get\n* batch_delete\n\nEvery stockpyle Store can handle any Python object that exposes the property *__stockpyle_keys__*.\nThis property lists the names of each attribute or attribute-tuple that `uniquely` identifies\nthat object. Read the quickstart below for more details.\n\nQuickstart\n==========\n\nBasics\n------\n\nThe fastest way to get up and running is to create an in-memory Store::\n \n from stockpyle.stores import ProcessMemoryStore\n \n store = ProcessMemoryStore()\n\nNow lets create a Python object that can be stored in stockpyle. This object\nhas an attribute 'key' that identifies it uniquely::\n \n class Foo(object):\n \n __stockpyle_keys__ = [\"key\"]\n \n def __init__(self, key):\n self.key = key\n\nWe can now store a Foo object in our Store::\n \n f = Foo('my_unique_key_123')\n store.put(f)\n\nAnd we can retrieve it from the Store::\n \n f = store.get(Foo, {'key': 'my_unique_key_123'})\n\nWe can also delete it from the Store::\n\n store.delete(f)\n\nManipulating batches of objects is also trivial::\n \n f1 = Foo('my_key_1')\n f2 = Foo('my_key_2')\n f3 = Foo('my_key_3')\n \n store.batch_put([f1, f2, f3])\n \n o1, o2, o3 = store.batch_get(Foo, [\n {'key': 'my_key_1'},\n {'key': 'my_key_2'},\n {'key': 'my_key_3'},\n ])\n \n assert((f1, f2, f3) == (o1, o2, o3))\n \n store.batch_delete([f1, f2, f3])\n\nNote: if you do a *batch_get* and one of the keys is null, it still gets returned as None::\n \n o1, o2, o3 = store.batch_get(Foo, [\n {'key': 'my_key_1'},\n {'key': 'nonexistent_key'},\n {'key': 'my_key_3'},\n ])\n \n assert(o2 is None)\n\nAnd that's basics of using stockpyle. No matter what Store object\nyou use, you can use this API to store, retrieve, and delete objects.\n\nChained Storage (e.g. write-through caching)\n--------------------------------------------\n\nPersistent storage is often expensive to access, making caching a necessity.\nHowever, maintaining cache consistency is difficult and error-prone. The stockpyle\nAPI provides a consistent way to perform this caching, using *ChainedStore*.\n\nChainedStore takes an ordered list of stores and treats them as a write-through\ncache. This example creates a write-through cache for SQLAlchemy-backed database objects::\n\n fast_cache = ProcessMemoryStore()\n dist_cache = MemcacheStore(servers=[\"localhost:11211\"])\n persistent_store = SqlAlchemyStore(uri=\"sqlite:///data.sqlite\")\n \n chained_store = ChainedStore([fast_cache, dist_cache, persistent_store])\n\nIn this example, the fast cache (in-memory) will always be attempted first for\nretrievals. The distributed cache (memcached) will be attempted second. If these\nstores fail to find the object, the database store (SQLAlchemy) will be queried for\nthe persistent object.\n\nDuring puts, gets, and deletes, stockpyle will keep the upper layers (the caches)\npopulated with the latest data from lower layers (the persistent database).\n\nAdvanced\n========\n\nAlternate Keys\n--------------\n\nThe __stockpyle_keys__ attribute can contain more than just one unique attribute.\nIt can also contain tuples of attribute names::\n \n class Foo(object):\n \n __stockpyle_keys__ = [\"key\", (\"zap\", \"bar\")]\n \n def __init__(self, key, zap, bar):\n self.key = key\n self.zap = zap\n self.bar = bar\n\nNow, Foo is indexed by both 'key', *and* the combined attributes 'zap' and 'bar'::\n \n f = Foo(key=1, zap=2, bar=3)\n \n store.put(f)\n \n o1 = store.get(Foo, {'key': 1})\n o2 = store.get(Foo, {'zap': 2, 'bar': 3})\n \n assert(f == o1 == o2)\n\nCache Expiration\n----------------\n\nSome stockpyle stores support the concept of object expiration:\n\n* ThreadLocalStore\n* ProcessMemoryStore\n* MemcachedStore\n* ShoveStore\n\nIn all three stores, you can specify a \"lifetime-callback\", which takes\na Python object as an argument and returns a lifetime value for that object.\n\nLifetime can be expressed in 3 ways:\n\n* integer number of seconds\n* Python timedelta\n* Python datetime (absolute expiration time)\n\nThis example allows Foo objects to live for 20 seconds, and Bar objects to\nlive for 5 minutes::\n\n def my_lifetime_cb(obj):\n \n if isinstance(obj, Foo):\n return 20\n \n elif isinstance(obj, Bar):\n return 5*60\n \n store = ProcessMemoryStore(lifetime_cb=my_lifetime_cb)\n\nNote that you can specify different lifetime callbacks for each your stores.\nFor example, you may want to expire in-memory caches quickly to for more frequent\nre-sync with the lower layers in a ChainedStore.\n\nPolymorphic Storage\n-------------------\n\nSome stockpyle stores support the concept of storing objects in a way\nthat can be queried polymorphically:\n\n* ThreadLocalStore\n* ProcessMemoryStore\n* MemcachedStore\n* ShoveStore\n\nBy default, objects are not stored polymorphically in these stores because\nit duplicates the locations that a single object is stored. However, you may\nwant to be able to query subclasses out of a cache::\n\n class Automobile(object):\n \n __stockpyle_keys__ = [\"license_plate\"]\n \n def __init__(self, license_plate):\n self.license_plate = license_plate\n \n class Car(Automobile):\n pass\n \n \n class Truck(Automobile):\n pass\n\nIf you create a store that supports polymorphic queries::\n \n store = ProcessMemoryStore(polymorphic=True)\n\nThen you can store a Car::\n \n car = Car(license_plate=\"1234 XYZ\")\n store.put()\n\nAnd retrieve it as either a Car or an automobile::\n \n car = store.get(Car, {'license_plate': '1234 XYZ'})\n automobile = store.get(Automobile, {'license_plate': '1234 XYZ'})\n \n assert(car == automobile)\n\nNote that there is a tradeoff in storage duplication when doing this. Every Car\nobject is indexed as a Car and as an Automobile (2 locations in storage).\n\nMemcache Integration\n--------------------\n\nIn order to enable MemcacheStore, you will need to install the python-memcached module:\n\nhttp://pypi.python.org/pypi/python-memcached\n\nThe MemcacheStore supports polymorphic storage and object expiration. The native memcache API is used to support\nobject expiration and batched operations.\n\nShove Integration\n-----------------\n\nIn order to enable ShoveStore, you will need to install the shove module:\n\nhttp://pypi.python.org/pypi/shove\n\nThe Shove API provides a very broad array of storage backends with a dictionary-style interface,\nwhich work well in stockpyle. This example uses the shove backend for Amazon S3::\n \n from stockpyle.stores import ShoveStore\n \n s3_store = ShoveStore(shoveuri=\"s3://s3key:s3secret@your_s3_bucket_name\")\n\nShoveStores support polymorphic storage and object expiration. Every object stored in the Shove is stored at\na human-readable key, as a tuple of (obj, expiredate).\n\nSQLAlchemy Integration\n----------------------\n\nIn order to enable SqlAlchemyStore, you will need to install the SQLAlchemy module:\n\nhttp://pypi.python.org/pypi/SQLAlchemy\n\nTypically, in SQLAlchemy you will use a session to store and retrieve your mapped objects::\n\n # create the object\n obj = MyMappedObject(foobar=123)\n \n # store it\n session.save(obj)\n session.commit()\n \n # retrieve it\n obj_retrieved = session.query(MyMappedObject).filter(MyMappedObject.foobar == 123).first()\n\nYou can do the same thing through a SqlAlchemyStore::\n \n # create the store\n store = SqlAlchemyStore(uri=\"sqlite:///data.sqlite\")\n \n # create the object\n obj = MyMappedObject(foobar=123)\n \n # store it\n store.put(obj)\n \n # retrieve it\n obj_retrieved = store.get(MyMappedObject, {'foobar': 123})\n\nNow you can put this SqlAlchemyStore in a ChainedStore for write-through caching::\n \n # use MemcacheStore as a cache layer\n mc = MemcacheStore(servers=[\"localhost:11211\"])\n sa = SqlAlchemyStore(uri=\"sqlite:///data.sqlite\")\n store = ChainedStore([mc, sa])\n \n # store it, which causes the object to be written-through\n # the MemcacheStore\n store.put(obj)\n \n # retrieve it, except this time it comes from\n # the MemcacheStore instead of the database\n obj_retrieved = store.get(MyMappedObject, {'id': obj.id})\n\n*What if you want to access the SQLAlchemy session directly?* This is a common\ncase, since obviously stockpyle does not provide the rich querying API that\nSQLAlchemy has. To ensure that your stockpyle cache does not get out of sync\nwith queries done in your own SQLAlchemy sessions, simply add a\nStockpyleSessionExtension to your session object::\n \n from sqlalchemy.orm import sessionmaker\n from stockpyle.stores import MemcacheStore\n from stockpyle.ext.sqlalchemy import StockpyleSessionExtension\n\n mc = MemcacheStore(servers=[\"localhost:11211\"])\n ext = StockpyleSessionExtension(store=mc)\n my_session = sessionmaker(extension=ext)\n\nNow, whenever *my_session* performs an insert, update, or delete on an object,\nit will also perform the corresponding puts and deletes in the MemcacheStore.\n\nObjects that you get from SqlAlchemyStore are bound to the internal session\nobject on that store. Keep this in mind when you are using your own session,\nsince you will have to *merge()* the stockpyle-retrieved object into your session::\n \n # get an object from SqlAlchemyStore\n obj = sa_store.get(MyMappedObject, {'id': 'foobar123'})\n \n # change some information\n obj.name = \"bleh\"\n \n # if you want to use this object in your SQLAlchemy\n # session, you must merge the object first since the\n # object is currently bound to the internal session\n # inside the SqlAlchemyStore\n my_session.merge(obj)\n my_session.commit()\n \nCaveats:\n\n* SqlAlchemyStores are *not* threadsafe (at least, at the moment)\n\nDefining a custom Store\n-----------------------\nAlthough stockpile contains most of the stores you will need to support\nany storage backend (especially through Shove integration), you may\nwant to implement your own Store. The stockpyle library provides two base\nclasses to define your own Stores:\n\n* BaseStore (for implementing your own store from scratch)\n* BaseDictionaryStore (for implementing your own store that has a dictionary-style interface)\n\nTo make your own store, simply create a subclass of either of these stores and implement\nthe 6 storage methods (put, get, delete, batch_put, batch_get, batch_delete).\n\nPlease browse the source code for detailed examples of how to implement your own store.\n\nDeveloping\n==========\n\nQuickest way to get started is using a clean virtualenv:\n\n mkdir -p .virtualenv\n curl -o .virtualenv/virtualenv-15.0.0.tar.gz https://pypi.python.org/packages/source/v/virtualenv/virtualenv-15.0.0.tar.gz\n tar xvfz .virtualenv/virtualenv-15.0.0.tar.gz -C .virtualenv\n python .virtualenv/virtualenv-15.0.0/virtualenv.py .virtualenv\n\nWhen developing, activate the virtualenv:\n\n . .virtualenv/bin/activate\n\nTo install dependencies:\n\n python setup.py install\n\nTo run tests:\n\n pip install nose\n python tests/main.py\n\nBugs & Contributions\n====================\nNotice any bugs? You can fork the stockpyle repository on github:\n\nhttps://github.com/mjpizz/stockpyle\n\nPlease submit your pull requests or issues there!\n\nContributors\n------------\n* [Ryan Blomberg](https://github.com/rblomberg) - sqlalchemy updates", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mjpizz/stockpyle", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "stockpyle", "package_url": "https://pypi.org/project/stockpyle/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/stockpyle/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/mjpizz/stockpyle" }, "release_url": "https://pypi.org/project/stockpyle/0.1.8/", "requires_dist": null, "requires_python": null, "summary": "stockpyle allows the creation of write-through storage for object caching and persistence", "version": "0.1.8" }, "last_serial": 2016475, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "08c8b8ac7c711f91c0476c95335982ca", "sha256": "53a8c9c0ec7ed87f2198bcff87cefe1db901abc092a308bd55cfe84a326e3415" }, "downloads": -1, "filename": "stockpyle-0.0.1.tar.gz", "has_sig": false, "md5_digest": "08c8b8ac7c711f91c0476c95335982ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60053, "upload_time": "2009-01-29T04:58:22", "url": "https://files.pythonhosted.org/packages/22/a6/7ea9e316603b8f9d8e2e881b51dd32e904b3fe71bc2fdd50c418c5823de5/stockpyle-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "e0d22699a74e03020839dda5ecdd13ed", "sha256": "1ad722cbb7245c8d0b8270e4a1df2b2eef95c6ef580e4090ad1063ebe20b5562" }, "downloads": -1, "filename": "stockpyle-0.0.2.tar.gz", "has_sig": false, "md5_digest": "e0d22699a74e03020839dda5ecdd13ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60011, "upload_time": "2009-01-29T13:17:22", "url": "https://files.pythonhosted.org/packages/88/e7/00ae793cb01a955795fbc0e7c96f0409ed0c26a2807dd718ae5d68c46548/stockpyle-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "aeeb324dfc8bd9927b46a2df5683d905", "sha256": "4b6ac760aaa1183cbdd2fb0cd9e7d85c6bd4139e34356abd84b9a89050a6acc5" }, "downloads": -1, "filename": "stockpyle-0.0.3.tar.gz", "has_sig": false, "md5_digest": "aeeb324dfc8bd9927b46a2df5683d905", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59575, "upload_time": "2009-01-29T13:34:38", "url": "https://files.pythonhosted.org/packages/ef/e6/5194a3692582981a4b8cffab27a5236095cdb9b7d673aa1e24cad9f94a52/stockpyle-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "ca3e3bd72a9c943d0522c19e13c5b879", "sha256": "75d4157e026e015907e98e8ca1e080bec991122c1d96c9c97609386aadaec7ba" }, "downloads": -1, "filename": "stockpyle-0.0.4.tar.gz", "has_sig": false, "md5_digest": "ca3e3bd72a9c943d0522c19e13c5b879", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60263, "upload_time": "2009-01-29T13:46:45", "url": "https://files.pythonhosted.org/packages/a6/83/641f39937eb5501aa9dcf1395d69863354b6750b9ab71215ed7ea0dab48e/stockpyle-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "19a6c387e4b0bffd22ef7ccaea4ddc78", "sha256": "2b2f6948bf9a75bfbb45e717a47b37becb5b877252ce6a0103a01514124f3489" }, "downloads": -1, "filename": "stockpyle-0.0.5.tar.gz", "has_sig": false, "md5_digest": "19a6c387e4b0bffd22ef7ccaea4ddc78", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60564, "upload_time": "2009-01-29T14:23:08", "url": "https://files.pythonhosted.org/packages/a0/17/131abd71aad65e2ed0eec2890680d3aad603eda13f47197af56baa885913/stockpyle-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "d572313cfd4a75d4664a922d7c1169f3", "sha256": "123a2c4da81dbe36f6f21d50ce677a69b91648ca6a5b154f926ece94e38b35df" }, "downloads": -1, "filename": "stockpyle-0.0.6.tar.gz", "has_sig": false, "md5_digest": "d572313cfd4a75d4664a922d7c1169f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74829, "upload_time": "2009-01-31T20:03:46", "url": "https://files.pythonhosted.org/packages/93/63/14a5e8fe3be897b270bc1446012752a3e981eaf734eab43c7914577bb0c1/stockpyle-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "c7532f1c1abc32a99c34663601bd9319", "sha256": "88c060673a909ab980b0b6f0ac61281d743845aacdf1ee21d436871cdf676aff" }, "downloads": -1, "filename": "stockpyle-0.0.7.tar.gz", "has_sig": false, "md5_digest": "c7532f1c1abc32a99c34663601bd9319", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77981, "upload_time": "2009-01-31T21:31:49", "url": "https://files.pythonhosted.org/packages/fe/40/1cbe18dd3b8d36af51d57fe32b153938fcba238a41521179ff08dd8b8568/stockpyle-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "6bae2baaa7ad0bdfc1173b5021f26870", "sha256": "bdab51a272da3e97e54182bee5b1a128a7c7b82a2df694f8693f4208c1a4bd20" }, "downloads": -1, "filename": "stockpyle-0.0.8.tar.gz", "has_sig": false, "md5_digest": "6bae2baaa7ad0bdfc1173b5021f26870", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 81667, "upload_time": "2009-02-01T18:42:43", "url": "https://files.pythonhosted.org/packages/8d/55/150c2f64bbaf1666a6b2bceadc26525f5afb73f1485d7f3ef36824419776/stockpyle-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "ef08e1a9bbd45839c32a474ec51806e9", "sha256": "a2dcc37645511c7932ef06d0a966c449efbdcf3c2d61beed9698d91d6725969a" }, "downloads": -1, "filename": "stockpyle-0.0.9.tar.gz", "has_sig": false, "md5_digest": "ef08e1a9bbd45839c32a474ec51806e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 82446, "upload_time": "2009-02-05T03:08:58", "url": "https://files.pythonhosted.org/packages/1d/65/d7589295b6bff7d5461c922ef5d78ff222480c19089506465cd037ebf710/stockpyle-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "802f0b2e0cff2ecc2fc55bc79ad46a20", "sha256": "2ceb9be22bc9d3b03feb071ee24ed19d6e3fc80db01fe1d4a35ea57cc978e45d" }, "downloads": -1, "filename": "stockpyle-0.1.0.tar.gz", "has_sig": false, "md5_digest": "802f0b2e0cff2ecc2fc55bc79ad46a20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25852, "upload_time": "2009-02-08T17:41:36", "url": "https://files.pythonhosted.org/packages/01/3c/2579effa875806f6f1ca52431d82002f3efe1d98e2755096e111c8c53641/stockpyle-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "5f29ba977f0482d914d1fa087bc42603", "sha256": "1ff02343289d3fe2c4bdebb20e3b9408cb5a63be3cae3c3119276eefd3d16fa0" }, "downloads": -1, "filename": "stockpyle-0.1.1.tar.gz", "has_sig": false, "md5_digest": "5f29ba977f0482d914d1fa087bc42603", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64113, "upload_time": "2009-02-09T14:32:53", "url": "https://files.pythonhosted.org/packages/0a/4d/f5b0b0b7fc1bcd0728ee7581a2b36966cdbe68308ed940c46bf5a7b3d6c6/stockpyle-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "d7a4862c57dcd42dccad44f0d462ad56", "sha256": "91a4ec9403dac97701f4376218c7e7d05d149fdd58f0be8b11fad761c2227e9a" }, "downloads": -1, "filename": "stockpyle-0.1.2.tar.gz", "has_sig": false, "md5_digest": "d7a4862c57dcd42dccad44f0d462ad56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64903, "upload_time": "2009-02-18T15:49:29", "url": "https://files.pythonhosted.org/packages/8a/38/d2b6fdb3095de225ebcf589fb5114744429790fb39fd094b7cb635f34992/stockpyle-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "8bc123c1df852b758b4c78f14d4b4970", "sha256": "8e63bd993ee1e85dd6ed2514a112e8f6708212a7271f42454894f18a1f57fda7" }, "downloads": -1, "filename": "stockpyle-0.1.3.tar.gz", "has_sig": false, "md5_digest": "8bc123c1df852b758b4c78f14d4b4970", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65076, "upload_time": "2009-02-19T19:26:21", "url": "https://files.pythonhosted.org/packages/1a/a2/1343865a01d4f2ea3de109f959ce8e7e3f74bbb90b0b310cca23453177ca/stockpyle-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "8fcef6dc939afcaca15b0eaf2e987c1f", "sha256": "524d30770f635e879316a2579c74f20e65398b78b03bb7589d3693d320f21c46" }, "downloads": -1, "filename": "stockpyle-0.1.4.tar.gz", "has_sig": false, "md5_digest": "8fcef6dc939afcaca15b0eaf2e987c1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65656, "upload_time": "2009-02-24T08:01:22", "url": "https://files.pythonhosted.org/packages/6c/4f/b2a98fca66c5281d5d8f503cc373b1518a7990896875f0885e54a21716b7/stockpyle-0.1.4.tar.gz" } ], "0.1.5": [], "0.1.6": [ { "comment_text": "", "digests": { "md5": "b285a5cfa179c70ff2f01f5612ea041c", "sha256": "9cb563306c1a218fd34facecc787e1369ad2e9147921917eb3d7a9ed5c64d495" }, "downloads": -1, "filename": "stockpyle-0.1.6.tar.gz", "has_sig": false, "md5_digest": "b285a5cfa179c70ff2f01f5612ea041c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17999, "upload_time": "2016-03-20T04:25:00", "url": "https://files.pythonhosted.org/packages/7e/6c/a72ff48085bcdf712ccb76b7ff0ae96ad479881145f07b350273c3908bc9/stockpyle-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "72eae183befc5244e0cc91e61f166144", "sha256": "c5856129c7197350c7b131ab8e601f74dfd54d6f4f78921fec09e144cf5dbfc7" }, "downloads": -1, "filename": "stockpyle-0.1.7.tar.gz", "has_sig": false, "md5_digest": "72eae183befc5244e0cc91e61f166144", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17977, "upload_time": "2016-03-20T04:28:42", "url": "https://files.pythonhosted.org/packages/6e/25/03028cf6103ec7a95ba63eb4edb56b85204331c1c231bb162aa9071c099a/stockpyle-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "d89647afe32458ff3f6620f95fd070a5", "sha256": "40c51e52f4de7afb1f9b34ea96f428e68b4c56697e33a9c9bc6290b4228e6f4c" }, "downloads": -1, "filename": "stockpyle-0.1.8.tar.gz", "has_sig": false, "md5_digest": "d89647afe32458ff3f6620f95fd070a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18947, "upload_time": "2016-03-20T04:34:18", "url": "https://files.pythonhosted.org/packages/9d/19/2fdf633ef6b9a3b47ed833eed4b03c8d5c54ad3da3accec95344abdad4e3/stockpyle-0.1.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d89647afe32458ff3f6620f95fd070a5", "sha256": "40c51e52f4de7afb1f9b34ea96f428e68b4c56697e33a9c9bc6290b4228e6f4c" }, "downloads": -1, "filename": "stockpyle-0.1.8.tar.gz", "has_sig": false, "md5_digest": "d89647afe32458ff3f6620f95fd070a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18947, "upload_time": "2016-03-20T04:34:18", "url": "https://files.pythonhosted.org/packages/9d/19/2fdf633ef6b9a3b47ed833eed4b03c8d5c54ad3da3accec95344abdad4e3/stockpyle-0.1.8.tar.gz" } ] }