{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "\u5408\u80a5\u5de5\u4e1a\u5927\u5b66\u6559\u52a1\u7cfb\u7edf\u5b66\u751f\u7aef\u63a5\u53e3\u4ee5\u53ca\u65b9\u4fbf\u5f00\u53d1\u8005\u5f00\u53d1\u56f4\u7ed5\u5b66\u751f\u6570\u636e\u7684\u4e00\u4e9b\u5de5\u5177.\n\nHome-page: https://github.com/er1iang/hfut\nAuthor: erliang\nAuthor-email: dev@erliang.me\nLicense: MIT\nDescription: ===========================================\n hfut - \u5408\u80a5\u5de5\u4e1a\u5927\u5b66\u5b66\u751f\u6559\u52a1\u63a5\u53e3\n ===========================================\n \n \u5f00\u53d1\u72b6\u6001\n --------------------\n \n .. image:: https://img.shields.io/github/license/er1iang/hfut.svg\n :target: https://github.com/er1iang/hfut/blob/master/LICENSE\n \n .. image:: https://img.shields.io/pypi/v/hfut.svg\n :target: https://pypi.python.org/pypi/hfut\n \n .. image:: https://img.shields.io/travis/er1iang/hfut.svg\n :target: https://travis-ci.org/er1iang/hfut\n \n hfut \u63d0\u4f9b\u4e86\u5408\u80a5\u5de5\u4e1a\u5927\u5b66\u6559\u52a1\u7cfb\u7edf\u5b66\u751f\u7aef\u63a5\u53e3\u5e76\u63d0\u4f9b\u4e86\u65b9\u4fbf\u5f00\u53d1\u8005\u5f00\u53d1\u56f4\u7ed5\u5b66\u751f\u6570\u636e\u7684\u4e00\u4e9b\u5de5\u5177.\n \n \n QQ \u7fa4\n ----------------\n \n \u4f60\u53ef\u4ee5\u70b9\u8fd9 `\u52a0\u5165QQ\u7fa4 `_ \u6216\u8005\u626b\u63cf\u4e8c\u7ef4\u7801\u52a0\u5165\u6211\u4eec.\n \n .. image:: docs/_static/qq_group_qr.png\n \n \n \u529f\u80fd\u7279\u6027\n --------------------\n \n - \u540c\u65f6\u652f\u6301\u5408\u80a5\u6821\u533a\u548c\u5ba3\u57ce\u6821\u533a\u7684\u6559\u52a1\u7cfb\u7edf, \u5bf9\u5e94\u63a5\u53e3\u7684\u4f7f\u7528\u65b9\u5f0f\u5b8c\u5168\u76f8\u540c\n - \u652f\u6301\u4f1a\u8bdd\u81ea\u52a8\u66f4\u65b0, \u65e0\u9700\u62c5\u5fc3\u8d85\u8fc7\u65f6\u95f4\u540e\u8bbf\u95ee\u63a5\u53e3\u4f1a\u51fa\u9519\n - \u652f\u6301\u975e\u6cd5\u53c2\u6570\u68c0\u67e5, \u4f60\u518d\u4e5f\u4e0d\u7528\u62c5\u5fc3\u4e00\u4e0d\u5c0f\u5fc3\u5c31\u88ab\u5c01\u4e86 IP \u4e86\n - \u652f\u6301\u5168\u5c40\u914d\u7f6e HTML \u89e3\u6790\u5668, \u540c\u65f6\u7167\u987e\u4e86\u4e0d\u4f1a\u5904\u7406\u4f9d\u8d56\u7f16\u8bd1\u7684\u65b0\u624b\u548c\u5bf9\u6027\u80fd\u6709\u8981\u6c42\u7684\u573a\u666f\n - \u4f7f\u7528\u7b80\u5355, \u53ea\u9700\u58f0\u660e\u4e00\u4e2a ``hfut.Student`` \u5bf9\u8c61\u5373\u53ef\u8c03\u7528\u6240\u6709\u63a5\u53e3\n - \u63a5\u53e3\u4e30\u5bcc, \u63d0\u4f9b\u4e86\u6240\u6709\u5b66\u751f\u80fd\u591f\u4f7f\u7528\u7684\u6559\u52a1\u63a5\u53e3, \u9664\u6b64\u5916\u8fd8\u6709\u6b63\u5e38\u60c5\u51b5\u4e0b\u5b66\u751f\u65e0\u6cd5\u8bbf\u95ee\u5230\u7684\u63a5\u53e3\n - \u53ef\u4ee5\u7075\u6d3b\u63a7\u5236\u8bfe\u8868\u6570\u636e, \u518d\u4e5f\u4e0d\u9700\u8981\u5404\u7c7b\u4e0a\u4f20\u4e2a\u4eba\u9690\u79c1, \u529f\u80fd\u81c3\u80bf\u7684\u8bfe\u8868\u8f6f\u4ef6\u4e86\n - \u6570\u636e\u80fd\u591f\u8f7b\u677e\u5bfc\u51fa, \u80fd\u591f\u4e3a\u57fa\u4e8e\u5de5\u5927\u6559\u52a1\u6570\u636e\u7684\u670d\u52a1\u6216\u5e94\u7528\u63d0\u4f9b\u5f3a\u5927\u7684\u5e95\u5c42\u652f\u6301\n - \u63d0\u4f9b\u4e86\u5f3a\u5927\u7684\u9009\u8bfe\u529f\u80fd, \u4f60\u80fd\u8f7b\u677e\u67e5\u8be2\u53ef\u9009\u7684\u8bfe\u7a0b, \u67e5\u770b\u6559\u5b66\u73ed\u7ea7\u9009\u4e2d\u4eba\u6570, \u6279\u91cf\u63d0\u4ea4\u589e\u5220\u8bfe\u7a0b\u6570\u636e\n - \u5bf9\u5f00\u53d1\u53cb\u597d, \u6bcf\u4e2a\u63a5\u53e3\u8fd4\u56de\u7684\u6570\u636e\u7ed3\u6784\u90fd\u63d0\u4f9b\u4e86\u63cf\u8ff0, \u540c\u65f6\u63d0\u4f9b\u4e86\u7528\u4e8e\u7ee7\u627f\u7684\u57fa\u7c7b\u4ee5\u53ca\u9875\u9762\u5904\u7406\u7684\u51fd\u6570\u548c\u5176\u4ed6\u5de5\u5177\u63d0\u5347\u4f60\u7684\u5f00\u53d1\u6548\u7387\n - Python2/3 \u517c\u5bb9, \u4ee3\u7801\u5728 2.7,3.3,3.4,3.5, pypy \u4e94\u4e2a\u7248\u672c\u4e0a\u8fdb\u884c\u4e86\u6d4b\u8bd5\n \n \n \u5b83\u80fd\u505a\u4ec0\u4e48\uff1f\n ---------------\n \n - \u5b66\u751f\u5fae\u4fe1\u540e\u53f0\u670d\u52a1\u652f\u6301\n - \u9009\u8bfe\u52a9\u624b\n - \u5b66\u751f\u6570\u636e\u5206\u6790\n - OAuth \u767b\u9646\u670d\u52a1\n - \u4ee5\u53ca\u4e00\u5207\u4f60\u80fd\u60f3\u5230\u7684\u4e0e\u5b66\u751f\u4fe1\u606f\u4e0e\u6559\u52a1\u6570\u636e\u6709\u5173\u7684\u9879\u76ee\n \n \n \u5feb\u901f\u4e0a\u624b\n ============\n \n \u4f60\u53ea\u9700\u8981\u5728\u547d\u4ee4\u884c\u4e0b\u8f93\u5165\u4e00\u4e0b\u4ee3\u7801\u4fbf\u80fd\u5b89\u88c5\u597d hfut::\n \n $ pip install hfut\n \n \u5982\u679c\u4f60\u6ca1\u6709\u5b89\u88c5 `pip `_ \uff0c\n `Python \u5b89\u88c5\u5305\u6307\u5357 `_\n \u80fd\u591f\u6307\u5bfc\u4f60\u5b89\u88c5 PIP .\n \n \u8c03\u7528\u63a5\u53e3\n ----------\n \n >>> from hfut import Student\n >>> stu = Student('your-account', 'your-password', 'campus')\n >>> stu.get_my_info()\n \n \u6240\u6709\u7684\u63a5\u53e3\u5728\u8fd9: :ref:`\u6240\u6709\u63a5\u53e3 `.\n \n :ref:`\u9ad8\u7ea7\u6280\u5de7 ` \u8fd9\u4e00\u8282\u6709\u66f4\u591a\u7684\u4f8b\u5b50.\n \n \u6587\u6863\n -----\n \n \u5b8c\u6574\u6587\u6863\u4f4d\u4e8e http://hfut.rtfd.io/ , \u4f60\u53ea\u8981\u82b1\u4e00\u70b9\u65f6\u95f4\u5c31\u80fd\u4e86\u89e3\u6574\u4e2a\u9879\u76ee.\n \n \n **\u66f4\u65b0\u65e5\u5fd7\u8bf7\u67e5\u770b:** `HISTORY.rst `_\n \n \n ..\n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n **\u95ee\u9898\u4fee\u590d**\n \n **\u6587\u6863**\n \n **\u5176\u4ed6\u6742\u9879**\n \n .. :changelog:\n \n 2.2.3 (20161128)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u4f7f\u7528\u4e86\u5feb\u901f\u5224\u65ad IP \u88ab\u7981\u7684\u7b97\u6cd5, \u5c06\u53ea\u5728\u767b\u5f55\u65f6\u8fdb\u884c\u7684\u68c0\u67e5\u653e\u5230\u4e86\u6bcf\u6b21\u54cd\u5e94,\n \u540c\u65f6\u63d0\u4f9b\u4e86 ``IP_BANNED_RESPONSE`` \u914d\u7f6e\u53c2\u6570, \u786e\u4fdd\u51fa\u73b0\u53d8\u52a8\u65f6\u80fd\u5373\u65f6\u7ea0\u6b63\n - \u6dfb\u52a0\u4e86 ``DEFAULT_HEADERS`` \u914d\u7f6e, \u7528\u4e8e\u521d\u59cb\u5316\u4f1a\u8bdd\u7684\u8bf7\u6c42\u5934\n - \u6dfb\u52a0\u4e86 ``RAISE_FOR_STATUS`` \u914d\u7f6e, \u5f53\u72b6\u6001\u54cd\u5e94\u7801\u5f02\u5e38\u65f6\u662f\u5426\u89e6\u53d1\u9519\u8bef, \u9ed8\u8ba4\u4e0d\u89e6\u53d1\n - \u66f4\u65b0\u4e86 ``ILLEGAL_CHARACTERS_PATTERN`` \u6b63\u5219, \u5220\u9664\u4e86\u8bef\u5224\u7684\u975e\u6cd5\u5b57\u7b26\n - ``shortcut.Student#get_selectable_courses`` \u652f\u6301 ``pool_size`` \u53c2\u6570\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``MAX_HISTORIES`` \u914d\u7f6e\u9879\u4e0d\u8d77\u4f5c\u7528\u7684\u95ee\u9898\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - ``exception.IPBanned`` \u4e0d\u518d\u7ee7\u627f\u81ea ``exception.SystemLoginFailed``\n \n 2.2.2 (20161128)\n ++++++++++++++++\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``interface.GetClassStudents`` \u73ed\u7ea7\u540d\u79f0\u5339\u914d\u7684\u9057\u6f0f\n - \u4fee\u590d ``log.report_response`` \u9057\u6f0f\u7684\u54cd\u5e94\u4f53\u5185\u5bb9\n - ``interface.SearchCourse`` \u5728\u6ca1\u6709\u641c\u7d22\u7ed3\u679c\u65f6\u4e0d\u518d\u7ed9\u51fa\u8b66\u544a, \u641c\u7d22\u884c\u4e3a\u672c\u6765\u5c31\u53ef\u4ee5\u6ca1\u6709\u7ed3\u679c\n \n 2.2.1 (20161127)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u73b0\u5728\u6240\u6709\u63a5\u53e3 ``parse`` \u65b9\u6cd5\u6539\u4e3a\u9759\u6001\u51fd\u6570, \u73b0\u5728\u53ef\u4ee5\u65e0\u9700\u5b9e\u4f8b\u5316\u4fbf\u53ef\u89e3\u6790\u54cd\u5e94\u4e86\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d\u7531\u4e8e Python \u9ed8\u8ba4\u503c\u9677\u9631\u5bfc\u81f4 ``interface.BaseInterface`` \u4e0b\u7684 ``send_kwarg`` , ``sextra_kwargs`` \u5728\u672a\u88ab\u91cd\u65b0\u58f0\u660e\u65f6\u6240\u6709\u5b50\u7c7b\u516c\u7528\u540c\u4e00\u4e2a\u5bf9\u8c61\u7684\u95ee\u9898\n - \u6709\u4e86\u5168\u5c40\u975e\u6cd5\u5b57\u7b26\u68c0\u67e5\u540e, \u53bb\u9664\u4e86 ``interface.EvaluateCourse`` \u5197\u4f59\u7684\u68c0\u67e5\u8fc7\u7a0b\n - \u4fee\u590d\u4e86 ``interface.BaseInterface`` \u4e2d\u7684\u6587\u6863\u9519\u8bef\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u7531\u4e8e\u6240\u6709\u63a5\u53e3 ``parse`` \u65b9\u6cd5\u6539\u4e3a\u9759\u6001\u51fd\u6570, ``interface.SetTelephone.parse`` \u7531\u539f\u6765\u8fd4\u56de\u503c\u4e3a\u662f\u5426\u4fee\u6539\u6210\u529f\u6539\u4e3a\u76f4\u63a5\u8fd4\u56de\u4fee\u6539\u540e\u7684\u7ed3\u679c(\u53ef\u80fd\u6ca1\u53d8), \u4f46 ``shortcut.Student#set_telephone`` \u7684\u884c\u4e3a\u662f\u6ca1\u6709\u53d8\u7684\n \n 2.2.0 (20161125)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u6dfb\u52a0\u4e86\u8bf7\u6c42\u53c2\u6570\u6821\u9a8c\u529f\u80fd, \u907f\u514d\u56e0\u4e3a\u9519\u8bef\u7684\u53c2\u6570\u4f7f IP \u88ab\u5c01, \u901a\u8fc7\u8bbe\u7f6e ``value.ENV['REQUEST_ARGUMENTS_CHECK']`` \u5f00\u542f\u6216\u5173\u95ed, \u9ed8\u8ba4\u662f\u5f00\u542f\u7684, \u540c\u65f6\u6ce8\u610f\u5b83\u53ea\u68c0\u67e5\u53d1\u5f80\u6559\u52a1\u7cfb\u7edf\u5730\u5740\u7684\u8bf7\u6c42\n - ``util.sort_hosts`` \u91cd\u6784\u4e3a\u901a\u7528\u7684\u6d4b\u901f\u51fd\u6570, \u73b0\u5728\u914d\u7f6e\u8bf7\u6c42\u7684\u8def\u5f84\u53ca\u5176\u4ed6\u8bf7\u6c42\u53c2\u6570, \u540c\u65f6\u73b0\u5728\u5fc5\u987b\u663e\u5f0f\u5730\u63d0\u4f9b ``hosts`` \u53c2\u6570\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``interface.GetClassStudents`` \u73ed\u7ea7\u540d\u79f0\u5339\u914d\u7684\u9057\u6f0f, \u8c03\u6574\u4e86\u5b66\u751f\u4fe1\u606f\u5339\u914d\u7684\u6b63\u5219\n - \u4fee\u590d\u4e86 ``examples/hfut_img.py``\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u66f4\u65b0\u4e86\u6587\u6863\n - \u5b8c\u5584\u6d4b\u8bd5\u7528\u4f8b\n \n 2.1.1 (20161121)\n ++++++++++++++++\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u5220\u9664 ``interface.GetClassStudents.parse`` \u9057\u7559\u7684\u8c03\u8bd5\u4fe1\u606f\n \n 2.1.0 (20161121)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u6dfb\u52a0\u4e86 ``parser.GlobalFeaturedSoup`` , \u80fd\u591f\u901a\u8fc7\u914d\u7f6e ``value.ENV['SOUP_FEATURES']`` \u5c5e\u6027\u6765\u5168\u5c40\u914d\u7f6e\u89e3\u6790\u5668, \u76ee\u524d\u5728 ``html.parser`` \u4e0e ``lxml`` \u4e0b\u8fdb\u884c\u4e86\u6d4b\u8bd5\n - \u6dfb\u52a0\u4e86 ``log.report_response`` \u7528\u6765\u751f\u6210\u54cd\u5e94\u62a5\u544a\n - \u6dfb\u52a0\u4e86 ``shortcut.BaseShortcuts.request`` , \u7528\u6765\u5206\u79bb\u63a5\u53e3\u7684\u8bf7\u6c42\u4e0e\u89e3\u6790\n - \u6709\u5173\u8bf7\u6c42\u7684\u65e5\u5fd7\u8bb0\u5f55\u4ee5\u53ca\u4f1a\u8bdd\u7c7b\u66f4\u52a0\u53cb\u597d\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d Python2 \u4e2d\u5bf9 Unicode \u5339\u914d\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u539f\u5148\u4f7f\u7528 ``bs4.BeautifulSoup`` \u89e3\u6790\u7684\u63a5\u53e3\u7edf\u4e00\u6539\u4e3a ``parser.GlobalFeaturedSoup`` \u5b50\u7c7b\n - ``HTML_PARSER`` \u91cd\u547d\u540d\u4e3a ``SOUP_FEATURES``\n - ``value`` \u6a21\u5757\u4e2d\u7684\u503c\u5168\u90e8\u6dfb\u52a0\u5230 ENV \u5b57\u5178\u4e2d\u4f7f\u5176\u53ef\u53d8\u52a8\n - ``interface.GetClassStudents`` \u4e0d\u518d\u56e0\u672a\u5339\u914d\u5230\u73ed\u7ea7\u540d\u79f0\u6216\u5b66\u671f\u62a5\u9519\n - ``util.rank_host_speed`` \u91cd\u6784\u4e3a ``util.sort_hosts`` , \u4e0d\u518d\u63a5\u53d7\u4e3b\u673a ip \u53c2\u6570, \u6539\u4e3a\u4e3b\u673a \u5730\u5740\u53c2\u6570, \u540c\u65f6\u4e0d\u518d\u5220\u9664\u9519\u8bef\u8bf7\u6c42\u5730\u5740, \u800c\u662f\u7edf\u4e00\u5c06\u8fd4\u56de\u65f6\u95f4\u8bbe\u4e3a INFINITY(10000000ms)\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u6dfb\u52a0\u4e86\u4f7f\u7528 ``lxml`` \u4f5c\u4e3a\u89e3\u6790\u5668\u7684\u6d4b\u8bd5, \u5b8c\u5584\u4e86\u5176\u4ed6\u4e00\u4e9b\u6d4b\u8bd5\u7ec6\u8282\n \n 2.0.0 (20161029)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u91cd\u6784\u4e86\u6846\u67b6\u7684\u6838\u5fc3\u90e8\u5206, \u5bf9\u539f\u5148\u7684\u63a5\u53e3\u8fdb\u884c\u4e86\u89e3\u8026, \u5b9e\u73b0\u7ec6\u8282\u66f4\u52a0\u6e05\u6670, \u73b0\u5728\u80fd\u591f\u63a7\u5236\u63a5\u53e3\u8bf7\u6c42\u7684\u8bf7\u6c42\u751f\u6210, \u54cd\u5e94\u83b7\u53d6, \u54cd\u5e94\u89e3\u6790\u7684\u8fc7\u7a0b\n - \u6dfb\u52a0\u4e86 ``parser.dict_list_2_matrix``\n - \u6dfb\u52a0\u4e86 ``util.curriculum2schedule`` \u5c06\u8bfe\u7a0b\u8868\u8f6c\u6362\u4e3a\u4e0a\u8bfe\u65f6\u95f4\u8868\n - \u6dfb\u52a0\u4e86\u5c06\u4e0a\u8bfe\u65f6\u95f4\u8868\u8f6c\u6362\u4e3a icalendar \u534f\u8bae\u6587\u4ef6\u5e76\u5bfc\u51fa\u7684\u4f8b\u5b50\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``shortcut.Student#change_course`` \u65e7\u7248\u7ed3\u679c\u9a8c\u8bc1\u65b9\u6cd5\u6ca1\u6709\u79fb\u9664\u5bfc\u81f4\u7684\u95ee\u9898\n - \u4fee\u590d ``shortcut.Student#change_course`` \u5bf9\u6559\u5b66\u73ed\u53f7\u9519\u8bef\u7684\u9a8c\u8bc1\u903b\u8f91\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u539f\u6765\u7684 ``model`` \u6a21\u5757\u4e2d\u7684\u4f1a\u8bdd\u7c7b\u62c6\u5206\u5230 ``session`` , ``interface``, ``shortcut`` \u4e09\u4e2a\u6a21\u5757, \u5177\u4f53\u6539\u53d8\u53ef\u4ee5\u9605\u8bfb\u6e90\u7801\u67e5\u770b\u6539\u52a8\n - \u539f\u5148\u4f7f\u7528 ``model.GuestSession`` , ``model.StudentSession`` \u5feb\u901f\u8c03\u7528\u63a5\u53e3\u73b0\u5728\u6539\u4e3a\u4f7f\u7528 ``shortcut.Guest`` , ``shortcut.Student`` \u5373\u53ef, \u63a5\u53e3\u8c03\u7528\u65b9\u5f0f\u4e0e\u540d\u5b57\u6ca1\u6709\u53d8\u5316, \u4f46\u662f\u8bbf\u95ee\u539f\u5148\u4f1a\u8bdd\u7684\u5c5e\u6027\u9700\u8981\u4ece\u65b0\u7c7b\u7684 ``session`` \u5c5e\u6027\u4e2d\u83b7\u5f97\n - \u5220\u9664\u4e86\u5c5e\u6027\u9a8c\u8bc1\u76f8\u5173\u7684\u51fd\u6570, \u5305\u62ec ``value.validate_attrs`` , ``session.BaseSession.validate_campus``, ``session.StudentSession.validate_account``, ``session.StudentSession.validate_password``\n - \u539f\u6765\u4f1a\u8bdd\u7c7b\u7684 ``html_parser`` , ``site_encoding`` \u8fc1\u79fb\u5230\u4e86 ``value`` \u6a21\u5757\u5e76\u6539\u4e3a ``HTML_PARSER`` , ``SITE_ENCODING``\n - \u4e00\u4e9b\u4e0d\u5408\u6cd5\u7684\u53c2\u6570\u5c06\u4e0d\u518d\u9690\u5f0f\u5730\u8fd4\u56de\u7ed3\u679c\u800c\u662f\u76f4\u63a5\u89e6\u53d1\u9519\u8bef, \u6d89\u53ca\u5230 ``shortcut.Student#change_password``, ``interface.ChangePassword``, ``interface.SetTelephone``\n - ``shortcut.Student#change_course`` : \u5f53\u9009\u8bfe\u6559\u5b66\u73ed\u53f7\u9519\u8bef, \u5220\u9664\u9519\u8bef\u7684\u8bfe\u7a0b\u65f6\u5c06\u4e0d\u518d\u89e6\u53d1\u9519\u8bef, \u800c\u662f\u5f97\u5230\u4e00\u4e2a\u8b66\u544a\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u66f4\u65b0\u6d4b\u8bd5\u7528\u4f8b\n - \u66f4\u65b0\u6587\u6863\n \n 1.4.3 (20160829)\n ++++++++++++++++\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``model.StudentSession#get_selectable_courses`` \u7531\u4e8e ``multiprocessing.dummy.Pool`` \u5728 Python 2.7 \u4e0b\u4e0d\u652f\u6301 with \u8bed\u53e5\u5bfc\u81f4\u7684\u9519\u8bef\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u4fee\u6b63\u4e86 ``model.StudentSession#change_course`` \u4e2d\u7684\u6587\u6863\u9519\u8bef\n - \u6539\u8fdb\u4e86\u6d4b\u8bd5\u811a\u672c, \u4fee\u590d\u7531\u4e8e\u6d4b\u8bd5\u811a\u672c\u6ca1\u6709\u5224\u65ad\u7a0b\u5e8f\u7ed3\u675f\u72b6\u6001\u7801\u5bfc\u81f4\u6709\u65f6\u6d4b\u8bd5\u5931\u8d25\u7ed3\u679c\u6ca1\u6709\u6355\u6349\u5230\u7684\u95ee\u9898\n \n 1.4.2 (20160828)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u4f18\u5316\u4e86 ``model.StudentSession#get_selectable_courses`` \u591a\u7ebf\u7a0b\u64cd\u4f5c\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d\u4e86 ``model.StudentSession#get_selectable_courses`` \u7531\u4e8e\u4e4b\u524d\u7248\u672c\u8fd4\u56de\u503c\u7684\u63a5\u53e3\u53d8\u52a8\u9020\u6210\u7684\u9519\u8bef\n - \u4fee\u590d\u4e86 ``model.StudentSession#change_course`` \u7531\u4e8e\u4e4b\u524d\u7248\u672c\u8fd4\u56de\u503c\u7684\u63a5\u53e3\u53d8\u52a8\u9020\u6210\u7684\u9519\u8bef\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - ``model.GuestSession#get_system_state`` -> ``model.GuestSession#get_system_status`` (\u62fc\u5199\u9519\u8bef\u8fd9\u4e48\u4e45\u7adf\u7136\u6ca1\u53d1\u73b0= =)\n - \u53bb\u9664\u4e86 ``log.unstable``\n \n 1.4.1 (20160812)\n ++++++++++++++++\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u5c06\u5f53\u63a5\u53e3\u6ca1\u6709\u89e3\u6790\u51fa\u7ed3\u679c\u65f6\u8fd4\u56de\u7684 None \u503c\u6539\u4e3a\u76f8\u5e94\u7684\u7a7a\u7684\u5bb9\u5668\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``model.GuestSession#get_class_info`` \u8fd4\u56de\u7ed3\u679c\u4e2d\u7684 ``\u5907\u6ce8`` \u5b57\u6bb5\u540d\u4e2d\u5305\u542b\u7a7a\u683c\u7684\u9519\u8bef\n - \u4fee\u590d ``model.GuestSession#get_class_students`` \u73ed\u7ea7\u540d\u79f0\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\u4e0d\u5b8c\u5168\u5bfc\u81f4\u7684\u9519\u8bef\n - \u4fee\u590d ``model.GuestSession#get_class_students`` \u5728\u6559\u5b66\u73ed\u6ca1\u6709\u5b66\u751f\u65f6\u89e6\u53d1\u9519\u8bef\u7684\u95ee\u9898\n \n 1.4.0 (20160812)\n ++++++++++++++++\n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u5305\u540d\u7531 ``hfut_stu_lib`` \u6539\u4e3a ``hfut``\n - \u5220\u9664\u4e86 ``APIResult`` , \u4f7f\u7528 ``model.BaseSession.histories`` (\u9ed8\u8ba4\u6700\u5927\u957f\u5ea6\u4e3a10\u7684\u53cc\u7aef\u961f\u5217)\u50a8\u5b58\u5386\u53f2\u54cd\u5e94\n \n **\u95ee\u9898\u4fee\u590d**\n \n - ``list`` \u672c\u8eab\u662f\u7ebf\u7a0b\u5b89\u5168\u7684, \u53bb\u9664\u4e86\u4e0d\u5fc5\u8981\u7684\u9501\n \n 1.3.3 (20160730)\n ++++++++++++++++\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d Python2 \u4e0b ``urllib.unquote`` \u4e0d\u63a5\u53d7\u7f16\u7801\u53c2\u6570\u7684\u9519\u8bef( ``model.StudentSession.login`` )\n - \u4fee\u590d Python2 \u4e0b ``list`` \u5bf9\u8c61\u7f3a\u5c11 ``copy()`` \u65b9\u6cd5\u7684\u9519\u8bef( ``util.filter_curriculum`` )\n - \u4fee\u590d\u65f6\u591a\u7ebf\u7a0b\u65f6\u91ca\u653e\u9501\u7684\u65b9\u6cd5\u540d\u62fc\u5199\u9519\u8bef\n - \u4fee\u590d ``model.StudentSession#get_selectable_courses`` \u6587\u4ef6\u540d\u91cd\u590d\u5730\u6dfb\u52a0'.json'\u540e\u7f00\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u91cd\u65b0\u914d\u7f6e\u4e86\u7ebf\u4e0a\u6301\u7eed\u96c6\u6210\u73af\u5883\n \n 1.3.2 (20160728)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u91cd\u65b0\u5b9e\u73b0\u4e86\u7c7b\u7684\u5c5e\u6027\u9a8c\u8bc1\u65b9\u5f0f, ``hfut.value.validate_attrs``\n - \u6dfb\u52a0\u4e86\u5bf9 `model.StudentSession.account`, `hfut.model.BaseSession.campus` \u7684\u9a8c\u8bc1\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - ``exception`` \u4e2d\u7684 `WrongPasswordPattern` \u6539\u4e3a\u4e86 `ValidationError`\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u66f4\u65b0\u4e86\u65b0\u7684\u5b66\u671f\u540d\u79f0\u5339\u914d\u89c4\u5219\n \n 1.3.1 (20160722)\n ++++++++++++++++\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``util.get_point`` \u5bf9\u6210\u7ee9\u6570\u636e\u5224\u65ad\u7684\u4e0d\u5b8c\u6574\u5bfc\u81f4\u7684\u9519\u8bef\n - \u4fee\u590d ``model.StudentSession.get_optional_courses`` \u5206\u7247\u9519\u8bef\u5bfc\u81f4\u603b\u662f\u7f3a\u5931\u4e00\u95e8\u8bfe\u7a0b\u7684\u9519\u8bef\n - \u4fee\u590d ``model.GuestSession.get_teaching_plan`` \u67e5\u8be2\u516c\u9009\u8bfe\u65f6\u6559\u52a1\u7cfb\u7edf\u8fd4\u56de\u5927\u91cf\u91cd\u590d\u8bfe\u7a0b\u7684\u9519\u8bef\n - \u4fee\u590d ``model.GuestSession.search_course`` \u7ed3\u679c\u6570\u636e\u683c\u5f0f\u5316\u4e0d\u5b8c\u6574\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - ``model.GuestSession.get_teaching_plan` \u67e5\u8be2\u516c\u9009\u8bfe\u65f6\u4e0d\u518d\u9700\u8981 `zydm`` \u53c2\u6570\n - \u5220\u9664\u4e86\u6240\u6709\u8fd4\u56de\u7ed3\u679c\u4e2d\u542b\u6709\u7684 `\u5e8f\u53f7` \u5b57\u6bb5\n \n 1.3.0 (20160719)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u6dfb\u52a0\u4e86 ``model.StudentSession.get_unfinished_evaluation`` \u63a5\u53e3\u7528\u6765\u67e5\u8be2\u672a\u5b8c\u6210\u7684\u8bfe\u7a0b\u8bc4\u4ef7\n - \u6dfb\u52a0\u4e86 ``model.StudentSession.evaluate_course`` \u63a5\u53e3\u7528\u6765\u8fdb\u884c\u8bfe\u7a0b\u8bc4\u4ef7\n - \u6dfb\u52a0\u4e86\u767b\u5f55\u65f6\u7684\u5bc6\u7801\u683c\u5f0f\u9a8c\u8bc1\n - \u5bc6\u7801\u683c\u5f0f\u4e0d\u6b63\u786e\u65f6\u5c06\u4f1a\u89e6\u53d1\u65b0\u589e\u7684 ``exception.WrongPasswordPattern``\n - \u8c03\u6574\u4e86\u65e5\u5fd7\u8bb0\u5f55\u683c\u5f0f\n - ``util.rank_host_speed`` \u5bf9\u5199\u64cd\u4f5c\u52a0\u9501\u907f\u514d\u7ade\u4e89\u5192\u9669\n - ``model.StudentSession.get_selectable_courses`` \u4f7f\u7528\u4e86\u591a\u7ebf\u7a0b\u8fdb\u884c\u4f18\u5316\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u53bb\u6389\u4e86 ``model.StudentSession.change_password` \u591a\u4f59\u7684 `oldpwd`,`new2pwd`` \u53c2\u6570, \u5408\u80a5\u6821\u533a\u4fee\u6539\u6559\u52a1\u5bc6\u7801\u65e0\u610f\u4e49, \u56e0\u6b64\u4e0d\u5141\u8bb8\u8c03\u7528\u6b64\u63a5\u53e3\n - ``model.StudentSession.login_session`` \u6539\u4e3a ``model.StudentSession.login`` \u5e76\u4e14\u4e0d\u518d\u6709\u8fd4\u56de\u503c, \u540c\u65f6\u4e5f\u4fee\u590d\u4e86\u4e0a\u4e2a\u7248\u672c\u9700\u8981\u4e3b\u52a8\u8c03\u7528\u7684\u95ee\u9898\n \n **\u95ee\u9898\u4fee\u590d**\n \n - ``model.StudentSession.__str__`` \u683c\u5f0f\u5316\u9519\u8bef\n - ``model.StudentSession.change_course`` \u4e2d\u9519\u8bef\u7684\u5c5e\u6027\u5f15\u7528\n - \u4fee\u590d\u7531\u4e8e\u5b58\u5728\u672a\u5b8c\u6210\u7684\u8bfe\u7a0b\u8bc4\u4ef7\u5bfc\u81f4\u63a5\u53e3\u8c03\u7528\u51fa\u9519\u7684\u95ee\u9898\n \n 1.2.2 (20160625)\n ++++++++++++++++\n \n **\u5c0f\u7684\u6539\u8fdb**\n \n - ``model.StudentSession`` \u521d\u59cb\u5316\u6210\u529f\u540e\u4f1a\u4ece cookie \u4e2d\u63d0\u53d6\u51fa\u59d3\u540d\n - \u767b\u5f55\u5931\u8d25\u65f6\u5c06\u4f1a\u89e6\u53d1\u65b0\u589e\u7684 ``exception.SystemLoginFailed``, IP\u88ab\u5c01\u4f1a\u89e6\u53d1 ``exception.IPBanned``\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - ``model.StudentSession`` \u5b9e\u4f8b\u5316\u540e\u4e0d\u4f1a\u81ea\u52a8\u767b\u5f55\uff0c\u9700\u8981\u4e3b\u52a8\u8c03\u7528 ``model.StudentSession.login_session`` \u767b\u5f55, \u8fd9\u6837\u53ef\u4ee5\u5728\u767b\u9646\u524d\u5bf9\u5b9e\u4f8b\u8fdb\u884c\u5176\u4ed6\u521d\u59cb\u5316\uff0c\u4f8b\u5982\u914d\u7f6e\u4ee3\u7406\u7b49\n \n 1.2.1 (20160511)\n ++++++++++++++++\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d\u4e86 ``model._get_curriculum`` \u5728\u6ca1\u6709\u83b7\u53d6\u5230\u8bfe\u8868\u5bfc\u81f4\u8d77\u59cb\u5468\u548c\u7ed3\u675f\u5468\u5728\u8ba1\u7b97\u65f6\u51fa\u9519\u7684\u95ee\u9898\u5e76\u76f8\u5e94\u6dfb\u52a0\u4e86\u6d4b\u8bd5\u7528\u4f8b\n \n 1.2.0 (20160510)\n ++++++++++++++++\n \n **\u5c0f\u7684\u6539\u8fdb**\n \n - \u4f18\u5316\u4e86 ``utils.filter_curriculum``, \u5f53\u8bfe\u7a0b\u51b2\u7a81\u65f6\u4f1a\u7ed9\u51fa\u8b66\u544a\n \n **\u63a5\u53e3\u6539\u53d8**\n \n - \u63a5\u53e3\u4f1a\u8bdd\u521d\u59cb\u5316\u53c2\u6570 ``is_hefei`` \u53d8\u6210\u4e86 ``campus`` ( ``value`` \u6a21\u5757\u4e2d\u7684\u6821\u533a\u4ee3\u7801 ``HF``, ``XC``) \u5e76\u4e14\u9700\u8981\u663e\u793a\u63d0\u4f9b\n - \u5220\u9664\u4e86 ``model.AuthSession`` , ``value`` \u4e2d\u7684\u7528\u6237\u7c7b\u578b\u5e38\u91cf\n - \u53bb\u9664\u4e86 ``model.APIResult`` \u4e2d\u7684\u9b54\u6cd5\u65b9\u6cd5, \u4fdd\u8bc1\u4e86\u8c03\u7528\u660e\u786e\u7684\u539f\u5219\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u7ea0\u6b63\u4e86\u9519\u8bef\u7684\u901a\u7528\u767b\u9646\u903b\u8f91\n - \u4fee\u590d\u4e86\u5408\u80a5\u6821\u533a\u767b\u9646\u7f51\u5740\u53d8\u66f4\u5bfc\u81f4\u5408\u80a5\u6821\u533a\u65e0\u6cd5\u767b\u9646\u7684\u95ee\u9898\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u8c03\u6574\u4e86\u4f8b\u5b50 ``web_curriculum.py``\n - \u76f8\u5e94\u8c03\u6574\u4e86\u6d4b\u8bd5\u7528\u4f8b\n \n 1.1.2 (20160413)\n ++++++++++++++++\n \n **\u5c0f\u7684\u6539\u8fdb**\n \n - ``model.APIResult.json`` \u652f\u6301\u4e86 `json.dumps` \u7684\u53c2\u6570\n - \u7edf\u4e00 ``model.GuestSession.get_entire_curriculum`` \u548c ``model.GuestSession.get_my_curriculum`` \u7684\u4ee3\u7801\n - ``model.GuestSession.get_entire_curriculum`` \u548c ``model.GuestSession.get_my_curriculum`` \u8fd4\u56de\u503c\u6dfb\u52a0\u4e86\u8d77\u6b62\u5468\u5b57\u6bb5\n \n **\u63a5\u53e3\u6539\u53d8**\n \n - ``parser.parse_course`` \u4e0d\u518d\u63a5\u53d7 None \u503c\u4e3a\u53c2\u6570\n \n **\u6587\u6863**\n \n - \u8865\u5145\u4f8b\u5b50\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u6dfb\u52a0\u4f8b\u5b50 ``web_curriculum.py``, \u4f7f\u7528 bottle \u7f16\u5199\u7684\u4e00\u4e2a\u7b80\u5355\u8bfe\u8868\u67e5\u770b\u9875\u9762, \u53ef\u4ee5\u7b5b\u9009\u6bcf\u5468\u7684\u8bfe\u7a0b, \u53ef\u4ee5\u5728\u624b\u673a\u4e0a\u5b89\u88c5 qpython \u5e76\u5b89\u88c5\u597d hfu_stu_lib \u540e\u5728\u624b\u673a\u4e0a\u8fd0\u884c\n \n 1.1.1 (20160330)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u6dfb\u52a0\u4e86 ``utils.filter_curriculum``, \u7b5b\u9009\u51fa\u6307\u5b9a\u661f\u671f[\u548c\u6307\u5b9a\u661f\u671f\u51e0]\u7684\u8bfe\u7a0b\n - \u6240\u6709\u63a5\u53e3\u6587\u6863\u6dfb\u52a0\u91cc ``@structure`` \u63cf\u8ff0\u6807\u8bb0\u7528\u6765\u63cf\u8ff0\u8fd4\u56de\u6570\u636e\u7684\u7ed3\u6784\u548c\u7c7b\u578b\n \n **\u5c0f\u7684\u6539\u8fdb**\n \n - \u6dfb\u52a0 ``parser.zip`` \u51fd\u6570\u4fdd\u8bc1 zip \u8fc7\u7a0b\u7684\u51c6\u786e\u6027\n - \u6dfb\u52a0 ``log.log_result_not_found`` \u8f93\u51fa\u5f53\u63a5\u53e3\u672a\u89e3\u6790\u51fa\u6570\u636e\u65f6\u7684\u65e5\u5fd7\n \n **\u63a5\u53e3\u6539\u53d8**\n \n - ``utils.get_host_speed_rank`` \u6539\u540d\u4e3a ``utils.rank_host_speed``\n - ``log.unfinished`` \u88c5\u9970\u5668\u88ab\u79fb\u9664\n - ``parser.parse_tr_strs`` \u4e0d\u518d\u63a5\u53d7\u5355\u4e2a\u7684 ``Tag`` \u5bf9\u8c61\u4f5c\u4e3a\u53c2\u6570, \u540c\u65f6\u73b0\u5728 ``td`` \u4e0b\u6709\u5b50\u6807\u7b7e\u4e5f\u4f1a\u89e3\u6790\u7ed3\u679c, \u4e0d\u518d\u62a5 ``ValueError``\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - ``__init__`` \u4e2d\u7684\u53d8\u91cf, \u8fc1\u79fb\u5230\u4e86 ``values``\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d\u4e86\u4e00\u4e9b\u63a5\u53e3\u8fd4\u56de\u6570\u636e\u5b57\u6bb5\u7c7b\u578b\u4e0e\u6574\u4f53\u5b9a\u4e49\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\n - \u4fee\u590d\u4e86\u4e00\u4e9b\u63a5\u53e3\u51fa\u73b0\u610f\u5916\u7684\u7a7a\u503c\u5bfc\u81f4 zip \u957f\u5ea6\u4e0d\u4e00\u81f4\u5bfc\u81f4\u7ed3\u679c\u51fa\u9519\u7684\u95ee\u9898\n - \u7edf\u4e00\u4e86\u8fd4\u56de\u7a7a\u503c\u7684\u884c\u4e3a\n \n **\u6587\u6863**\n \n - \u5bf9\u5e94\u5730\u66f4\u65b0\u4e86 ``\u529f\u80fd\u7279\u6027`` \u8fd9\u4e00\u90e8\u5206\n \n 1.1.0 (20160310)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u73b0\u5728\u652f\u6301\u5408\u80a5\u6821\u533a\u7684\u6559\u52a1\u7cfb\u7edf\u4e86\n \n **\u5c0f\u7684\u6539\u8fdb**\n \n - \u7b80\u5355\u7684\u4fee\u6539\u4e86\u4e00\u4e0b\u4f8b\u5b50\n \n **\u63a5\u53e3\u6539\u53d8**\n \n - \u6240\u6709\u7ee7\u627f\u81ea ``model.BaseSession`` \u7684\u7c7b\u73b0\u5728\u9700\u8981\u4e00\u4e2a ``is_hefei`` \u53c2\u6570\u6765\u786e\u5b9a\u662f\u5426\u662f\u5408\u80a5\u6821\u533a\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d ``model.StudentSession.get_selected_courses`` \u7684\u8d39\u7528\u5b57\u6bb5\u4f7f\u7528\u4e86\u9519\u8bef\u7684\u6574\u6570\u7c7b\u578b\n - \u4fee\u590d ``model.GuestSession.get_course_classes`` \u952e\u503c\u5206\u79bb\u7531\u4e8e\u7279\u6b8a\u60c5\u51b5\u5bfc\u81f4\u7684\u9519\u8bef, \u540c\u65f6\u4e5f\u5bf9\u5176\u4ed6\u65b9\u6cd5\u8fdb\u884c\u4e86\u76f8\u5e94\u7684\u4fee\u6539\u907f\u514d\u7c7b\u4f3c\u95ee\u9898\u53d1\u751f\n - \u4fee\u590d ``model.APIResult.__bool__`` \u9519\u8bef\n \n **\u6587\u6863**\n \n - \u8865\u5145\u90e8\u5206\u63a5\u53e3\u7684\u6587\u6863\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u8865\u5145\u548c\u4fee\u590d\u4e86\u6d4b\u8bd5\u7528\u4f8b\n - \u4e3a\u4e86\u4fdd\u62a4\u8d21\u732e\u8005\u9690\u79c1\u5c06\u6d4b\u8bd5\u6a21\u5757\u4ece\u7ebf\u4e0a\u4ed3\u5e93\u5220\u9664, \u5bf9\u7528\u6237\u6ca1\u6709\u4efb\u4f55\u5f71\u54cd\n \n 1.0.1 (20160308)\n ++++++++++++++++\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u5c06 ``lxml`` \u89e3\u6790\u5668\u6539\u4e3a\u5185\u7f6e\u7684 ``html.parser``, \u964d\u4f4e\u4e86\u4f7f\u7528\u95e8\u69db, \u51cf\u5c11\u4e86\u4f9d\u8d56\n \n 1.0.0 (20160307)\n ++++++++++++++++\n \n **\u529f\u80fd\u548c\u6539\u8fdb**\n \n - \u7cbe\u7b80\u4e86\u67b6\u6784,\u73b0\u5728\u63a5\u53e3\u533a\u5206\u66f4\u6e05\u6670,\u73b0\u5728\u652f\u6301\u5355\u72ec\u7684\u4f1a\u8bdd\u914d\u7f6e,\u540c\u65f6\u4e0d\u4f1a\u518d\u56e0\u52a8\u6001\u7ed1\u5b9a\u63a5\u53e3\u800c\u65e0\u6cd5\u8fdb\u884c\u4ee3\u7801\u63d0\u793a\n - \u6dfb\u52a0\u4e86 ``util.cal_term_code`` \u548c ``util.term_str2code`` \u8ba1\u7b97\u5b66\u671f\u4ee3\u7801\n - \u6dfb\u52a0\u4e86 ``model.GuestSession.get_selecting_lesson_time`` \u67e5\u8be2\u9009\u8bfe\u65f6\u95f4\n - \u6dfb\u52a0 ``get_host_speed_rank``,\u7531\u4e8e\u5ba3\u57ce\u6821\u533a\u6821\u5185\u8fd8\u6709\u591a\u4e2a\u955c\u50cf\u7ad9\u70b9,\u73b0\u5728\u63d0\u4f9b\u4e86\u6d4b\u8bd5\u5730\u5740\u901f\u5ea6\u6392\u884c\u7684\u529f\u80fd\n - \u73b0\u5728\u80fd\u591f\u81ea\u52a8\u66f4\u65b0\u4f1a\u8bdd\u4fdd\u6301\u767b\u5f55\u72b6\u6001\u4e86\n \n **\u5c0f\u7684\u6539\u8fdb**\n \n - ``change_lesson`` \u73b0\u5728\u80fd\u591f\u5224\u65ad\u5f53\u524d\u662f\u5426\u80fd\u591f\u9009\u8bfe\n - ``get_lessons_can_be_selected`` \u5bfc\u51fa\u7684\u7ed3\u679c\u73b0\u5728\u662f\u683c\u5f0f\u5316\u540e\u7684\u4e86\n - ``model.StudentSession.get_stu_timetable`` \u73b0\u5728\u8fd4\u56de\u7684\u4e0a\u8bfe\u5468\u6570\u4e3a\u5468\u6570\u5217\u8868\u4fbf\u4e8e\u5b9e\u9645\u5904\u7406\n - ``get_selected_lessons`` \u7ed3\u679c\u4e2d\u7684 ``\u8d39\u7528`` \u548c ``\u5b66\u5206`` \u4e24\u4e2a\u5b57\u6bb5\u4ece\u5b57\u7b26\u4e32\u5206\u522b\u6539\u4e3a\u4e86\u6574\u578b\u548c\u6d6e\u70b9\u578b\n - \u8c03\u6574\u4e86 ``model.GuestSession.get_teaching_plan`` \u7684\u53c2\u6570\u4f7f\u4f7f\u7528\u66f4\u52a0\u65b9\u4fbf\n - \u7edf\u4e00\u4e86 ``model.StudentSession.get_code`` \u7684\u7ed3\u679c\u952e\u503c\u4e3a\u4e2d\u6587\n - \u73b0\u5728\u767b\u5f55\u65f6\u80fd\u591f\u5224\u65ad\u662f\u5426\u662f\u715e\u7b14\u7684\u9632\u6ce8\u5165\u7cfb\u7edf\u5bfc\u81f4\u65e0\u6cd5\u767b\u9646\u5e76\u4e14\u5982\u679c\u662f\u5ba3\u57ce\u6821\u533a\u4f1a\u81ea\u52a8\u9009\u53d6\u53ef\u7528\u5730\u5740\u91cd\u65b0\u767b\u5f55\n \n \n **\u63a5\u53e3\u6539\u53d8**\n \n - \u53bb\u9664\u4e86 ``const``, ``session``, ``api``, ``api_request_builder``, ``core``\n - \u5c06\u539f\u6765\u7684 ``api`` \u4e2d\u6240\u6709\u7684\u63a5\u53e3\u6839\u636e\u8981\u6c42\u7684\u767b\u5f55\u6743\u9650\u4e0d\u540c\u5206\u522b\u8fc1\u79fb\u5230\u4e86 ``model.GuestSession`` \u548c ``model.StudentSession``\n - \u5c06\u539f\u6765\u7684 ``core`` \u4e2d\u7684 ``@unstable``, ``@unfinish`` \u8fc1\u79fb\u5230\u4e86 ``log`` \u6a21\u5757\u4e2d\n - ``const`` \u4e2d\u7684\u914d\u7f6e\u9879\u8fc1\u79fb\u5230\u4e86 ``BaseSession`` \u4e2d, \u73b0\u5728\u7684\u914d\u7f6e\u662f\u4f1a\u8bdd\u7ea7\u800c\u4e0d\u662f\u5168\u5c40\u7684,\u8fd9\u6837\u53ef\u4ee5\u65b9\u4fbf\u7684\u6839\u636e\u9700\u8981\u8fdb\u884c\u4fee\u6539\n - ``util.store_api_result`` \u8fc1\u79fb\u5230\u4e86 ``model.APIResult.store_api_result`` \u5e76\u7a0d\u5fae\u8c03\u6574\u4e86\u4e00\u4e0b\u53c2\u6570\n - \u91cd\u65b0\u547d\u540d\u4e86\u5927\u91cf\u63a5\u53e3\u4f7f\u5176\u66f4\u6613\u7406\u89e3, \u540c\u65f6\u7ea0\u6b63\u547d\u540d\u7684\u9519\u8bef, \u63a5\u53e3\u7684\u91cd\u547d\u540d\u72b6\u6001\u5982\u4e0b\n - ``get_selecting_lesson_time`` -> ``get_system_state``\n - ``search_lessons`` -> ``search_course``\n - ``get_lesson_classes`` -> ``get_course_classes``\n - ``get_stu_info`` -> ``get_my_info``\n - ``get_stu_grades`` -> ``get_my_achievements``\n - ``get_stu_timetable`` -> ``get_my_curriculum``\n - ``get_stu_feeds`` -> ``get_my_fees``\n - ``get_optional_lessons`` -> ``get_optional_courses``\n - ``get_selected_lessons`` -> ``get_selected_courses``\n - ``is_lesson_selected`` -> ``check_courses``\n - ``get_lessons_can_be_selected`` -> ``get_selectable_courses``\n \n **\u63a5\u53e3\u53d8\u52a8**\n \n - \u73b0\u5728\u767b\u5f55\u4e5f\u770b\u4f5c\u662f\u4e00\u4e2a\u63a5\u53e3,\u8fdb\u884c\u4e86\u91cd\u6784\n - \u73b0\u5728\u6240\u6709\u7684\u63a5\u53e3\u8fd4\u56de\u7684\u90fd\u662f ``model.APIResult`` \u5bf9\u8c61\n \n **\u95ee\u9898\u4fee\u590d**\n \n - \u4fee\u590d\u53d1\u9001\u767b\u5f55\u6743\u9650\u4e0d\u4e00\u81f4\u65f6\u4ecd\u4f1a\u53d1\u9001\u8bf7\u6c42\u7684\u95ee\u9898\n - \u4fee\u590d ``AuthSession`` \u521d\u59cb\u5316\u65f6\u53c2\u6570\u5224\u65ad\u903b\u8f91\u9519\u8bef\n - \u4fee\u590d ``model.APIRequest`` \u521d\u59cb\u5316\u65f6\u7ee7\u627f\u53c2\u6570\u9519\u8bef\n - \u4fee\u590d ``api.get_optional_lessons`` \u7531\u4e8e\u758f\u5ffd\u7f3a\u5c11\u4e00\u4e2a\u53c2\u6570\n - \u4fee\u590d ``model.StudentSession.get_stu_timetable`` \u4e0a\u8bfe\u5468\u6570\u5339\u914d\u60c5\u51b5\u7684\u9057\u6f0f\n - \u4fee\u590d ``model.GuestSession.search_lessons`` \u7531\u4e8e\u7f16\u7801\u95ee\u9898\u65e0\u6cd5\u4f7f\u7528\u8bfe\u7a0b\u540d\u79f0\u641c\u7d22\u7684\u95ee\u9898\n - \u4fee\u590d ``parser.parse_tr_strs`` \u89e6\u53d1\u5f02\u5e38\u65f6\u5b57\u7b26\u4e32\u683c\u5f0f\u9519\u8bef\u7684\u95ee\u9898\n \n **\u6587\u6863**\n \n - \u5728**\u9ad8\u7ea7\u6280\u5de7**\u4e00\u7ae0\u6dfb\u52a0\u4e86\u4f8b\u5b50\n \n **\u5176\u4ed6\u6742\u9879**\n \n - \u5c06\u9ed8\u8ba4\u7684\u6d4b\u8bd5\u6a21\u5757\u4ece ``unitest`` \u8fc1\u79fb\u5230\u4e86 ``pytest``\n - \u6dfb\u52a0\u5927\u91cf\u6d4b\u8bd5,Python \u7248\u672c\u8986\u76d6 2.6-3.5\n \n \n 0.5.0 (20160225)\n ++++++++++++++++\n \n - \u91cd\u6784 ``api_request_builder.GetLessonClasses``,\n \u73b0\u5728\u53ef\u4ee5\u8fd4\u56de\u8bfe\u7a0b\u5df2\u9009\u4eba\u6570, \u8bfe\u7a0b\u5bb9\u91cf, \u65f6\u95f4\u5730\u70b9\u7b49\u4fe1\u606f,\n \u540c\u65f6\u4fee\u590d\u4e86\u4e00\u4e9b\u95ee\u9898\n - \u6dfb\u52a0 ``api.get_lessons_can_be_selected``,\n \u83b7\u53d6\u53ef\u4ee5\u9009\u4e0a\u7684\u8bfe\u7a0b\u6559\u5b66\u73ed\u7ea7\n - \u5408\u5e76 ``api.select_lesson`` \u548c ``api.delete_lesson`` \u4e3a\n ``api.change_lesson`` \u5e76\u91cd\u6784\u4e86\u903b\u8f91\n - \u4fee\u6539 ``api.is_lesson_selected`` \u53c2\u6570\u7c7b\u578b\u4e3a list,\n \u907f\u514d\u4f7f\u7528\u4e2d\u91cd\u590d\u8c03\u7528\u5bfc\u81f4\u53d1\u9001\u5927\u91cf\u5197\u4f59\u7684\u8bf7\u6c42\n - \u91cd\u6784 ``parser.parse_tr_strs`` , \u73b0\u5728\u652f\u6301\u5355\u4e2a\u503c\u8f93\u5165\u8f93\u51fa\n - \u6dfb\u52a0 ``parser.dict_list_2_tuple_set``\n - \u63d0\u5347\u517c\u5bb9\u6027\n \n 0.4.2 (20160218)\n ++++++++++++++++\n \n - \u4fee\u590d\u7531\u4e8e\u914d\u7f6e\u9057\u6f0f\u5bfc\u81f4\u65e0\u6cd5\u5b89\u88c5\u7684\u95ee\u9898\n \n 0.4.1 (20160217)\n ++++++++++++++++\n \n - \u4fee\u590d\u4e00\u4e9b\u6f5c\u5728\u95ee\u9898\n - \u66f4\u65b0\u6587\u6863\n \n 0.4.0 (20160216)\n ++++++++++++++++\n \n - \u5220\u9664\u7f13\u5b58\u6a21\u5757\u53ca\u76f8\u5173\u63a5\u53e3\n - \u5206\u79bb\u4e00\u822c\u63a5\u53e3\u4e0e\u8bf7\u6c42\u63a5\u53e3, \u53bb\u9664\u4e86 ``g`` \u5bf9\u8c61, \u53ea\u4f7f\u7528\u5217\u8868 ``all_api``\n \u4fdd\u5b58\u6ce8\u518c\u7684\u4e00\u822c\u63a5\u53e3\n - \u5c06 ``AuthSession.catch_response`` \u5220\u9664, \u6539\u7528\n ``AuthSession.api_request``\n - \u65b0\u589e\u4e86 ``model`` \u6a21\u5757, \u5305\u542b ``model.APIRequestBuilder``,\n ``model.APIRequest``, ``model.APIResult`` \u4e09\u4e2a\u7c7b\n - api \u6a21\u5757\u5408\u5e76\u4e3a\u5355\u4e2a\u6587\u4ef6, \u6dfb\u52a0\u4e86\u8bf7\u6c42\u751f\u6210\u4e0e\u54cd\u5e94\u5904\u7406\u7684\n ``api_request_builder`` \u6a21\u5757\n - \u65b0\u7684\u67b6\u6784\u907f\u514d\u4e86 ``api`` \u6ce8\u518c\u5197\u4f59\u4ee5\u53ca ``api`` \u4e0e ``session``\n \u7684\u4ea4\u53c9\u8c03\u7528, \u7b80\u5316\u6a21\u578b, \u589e\u52a0\u4e86\u7075\u6d3b\u6027, \u5e76\u4e14\u4e0d\u6539\u53d8\u4e4b\u524d\u4f7f\u7528 session\n \u8c03\u7528\u63a5\u53e3\u7684\u65b9\u5f0f\n - \u4fee\u6539\u4e86 ``api.get_stu_info`` \u4e2d\u7167\u7247\u5730\u5740\u7684\u751f\u6210\u65b9\u5f0f\n \n 0.3.5 (20160208)\n ++++++++++++++++\n \n - \u4fee\u590d ``session.AuthSession`` \u521d\u59cb\u5316\u65f6\u7684\u903b\u8f91\u9519\u8bef\n - \u4fee\u6539\u7f13\u5b58 md5 \u8ba1\u7b97\u65b9\u5f0f\n - \u517c\u5bb9 Python 3.X\n \n 0.3.4 (20151030)\n ++++++++++++++++\n \n - \u6dfb\u52a0 MANIFEST.in\n - \u63d0\u4ea4\u5230\u4e86\u5b98\u65b9\u4ed3\u5e93\n \n 0.3.3 (20151030)\n ++++++++++++++++\n \n - \u4fee\u590d setup.py \u914d\u7f6e\u4e2d\u7684\u4e00\u5904\u9519\u8bef\n - \u63d0\u4ea4\u5230\u4e86\u5b98\u65b9\u4ed3\u5e93\n \n 0.3.2 (20151030)\n ++++++++++++++++\n \n - \u4fee\u6539\u6301\u7eed\u96c6\u6210\u901a\u77e5\n - \u4fee\u590d anydbm \u5728\u4e0d\u540c\u73af\u5883\u4e0b\u89e6\u53d1\u7684 AttributeError: get\n \n 0.3.1 (20151030)\n ++++++++++++++++\n \n - \u4fee\u590d\u63a5\u53e3\u6ce8\u518c\u524d\u540e\u7684\u53c2\u6570\u5dee\u5f02\u5bfc\u81f4 ``cal_cache_md5``\n \u8ba1\u7b97\u7ed3\u679c\u4e0d\u6b63\u786e\u7684\u95ee\u9898\n - \u6dfb\u52a0\u4e86\u66f4\u591a\u7684\u6d4b\u8bd5\u7528\u4f8b\n \n 0.3.0 (20151029)\n ++++++++++++++++\n \n - \u4fee\u6539 ``regist_api`` \u4e3a ``register_api``\n - \u9ed8\u8ba4\u5728\u5b89\u88c5uniout\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528\u5176\u8f93\u51faunicode\u5185\u5bb9\u65b9\u4fbf\u4f7f\u7528\n - \u6539\u7528\u5143\u7c7b\u6765\u7ed1\u5b9a\u63a5\u53e3, \u63d0\u5347\u58f0\u660e\u5bf9\u8c61\u65f6\u7684\u6548\u7387\n - \u9884\u5b9a\u4e49\u4e86\u7528\u6237\u7c7b\u578b, ``user_type`` \u53c2\u6570\u4f7f\u7528\u9884\u5b9a\u4e49\u53d8\u91cf\n - ``cal_gpa`` \u7cbe\u5ea6\u6539\u4e3a5\u4f4d\u5c0f\u6570, \u4e0e\u5b66\u6821\u4e00\u81f4\n - \u6dfb\u52a0\u7f13\u5b58\u529f\u80fd, \u4f60\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e2a\u5168\u5c40\u7684\u7f13\u5b58\u7ba1\u7406\u5bf9\u8c61\u7ba1\u7406\u7f13\u5b58\u4e86,\n \u6a21\u5757\u5185\u7f6e\u4e86 ``MemoryCache`` \u548c ``FileCache``, \u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u7ee7\u627f\n ``BaseCache`` \u7f16\u5199\u65b0\u7684\u7f13\u5b58\u7ba1\u7406\u5bf9\u8c61, \u6a21\u5757\u4f1a\u81ea\u52a8\u5e2e\u4f60\u6ce8\u518c\n \n 0.2.0 (20151025)\n ++++++++++++++++\n \n - \u8c03\u6574\u4e86\u6a21\u5757\u7ed3\u6784\n - \u5206\u79bb\u4e86 ``session`` \u4e0e \u63a5\u53e3, \u901a\u8fc7\u4e00\u4e2a\u7edf\u4e00\u7684 ``AuthSession``\n \u81ea\u52a8\u7ed1\u5b9a\u63a5\u53e3, \u53c2\u6570\u539f\u6765 ``StuLib`` \u63a5\u53e3\u53c2\u6570\u76f8\u540c\n - \u533a\u5206\u4e86\u7528\u6237\u7c7b\u578b, AuthSession \u5373\u4f7f\u6ca1\u6709\u767b\u5f55\u4e5f\u80fd\u8bbf\u95ee\u516c\u5171\u63a5\u53e3\u4e86\n - \u6dfb\u52a0\u4e86 ``regist_api`` ,\n \u73b0\u5728\u4f60\u53ef\u4ee5\u5728\u4e0d\u4fee\u6539\u6a21\u5757\u4ee3\u7801\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u81ea\u5df1\u7684\u63a5\u53e3\u4e86\n \n 0.1.3 (20150912)\n ++++++++++++++++\n \n - \u4fee\u590d\u56e0 ``StuLib`` \u521d\u59cb\u5316\u65f6\u672a\u5bf9 ``stu_id`` \u8fdb\u884c\u7c7b\u578b\u8f6c\u6362\u800c\u5bfc\u81f4\n ``StuLib.get_stu_info`` \u51fa\u9519\u7684\u95ee\u9898\n \n 0.1.2 (20150912)\n ++++++++++++++++\n \n - \u4fee\u590d\u5b89\u88c5\u65f6 README.md \u7f3a\u5931\u7684\u95ee\u9898\n \n 0.1.1 (20150912)\n ++++++++++++++++\n \n - \u6dfb\u52a0\u4e86\u4e00\u4e9b\u5355\u5143\u6d4b\u8bd5\n \n 0.1.0 (20150911)\n ++++++++++++++++\n \n - \u89e3\u51b3 ``requests`` \u4e0d\u80fd\u5bf9 GBK \u8f6c UTF8 \u65e0\u635f\u8f6c\u6362\u7684\u95ee\u9898\n - \u6dfb\u52a0 ``StuLib.catch_response`` , \u62bd\u8c61\u4e86\u54cd\u5e94\u7684\u83b7\u53d6,\n \u63d0\u5347\u4e86\u4ee3\u7801\u7684\u53ef\u7ef4\u62a4\u6027\n \n 0.0.4 (20150910)\n ++++++++++++++++\n \n - \u4fee\u590d\u4e86 ``StuLib.get_class_student``\n \u4e2d\u7531\u4e8e\u6559\u52a1\u7f51\u9875\u4ee3\u7801\u4e25\u91cd\u7684\u9519\u8bef\u5bfc\u81f4\u9875\u9762\u65e0\u6cd5\u89e3\u6790\u800c\u4e0d\u53ef\u7528\u7684\u95ee\u9898\n - \u6dfb\u52a0\u4e86 ``StuLib.get_class_student`` \u7684\u6d4b\u8bd5\u7528\u4f8b\n - \u7531\u4e8e ``requests`` \u8fd4\u56de\u7684\u7684\u7f51\u9875\u65e0\u6cd5\u505a\u5230\u65e0\u635f\u8f6c\u7801, \u5c06\u4f20\u9012\n ``BeautifulSoup`` \u7684\u6587\u6863\u6539\u4e3a\u539f\u59cb\u7f16\u7801\u6587\u6863,\u5c06\u8f6c\u7801\u5de5\u4f5c\u4ea4\u7ed9\n ``BeautifulSoup`` \u5904\u7406, \u4f46\u7528\u5230\u6b63\u5219\u5339\u914d\u7684\u65b9\u6cd5\u8fd8\u5b58\u5728\u6b64\u95ee\u9898\n \n 0.0.3 (20150909)\n ++++++++++++++++\n \n - \u7edf\u4e00\u5c06\u8fd4\u56de\u7684\u8bfe\u7a0b\u4ee3\u7801\u8fdb\u884c\u5927\u5199\u8f6c\u6362,\n \u907f\u514d\u56e0\u5b66\u6821\u8bfe\u7a0b\u4ee3\u7801\u5927\u5c0f\u5199\u7684\u4e0d\u7edf\u4e00\u4ea7\u751f\u4e0d\u53ef\u9884\u6599\u7684\u95ee\u9898\n - \u91cd\u6784\u4e86 ``StuLib.select_lesson`` , \u73b0\u5728\u652f\u6301\u66f4\u597d\u5730\u6279\u91cf\u9009\u8bfe\u4ee5\u53ca\u66f4\u597d\u5730\u7ed3\u679c\u5904\u7406\u8fc7\u7a0b\n - \u91cd\u6784\u4e86 ``StuLib.delete_lesson`` , \u73b0\u5728\u652f\u6301\u6279\u91cf\u5220\u8bfe\u4ee5\u53ca\u66f4\u597d\u5730\u7ed3\u679c\u5904\u7406\u8fc7\u7a0b\n \n 0.0.2 (20150903)\n ++++++++++++++++\n \n - \u91cd\u6784\u4e86 ``StuLib.select_lesson`` \u7684\u53c2\u6570\u5904\u7406\u8fc7\u7a0b,\n \u7531\u4e8e\u7b2c\u4e8c\u6b21\u9009\u8bfe\u7ed3\u675f\u6682\u65f6\u6ca1\u6709\u5b8c\u6210\u5bf9\u63d0\u4ea4\u7ed3\u679c\u7684\u5904\u7406\n - \u6dfb\u52a0 Travis IC \u6301\u7eed\u96c6\u6210\u5de5\u5177\n \n 0.0.1 (20150902)\n ++++++++++++++++\n \n - \u4fee\u590d ``StuLib.get_class_info`` \u51fa\u9519\n - \u6dfb\u52a0 \u6559\u5e08\u4fe1\u606f\u67e5\u8be2 ``StuLib.get_teacher_info`` \u529f\u80fd\n - \u5c06 ``StuLib.get_url`` \u7684 ``code`` \u4fee\u6539\u4e3a\u5bf9\u5e94\u7684\u65b9\u6cd5\u540d\u79f0\n - \u4fee\u590d ``StuLib.change_password`` \u6b63\u5219\u5339\u914d\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\n - \u4fee\u590d ``StuLib.set_telephone`` \u6b63\u5219\u5339\u914d\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\n - \u6dfb\u52a0\u90e8\u5206\u5355\u5143\u6d4b\u8bd5\n - \u8c03\u6574\u4e86\u5305\u7684\u7ed3\u6784\n \nKeywords: hfut,edu,student,interface\nPlatform: any\nClassifier: Development Status :: 5 - Production/Stable\nClassifier: Intended Audience :: Developers\nClassifier: Topic :: Software Development :: SDK\nClassifier: License :: OSI Approved :: MIT License\nClassifier: Programming Language :: Python :: 2\nClassifier: Programming Language :: Python :: 2.7\nClassifier: Programming Language :: Python :: 3\nClassifier: Programming Language :: Python :: 3.3\nClassifier: Programming Language :: Python :: 3.4\nClassifier: Programming Language :: Python :: 3.5\n", "description_content_type": null, "docs_url": "https://pythonhosted.org/hfut/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "hfut", "package_url": "https://pypi.org/project/hfut/", "platform": "", "project_url": "https://pypi.org/project/hfut/", "project_urls": null, "release_url": "https://pypi.org/project/hfut/2.2.3/", "requires_dist": [ "beautifulsoup4 (>=4.5.0)", "requests (>=2.10.0)", "six (>=1.10.0)", "icalendar (>=3.10); extra == 'ical'" ], "requires_python": "", "summary": "", "version": "2.2.3" }, "last_serial": 3802804, "releases": { "1.4.1": [ { "comment_text": "", "digests": { "md5": "34be97a6fd0945017162166289ffd47f", "sha256": "be866ed76e5c94072c8774d4d043f1c5578e751270fb6cd4969d61a8d34e7c5e" }, "downloads": -1, "filename": "hfut-1.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "34be97a6fd0945017162166289ffd47f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41277, "upload_time": "2016-08-19T15:28:55", "url": "https://files.pythonhosted.org/packages/48/e4/16db2a48937236b91b8396da752ac12f671e2d7b6dd635a4d0ea93197d62/hfut-1.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "30741d9c27b45f882c0d054200de25e9", "sha256": "d810e7b74ea4d7ff1610727225d730912e2b579fc6d930cb623c6731ef3d9dee" }, "downloads": -1, "filename": "hfut-1.4.1.tar.gz", "has_sig": false, "md5_digest": "30741d9c27b45f882c0d054200de25e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39571, "upload_time": "2016-08-19T15:28:59", "url": "https://files.pythonhosted.org/packages/3a/c7/f22d1889cba8fd8af6e3faf7d593703bd105a63eb02f961ef05340f87332/hfut-1.4.1.tar.gz" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "5f43c989eb3ed243e0fb012ed2d5ce90", "sha256": "9087bcd00428462c943fc7e3d4068b90b1dc666a3373c18ed81e6b9857751b0c" }, "downloads": -1, "filename": "hfut-1.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5f43c989eb3ed243e0fb012ed2d5ce90", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41397, "upload_time": "2016-08-28T14:47:21", "url": "https://files.pythonhosted.org/packages/12/a4/413fdd1a55b931c8f85af8f3a9e6a9892e55908b1b3e02c7376851ad6ae3/hfut-1.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "352d9382c387a5ab3baa2146a74a6639", "sha256": "9adf0609c5be8feb5d4bb6e88b56467e6f19a9401240aa71bfd9103873036515" }, "downloads": -1, "filename": "hfut-1.4.2.tar.gz", "has_sig": false, "md5_digest": "352d9382c387a5ab3baa2146a74a6639", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40796, "upload_time": "2016-08-28T14:47:23", "url": "https://files.pythonhosted.org/packages/fe/0f/b424e079c230216734debc031f0ca5eed31b12c1a97c900e555ba2c5314d/hfut-1.4.2.tar.gz" } ], "1.4.3": [ { "comment_text": "", "digests": { "md5": "369d8608a3beb872074e1c75f021ce61", "sha256": "45c74cc387e04f8c6fdb1b34e2719aca6066cb4e198f313586b05606cce3c1ca" }, "downloads": -1, "filename": "hfut-1.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "369d8608a3beb872074e1c75f021ce61", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 42221, "upload_time": "2016-08-28T18:26:32", "url": "https://files.pythonhosted.org/packages/e3/db/bf946725931df431dcb9c7a37a836622f81ab5b84c8edb58f70bce8c97e1/hfut-1.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c0c108e2aece141f94a28ad7dfa0205f", "sha256": "20d9356b1ad93a5cb36b75b70b37dbba5e183ade01dd310ecd353d4d3e2066a2" }, "downloads": -1, "filename": "hfut-1.4.3.tar.gz", "has_sig": false, "md5_digest": "c0c108e2aece141f94a28ad7dfa0205f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39226, "upload_time": "2016-08-28T18:26:37", "url": "https://files.pythonhosted.org/packages/24/c4/7d2eb8539ba53d9e1e7a0a464e41a2e8a8a6caef96a8aeffbb64dfab5772/hfut-1.4.3.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "d6ca59c75b06e9f11bafe9a5b7028aba", "sha256": "e65d71d6806906902a98652ae0430cb112242c47b4a956c60829920a41ce1c0d" }, "downloads": -1, "filename": "hfut-2.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6ca59c75b06e9f11bafe9a5b7028aba", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 46786, "upload_time": "2016-10-29T07:49:55", "url": "https://files.pythonhosted.org/packages/41/bc/b46d8a258a2a581319e8f5c09d45249401c38e3a76c564aa1c5fc259fc42/hfut-2.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "08f14ca4ee0befdeb7b5b5ba20639b4f", "sha256": "da90da7de19199c4582e86412d04d7c51bd3c4e5ffbcb9dfbe1b2aba94255a05" }, "downloads": -1, "filename": "hfut-2.0.0.tar.gz", "has_sig": false, "md5_digest": "08f14ca4ee0befdeb7b5b5ba20639b4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46828, "upload_time": "2016-10-29T07:49:58", "url": "https://files.pythonhosted.org/packages/c3/fe/271d7c18a10777085349b236ab146d249b6dafb990b68d8594ab0fe379d7/hfut-2.0.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "0a8b86430e7ea7459c87a4bfe0979f3c", "sha256": "27c18a5f7006d80400326a3cb350c6082f44144e7dbf5026ce941a5184722770" }, "downloads": -1, "filename": "hfut-2.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0a8b86430e7ea7459c87a4bfe0979f3c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 49513, "upload_time": "2016-11-21T13:44:07", "url": "https://files.pythonhosted.org/packages/e3/20/9b56b54a92aefff9be095f13644209002d8f8bd88882363358b6ef5c4df3/hfut-2.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b00a560d3cba6533bf9ec2326ce3dd82", "sha256": "34bfaaf20bc4030d133c844cd4d542b79bc8040fa9d6b83ec301053d3f4e0d8f" }, "downloads": -1, "filename": "hfut-2.1.1.tar.gz", "has_sig": false, "md5_digest": "b00a560d3cba6533bf9ec2326ce3dd82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51299, "upload_time": "2016-11-21T13:44:11", "url": "https://files.pythonhosted.org/packages/01/39/7968254549b0bc8a144313a0fbf42f037beed7ef79d9b7751da18daaf521/hfut-2.1.1.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "94485b4c0a7bbda89b14f5f4d6d4c015", "sha256": "5a2ae77b63086a930f264c5ff46dbffd257e5ec6f7ff7108559ba5aa91d891ff" }, "downloads": -1, "filename": "hfut-2.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "94485b4c0a7bbda89b14f5f4d6d4c015", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 50792, "upload_time": "2016-11-25T16:34:25", "url": "https://files.pythonhosted.org/packages/61/00/b30b2a7021bd84934797b702fa232d38d0ca6f8c65b262d1ed75f8d08bb4/hfut-2.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "19cdaf2cf66741e1f485786f048fe683", "sha256": "c301081c067359459a45d7f00d3aba9b8521c72aaf8ff9580f88c5964819ea66" }, "downloads": -1, "filename": "hfut-2.2.0.tar.gz", "has_sig": false, "md5_digest": "19cdaf2cf66741e1f485786f048fe683", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50891, "upload_time": "2016-11-25T16:34:27", "url": "https://files.pythonhosted.org/packages/2b/9f/1ad9740ba88952a668a85b944954826e8213f1849df39bae706bd1fb5b4b/hfut-2.2.0.tar.gz" } ], "2.2.1": [ { "comment_text": "", "digests": { "md5": "16d4185492f64d61191632a680382ce2", "sha256": "33292d83d8f80e2d8985840dbeb9dad215676a19ba387404b66e98b5b0c79905" }, "downloads": -1, "filename": "hfut-2.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "16d4185492f64d61191632a680382ce2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 51351, "upload_time": "2016-11-27T01:59:35", "url": "https://files.pythonhosted.org/packages/77/b3/2b705c779a71c613bffd9e412cb921e99f3de76b47f9b7651da7d3a03ed4/hfut-2.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea24f1d558d55995e5e2ca8e4b7c255a", "sha256": "e2353ed6aba014d648d96213dd3eb052ea9b8b99ddc0274ced1426f15c71dbee" }, "downloads": -1, "filename": "hfut-2.2.1.tar.gz", "has_sig": false, "md5_digest": "ea24f1d558d55995e5e2ca8e4b7c255a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53629, "upload_time": "2016-11-27T01:59:37", "url": "https://files.pythonhosted.org/packages/07/dc/2b68a75b0dac1af5e9821d309158b9482a0e59f7e9b2187e887abc103601/hfut-2.2.1.tar.gz" } ], "2.2.2": [ { "comment_text": "", "digests": { "md5": "376a4464c5b1ea4afe6e55adc2dbf3bd", "sha256": "fdabc76f936cbfe6b15fd78173c6e923cc24846236e633ad13f02819bafa5fb1" }, "downloads": -1, "filename": "hfut-2.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "376a4464c5b1ea4afe6e55adc2dbf3bd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 51488, "upload_time": "2016-11-27T17:23:27", "url": "https://files.pythonhosted.org/packages/99/86/f2e691038190c7616cd7e38366210077cfd797357ba38db5033fa7c2d53c/hfut-2.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "41874bcbfdbba74def93394595fe5178", "sha256": "69f88bd662837123edf3c0bdb51e3c6951adc93d621e40aca0058389e0108f76" }, "downloads": -1, "filename": "hfut-2.2.2.tar.gz", "has_sig": false, "md5_digest": "41874bcbfdbba74def93394595fe5178", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51902, "upload_time": "2016-11-27T17:23:29", "url": "https://files.pythonhosted.org/packages/ef/37/c9a25cb3684b355c9ae7a4d2a324fa82bab3a193f75e28b4a21411f1bf55/hfut-2.2.2.tar.gz" } ], "2.2.3": [ { "comment_text": "", "digests": { "md5": "9abc795bef9e73fe8300238abff23e30", "sha256": "ba666b0411e7cebbfa66c87bc74fed67f7d02ce7107d3a84f5913cce79f16cbb" }, "downloads": -1, "filename": "hfut-2.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9abc795bef9e73fe8300238abff23e30", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 52897, "upload_time": "2016-11-28T15:16:41", "url": "https://files.pythonhosted.org/packages/75/0a/bbf77da222e51f8b3e97b87d409dd45f8dc6957dc1bc9dc26c8b5aaec0e5/hfut-2.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f9a0e433e61bba814e2488854d4a43de", "sha256": "cd60521372747cb7bacd7894f78d61ecc980f33d82909d338836b92e43342658" }, "downloads": -1, "filename": "hfut-2.2.3.tar.gz", "has_sig": false, "md5_digest": "f9a0e433e61bba814e2488854d4a43de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55403, "upload_time": "2016-11-28T15:16:49", "url": "https://files.pythonhosted.org/packages/bb/07/364bac07629bea4f418cb089d4482f330d8b55da380b97d4acd24b39ccdc/hfut-2.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9abc795bef9e73fe8300238abff23e30", "sha256": "ba666b0411e7cebbfa66c87bc74fed67f7d02ce7107d3a84f5913cce79f16cbb" }, "downloads": -1, "filename": "hfut-2.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9abc795bef9e73fe8300238abff23e30", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 52897, "upload_time": "2016-11-28T15:16:41", "url": "https://files.pythonhosted.org/packages/75/0a/bbf77da222e51f8b3e97b87d409dd45f8dc6957dc1bc9dc26c8b5aaec0e5/hfut-2.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f9a0e433e61bba814e2488854d4a43de", "sha256": "cd60521372747cb7bacd7894f78d61ecc980f33d82909d338836b92e43342658" }, "downloads": -1, "filename": "hfut-2.2.3.tar.gz", "has_sig": false, "md5_digest": "f9a0e433e61bba814e2488854d4a43de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55403, "upload_time": "2016-11-28T15:16:49", "url": "https://files.pythonhosted.org/packages/bb/07/364bac07629bea4f418cb089d4482f330d8b55da380b97d4acd24b39ccdc/hfut-2.2.3.tar.gz" } ] }