{ "info": { "author": "liuhui", "author_email": "1318633361@qq.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# \u63a5\u53e3\u65ad\u8a00\u5f15\u5165\u5951\u7ea6\u6821\u9a8c\n## \u4e00.\u80cc\u666f\n\u516c\u53f8\u524d\u7aef\u5410\u69fd\u540e\u53f0\u63a5\u53e3\u6709\u65f6\u4f1a\u66f4\u6539\u8fd4\u56de\u7684\u6570\u636e\u7ed3\u6784\uff0c\u8fd4\u56de\u7684\u5b57\u6bb5\u540d\u4e0e\u5b57\u6bb5\u7c7b\u578b\u4e0e\u63a5\u53e3\u6587\u6863\u4e0d\u4e00\u81f4\uff0c\u5e0c\u671b\u6709\u4e00\u4e2a\u5feb\u901f\u68c0\u6d4b\u63a5\u53e3\u8fd4\u56de\u6570\u636e\u7684\u6240\u6709\u5b57\u6bb5\u540d\u4e0e\u5b57\u6bb5\u7c7b\u578b\u7684\u65b9\u6cd5 \n\n\u4ee5\u4e0b\u65b9\u6570\u636e\u4e3a\u4f8b\uff0c\u8981\u6821\u9a8cdata\u6570\u7ec4\u4e2ddict\u7ed3\u6784\u4e2d\u7684\u5b57\u6bb5\u540d\u4e0e\u5b57\u6bb5\u7c7b\u578b\uff0c\u53ef\u4ee5\u5199\u811a\u672c\u904d\u5386\u6570\u636e\uff0c\u4f46\u662f\u7531\u4e8e\u6bcf\u4e2a\u63a5\u53e3\u8fd4\u56de\u7684\u6570\u636e\u7ed3\u6784\u53ef\u80fd\u4e0d\u4e00\u81f4\uff0c\u53ef\u80fd\u9700\u8981\u9488\u5bf9\u6bcf\u4e2a\u63a5\u53e3\u505a\u4e0d\u540c\u7684\u903b\u8f91\uff0c\u6240\u4ee5\u9700\u8981\u4e00\u4e2a\u6bd4\u8f83\u901a\u7528\u7684\u6821\u9a8c\u65b9\u6cd5\n```python\n{\n\t\"msg\": \"success\",\n\t\"code\": 0,\n\t\"data\": [{\n\t\t\t\"type_id\": 249,\n\t\t\t\"name\": \"\u738b\u8005\u8363\u8000\",\n\t\t\t\"order_index\": 1,\n\t\t\t\"status\": 1,\n\t\t\t\"subtitle\": \" \",\n\t\t\t\"game_name\": \"\u738b\u8005\u8363\u8000\"\n\t\t}, {\n\t\t\t\"type_id\": 250,\n\t\t\t\"name\": \"\u7edd\u5730\u6c42\u751f\",\n\t\t\t\"order_index\": 2,\n\t\t\t\"status\": 1,\n\t\t\t\"subtitle\": \" \",\n\t\t\t\"game_name\": \"\u7edd\u5730\u6c42\u751f\"\n\t\t}, {\n\t\t\t\"type_id\": 251,\n\t\t\t\"name\": \"\u523a\u6fc0\u6218\u573a\",\n\t\t\t\"order_index\": 3,\n\t\t\t\"status\": 1,\n\t\t\t\"subtitle\": \" \",\n\t\t\t\"game_name\": \"\u523a\u6fc0\u6218\u573a\"\n\t\t}\n\t]\n}\n\n```\n\n\u5728\u7814\u7a76\u4e86[\u5951\u7ea6\u6d4b\u8bd5](https://www.pact.net.cn/documentation/what_is_pact.html)\u540e\uff0c\u62bd\u53d6[pact-python](https://github.com/pact-foundation/pact-python)\u90e8\u5206\u4ee3\u7801\uff0c\u5b9e\u73b0\uff1a\u81ea\u5b9a\u4e49\u63a5\u53e3\u8fd4\u56de\u6570\u636e\u683c\u5f0f(\u3010\u5951\u7ea6\u5b9a\u4e49\u3011)-\u5b9e\u9645\u54cd\u5e94\u6570\u636e\u683c\u5f0f\u6821\u9a8c(\u3010\u5951\u7ea6\u6821\u9a8c\u3011)\u7684\u529f\u80fd\n\n\u5907\u6ce8\uff1a\u8fd9\u91cc\u7684\u3010\u5951\u7ea6\u3011\u7b49\u540c\u4e8e\u63a5\u53e3\u54cd\u5e94\u6570\u636e\u7ed3\u6784 \n\n-------------\n## \u4e8c.\u6821\u9a8c\u539f\u5219\n\n>1.\u5b9e\u9645\u8fd4\u56de\u5b57\u6bb5\u8981**\u4e25\u683c\u7b49\u4e8e**\u6216\u8005**\u542b\u5951\u7ea6\u5b9a\u4e49\u5b57\u6bb5**(\u6839\u636e\u4e0d\u540c\u5339\u914d\u6a21\u5f0f\u6765\u786e\u5b9a) \n>2.\u5b57\u6bb5\u503c\u53ef\u4ee5\u503c\u76f8\u7b49\u6216\u7c7b\u578b\u76f8\u7b49 \n\n\u76ee\u6807\uff1a\u5bf9\u8fd4\u56de\u6570\u636e\u8fdb\u884c**\u5168\u91cf(\u5b57\u6bb5\u540d-\u503c/\u7c7b\u578b)** \u6821\u9a8c \n\n-------------\n\n## \u4e09.\u57fa\u672c\u4f7f\u7528\n### \u793a\u4f8b\uff1a\n```python\nfrom pactverify.matchers import Matcher, Like, EachLike, Enum, Term, PactVerify\n\n# \u5b9a\u4e49\u5951\u7ea6\u683c\u5f0f\nexpect_format = Matcher({\n 'code': 0, # code key\u5b58\u5728,\u503c\u76f8\u7b49,code==0\n 'msg': 'success', # msg key\u5b58\u5728,\u503c\u76f8\u7b49,msg=='success'\n # [{}]\u7ed3\u6784\n 'data': EachLike({\n \"type_id\": 249, # type_id key\u5b58\u5728,\u503c\u7c7b\u578b\u76f8\u7b49,type(type_id) == type(249)\n \"name\": \"\u738b\u8005\u8363\u8000\", # name key\u5b58\u5728,\u503c\u7c7b\u578b\u76f8\u7b49,type(name) == type(\"\u738b\u8005\u8363\u8000\")\n }),\n 'type': Enum([11,22]),\n 'list': EachLike(11,minimum=2)\n})\n\n# \u5b9e\u9645\u8fd4\u56de\u6570\u636e\nactual_data = {\n \"msg\": \"success\",\n \"code\": 1,\n 'type': 12,\n \"data\": [{\n # type_id\u7c7b\u578b\u4e0d\u5339\u914d\n \"type_id\": '249',\n \"name\": \"\u738b\u8005\u8363\u8000\"\n }, {\n # \u7f3a\u5c11name\n \"type_id\": 250,\n }, {\n # \u6bd4\u5951\u7ea6\u5b9a\u4e49\u591aindex\u5b57\u6bb5\n \"type_id\": 251,\n \"name\": \"\u523a\u6fc0\u6218\u573a\",\n \"index\": 111\n }\n ],\n 'list': [11]\n}\n# hard_mode\u9ed8\u8ba4\u4e3atrue,hard_mode = True\u65f6,\u5b9e\u9645\u8fd4\u56dekey\u5fc5\u987b\u4e25\u683c\u7b49\u4e8e\u9884\u671fkey;hard_mode = False\u65f6,\u5b9e\u9645\u8fd4\u56dekey\u5305\u542b\u9884\u671fkey\u5373\u53ef\nmPactVerify = PactVerify(expect_format, hard_mode=True)\n# \u6821\u9a8c\u5b9e\u9645\u8fd4\u56de\u6570\u636e\nmPactVerify.verify(actual_data)\n# \u6821\u9a8c\u7ed3\u679c False\nprint(mPactVerify.verify_result)\n''' \u6821\u9a8c\u9519\u8bef\u4fe1\u606f\n\u9519\u8bef\u4fe1\u606f\u8f93\u51faactual_key\u8def\u5f84\uff1aroot.data.0.name\u5f62\u5f0f\nroot\u4e3a\u6839\u76ee\u5f55,dict\u7c7b\u578b\u62fc\u63a5key,list\u7c7b\u578b\u62fc\u63a5\u6570\u7ec4\u4e0b\u6807(\u4ece0\u5f00\u59cb)\n{ \n # \u5b9e\u9645key\u5c11\u4e8e\u9884\u671fkey\u9519\u8bef\n\t'key_less_than_expect_error': ['root.data.1.name'],\n\t# \u5b9e\u9645key\u591a\u4e0e\u9884\u671fkey\u9519\u8bef,\u53ea\u5728hard_mode = True\u65f6\u624d\u62a5\u8be5\u9519\u8bef\n\t'key_more_than_expect_error': ['root.data.2.index'],\n\t# \u503c\u4e0d\u5339\u914d\u9519\u8bef\n\t'value_not_match_error': [{\n\t\t\t'actual_key': 'root.code',\n\t\t\t'actual_value': 1,\n\t\t\t'expect_value': 0\n\t\t}\n\t],\n\t# \u7c7b\u578b\u4e0d\u5339\u914d\u9519\u8bef\n\t'type_not_match_error': [{\n\t\t\t'actual_key': 'root.data.0.type_id',\n\t\t\t'actual_vaule': '249',\n\t\t\t'expect_type': 'int'\n\t\t}\n\t],\n\t# \u6570\u7ec4\u957f\u5ea6\u4e0d\u5339\u914d\u9519\u8bef\n\t'list_len_not_match_error': [{\n\t\t\t'actual_key': 'root.list',\n\t\t\t'actual_len': 1,\n\t\t\t'min_len': 2\n\t\t}\n\t],\n\t# \u5143\u7956\u4e0d\u5339\u914d\u9519\u8bef\n\t'enum_not_match_error': [{\n\t\t\t'actual_key': 'root.type',\n\t\t\t'actual_value': 12,\n\t\t\t'expect_enum': [11, 22]\n\t\t}\n\t]\n}\n\n'''\nprint(mPactVerify.verify_info)\n```\n\n### 1. Matcher\u7c7b \n#### \u6821\u9a8c\u89c4\u5219\uff1a\u503c\u5339\u914d\n```python\n# \u9884\u671f11\nexpect_format_1 = Matcher(11)\n# \u9884\u671f1.0\nexpect_format_2 = Matcher(1.0)\n# \u9884\u671f'11'\nexpect_format_3 = Matcher('11')\n# \u9884\u671f\u8fd4\u56de\u6570\u636eactual\u4e3adict\u7ed3\u6784\uff0cactual['k1'] == 'v1'\nexpect_format_4 = Matcher({'k1':'v1'})\n``` \n### 2. Like\u7c7b \n#### \u6821\u9a8c\u89c4\u5219\uff1a\u7c7b\u578b\u5339\u914d\n```python\n# \u9884\u671ftype(11)\nexpect_format_1 = Like(11)\n# \u9884\u671ftype(1.0)\nexpect_format_2 = Like(1.0)\n# \u9884\u671ftype('11')\nexpect_format_3 = Like('11')\n# \u9884\u671f\u8fd4\u56de\u6570\u636eactual\u4e3adict\u7ed3\u6784\uff0cactual['k1'] == type('v1')\nexpect_format_4 = Like({'k1':'v1'})\n```\n### 3. EachLike\u7c7b \n#### \u6821\u9a8c\u89c4\u5219\uff1a\u6570\u7ec4\u7c7b\u578b\u5339\u914d\n```python\n# \u9884\u671f[type(11)]\nexpect_format_1 = EachLike(11)\n# \u9884\u671f[type(1.0)]\nexpect_format_2 = EachLike(1.0)\n# \u9884\u671f[type('11')]\nexpect_format_3 = EachLike('11')\n# \u9884\u671f[Like{'k1':'v1'}]\nexpect_format_4 = EachLike({'k1': 'v1'})\n# \u9884\u671f[Like{'k1':'v1'}]\u6216[],minimum\u4e3a\u6570\u7ec4\u6700\u5c0f\u957f\u5ea6,\u9ed8\u8ba4minimum=1\nexpect_format_4 = EachLike({'k1': 'v1'}, minimum=0)\n```\n\n### 4. Term\u7c7b \n#### \u6821\u9a8c\u89c4\u5219\uff1a\u6b63\u5219\u5339\u914d\n```python\n# \u9884\u671fr'^\\d{2}$'\uff0c\u5e76\u4e14type(actual_data) == type(example)\uff0cexample\u4e5f\u6765\u6d4b\u8bd5\u6b63\u5219\u8868\u8fbe\u5f0f\nexpect_format_1 = Term(r'^\\d{2}$', example=111)\n```\n\n### 5. Enum\u7c7b \n#### \u6821\u9a8c\u89c4\u5219\uff1a\u679a\u4e3e\u5339\u914d\n```python\n# \u9884\u671f11\u621622\nexpected_format_1 = Enum([11, 22])\n# iterate_list\u4e3atrue\u65f6\uff0c\u5f53\u76ee\u6807\u6570\u636e\u4e3a\u6570\u7ec4\u65f6\uff0c\u4f1a\u904d\u5386\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5143\u7d20\u662f\u5426in [11, 22]\nexpected_format_2 = Enum([11, 22],iterate_list=True)\n```\n\n-------------\n\n## \u56db.\u590d\u6742\u89c4\u5219\u5339\u914d\n### 4.1 {{}}\u683c\u5f0f\n```python\nactual_data = {\n 'code': 0,\n 'msg': 'success',\n 'data': {\n \"id\": 1,\n \"name\": 'lili'\n }\n}\nexpect_format = Like({\n 'code': 0,\n 'msg': 'success',\n 'data': Like({\n \"id\": 1,\n \"name\": 'lili'\n })\n})\n```\n### 4.2 [[]]\u683c\u5f0f\n```python\nactual_data = [[{\n \"id\": 1,\n \"name\": 'lili'\n}]]\n\nexpect_format = EachLike(EachLike({\n \"id\": 1,\n \"name\": 'lili'\n}))\n\n```\n### 4.3 {[]}\u683c\u5f0f\n```python\nactual_data = {\n 'code': 0,\n 'msg': 'success',\n 'data': [{\n \"id\": 1,\n \"name\": 'lili'\n },{\n \"id\": 2,\n \"name\": 'lilei'\n }]\n}\n\nexpect_format = Like({\n 'code': 0,\n 'msg': 'success',\n 'data': EachLike({\n \"id\": 1,\n \"name\": 'lili'\n })\n})\n\n```\n### 4.4 Like-Term\u5d4c\u5957\n```python\nexpect_format = Like({\n 'code': 0,\n 'msg': 'success',\n 'data': Like({\n \"id\": 1,\n \"name\": Term(r'\\w*',example='lili')\n })\n})\n```\n### 4.5 Like-Matcher\u5d4c\u5957\n```python\nexpect_format = Like({\n # name\u5b57\u6bb5\u503c\u7c7b\u578b\u5339\u914d\n 'name': 'lilei',\n # age\u5b57\u6bb5\u503c\u5339\u914d\n 'age': Matcher(12),\n})\n```\n#### \u8bf4\u660e\uff1a\n>1. Matcher\uff0cLike\u548cEachLike\u7c7b\u53ef\u4ee5\u4e0d\u9650\u5c42\u7ea7\u5d4c\u5957\uff0cTerm\u548cEnum\u5219\u4e0d\u80fd\u5d4c\u5957\u5176\u4ed6\u89c4\u5219\n>2. \u5339\u914d\u89c4\u5219\u591a\u5c42\u5d4c\u5957\u65f6\uff0c\u5185\u5c42\u89c4\u5219\u4f18\u5148\u751f\u6548\n\n\n-------------\n\n## \u4e94.\u5f02\u5e38\u573a\u666f\u5339\u914d\n### 5.1 null\u5339\u914d \n```python\n# nullable\u4e3atrue\u65f6\u5141\u8bb8\u8fd4\u56denull\uff0c\u9884\u671fnull\u548c\uff08actual\u4e3adict\u7ed3\u6784\uff0cactual['k1'] == 'v1' or null\uff09\u5f62\u5f0f\nexpect_format = Matcher({'k1': 'v1'},nullable=True)\n# nullable\u4e3atrue\u65f6\u5141\u8bb8\u8fd4\u56denull\uff0c\u9884\u671fnull\u548c\uff08actual\u4e3adict\u7ed3\u6784\uff0cactual['k1'] == type('v1') or null\uff09\u5f62\u5f0f\nexpect_format = Like({'k1': 'v1'},nullable=True)\n# nullable\u4e3atrue\u65f6\u5141\u8bb8\u8fd4\u56denull\uff0c\u9884\u671fnull\u548c[null,{'k1':null}]\u5f62\u5f0f\nexpect_format = EachLike({'k1': 'v1'},nullable=True)\n# nullable\u4e3atrue\u65f6\u5141\u8bb8\u8fd4\u56denull\uff0c\u9884\u671fnull\u548c11\u5f62\u5f0f\nexpect_format = Term(r'^\\d{2}$', example=11, nullable=True)\n# nullable\u4e3atrue\u65f6\u5141\u8bb8\u8fd4\u56denull\uff0c\u9884\u671fnull\u548c11/22/33\u5f62\u5f0f\nexpect_format = Enum([11, 22, 33], nullable=True)\n```\n>**\u5907\u6ce8\uff1anullable\u53c2\u6570\u5728hard_mode = True\u65f6\u4e5f\u751f\u6548** \n### 5.2 {}\u5339\u914d \n```python\n# dict_emptiable\u4e3atrue\u65f6\uff0c\u5141\u8bb8\u8fd4\u56de{}\uff0c\u9884\u671f{}\u548c\uff08actual\u4e3adict\u7ed3\u6784\uff0cactual['k1'] == 'v1'\uff09\u5f62\u5f0f\nexpect_format = Matcher({'k1': 'v1'},dict_emptiable=True)\n# dict_emptiable\u4e3atrue\u65f6\uff0c\u5141\u8bb8\u8fd4\u56de{}\uff0c\u9884\u671f{}\u548c\uff08actual\u4e3adict\u7ed3\u6784\uff0cactual['k1'] == type('v1')\uff09\u5f62\u5f0f\nexpect_format = Like({'k1': 'v1'},dict_emptiable=True)\n```\n>**\u5907\u6ce8\uff1adict_emptiable\u5728hard_mode = True\u65f6\u4e5f\u751f\u6548** \n### 5.3 json\u683c\u5f0f\u5b57\u7b26\u4e32\u5339\u914d \n```python\n# actual\u4e3a\"{\\\"k1\\\":\\\"v1\\\"}\"json\u5b57\u7b26\u4e32\u683c\u5f0f\u65f6\uff0c\u5148\u8fdb\u884cjson.loads\u518d\u6821\u9a8c\nexpect_format = Matcher({'k1':'v1'},jsonloads = True)\n# actual\u4e3a\"{\\\"k1\\\":\\\"v1\\\"}\"json\u5b57\u7b26\u4e32\u683c\u5f0f\u65f6\uff0c\u5148\u8fdb\u884cjson.loads\u518d\u6821\u9a8c\nexpect_format = Like({'k1': 'v1'},jsonloads = True)\n# actual\u4e3a\"[{\\\"k1\\\":\\\"v1\\\"}]\"json\u5b57\u7b26\u4e32\u683c\u5f0f\u65f6\uff0c\u5148\u8fdb\u884cjson.loads\u518d\u6821\u9a8c\nexpect_format = EachLike({'k1': 'v1'}, jsonloads = True)\n# actual\u4e3a\"[11,22]\"json\u5b57\u7b26\u4e32\u683c\u5f0f\u65f6\uff0c\u5148\u8fdb\u884cjson.loads\u518d\u6821\u9a8c\nexpected_format = Enum([11, 22],jsonloads = True)\n\n```\n\n### 5.4 key\u4e0d\u5b58\u5728\u5339\u914d \n```python\n# key_missable\u4e3atrue\u65f6\uff0c\u5141\u8bb8key\u4e0d\u5b58\u5728\uff0ckey\u5b58\u5728\u65f6\u8d70\u6b63\u5e38\u6821\u9a8c\uff1bMatcher,Like,EachLike,Term\u548cEnum\u7c7b\u90fd\u53ef\u4f7f\u7528\u8be5\u5c5e\u6027\nexpect_format = Matcher({\n 'code': Like(0, key_missable=True),\n 'msg': Matcher('success', key_missable=True),\n 'data': EachLike(11, key_missable=True),\n 'age': Term(r'^\\d{2}$', example=11, key_missable=True),\n 'num': Enum([11, 22, 33], key_missable=True)\n })\n```\n>**\u5907\u6ce8\uff1akey_missable\u5728hard_mode = True\u65f6\u4e5f\u751f\u6548** \n\n#### \u6ce8\u610f\uff1a\u5f02\u5e38\u5339\u914d\u573a\u666f\u8d8a\u591a,\u4ee3\u8868\u63a5\u53e3\u6570\u636e\u683c\u5f0f\u8d8a\u4e0d\u89c4\u8303\n-------------\n\n## \u516d.\u914d\u5408unittest+requests\u4f7f\u7528\n```python\nimport unittest, requests, HtmlTestRunner, os\nfrom pactverify.matchers import Matcher, Like, EachLike, Term, Enum, PactVerify\n\n\nclass PactTest(unittest.TestCase):\n\n def test_config_2(self):\n url = 'http://127.0.0.1:8080/configV2'\n config_rsp = requests.get(url)\n config_contract_format = Matcher({\n \"msg\": \"success\",\n \"code\": 200,\n 'name': Enum(['lili', 'xiaohei']),\n 'addr': Term(r'\u6df1\u5733*', example='\u6df1\u5733\u5b9d\u5b89'),\n \"data\": EachLike({\n \"type_id\": 249,\n \"name\": \"\u738b\u8005\u8363\u8000\",\n \"order_index\": 1,\n \"status\": 1,\n \"subtitle\": \" \",\n \"game_name\": \"\u738b\u8005\u8363\u8000\"\n }),\n 'data_2':\n EachLike({\n \"type_id\": 249,\n \"name\": \"\u738b\u8005\u8363\u8000\",\n \"order_index\": 1,\n \"status\": 1,\n \"subtitle\": \" \",\n \"game_name\": \"\u738b\u8005\u8363\u8000\"\n }, minimum=1)\n })\n\n mPactVerify = PactVerify(config_contract_format)\n\n try:\n actual_rsp_json = config_rsp.json()\n mPactVerify.verify(actual_rsp_json)\n assert mPactVerify.verify_result == True\n except Exception:\n # \u81ea\u5b9a\u4e49\u9519\u8bef\u4fe1\u606f,\u8f93\u51fa\u5230HTMLTestRunner\u4e2d\n err_msg = 'PactVerify_fail,verify_result:{},verify_info:{}'.format(mPactVerify.verify_result,\n mPactVerify.verify_info)\n self.fail(err_msg)\n\n\nif __name__ == '__main__':\n current_path = os.path.abspath(__file__)\n current_dir = os.path.abspath(os.path.dirname(current_path) + os.path.sep + \".\")\n suite = unittest.defaultTestLoader.discover(current_dir, pattern=\"test_*.py\")\n runner = HtmlTestRunner.HTMLTestRunner(combine_reports=True, report_name=\"MyReport\", add_timestamp=False)\n runner.run(suite)\n```\n## \u4e03.\u4f18\u70b9\u603b\u7ed3 \n>1.\u663e\u5f0f\u5b9a\u4e49\u63a5\u53e3\u65ad\u8a00\u683c\u5f0f\uff0c\u63a5\u53e3\u65ad\u8a00\u66f4\u52a0\u76f4\u89c2 \n>2.\u53ef\u590d\u7528\u63a5\u53e3\u5b9e\u9645\u54cd\u5e94\u6570\u636e\u6765\u5b9a\u4e49\u5951\u7ea6 \n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/xglh/PactVerify_demo", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pactverify", "package_url": "https://pypi.org/project/pactverify/", "platform": "", "project_url": "https://pypi.org/project/pactverify/", "project_urls": { "Homepage": "https://github.com/xglh/PactVerify_demo" }, "release_url": "https://pypi.org/project/pactverify/1.7.2/", "requires_dist": null, "requires_python": "", "summary": "\u63a5\u53e3\u65ad\u8a00\u5951\u7ea6\u6821\u9a8c", "version": "1.7.2" }, "last_serial": 5723963, "releases": { "1.6": [ { "comment_text": "", "digests": { "md5": "1c9f923114785f8510ae8187822a653a", "sha256": "8e5dd351a12710a7748ac945241464df4edd38f71765fa7d7920407dc4fa332b" }, "downloads": -1, "filename": "pactverify-1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "1c9f923114785f8510ae8187822a653a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10669, "upload_time": "2019-08-09T03:02:53", "url": "https://files.pythonhosted.org/packages/bb/19/59a20faa600c3afa00b4cf3b6c49e6c9d5c63f7f3da75b8d658b04b9ab11/pactverify-1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f4ead85a692a7149a1aa64aaf53eb767", "sha256": "b0fbcfa52df7b15c58d59281a5798293e187dfc0d1362e41efee58789fefd798" }, "downloads": -1, "filename": "pactverify-1.6.tar.gz", "has_sig": false, "md5_digest": "f4ead85a692a7149a1aa64aaf53eb767", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13479, "upload_time": "2019-08-09T03:02:55", "url": "https://files.pythonhosted.org/packages/ff/2f/98f8d5b5975444f9f9cf06332b830d54997381ba1a3ad1b9d4436c59f077/pactverify-1.6.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "cbad46be0e6a175b12e4ed1502c2a727", "sha256": "84e34a2bff14302885f85a5116b63377d251b9deb211d1a37a15b2052307c2af" }, "downloads": -1, "filename": "pactverify-1.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "cbad46be0e6a175b12e4ed1502c2a727", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10690, "upload_time": "2019-08-09T07:12:38", "url": "https://files.pythonhosted.org/packages/7c/32/d3faafaf52a23554076ff407e165554cd7833bf3c1e4b1bf9ebc39667e5a/pactverify-1.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "71a12bd7773ab6167326a952a5aeed27", "sha256": "9fb761201c0e6758b64213856b34d2ee99cb2737e3b9e3c4a75681d6e1319a8e" }, "downloads": -1, "filename": "pactverify-1.6.1.tar.gz", "has_sig": false, "md5_digest": "71a12bd7773ab6167326a952a5aeed27", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13482, "upload_time": "2019-08-09T07:12:40", "url": "https://files.pythonhosted.org/packages/5e/78/98c33ba640c9374ebab181762bca3ac44194c4e49ba904a903103f49b0c9/pactverify-1.6.1.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "71e2575a61ed5c4c633e98d752904a03", "sha256": "0a5a3d01a670db4bcf63e409f7cee670c2a4ba9d64fb50c2dbffb42a54350fdb" }, "downloads": -1, "filename": "pactverify-1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "71e2575a61ed5c4c633e98d752904a03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11496, "upload_time": "2019-08-12T15:38:41", "url": "https://files.pythonhosted.org/packages/c1/96/346d8a239026135ec66ac603c54d7efbc44a3f6e5ba3c31f8b75c61bc6d0/pactverify-1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bcfca9c8151a396ac47c375ffac01bc3", "sha256": "ec136dc070b2bd759a58f38fd5d55834a727abe4e020903c4bb30f9a2249bcd7" }, "downloads": -1, "filename": "pactverify-1.7.tar.gz", "has_sig": false, "md5_digest": "bcfca9c8151a396ac47c375ffac01bc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14656, "upload_time": "2019-08-12T15:38:43", "url": "https://files.pythonhosted.org/packages/64/89/e945561e7bb89240b14ea3ed55664417b44347ebdce9f56fdb80c2d0641d/pactverify-1.7.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "f54a2c2dfe4d6b08bccc91a92debb8eb", "sha256": "21268c0ea8b2e7685d66c696dcf9c284a577927cfcf03b19db853f60549a7815" }, "downloads": -1, "filename": "pactverify-1.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f54a2c2dfe4d6b08bccc91a92debb8eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11542, "upload_time": "2019-08-16T07:50:52", "url": "https://files.pythonhosted.org/packages/62/9e/192dc70d6dcb20c7c7ed7bcac1c9e69f8aab99cee87dede6ef16ecd8efba/pactverify-1.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "205fde994f51341f73f388246c8ca6b5", "sha256": "2c1ecb8bb88eec21ddf76686befb5d07d7c6eef38ae9fe209d51ca220927ab9e" }, "downloads": -1, "filename": "pactverify-1.7.1.tar.gz", "has_sig": false, "md5_digest": "205fde994f51341f73f388246c8ca6b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14679, "upload_time": "2019-08-16T07:50:54", "url": "https://files.pythonhosted.org/packages/be/d4/529beabcf1785144bb7c9b06ccb092993eba19b2dd25b823aa766a5acdc0/pactverify-1.7.1.tar.gz" } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "0b094b4e9b79845725bafc88dc27ecde", "sha256": "92c5bb6535935eb758f7a9fc041e2b667f309148ad5fefc2adaddd926210da16" }, "downloads": -1, "filename": "pactverify-1.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0b094b4e9b79845725bafc88dc27ecde", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11540, "upload_time": "2019-08-24T08:07:51", "url": "https://files.pythonhosted.org/packages/f5/de/514d4371bf77d50beb42c4cd1991726eee2b36baebd6a154dfa0244e7748/pactverify-1.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6a3ad9016a7c4d2f4ac836469c9473a1", "sha256": "b0e0289a142877ab4d8875bb3ef111c7dbaa83cd605720545197093d10f40548" }, "downloads": -1, "filename": "pactverify-1.7.2.tar.gz", "has_sig": false, "md5_digest": "6a3ad9016a7c4d2f4ac836469c9473a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14671, "upload_time": "2019-08-24T08:07:52", "url": "https://files.pythonhosted.org/packages/e8/25/4c908f61f3b845ed26df92d14bfffb569127031dfb12a37d2664a140a3b3/pactverify-1.7.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0b094b4e9b79845725bafc88dc27ecde", "sha256": "92c5bb6535935eb758f7a9fc041e2b667f309148ad5fefc2adaddd926210da16" }, "downloads": -1, "filename": "pactverify-1.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0b094b4e9b79845725bafc88dc27ecde", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11540, "upload_time": "2019-08-24T08:07:51", "url": "https://files.pythonhosted.org/packages/f5/de/514d4371bf77d50beb42c4cd1991726eee2b36baebd6a154dfa0244e7748/pactverify-1.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6a3ad9016a7c4d2f4ac836469c9473a1", "sha256": "b0e0289a142877ab4d8875bb3ef111c7dbaa83cd605720545197093d10f40548" }, "downloads": -1, "filename": "pactverify-1.7.2.tar.gz", "has_sig": false, "md5_digest": "6a3ad9016a7c4d2f4ac836469c9473a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14671, "upload_time": "2019-08-24T08:07:52", "url": "https://files.pythonhosted.org/packages/e8/25/4c908f61f3b845ed26df92d14bfffb569127031dfb12a37d2664a140a3b3/pactverify-1.7.2.tar.gz" } ] }