{ "info": { "author": "bingtel Wang", "author_email": "bingtelwang@163.com", "bugtrack_url": null, "classifiers": [], "description": "Hare\n=====================\n\n``hare``\u662f\u4e00\u4e2a\u57fa\u4e8epymysql\u5e76\u8fd0\u7528ActiveRecord\u6a21\u5f0f\u7684ORM\u6846\u67b6, \u5728\u865a\u62df\u73af\u5883\u4e0b\uff0c\u901a\u8fc7\uff1a\n\n\tpip install hare\n\n\u5373\u53ef\u5b89\u88c5\u3002\n\n\u5f53\u524d\uff0c\u5b83\u53ea\u652f\u6301\uff1a\n\n\tMySQL\n\n## \u52a8\u673a\n\u5728Python\u4e0b\u8fdb\u884c\u6570\u636e\u5e93\u64cd\u4f5c\uff0c \u5927\u4f53\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a\n\n 1\u3001\u4f7f\u7528raw sql\n 2\u3001\u4f7f\u7528ORM\n\n### Raw SQL\npython\u4e2d\u5e38\u7528\u7684``raw sql``\u5de5\u5177\u662f\uff1a\n\n MySQLdb\n PyMySQL\n\n\u4f7f\u7528``raw sql``\u7684\u597d\u5904\u662f\uff1a\n\n \u7ed9\u4e88\u5f00\u53d1\u4eba\u5458\u6781\u5927\u7684\u81ea\u7531\uff0c\u8ba9\u5f00\u53d1\u4eba\u5458\u77e5\u9053\u5177\u4f53\u8981\u6267\u884c\u7684sql\uff0c\u65b9\u4fbfsql\u4f18\u5316\n\n\u574f\u5904\u662f``\u9ebb\u70e6``\uff1a\n\n \u5199\u8d77\u6765\u9ebb\u70e6\u3001\u5f71\u54cd\u5f00\u53d1\u901f\u5ea6\uff1b\u7ef4\u62a4\u8d77\u6765\u4e5f\u9ebb\u70e6\n\n### ORM\npython\u4e2d\u7528\u7684\u6700\u5e7f\u7684ORM\u662f``SQLAlchemy``\u548c``Peewee``.\n\n\u4f7f\u7528``ORM``\u7684\u597d\u5904\u662f\uff1a\n\n \u5199\u8d77\u6765\u65b9\u4fbf\uff0c\u7ef4\u62a4\u65b9\u4fbf\n\n\u574f\u5904\u662f\uff1a\n\n \u5bf9\u5f00\u53d1\u4eba\u5458\u900f\u660e\u3001\u4e0d\u5229\u4e8esql\u4f18\u5316\uff1b\n \u4e3b\u6d41\u7684ORM\u5b66\u4e60\u6210\u672c\u9ad8\uff0c\u5bf9\u4e8e\u4e00\u822c\u7684\u4e2d\u5c0f\u578b\u9879\u76ee\u800c\u8a00\uff0c\u7528\u4e0d\u5230\u90a3\u4e48\u5230\u529f\u80fd\uff0c\u5982SQLAlchemy\n\n\u6b64\u5916\uff0c python``ORM``\u6846\u67b6\u7684\u4f7f\u7528\u54f2\u5b66\u662f\uff1a\n\n \u9700\u8981\u8981\u624b\u52a8\u7684\u5728\u7c7b\u4e2d\u914d\u7f6e\u5b57\u6bb5\u548c\u5bf9\u5e94\u7c7b\u578b\uff0c \u7136\u540e\u4f7f\u7528ORM\u53bb\u81ea\u52a8\u521b\u5efa\u5bf9\u5e94\u7684table\u3002\n\n\u800c\u5f00\u53d1\u4eba\u5458\u7684\u54f2\u5b66\u662f:\n\n \u624b\u52a8\u4f7f\u7528sql\u5efa\u8868\u3001\u7136\u540e\u518d\u53bb\u521b\u5efa\u5bf9\u5e94\u7684ORM\u3002\n\n\u90a3\u4e48\uff0c \u6bd4\u8f83\u4e0b\u6765\uff0c\u5c31\u4ea7\u751f\u4e86\u65b0\u7684\u9700\u6c42\uff1a \u5b9e\u73b0\u4e00\u4e2a``ORM``\uff0c\u6ee1\u8db3\u4e0b\u5217\u8981\u6c42\uff1a\n\n 1\u3001\u65b9\u4fbfORM\u548c\u6570\u636e\u5e93\u8868\u4e4b\u95f4\u7684\u6620\u5c04\u3001\u6700\u597d\u4e0d\u7528\u5728ORM\u4e2d\u58f0\u660e\u5b57\u6bb5\n 2\u3001\u652f\u6301raw sql\n 3\u3001\u4e0d\u9700\u8981\u5b9e\u73b0\u590d\u6742\u7684API(\u592a\u590d\u6742\u7684\uff0c\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7raw sql\u5b9e\u73b0)\n 4\u3001\u652f\u6301\u4e8b\u52a1(\u58f0\u660e\u5f0f\u3001\u547d\u4ee4\u5f0f)\n\n\u5f88\u5bb9\u6613\u60f3\u5230\uff0c \u4f7f\u7528``Active Record``\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e00\u4e2aORM\uff0c\u6ee1\u8db3\u4e0a\u8ff0\u6761\u4ef6\n\n\u4e8e\u662f\u5c31\u5b9e\u73b0\u4e86\u4e00\u4e2a\u540d\u4e3a``Hare``\u7684ORM.``Hare``\u7684\u610f\u601d\u662f``\u91ce\u5154``\uff0c \u5e0c\u671b\u8fdb\u884cpython\u7684db\u64cd\u4f5c\u65f6\uff0c\u50cf\u5154\u5b50\u4e00\u6837\u5feb\u3002\n\n### \u53c2\u8003\u6846\u67b6\n\n\u5728\u8bbe\u8ba1\u548c\u5b9e\u73b0``Hare``\u7684\u8fc7\u7a0b\u4e2d\uff0c\u53c2\u8003\u4e86``Flask``\u6846\u67b6\u548c``jFinal``\u6846\u67b6\u7684\u8bbe\u8ba1\u3002\n\n#### jFinal\n\njFinal\u662f\u4e00\u79cd\u8f7b\u91cf\u7684java web\u6846\u67b6\uff1b\u8bbe\u8ba1\u548c\u5b9e\u73b0``Hare``\u7684\u8fc7\u7a0b\u4e2d\uff0c\u501f\u9274\u4e86\u5b83\u7684\u4e00\u4e9b\u8bbe\u8ba1\u601d\u60f3\uff1a\n\n##### \u81ea\u52a8\u83b7\u53d6\u8868\u7ed3\u6784\n\njFinal\u5728\u542f\u52a8\u7684\u65f6\u5019\uff0c\u6839\u636eORM\u5bf9\u5e94\u7684\u8868\u540d\uff0c\u901a\u8fc7``MySQL``\u7684``INFORMATION_SCHEMA``\u53d6\u83b7\u53d6\u8868\u7ed3\u6784\uff1b\n``Hare``\u4e5f\u901a\u8fc7\u6b64\u65b9\u5f0f\u6765\u83b7\u53d6\u3002\n\n#### Flask\n\nFlask\u662f\u4e00\u79cd\u8f7b\u91cf\u7684python web\u6846\u67b6\uff1b\u8bbe\u8ba1\u548c\u5b9e\u73b0``Hare``\u7684\u8fc7\u7a0b\u4e2d\uff0c\u501f\u9274\u4e86\u5b83\u7684\u4e00\u4e9b\u8bbe\u8ba1\u601d\u60f3\uff1a\n\n##### \u5c06\u6846\u67b6\u5bf9\u8c61\u5316\nflask\u4e2d\uff0c\u901a\u8fc7\uff1a\n\n app = Flask(__name__)\n\n\u7684\u65b9\u5f0f\u6765\u5efa\u7acb\u4e00\u4e2a\u5e94\u7528\u5bf9\u8c61\uff0c \u5e76\u5728\u8be5\u5bf9\u8c61\u4e2d\u5b58\u50a8\u76f8\u5173\u8def\u7531\u3001\u5904\u7406\u5668\u7b49\u4fe1\u606f\uff1b\n\nHare\u4e2d\uff0c \u91c7\u7528\u7c7b\u4f3c\u65b9\u5f0f\uff0c\u901a\u8fc7\uff1a\n\n haredb = Hare(host='localhost', user='root',\n password='*****', db='test',\n charset='utf8')\n\n\u6765\u521b\u5efa\u4e00\u4e2a\u6570\u636e\u6e90\u5bf9\u8c61\uff0c \u5b58\u653e\u6570\u636e\u64cd\u4f5c\u6240\u9700\u7684\u4e00\u5207\u4fe1\u606f\u3002\n##### \u88c5\u9970\u5668\nflask\u4e2d\uff0c\u4f7f\u7528\u88c5\u9970\u5668\u7684\u65b9\u5f0f\uff0c\u6765\u5b9a\u4e49\u8def\u7531\u5904\u7406\uff1a\n\n @app.route('/home', methods=['GET'])\n def home():\n pass\n\nHare\u4e5f\u4f7f\u7528\u88c5\u9970\u5668\u6765\u5b9a\u4e49\u5b9a\u4e49\u6570\u636e\u6a21\u578b\u7c7b\u548c\u8868\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u5e76\u5b58\u50a8\uff0c \u5982\u4e0b\uff1a\n\n @haredb.table('user')\n class User(Model):\n pass\n\n\u628a``User``\u7c7b\u548c``user``\u8868\u5bf9\u5e94\u8d77\u6765.\n\n\u540c\u65f6\uff0cHare\u4e2d\u7684\u4e8b\u52a1\u4e5f\u53ef\u4ee5\u901a\u8fc7\u88c5\u9970\u5668\u6765\u5b9e\u73b0\uff1a\n\n @haredb.tx\n def func(...):\n ...\n\n## \u4f7f\u7528\n\u6570\u636e\u5e93\u7684\"\u5e93->\u8868->\u5b57\u6bb5\"\uff0c\u662f\u4e00\u79cd\u5c42\u6b21\u5206\u660e\u7684\u7ed3\u6784\u3002``Hare``\u4e5f\u57fa\u4e8e\u6b64\u3002\n\n\u7528\u6237\u63d0\u4f9b\u6570\u636e\u5e93\u7684\u8fde\u63a5\u914d\u7f6e\uff0c\u5c31\u5bf9\u5e94\u4e86\u4e00\u4e2a\u6570\u636e\u6e90\uff0c\u4e5f\u5c31\u662fDatabase\uff1b\n\n\tharedb = Hare(\n\t host='localhost', user='root',\n\t password='********', db='test',\n\t charset='utf8')\n\n\u5047\u8bbe\u5728``test``\u6570\u636e\u5e93\u4e2d\u5df2\u7ecf\u521b\u5efa\u4e86\u4e00\u4e2a``user``\u8868\uff1a\n\n USER_TABLE = \"\"\"CREATE TABLE `user` (\n `uid` int(11) NOT NULL AUTO_INCREMENT,\n `nickname` varchar(20) DEFAULT NULL,\n `email` varchar(20) DEFAULT NULL,\n PRIMARY KEY (`uid`)\n ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8\"\"\"\n\n\u901a\u8fc7``\u88c5\u9970\u5668``\u6765\u58f0\u660e\u8fd9\u4e2a\u6570\u636e\u5e93\u4e0b\u6709\u54ea\u4e9b\u8868(\u6dfb\u52a0\u4e00\u4e2a\u540d\u662f``user``\u7684table\uff0c\u5bf9\u5e94\u7684\u6a21\u578b\u662f``User``)\uff1a\n\n @haredb.table('user')\n class User(Model):\n pass\n\n\u90a3\u4e48:\n\n### \u5b8c\u6574\u7684\u7528\u4f8b\u5982\u4e0b\n```\n#! -*- coding: utf-8 -*-\nfrom __future__ import absolute_import\nimport logging\nfrom traceback import format_exc\nimport pymysql\nfrom hare import Hare, Model\n\n# \u521b\u5efa\u4e00\u4e2aHare\u5bf9\u8c61, \u4f5c\u4e3a\u6570\u636e\u6e90\n# \u4f1a\u4f7f\u7528\u9ed8\u8ba4\u7684logger\u6765\u8bb0\u5f55\u6267\u884c\u7684sql\nharedb = Hare(\n host='localhost', user='root',\n password='********', db='test',\n charset='utf8')\n\n# \u521b\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49logger\u7684\u6570\u636e\u6e90\nlogger = logging.getLogger('hare')\nlogger.addHandler(logging.StreamHandler())\nlogger.setLevel(logging.DEBUG)\nharedb = Hare(\n host='localhost', user='root',\n password='********', db='test',\n charset='utf8',\n logger=logger)\n\n# \u5c06user\u8868\u548cUser\u7c7b\u7ed1\u5b9a\n@haredb.table('user')\nclass User(Model):\n pass\n\n# \u83b7\u53d6\u6240\u6709\u7684\u8868\u540d\n# \u8fd4\u56de['user']\nprint haredb.tables\n\n\n# \u83b7\u53d6User\u7c7b\u5bf9\u5e94\u7684table\u5bf9\u8c61\ntable = User.table\n\n# \u8f93\u51fa\u8868\u540d\u79f0\nprint table.name\n\n# \u6e05\u7a7aUser\u8868\ntable.truncate()\n\n# \u5224\u65ad\u5b57\u6bb5\u662f\u5426\u5c5e\u4e8e\u8be5\u8868\nprint table.is_column('uid')\nprint table.is_column('uid_not_exists')\n\n# \u65b0\u5efa\u4e00\u6761\u8bb0\u5f55\nu = User()\nu.set_many(**{'nickname': 'haha', 'email': 'a@q.com'}).save()\n\n# \u83b7\u53d6\u4e3b\u952e\nprint u.uid\n\n# \u83b7\u53d6\u4e00\u6761\u8bb0\u5f55\nu = User.get(uid=1)\n\n# \u4fee\u6539\u5b57\u6bb5\u7684\u503c\nu.nickname = 'new name'\nu.update()\n\n# \u5220\u9664\u8be5\u5bf9\u8c61\nu.delete()\n\n# \u83b7\u53d6\u6240\u6709\u7684\u7528\u6237\u8bb0\u5f55\n# \u6bcf\u4e2a\u5143\u7d20\u662f\u4e2adict\nusers = User.select_many()\n\n# \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u6240\u6709\u8bb0\u5f55\n# \u6bcf\u4e2a\u5143\u7d20\u662f\u4e2adict\nusers = User.select_many(email='a@q.com')\n\n# \u5206\u9875\u67e5\u8be2User\u8868\npagination = User.paginate(params={'nickname': ('is not', None)}, page=1, per_page=10)\nprint pagination.items\n\n# \u83b7\u53d6\u4e00\u6761\u6570\u636e\u5e93\u8fde\u63a5\ndbi = haredb.dbi\n\n# \u6267\u884crow sql\n# \u4e00\u6761\u8bb0\u5f55\nusers = dbi.select(u'SELECT * FROM user WHERE uid = 10')\n# \u591a\u6761\u8bb0\u5f55\nusers = dbi.select_many(u'SELECT * FROM user WHERE uid > 10')\n# \u6267\u884c\u5199\u64cd\u4f5c\ndbi.modify(u'DELETE FROM user WHERE uid = %s', 1)\n# \u6279\u91cf\u5199\u64cd\u4f5c\nrows = [{'nickname': 'test', 'email': 'test@qq.com'}]\ndbi.modify_many(u'INSERT INTO user(nickname, email) VALUES(%(nickname)s, %(email)s)', rows)\n\n# \u6267\u884c\u4e8b\u52a1\n@haredb.tx\ndef save_user():\n user = User().set_many(**{'nickname': 'test2'})\n user.save()\n # 1/0 \u53d6\u6d88\u6ce8\u91ca\u8be5\u884c\uff0c\u5219\u4fdd\u5b58\u5931\u8d25\n\n# \u6267\u884c\u4e8b\u52a1\u7684\u53e6\u5916\u4e00\u79cd\u65b9\u5f0f\ndef save_user2():\n user = User().set_many(**{'nickname': 'test2'})\n user.save()\n # 1/0 \u53d6\u6d88\u6ce8\u91ca\u8be5\u884c\uff0c\u5219\u4fdd\u5b58\u5931\u8d25\n\nwith haredb.get_tx() as tx:\n try:\n save_user2()\n except:\n logging.error(format_exc())\n tx.rollback()\n else:\n tx.commit()\nprint User.select_many()\n```\n## API\n\n\u89c1\n\n\tdoc/api.md\n\n## \u4e2a\u4eba\u535a\u5ba2\n\n[bingtel-\u6728\u72b9\u5982\u6b64](http://www.bingtel.wang/)\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bingtel/hare", "keywords": "python ORM orm ActiveRecord pymysql raw sql", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "hare", "package_url": "https://pypi.org/project/hare/", "platform": "", "project_url": "https://pypi.org/project/hare/", "project_urls": { "Homepage": "https://github.com/bingtel/hare" }, "release_url": "https://pypi.org/project/hare/0.6/", "requires_dist": [ "PyMySQL" ], "requires_python": "", "summary": "A python ORM based on pymysql with ActiveRecord", "version": "0.6" }, "last_serial": 2763912, "releases": { "0.3": [ { "comment_text": "", "digests": { "md5": "3dc2a40d79d9dc6b77981e3ecc65d918", "sha256": "1145b68b0e63eb4daef696447b238aa23eef6236af813e3dd3476b9df585e360" }, "downloads": -1, "filename": "hare-0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "3dc2a40d79d9dc6b77981e3ecc65d918", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15396, "upload_time": "2017-02-06T14:49:44", "url": "https://files.pythonhosted.org/packages/86/dc/6b206a345401920314ec853187ac0908e1551a5e9f4f2a9e4da4d018c58d/hare-0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d96c21b431b1f8b65866780669a9c346", "sha256": "4581f74af1cea314a0de4d534c1bbf1bb38bbe0efb833bf4142c34fd7a1c0005" }, "downloads": -1, "filename": "hare-0.3.tar.gz", "has_sig": false, "md5_digest": "d96c21b431b1f8b65866780669a9c346", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12341, "upload_time": "2017-02-06T14:49:47", "url": "https://files.pythonhosted.org/packages/52/b5/52b5e3edae774f251521dc4dbe0f5640fc8a9afdd2e18a9e7d6edd60aeac/hare-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "e6946d1679ec701c785ebe940f21e52b", "sha256": "a66c320558ece98fd24a6240080df58084c876e2096d9a9b3f46350227a8c893" }, "downloads": -1, "filename": "hare-0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "e6946d1679ec701c785ebe940f21e52b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15932, "upload_time": "2017-02-08T00:13:32", "url": "https://files.pythonhosted.org/packages/78/a7/2ac1addfc95dd661df98206dfa39282d9f49772a059ca3e3ec351fc22da9/hare-0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12b154a5f89f2aaeccf1fa05d4f4b4cf", "sha256": "959fc03eb631ba560e25e0a6e0f9c6e7509cdfd884da536e70834dc2f6e200d6" }, "downloads": -1, "filename": "hare-0.4.tar.gz", "has_sig": false, "md5_digest": "12b154a5f89f2aaeccf1fa05d4f4b4cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12833, "upload_time": "2017-02-08T00:13:34", "url": "https://files.pythonhosted.org/packages/e4/8e/f08798f4c296ac7a06fc0c0a7fb1a7130228ba076bffe4721e54ef1c12e0/hare-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "090a7e175f01d27db3b11e84ebfcd4f7", "sha256": "41ec4675011a290c299bae18642dee907b0a2e419e3c3e9796fb4d6f0b1525f7" }, "downloads": -1, "filename": "hare-0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "090a7e175f01d27db3b11e84ebfcd4f7", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 16016, "upload_time": "2017-03-16T12:47:01", "url": "https://files.pythonhosted.org/packages/5c/5c/7c1fb920bcbdaf45b36bdaf482475f4020ff13ed76c61b76bb6bf33fc8f6/hare-0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc416c394ae45b6e022ed4c3731b2885", "sha256": "5799cdcbb4b5f9fd02d3bed88f394f4c31a155940d3c60e73f9ecc78727d2090" }, "downloads": -1, "filename": "hare-0.5.tar.gz", "has_sig": false, "md5_digest": "fc416c394ae45b6e022ed4c3731b2885", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12907, "upload_time": "2017-03-16T12:47:07", "url": "https://files.pythonhosted.org/packages/9e/c9/222130591b8d9ad81fa56be0d74ac545e85ecb96728870086a919a690479/hare-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "e18c78f7cf71d66eed87223dfc344819", "sha256": "9486437d5c5eeb5ad175bc3dd7e39f4b8da9709a5143d7b8b7bdf66d5e18cb3e" }, "downloads": -1, "filename": "hare-0.6-py2-none-any.whl", "has_sig": false, "md5_digest": "e18c78f7cf71d66eed87223dfc344819", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 16136, "upload_time": "2017-04-09T12:07:55", "url": "https://files.pythonhosted.org/packages/9d/b0/eff039237a55c93528b8e19df220c520ec873f15fd23cc089145a1941ee3/hare-0.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6fc9eff5372be6dd6bfb004c8dce90b2", "sha256": "9cb2a15282391da38c8eb52504f492ca262e9d979987064c55bba6965fba5ba6" }, "downloads": -1, "filename": "hare-0.6.tar.gz", "has_sig": false, "md5_digest": "6fc9eff5372be6dd6bfb004c8dce90b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13053, "upload_time": "2017-04-09T12:07:56", "url": "https://files.pythonhosted.org/packages/31/f1/7d99e4d21aed311d25d144d7829a052d5455d1ff7e71d92ccfd436d0b417/hare-0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e18c78f7cf71d66eed87223dfc344819", "sha256": "9486437d5c5eeb5ad175bc3dd7e39f4b8da9709a5143d7b8b7bdf66d5e18cb3e" }, "downloads": -1, "filename": "hare-0.6-py2-none-any.whl", "has_sig": false, "md5_digest": "e18c78f7cf71d66eed87223dfc344819", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 16136, "upload_time": "2017-04-09T12:07:55", "url": "https://files.pythonhosted.org/packages/9d/b0/eff039237a55c93528b8e19df220c520ec873f15fd23cc089145a1941ee3/hare-0.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6fc9eff5372be6dd6bfb004c8dce90b2", "sha256": "9cb2a15282391da38c8eb52504f492ca262e9d979987064c55bba6965fba5ba6" }, "downloads": -1, "filename": "hare-0.6.tar.gz", "has_sig": false, "md5_digest": "6fc9eff5372be6dd6bfb004c8dce90b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13053, "upload_time": "2017-04-09T12:07:56", "url": "https://files.pythonhosted.org/packages/31/f1/7d99e4d21aed311d25d144d7829a052d5455d1ff7e71d92ccfd436d0b417/hare-0.6.tar.gz" } ] }