{ "info": { "author": "Dan Noble", "author_email": "@dwnoble", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "rawes\n=====\n\nAbout\n-----\nrawes is an elasticsearch driver for Python. It provides a small level of abstraction above the requests library - enough abstraction to be useful, but not so much to obscure elasticsearch's great [native api](http://www.elasticsearch.org/guide/reference/api/)\n\nFeatures\n--------\n* elasticsearch native API support\n* Python 3 support\n* gzip over HTTP support\n* HTTPS support\n* Thrift support\n\nInstallation\n------------\n```bash\n$ pip install rawes\n```\n\nUsage\n-----\nCreate a connection to elasticsearch\n```python\nimport rawes\nes = rawes.Elastic('localhost:9200')\n```\n\nSearch for a document\n```python\nes.get('tweets/tweet/_search', data={\n 'query' : {\n 'match_all' : {}\n }\n})\n```\n\nThe rawes.Elastic constructor takes the following parameters (defaults shown):\n```python\nrawes.Elastic(\n url='http://localhost:9200', # Protocol, host, and port of elasticsearch service. Can be a list of hosts.\n # Valid protocols: http, https, thrift\n # Default protocol is http, unless port is in range 9500-9600, then thrift\n # Default ports: http=9200, https=443, thrift=9500\n timeout=30, # Timeout in seconds,\n **kwrgs # http(s) only: additional parameters you wish to pass\n # to the python 'requests' library (for example, basic auth)\n)\n```\n\nConstructor examples:\n\n```python\nes = rawes.Elastic() # will connect to: http://localhost:9200\nes = rawes.Elastic('https://localhost') # will connect to: https://localhost:443\nes = rawes.Elastic('thrift://localhost') # will connect to: thrift://localhost:9500\nes = rawes.Elastic('https://example.org:8443', auth=('user','pass')) # https with basic auth connection to: https://example.org:8443\nes = rawes.Elastic(['http://host1:9200', 'http://host2:9200', 'http://host3:9200']) # Each call will be issued to a different host, default is RoundRobin strategy\n```\n\nAn instance of rawes.Elastic ('es' in this case) has methods for get, post, put, delete, and head (for each http verb). Each method takes the following parameters (defaults shown):\n```python\nes.get(\n path='', # http URL path\n data='', # http body. can be either a string or a python dictionary (will automatically be converted to JSON)\n params={}, # http URL params passed as a python dictionary\n headers={}, # http headers as a python dictionary\n **kwargs # additional parameters you wish to pass to the python 'requests' library or the thrift RestRequest\n # Examples: headers, basic auth\n)\n```\n\nExamples\n--------\n\nCreate a new document in the twitter index of type tweet with id 1\n```python\nes.put('tweets/tweet/1', data={\n 'user' : 'dwnoble',\n 'post_date' : '2012-8-27T08:00:30Z',\n 'message' : 'Tweeting about elasticsearch'\n})\nes.put('blogs/post/2', data={\n 'user' : 'dan',\n 'post_date' : '2012-8-27T09:30:03Z',\n 'title' : 'Elasticsearch',\n 'body' : 'Blogging about elasticsearch'\n})\n```\n\nSearch for a document, specifying http params\n```python\nes.get('tweets/tweet/_search', data={\n 'query' : {\n 'match_all' : {}\n }\n}, params= {\n 'size': 2\n})\n```\n\nSearch for a document with a JSON string\n```python\nes.get('tweets,blogs/_search', data=\"\"\"\n{\n \"query\" : {\n \"match_all\" : {}\n }\n}\n\"\"\")\n```\n\nUpdate a document\n```python\nes.put('someindex/sometype/123', data={\n 'value' : 100,\n 'other' : 'stuff'\n})\nes.post('someindex/sometype/123/_update', data={\n 'script' : 'ctx._source.value += value',\n 'params' : {\n 'value' : 50\n }\n})\n```\n\nDelete a document\n```python\nes.delete('tweets/tweet/1')\n```\n\nBulk load\n```python\nbulk_body = '''\n{\"index\" : {}}\n{\"key\":\"value1\"}\n{\"index\" : {}}\n{\"key\":\"value2\"}\n{\"index\" : {}}\n{\"key\":\"value3\"}\n'''\n\nes.post('someindex/sometype/_bulk', data=bulk_body)\n\nbulk_list = [\n {\"index\" : {}},\n {\"key\":\"value4\"},\n {\"index\" : {}},\n {\"key\":\"value5\"},\n {\"index\" : {}},\n {\"key\":\"value6\"}\n]\n\n# Remember to include the trailing \\n character for bulk inserts\nbulk_body_2 = '\\n'.join(map(json.dumps, bulk_list))+'\\n'\n\nes.post('someindex/sometype/_bulk', data=bulk_body_2)\n```\n\n\nAlternate Syntax\n----------------\nInstead of setting the first argument of a es.<http verb> call to the HTTP URL path, you can also use python attributes and item accessors to build up the url path. For example:\n```python\nes.post('tweets/tweet/', data={\n 'user' : 'dwnoble',\n 'post_date' : '2012-8-27T09:15:59',\n 'message' : 'More tweets about elasticsearch'\n})\n```\n\nBecomes:\n```python\nes.tweets.tweet.post(data={\n 'user' : 'dwnoble',\n 'post_date' : '2012-8-27T09:15:59',\n 'message' : 'More tweets about elasticsearch'\n})\n```\n\nOr using item accessors ([] notation). This can be useful for characters that are not allowed in python attributes:\n```python\nes['tweets']['tweet'].post(data={\n 'user' : 'dwnoble',\n 'post_date' : '2012-8-27T09:15:59',\n 'message' : 'More tweets about elasticsearch'\n})\n```\n\nMore examples:\n\nSearching the \"tweets\" index for documents of type \"tweets\"\n```python\nes.tweets.tweet._search.get(data={'query' : {'match_all' : {} }})\n```\n\nSearching the \"tweets\" and \"blogs\" index for documents of any type using a JSON strings\n```python\nes['tweets,blogs']._search.get(data='{\"query\" : {\"match_all\" : {}}}')\n```\n\nJSON Encoding\n-------------\n\nBy default, rawes will encode datetimes (timezone required!) to UTC ISO8601 strings with 'second' precision before handing the JSON off to elasticsearch. If elasticsearch has no mapping defined, this will result in the default mapping of 'dateOptionalTime.'\nTimezones are required for this automatic serialization: you may want to use a python module like python-dateutil (Python 2.x only) or pytz to make your life easier.\n```python\nfrom datetime import datetime\nfrom dateutil import tz\neastern_timezone = tz.gettz('America/New_York')\n\nes.put('tweets/tweet/99', data={\n 'user' : 'dwnoble',\n 'post_date' : datetime(2012, 8, 27, 8, 0, 30, tzinfo=eastern_timezone),\n 'message' : 'Tweeting about elasticsearch'\n})\n\nes.get('tweets/tweet/99')['_source']['post_date']\n# Returns:\nu'2012-08-27T12:00:30Z'\n```\n\nAlternatively, you can specify a custom JSON encoder using the json_encoder parameter:\n```python\nfrom datetime import datetime\nfrom dateutil import tz\neastern_timezone = tz.gettz('America/New_York')\n\ndef encode_custom(obj):\n if isinstance(obj, datetime):\n return obj.astimezone(tz.tzutc()).strftime('%Y-%m-%d')\n raise TypeError(repr(obj) + \" is not JSON serializable\")\n\nes.put('tweets/tweet/445', data={\n 'user' : 'dwnoble',\n 'post_date' : datetime(2012, 11, 12, 9, 45, 45, tzinfo=eastern_timezone),\n 'message' : 'Tweeting about elasticsearch'\n}, json_encoder=encode_custom)\n\nes.get('tweets/tweet/445')['_source']['post_date']\n# Returns:\nu'2012-11-12'\n```\n\nAdditionally, a default JSON encoder can be specified in the rawes.Elastic constructor:\n\n```python\nimport rawes\nfrom datetime import datetime\nfrom dateutil import tz\neastern_timezone = tz.gettz('America/New_York')\n\ndef encode_custom(obj):\n if isinstance(obj, datetime):\n return obj.astimezone(tz.tzutc()).strftime('%Y-%m-%d')\n raise TypeError(repr(obj) + \" is not JSON serializable\")\n\nes = rawes.Elastic(\"http://localhost:9200\", json_encoder=encode_custom)\n\nes.put('tweets/tweet/445', data={\n 'user' : 'dwnoble',\n 'post_date' : datetime(2012, 11, 12, 9, 45, 45, tzinfo=eastern_timezone),\n 'message' : 'Tweeting about elasticsearch'\n})\n\nes.get('tweets/tweet/445')['_source']['post_date']\n# Returns:\nu'2012-11-12'\n```\n\nJSON Decoding\n-------------\n\nLike with JSON encoding, a custom JSON decoder may be specified as well to parse elasticsearch results. A common use case here may be parsing ISO8601 dates to python datetime objects.\n\nIndex a document with a ISO8601 formatted date string:\n\n```python\nimport rawes\nes = rawes.Elastic()\n\nes.put('blogs/post/3', data={\n 'user' : 'dan',\n 'post_date' : '2013-7-04T23:14:53Z',\n 'title' : 'Elasticsearch 2',\n 'body' : 'More blogging about elasticsearch'\n})\n```\n\nDefine a custom JSON decoder:\n```python\nimport json\nimport pytz\nimport dateutil.parser\n\nclass Iso8601JsonDecoder(json.JSONDecoder):\n \"\"\"\n Automatically decode ISO8601 strings with key \"post_date\" to python datetime objects in UTC timezone\n \"\"\"\n def __init__(self):\n json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)\n\n def dict_to_object(self, d):\n for k,v in d.iteritems():\n if k == \"post_date\":\n d[k] = dateutil.parser.parse(v)\n return d\n\n\niso8601_json_decoder = Iso8601JsonDecoder()\n\n```\n\nNow retrieve this document using our JSON decoder\n```python\nes.get(\"blogs/post/3\")[\"_source\"][\"post_date\"]\n# returns:\n# u'2013-7-04T23:14:53Z'\nes.get(\"blogs/post/3\",json_decoder=iso8601_json_decoder.decode)[\"_source\"][\"post_date\"]\n# returns:\n# datetime.datetime(2013, 7, 4, 23, 14, 53, tzinfo=tzutc())\nes_default_decoder = rawes.Elastic(json_decoder=iso8601_json_decoder.decode)\nes_default_decoder.get(\"blogs/post/3\")[\"_source\"][\"post_date\"]\n# returns:\n# datetime.datetime(2013, 7, 4, 23, 14, 53, tzinfo=tzutc())\n```\n\nError Handling\n--------------\nAs of version 0.5, the rawes.Elastic constructor throws a rawes.elastic_exception.ElasticException any time elasticsearch returns an http status code of 400 or greater.\n\n```python\nfrom rawes.elastic_exception import ElasticException\nes = rawes.Elastic('localhost:9200')\ntry:\n es.get('invalid_index/invalid_type/123')\nexcept ElasticException as e:\n # since our index is invalid, this exception handler will run\n print e.result\n # prints: {u'status': 404, u'error': u'IndexMissingException[[invalid_index] missing]'}\n print e.status_code\n # prints: 404\n```\n\nThrift support\n--------------\nThrift is supported for Python 2.x versions only. Before thrift will work with rawes, you must install the thrift python module\n```bash\n$ pip install thrift\n```\n\nBy default, connections on ports between 9500 and 9600 will use thrift\n```python\nimport rawes\nes_thrift = rawes.Elastic('localhost:9500')\n```\n\nIf you are using thrift on a non standard port, specify a 'thrift://' url\n```python\nimport rawes\nes_thrift = rawes.Elastic('thrift://localhost:8500')\n```\n\nConnection Pooling\n------------------\nrawes supports connection pooling of elasticsearch hosts:\n\n```python\nimport rawes\nes = rawes.Elastic(['http://host1:9200', 'http://host2:9200', 'http://host3:9200'])\n```\n\nThe class cycles through these hosts in a round robin fashion with each request method call. \nYou can change the connection pool strategy, or other connection pool parameters, by passing options to the `rawes.Elastic` constructor's `connection_pool_kwargs` argument:\n\n```python\nimport rawes\nes = rawes.Elastic(['http://host1:9200', 'http://host2:9200', 'http://host3:9200'], connection_pool_kwargs={\n \"selector_class\" : rawes.connection_pool.RandomSelector\n})\n```\n\nSee [rawes/connection_pool.py](https://github.com/uberVU/rawes/blob/master/rawes/connection_pool.py) for details on all available parameters.\n\nThe conncetion pooling implementation used is from the [elasticsearch-py](https://github.com/elasticsearch/elasticsearch-py/blob/master/elasticsearch/connection_pool.py) project.\n\nRun Unit Tests\n--------------\nrawes' unit tests require the python thrift and mock modules to run:\n```bash\n$ pip install thrift\n$ pip install mock\n```\n\nRun tests:\n```bash\n$ python -m unittest tests\n```\n\nRun tests for Python 3 (no thrift tests, no need to \"pip install thrift\")\n```bash\n$ python3 -m unittest tests.py3k\n```\n\nLicense\n-------\nApache 2.0 License\n\nContact\n-------\n[@dwnoble](https://twitter.com/dwnoble)\n\n\nHistory\n=========\n\n0.5.5 (2014-1)\n--------------\n* Removed tests package from setup.py (thanks [alisaifee](https://github.com/alisaifee))\n\n\n0.5.4 (2014-1)\n----------------\n* Added connection pooling from [elasticsearch-py](https://github.com/elasticsearch/elasticsearch-py) (thanks [mishu-](https://github.com/mishu-))\n\n0.5.3 (2013-7-4)\n----------------\n* Added JSON decoder support (thanks [adisbladis](https://github.com/adisbladis))\n* Added JSON encoder argument to rawes.Elastic constructor\n\n0.5.2 (2013-5-17)\n----------------\n* Python 2.6 compatibility fix (thanks [Simon Kelly](https://github.com/snopoke)!)\n\n0.5.1 (2013-5-15)\n----------------\n* Added Python 3 http & https support (no thrift support yet for python 3) (thanks [adisbladis](https://github.com/adisbladis))\n* Removed python-dateutil requirement in favor of pytz (due to Python 3 not supporting python-dateutil)\n\n0.5.0 (2013-4-25)\n----------------\n* rawes now throws a rawes.elastic_exception.ElasticException on http status codes of >=400 by default. Removed rawes.Elastic \"except_on_error\" argument.\n\n0.4.0 (2013-4-21)\n----------------\n* Simplified Elastic constructor by removing connection_type param and incorporating in to url (Thanks [nvie](https://github.com/nvie)!)\n* Added optional **kwargs to Elastic constructor. Useful for specifying things like basic authentication or specific headers\n\n0.3.6 (2013-1-8)\n----------------\n* Fixed requests >1.0 incompatibilities, changed requirement back to 'requests>=0.11.1'\n\n0.3.5 (2013-1-8)\n----------------\n* Timeout bug fix for HTTP and Thrift\n\n0.3.4 (2013-1-7)\n----------------\n* Added 'except_on_error' boolean option to rawes.Elastic constructor. If set to True, rawes.Elastic will throw an exception when elasticsearch returns a status code of >= 400 (i.e., when there is an error)\n\n0.3.3 (2012-12-21)\n------------------\n* Restricted \"requests\" requirement from >=0.11.1 to '>=0.11.1, <1.0.0'\n\n0.3.2 (2012-12-11)\n----------------\n* Thrift bug fix (Thanks [anathomical](https://github.com/anathomical)!)\n* Relaxed \"requests\" requirement from ==0.14.2 to >=0.11.1\n\n0.3.1 (2012-11-26)\n----------------\n* Changed python-dateutil version dependency from ==2.1 to >=1.0\n\n0.3 (2012-11-12)\n----------------\n* Added automatic datetime encoding (Thanks [atkinson](https://github.com/atkinson)!)\n* Added support for custom json encoderings\n\n0.2 (2012-08-10)\n----------------\n* Current Release", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/humangeo/rawes/tarball/master", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/humangeo/rawes", "keywords": null, "license": "Apache-2.0", "maintainer": null, "maintainer_email": null, "name": "rawes", "package_url": "https://pypi.org/project/rawes/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/rawes/", "project_urls": { "Download": "https://github.com/humangeo/rawes/tarball/master", "Homepage": "https://github.com/humangeo/rawes" }, "release_url": "https://pypi.org/project/rawes/0.5.5/", "requires_dist": null, "requires_python": null, "summary": "rawes elasticsearch driver", "version": "0.5.5" }, "last_serial": 1018259, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "82479524df6aa12d2f4c7f406d5c461c", "sha256": "4cd2762ca7b1bf8c27bdde436704d678b62f1524fb727d1d0ec8ee91a2942c42" }, "downloads": -1, "filename": "rawes-0.2.tar.gz", "has_sig": false, "md5_digest": "82479524df6aa12d2f4c7f406d5c461c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9969, "upload_time": "2012-08-27T22:19:15", "url": "https://files.pythonhosted.org/packages/01/9b/31b023952a9df60deb67f7455249782a946e6995720de365e58b10a7ff1b/rawes-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "9f492b4849af49de9706ac2ee3b2d640", "sha256": "d212a913ddede19615b5bc0ee05c8f7d9a8e4b8e9285dd42359627b02b2e52e1" }, "downloads": -1, "filename": "rawes-0.3.tar.gz", "has_sig": false, "md5_digest": "9f492b4849af49de9706ac2ee3b2d640", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18725, "upload_time": "2012-11-13T04:02:19", "url": "https://files.pythonhosted.org/packages/6b/cb/47cb977c43a7e8e7a12b74af562831c8c61bb89c552fd1869a2097154cab/rawes-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "667f1704a07528ad20882da31a51809a", "sha256": "9536d2fc984c7821c03e652d2d1446083ef8c2e27339690a0805e495434b6f69" }, "downloads": -1, "filename": "rawes-0.3.1.tar.gz", "has_sig": false, "md5_digest": "667f1704a07528ad20882da31a51809a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18817, "upload_time": "2012-11-26T17:06:54", "url": "https://files.pythonhosted.org/packages/af/43/45a547e8e25042b4c346fbe0a78a7bd34359d650649964af796ba6f204a8/rawes-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "40823f4e73f0a31ccea1087f2fb32f35", "sha256": "5d667dd47a770fcd58d0d09fcd1b1b0c1f60124568ce00f3ebde6fe6de5c3d33" }, "downloads": -1, "filename": "rawes-0.3.2.tar.gz", "has_sig": false, "md5_digest": "40823f4e73f0a31ccea1087f2fb32f35", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18973, "upload_time": "2012-12-11T17:17:44", "url": "https://files.pythonhosted.org/packages/77/67/b9918cdec93db8bf37aea7dc665b969bab74aade5b5e4aaeb9144ccc8ab1/rawes-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "565625e9e7718482cdbb29fa50b51980", "sha256": "1fab0166f8188c0d7510a1f1e74623f54f4c36c4c7a53d0d2d2ffa90f7ce27c3" }, "downloads": -1, "filename": "rawes-0.3.3.tar.gz", "has_sig": false, "md5_digest": "565625e9e7718482cdbb29fa50b51980", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18983, "upload_time": "2012-12-22T02:31:59", "url": "https://files.pythonhosted.org/packages/4b/d2/c2e105abba22cdab41954d44dbb703a6a7f5dbd7c405b78503a149fa1b44/rawes-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "1c5f6db91c602ea9bbb1015c00db2d1e", "sha256": "8ab5c73c197b0885004be9287560cf1d6e5e0394d9b7d6b534a872ae34e8cf71" }, "downloads": -1, "filename": "rawes-0.3.4.tar.gz", "has_sig": false, "md5_digest": "1c5f6db91c602ea9bbb1015c00db2d1e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20643, "upload_time": "2013-01-07T19:57:38", "url": "https://files.pythonhosted.org/packages/7f/d6/39f6f4781392b0fa35f95ef7482c9675a19297d2f13f3ebd818c8379c6d5/rawes-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "9f62ecb40724765983045c2fe6d07a25", "sha256": "a9ce7dbee3f8ecaf0024a8bfcc9a9e79b1ceb14eabee74bbbabf1033d6c83149" }, "downloads": -1, "filename": "rawes-0.3.5.tar.gz", "has_sig": false, "md5_digest": "9f62ecb40724765983045c2fe6d07a25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20718, "upload_time": "2013-01-08T20:09:05", "url": "https://files.pythonhosted.org/packages/ea/35/d2b67d9a43aa0835d0ed986d0a1c840b88bbde46805f696bdadaf584b25b/rawes-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "a21426942c0e23e809544ffa6e3fa235", "sha256": "d284566160c589e1f23302ad639d075a7d2090e52b40807c65f29c1c519dc385" }, "downloads": -1, "filename": "rawes-0.3.6.tar.gz", "has_sig": false, "md5_digest": "a21426942c0e23e809544ffa6e3fa235", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20994, "upload_time": "2013-01-09T02:17:02", "url": "https://files.pythonhosted.org/packages/a1/47/18131c6d421d55957e69a74bfad0b006868badefeb73eff7a140528f3e40/rawes-0.3.6.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "49b3d5e865e7d2bea4f84ae8f2d71975", "sha256": "6aa0251dba67ff1d684fd35615c7fb0342bcbec41a8ed38dfaf34c45ad46b3fb" }, "downloads": -1, "filename": "rawes-0.4.0.tar.gz", "has_sig": false, "md5_digest": "49b3d5e865e7d2bea4f84ae8f2d71975", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22039, "upload_time": "2013-04-22T00:59:13", "url": "https://files.pythonhosted.org/packages/df/bf/9d43557e063e887b9600b8bb8b9d8100cc5e7d7fc31574102abe5620a4e7/rawes-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "0c2e2ff68e19131be1e171f7c3c93f8e", "sha256": "862548ca0f9ce3ab55142453e6513626a370f4b1c49b1bb2f2557d5e06ec1d15" }, "downloads": -1, "filename": "rawes-0.5.0.tar.gz", "has_sig": false, "md5_digest": "0c2e2ff68e19131be1e171f7c3c93f8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21883, "upload_time": "2013-04-26T03:26:40", "url": "https://files.pythonhosted.org/packages/4d/22/4c0bd385c03df031551ae40f1765382e897b5cdcdfd8f9f6894962ee57bf/rawes-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "338bea4a93cf8dafdab476f5685e0e49", "sha256": "bbd8f87fbcfd0796bbb5ae684a69ceb04f9191b7f697e88b4462462e49dfdd7e" }, "downloads": -1, "filename": "rawes-0.5.1.tar.gz", "has_sig": false, "md5_digest": "338bea4a93cf8dafdab476f5685e0e49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22471, "upload_time": "2013-05-15T16:23:02", "url": "https://files.pythonhosted.org/packages/48/29/faf5221f50c681b914e032d7c00da8fa3a82fa3c383a3eabea705437f9b2/rawes-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "23895281779a4be20e1fc5a5dcd7daad", "sha256": "94b14d2994ef2a93d795be3d0ad8749dc518c6ac00301ad56f3ea590890c8a4e" }, "downloads": -1, "filename": "rawes-0.5.2.tar.gz", "has_sig": false, "md5_digest": "23895281779a4be20e1fc5a5dcd7daad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22574, "upload_time": "2013-05-17T13:57:02", "url": "https://files.pythonhosted.org/packages/3f/78/7752d16ccde16e124baad5bf1940ef9a9b15df9203b2563055f2facad95e/rawes-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "d2aeb41dd8903727658b5aa052c30b28", "sha256": "ca5e0ef934138f74ce8e1555b8e4a1321cf6130b4a3e8358f472f12c65e921d3" }, "downloads": -1, "filename": "rawes-0.5.3.tar.gz", "has_sig": false, "md5_digest": "d2aeb41dd8903727658b5aa052c30b28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24557, "upload_time": "2013-07-05T03:28:25", "url": "https://files.pythonhosted.org/packages/5c/bd/66f9a19e19e8aeb44585c6518b353eceffb84e4864c71c8ad0694291b7f6/rawes-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "a63d54faf4fefd954b9e9185b2a60719", "sha256": "f4a93dd0ccfc063a4a756a263c575d4e4d8c71cd623146f854bbb934a2633d22" }, "downloads": -1, "filename": "rawes-0.5.4.tar.gz", "has_sig": false, "md5_digest": "a63d54faf4fefd954b9e9185b2a60719", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30532, "upload_time": "2014-01-30T17:20:26", "url": "https://files.pythonhosted.org/packages/60/55/f5fdf0bb36cca6677d349a535fe142a059e04ebec956536b4b9caeb838bc/rawes-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "8161c7672fb081da4433838ceefd5c5f", "sha256": "41df53fd2742e536d4e370614eec06ae0e8a5eeaeb2715bc00814b5a6b703b53" }, "downloads": -1, "filename": "rawes-0.5.5.tar.gz", "has_sig": false, "md5_digest": "8161c7672fb081da4433838ceefd5c5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30776, "upload_time": "2014-03-04T05:12:27", "url": "https://files.pythonhosted.org/packages/0c/de/3ad6c22afecb22cbe178c319e6d5f9bc7ff8da77eec9b7469670675e3170/rawes-0.5.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8161c7672fb081da4433838ceefd5c5f", "sha256": "41df53fd2742e536d4e370614eec06ae0e8a5eeaeb2715bc00814b5a6b703b53" }, "downloads": -1, "filename": "rawes-0.5.5.tar.gz", "has_sig": false, "md5_digest": "8161c7672fb081da4433838ceefd5c5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30776, "upload_time": "2014-03-04T05:12:27", "url": "https://files.pythonhosted.org/packages/0c/de/3ad6c22afecb22cbe178c319e6d5f9bc7ff8da77eec9b7469670675e3170/rawes-0.5.5.tar.gz" } ] }