From ab63ff34bd004a4f3a63a8acc64212d3a633f97b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=9C?= Date: Mon, 18 May 2020 09:19:44 +0800 Subject: [PATCH 1/5] feature(): bug fix for docs dest --- docs/source/intro.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/intro.rst b/docs/source/intro.rst index 514c69c..fd661af 100644 --- a/docs/source/intro.rst +++ b/docs/source/intro.rst @@ -405,15 +405,15 @@ lte / lte_key 使用方法同 gt / gt_key 表示小于等于的判断 -key_map +dest ------------ -`kay_map` 用于将用户传入的参数名称映射为特定的字符串。默认值为 `None` +`dest` 用于将用户传入的参数名称映射为特定的字符串。默认值为 `None` :: params = { - "userId": Rule(direct_type=int, key_map="user_id") + "userId": Rule(direct_type=int, dest="user_id") } From 8bb0d104dbdfb1c082c9bac92cac5a83a039ea8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=9C?= Date: Tue, 19 May 2020 17:01:21 +0800 Subject: [PATCH 2/5] bugfix(): big fix for different dest key while cross filed --- CHANGES.rst | 3 +-- examples/example_filter/example_gt_key.py | 9 +++++---- examples/example_filter/example_required_with.py | 4 ++-- pre_request/filters/cross/equal_key_filter.py | 2 +- pre_request/filters/cross/required_with_filter.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index fdcbdee..f6ef8ba 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,12 +1,11 @@ .. py:currentmodule:: pre_request -Version 2.2.0 (20200630) +Version 2.1.1 (20200630) ------------------------- Unreleased -- TODO: 优化项目结构,脱离Flask限制,将不同web框架作为扩展实现 - TODO: 核心能力抽象,支持普通函数入参校验能力 Version 2.1.0 diff --git a/examples/example_filter/example_gt_key.py b/examples/example_filter/example_gt_key.py index 5050744..9ed1780 100644 --- a/examples/example_filter/example_gt_key.py +++ b/examples/example_filter/example_gt_key.py @@ -7,6 +7,7 @@ """ 演示 pre-request 框架验证不同参数联动限制禁止相等 """ import json +from datetime import datetime from flask import Flask from pre_request import pre, Rule @@ -18,8 +19,8 @@ # 指定gt_key, 禁止两个参数相等 gt_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, gt_key="p1") + "p1": Rule(type=datetime, dest="P1"), + "p2": Rule(type=datetime, gt_key="P1", dest="P2") } @@ -33,8 +34,8 @@ def example_gt_key_filter(): """ 演示gt_key包含函数 """ resp = client.get("/gt/key", data={ - "p1": 15, - "p2": 13 + "p1": "2020-01-01 12:00:00", + "p2": "2019-12-12 12:00:00" }) print(json.loads(resp.data)) diff --git a/examples/example_filter/example_required_with.py b/examples/example_filter/example_required_with.py index b700db0..d8104e7 100644 --- a/examples/example_filter/example_required_with.py +++ b/examples/example_filter/example_required_with.py @@ -19,7 +19,7 @@ # 指定required_with=other, 当指定的其它参数填写后,要求此参数也必须填写 required_with_params = { "p1": Rule(required=False), - "p2": Rule(required=False, required_with="p1", type=float) + "p2": Rule(required=False, required_with="p1", type=float, dest="P2") } @@ -36,7 +36,7 @@ def example_required_with_filter(): "p1": "H", # "p2": 13 }) - print(resp.data) + print(resp.json) if __name__ == "__main__": diff --git a/pre_request/filters/cross/equal_key_filter.py b/pre_request/filters/cross/equal_key_filter.py index 2392c9b..9bf795f 100644 --- a/pre_request/filters/cross/equal_key_filter.py +++ b/pre_request/filters/cross/equal_key_filter.py @@ -69,7 +69,7 @@ def __call__(self, *args, **kwargs): # 所有请求后的处理函数 params = kwargs.get("params", dict()) - value = get_deep_value(self.key, params, None, deep=True) + value = get_deep_value(self.rule.key_map or self.key, params, None, deep=True) for r_key, r_code in self.support_rules.items(): rule = getattr(self.rule, r_key, None) diff --git a/pre_request/filters/cross/required_with_filter.py b/pre_request/filters/cross/required_with_filter.py index c2695cc..7814795 100644 --- a/pre_request/filters/cross/required_with_filter.py +++ b/pre_request/filters/cross/required_with_filter.py @@ -41,7 +41,7 @@ def __call__(self, *args, **kwargs): other_v = get_deep_value(self.rule.required_with, params, None, deep=True) - if other_v is not None and get_deep_value(self.key, params, None, deep=True) is None: + if other_v is not None and get_deep_value(self.rule.key_map or self.key, params, None, deep=True) is None: raise ParamsValueError(self.required_with_error, filter=self) return self.value From 2958d560af7f9fa864a66401ec6a185518862e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=9C?= Date: Wed, 20 May 2020 10:54:51 +0800 Subject: [PATCH 3/5] feature(): update test style --- tests/conftest.py | 109 ------------------------ tests/test_filter/test_callback.py | 44 +++++++++- tests/test_filter/test_eq_key.py | 40 +++++++-- tests/test_filter/test_gt_key.py | 40 +++++++-- tests/test_filter/test_gte_key.py | 44 ++++++++-- tests/test_filter/test_lt_key.py | 42 +++++++-- tests/test_filter/test_lte_key.py | 54 ++++++++++-- tests/test_filter/test_neq_key.py | 38 ++++++++- tests/test_filter/test_required_with.py | 39 +++++++-- 9 files changed, 297 insertions(+), 153 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index d8105f8..6e61788 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -191,25 +191,6 @@ def test_type_handler(params): return json_resp(params) -def call_back_func(value): - if value == "3": - return 999 - return value - - -callback_params = { - "params": Rule(type=str, callback=call_back_func) -} - - -@app.route("/callback", methods=['get', 'post']) -@pre.catch(callback_params) -def test_callback_handler(params): - """ 测试自定义处理callback校验 - """ - return json_resp(params) - - key_map_params = { "params": Rule(type=str, dest="ttt") } @@ -237,18 +218,6 @@ def test_skip_handler(params): return json_resp(params) -required_with_params = { - "p1": Rule(required=False), - "p2": Rule(required=False, required_with="p1", type=float) -} - - -@app.route("/required/with", methods=["GET", "POST"]) -@pre.catch(required_with_params) -def test_required_with_handler(params): - return json_resp(params) - - # 指定 contains 数组,则要求入参必须包含指定子串 contains_params = { "p1": Rule(contains=["a", "b", "c"]) @@ -393,84 +362,6 @@ def test_longitude_handler(params): return json_resp(params) -# 指定eq_key, 邀请 -eq_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, eq_key="p1") -} - - -@app.route("/eq/key", methods=["GET", "POST"]) -@pre.catch(eq_key_params) -def test_eq_key_handler(params): - return json_resp(params) - - -# 指定neq_key, 禁止两个参数相等 -neq_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, neq_key="p1") -} - - -@app.route("/neq/key", methods=["GET", "POST"]) -@pre.catch(neq_key_params) -def test_neq_key_handler(params): - return json_resp(params) - - -# 指定gt_key, 禁止两个参数相等 -gt_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, gt_key="p1") -} - - -@app.route("/gt/key", methods=["GET", "POST"]) -@pre.catch(gt_key_params) -def test_gt_key_handler(params): - return json_resp(params) - - -# 指定gte_key, 禁止两个参数相等 -gte_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, gte_key="p1") -} - - -@app.route("/gte/key", methods=["GET", "POST"]) -@pre.catch(gte_key_params) -def test_gte_key_handler(params): - return json_resp(params) - - -# 指定lt_key, 限定一个参数必须小于另一个参数 -lt_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, lt_key="p1") -} - - -@app.route("/lt/key", methods=["GET", "POST"]) -@pre.catch(lt_key_params) -def test_lt_key_handler(params): - return json_resp(params) - - -# 指定lte_key, 限定一个参数必须小于另一个参数 -lte_key_params = { - "p1": Rule(type=int), - "p2": Rule(type=int, lte_key="p1") -} - - -@app.route("/lte/key", methods=["GET", "POST"]) -@pre.catch(lte_key_params) -def test_lte_key_handler(params): - return json_resp(params) - - # 读取指定位置的数据 location_params = { "p1": Rule(type=int, location="args"), diff --git a/tests/test_filter/test_callback.py b/tests/test_filter/test_callback.py index 8358093..9e36ede 100644 --- a/tests/test_filter/test_callback.py +++ b/tests/test_filter/test_callback.py @@ -4,26 +4,62 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-03-18 13:25' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +def call_back_func(value): + if value == "3": + return 999 + return value + + +callback_params = { + "params": Rule(type=str, callback=call_back_func) +} + + +@app.route("/callback", methods=['get', 'post']) +@pre.catch(callback_params) +def callback_handler(params): + """ 测试自定义处理callback校验 + """ + return json_resp(params) class TestCallBack: - def test_call_back_smoke(self, client): + def test_call_back_smoke(self): """ 测试回调函数 """ - resp = client.get("/callback", data={ + resp = app.test_client().get("/callback", data={ "params": 3 }) assert resp.json == {"params": 999} - resp = client.get("/callback", data={ + resp = app.test_client().get("/callback", data={ "params": "3" }) assert resp.json == {"params": 999} - resp = client.get("/callback", data={ + resp = app.test_client().get("/callback", data={ "params": 5 }) diff --git a/tests/test_filter/test_eq_key.py b/tests/test_filter/test_eq_key.py index 2eb94e0..7c8ab78 100644 --- a/tests/test_filter/test_eq_key.py +++ b/tests/test_filter/test_eq_key.py @@ -4,24 +4,54 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-15 09:26' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +# 指定eq_key, 邀请 +eq_key_params = { + "p1": Rule(type=int, dest="P1"), + "p2": Rule(type=int, eq_key="P1", dest="P2") +} + + +@app.route("/eq/key", methods=["GET", "POST"]) +@pre.catch(eq_key_params) +def eq_key_handler(params): + return json_resp(params) class TestEqualKey: - def test_eq_key_smoke(self, client): + def test_eq_key_smoke(self): """ 测试 eq_key 冒烟测试 """ - resp = client.get("/eq/key", data={ + resp = app.test_client().get("/eq/key", data={ "p1": 15, "p2": 15 }) - assert resp.json == {"p1": 15, "p2": 15} + assert resp.json == {"P1": 15, "P2": 15} - def test_eq_key_593(self, client): + def test_eq_key_593(self): """ 测试 eq_key 异常 """ - resp = client.get("/eq/key", data={ + resp = app.test_client().get("/eq/key", data={ "p1": 15, "p2": 16 }) diff --git a/tests/test_filter/test_gt_key.py b/tests/test_filter/test_gt_key.py index 63c1632..9720aa7 100644 --- a/tests/test_filter/test_gt_key.py +++ b/tests/test_filter/test_gt_key.py @@ -4,24 +4,54 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-15 09:26' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +# 指定gt_key, 禁止两个参数相等 +gt_key_params = { + "p1": Rule(type=int), + "p2": Rule(type=int, gt_key="p1", dest="P2") +} + + +@app.route("/gt/key", methods=["GET", "POST"]) +@pre.catch(gt_key_params) +def gt_key_handler(params): + return json_resp(params) class TestGtKey: - def test_gt_key_smoke(self, client): + def test_gt_key_smoke(self): """ 测试 gt_key 冒烟测试 """ - resp = client.get("/gt/key", data={ + resp = app.test_client().get("/gt/key", data={ "p1": 15, "p2": 16 }) - assert resp.json == {"p1": 15, "p2": 16} + assert resp.json == {"p1": 15, "P2": 16} - def test_gt_key_595(self, client): + def test_gt_key_595(self): """ 测试 gt_key 异常 """ - resp = client.get("/gt/key", data={ + resp = app.test_client().get("/gt/key", data={ "p1": 15, "p2": 15 }) diff --git a/tests/test_filter/test_gte_key.py b/tests/test_filter/test_gte_key.py index 4c55c7f..9cf8994 100644 --- a/tests/test_filter/test_gte_key.py +++ b/tests/test_filter/test_gte_key.py @@ -4,31 +4,61 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-15 09:26' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +# 指定gte_key, 禁止两个参数相等 +gte_key_params = { + "p1": Rule(type=int), + "p2": Rule(type=int, gte_key="p1", dest="P2") +} + + +@app.route("/gte/key", methods=["GET", "POST"]) +@pre.catch(gte_key_params) +def gte_key_handler(params): + return json_resp(params) class TestGteKey: - def test_gte_key_smoke(self, client): + def test_gte_key_smoke(self): """ 测试 gte_key 冒烟测试 """ - resp = client.get("/gte/key", data={ + resp = app.test_client().get("/gte/key", data={ "p1": 15, "p2": 16 }) - assert resp.json == {"p1": 15, "p2": 16} + assert resp.json == {"p1": 15, "P2": 16} - resp = client.get("/gte/key", data={ + resp = app.test_client().get("/gte/key", data={ "p1": 15, "p2": 15 }) - assert resp.json == {"p1": 15, "p2": 15} + assert resp.json == {"p1": 15, "P2": 15} - def test_gte_key_596(self, client): + def test_gte_key_596(self): """ 测试 gte_key 异常 """ - resp = client.get("/gte/key", data={ + resp = app.test_client().get("/gte/key", data={ "p1": 15, "p2": 14 }) diff --git a/tests/test_filter/test_lt_key.py b/tests/test_filter/test_lt_key.py index 29ad074..5510728 100644 --- a/tests/test_filter/test_lt_key.py +++ b/tests/test_filter/test_lt_key.py @@ -4,31 +4,61 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-15 09:26' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +# 指定lt_key, 限定一个参数必须小于另一个参数 +lt_key_params = { + "p1": Rule(type=int, dest="P1"), + "p2": Rule(type=int, lt_key="P1") +} + + +@app.route("/lt/key", methods=["GET", "POST"]) +@pre.catch(lt_key_params) +def lt_key_handler(params): + return json_resp(params) class TestLtKey: - def test_lt_key_smoke(self, client): + def test_lt_key_smoke(self): """ 测试 lt_key 冒烟测试 """ - resp = client.get("/lt/key", data={ + resp = app.test_client().get("/lt/key", data={ "p1": 15, "p2": 13 }) - assert resp.json == {"p1": 15, "p2": 13} + assert resp.json == {"P1": 15, "p2": 13} - def test_lt_key_596(self, client): + def test_lt_key_596(self): """ 测试 gt_key 异常 """ - resp = client.get("/lt/key", data={ + resp = app.test_client().get("/lt/key", data={ "p1": 15, "p2": 15 }) assert resp.json["respCode"] == 597 - resp = client.get("/lt/key", data={ + resp = app.test_client().get("/lt/key", data={ "p1": 15, "p2": 16 }) diff --git a/tests/test_filter/test_lte_key.py b/tests/test_filter/test_lte_key.py index 3660d6d..d2e1c63 100644 --- a/tests/test_filter/test_lte_key.py +++ b/tests/test_filter/test_lte_key.py @@ -4,25 +4,63 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-15 09:27' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +# 指定lte_key, 限定一个参数必须小于另一个参数 +lte_key_params = { + "p1": Rule(type=int), + "p2": Rule(type=int, lte_key="p1") +} + + +@app.route("/lte/key", methods=["GET", "POST"]) +@pre.catch(lte_key_params) +def lte_key_handler(params): + return json_resp(params) + class TestGtKey: - def test_gt_key_smoke(self, client): + def test_gt_key_smoke(self): """ 测试 gt_key 冒烟测试 """ - resp = client.get("/gt/key", data={ + resp = app.test_client().get("/lte/key", data={ "p1": 15, - "p2": 16 + "p2": 13 + }) + + assert resp.json == {"p1": 15, "p2": 13} + + resp = app.test_client().get("/lte/key", data={ + "p1": 15, + "p2": 15 }) - assert resp.json == {"p1": 15, "p2": 16} + assert resp.json == {"p1": 15, "p2": 15} - def test_gt_key_595(self, client): + def test_gt_key_595(self): """ 测试 gt_key 异常 """ - resp = client.get("/gt/key", data={ + resp = app.test_client().get("/lte/key", data={ "p1": 15, - "p2": 15 + "p2": 16 }) - assert resp.json["respCode"] == 595 + assert resp.json["respCode"] == 598 diff --git a/tests/test_filter/test_neq_key.py b/tests/test_filter/test_neq_key.py index b4dafbb..aa7c878 100644 --- a/tests/test_filter/test_neq_key.py +++ b/tests/test_filter/test_neq_key.py @@ -4,24 +4,54 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-15 09:26' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +# 指定neq_key, 禁止两个参数相等 +neq_key_params = { + "p1": Rule(type=int), + "p2": Rule(type=int, neq_key="p1") +} + + +@app.route("/neq/key", methods=["GET", "POST"]) +@pre.catch(neq_key_params) +def neq_key_handler(params): + return json_resp(params) class TestNotEqualKey: - def test_neq_key_smoke(self, client): + def test_neq_key_smoke(self): """ 测试 neq_key 冒烟测试 """ - resp = client.get("/neq/key", data={ + resp = app.test_client().get("/neq/key", data={ "p1": 15, "p2": 16 }) assert resp.json == {"p1": 15, "p2": 16} - def test_neq_key_594(self, client): + def test_neq_key_594(self): """ 测试 eq_key 异常 """ - resp = client.get("/neq/key", data={ + resp = app.test_client().get("/neq/key", data={ "p1": 15, "p2": 15 }) diff --git a/tests/test_filter/test_required_with.py b/tests/test_filter/test_required_with.py index d084cbd..9508ab4 100644 --- a/tests/test_filter/test_required_with.py +++ b/tests/test_filter/test_required_with.py @@ -4,31 +4,60 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-04-13 11:21' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +required_with_params = { + "p1": Rule(required=False), + "p2": Rule(required=False, required_with="p1", type=float) +} + + +@app.route("/required/with", methods=["GET", "POST"]) +@pre.catch(required_with_params) +def required_with_handler(params): + return json_resp(params) class TestRequiredWith: - def test_required_with_smoke(self, client): + def test_required_with_smoke(self): """ 测试 required_with 冒烟测试 """ - resp = client.get("/required/with", data={ + resp = app.test_client().get("/required/with", data={ "p1": "H", "p2": 13 }) assert resp.json == {"p1": "H", "p2": 13.0} - def test_required_with_599(self, client): + def test_required_with_599(self): """ 测试 required_with 冒烟测试 """ - resp = client.get("/required/with", data={ + resp = app.test_client().get("/required/with", data={ "p1": "H", "p2": None }) assert resp.json["respCode"] == 599 - resp = client.get("/required/with", data={ + resp = app.test_client().get("/required/with", data={ "p1": None, "p2": None }) From c057b7d4061fb65554d469decb3a1e3421756d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=9C?= Date: Thu, 21 May 2020 10:22:57 +0800 Subject: [PATCH 4/5] bug fix for type transform --- examples/example_filter/example_type.py | 6 ++-- pre_request/filters/simple/type_filter.py | 5 +-- tests/conftest.py | 14 --------- tests/test_filter/test_type.py | 35 +++++++++++++++++++-- tests/test_flask/test_json.py | 37 +++++++++++++++++++++-- tests/test_flask/test_post.py | 35 +++++++++++++++++++-- 6 files changed, 104 insertions(+), 28 deletions(-) diff --git a/examples/example_filter/example_type.py b/examples/example_filter/example_type.py index 532e17e..1717521 100644 --- a/examples/example_filter/example_type.py +++ b/examples/example_filter/example_type.py @@ -18,7 +18,7 @@ # 指定direct_type,此时框架会尝试将入参转换成目标格式 type_params = { - "params": Rule(type=int) + "params": Rule(type=str, gte=1, lte=11) } @@ -31,8 +31,8 @@ def example_type_handler(params): def example_type_filter(): """ 演示邮箱验证 """ - resp = client.get("/type", data={ - "params": 19.9 + resp = client.post("/type", json={ + "params": 19 }) print(resp.data) diff --git a/pre_request/filters/simple/type_filter.py b/pre_request/filters/simple/type_filter.py index b71ee37..d99d327 100644 --- a/pre_request/filters/simple/type_filter.py +++ b/pre_request/filters/simple/type_filter.py @@ -79,10 +79,7 @@ def _type_transform(self, d_type, value): def __call__(self, *args, **kwargs): super(TypeFilter, self).__call__() - if isinstance(self.value, str): - return self._type_transform(self.rule.direct_type, self.value) - if isinstance(self.value, list): return [self._type_transform(self.rule.direct_type, value) for value in self.value] - return self.value + return self._type_transform(self.rule.direct_type, self.value) diff --git a/tests/conftest.py b/tests/conftest.py index 6e61788..991dd43 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -177,20 +177,6 @@ def test_trim_handler(params): return json_resp(params) -type_params = { - "int": Rule(type=int), - "str": Rule(type=str) -} - - -@app.route("/type", methods=['get', 'post']) -@pre.catch(type_params) -def test_type_handler(params): - """ 测试字段目标数据类型校验 - """ - return json_resp(params) - - key_map_params = { "params": Rule(type=str, dest="ttt") } diff --git a/tests/test_filter/test_type.py b/tests/test_filter/test_type.py index c6ff636..b0beb99 100644 --- a/tests/test_filter/test_type.py +++ b/tests/test_filter/test_type.py @@ -4,14 +4,45 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-03-18 12:52' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +type_params = { + "int": Rule(type=int), + "str": Rule(type=str) +} + + +@app.route("/type", methods=['get', 'post']) +@pre.catch(type_params) +def type_handler(params): + """ 测试字段目标数据类型校验 + """ + return json_resp(params) class TestType: - def test_type_filter_smoke(self, client): + def test_type_filter_smoke(self): """ 测试 type_filter 冒烟测试 """ - resp = client.get("/type", data={ + resp = app.test_client().get("/type", data={ "int": "3", "str": 2, }) diff --git a/tests/test_flask/test_json.py b/tests/test_flask/test_json.py index b60dd9a..da6c440 100644 --- a/tests/test_flask/test_json.py +++ b/tests/test_flask/test_json.py @@ -4,16 +4,47 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-03-18 13:17' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +type_params = { + "int": Rule(type=int), + "str": Rule(type=str) +} + + +@app.route("/type", methods=['get', 'post']) +@pre.catch(type_params) +def type_handler(params): + """ 测试字段目标数据类型校验 + """ + return json_resp(params) class TestJson: - def test_json_filter(self, client): + def test_json_filter(self): """ 测试POST提交参数 """ - resp = client.post("/type", json={ + resp = app.test_client().post("/type", json={ "int": "3", "str": 2, }) - assert resp.json == {"int": 3, "str": 2} + assert resp.json == {"int": 3, "str": "2"} diff --git a/tests/test_flask/test_post.py b/tests/test_flask/test_post.py index c89b7d4..1e774ca 100644 --- a/tests/test_flask/test_post.py +++ b/tests/test_flask/test_post.py @@ -4,14 +4,45 @@ # All rights reserved # @Author: 'Wu Dong ' # @Time: '2020-03-18 13:16' +# sys +import json +# 3p +from flask import Flask, make_response +# project +from pre_request import pre, Rule + + +app = Flask(__name__) +app.config["TESTING"] = True + + +def json_resp(result): + result = json.dumps(result) + resp = make_response(result) + resp.headers['Content-Type'] = 'application/json' + return resp + + +type_params = { + "int": Rule(type=int), + "str": Rule(type=str) +} + + +@app.route("/type", methods=['get', 'post']) +@pre.catch(type_params) +def type_handler(params): + """ 测试字段目标数据类型校验 + """ + return json_resp(params) class TestPost: - def test_post_filter(self, client): + def test_post_filter(self): """ 测试POST提交参数 """ - resp = client.post("/type", data={ + resp = app.test_client().post("/type", data={ "int": "3", "str": 2, }) From 74b7ada7f937922d64f2cff40e246ac5ffe291db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=9C?= Date: Fri, 22 May 2020 09:39:35 +0800 Subject: [PATCH 5/5] version 2.1.1 release --- CHANGES.rst | 6 +++--- pre_request/__version__.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index f6ef8ba..48ae966 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,12 +1,12 @@ .. py:currentmodule:: pre_request -Version 2.1.1 (20200630) +Version 2.1.1 ------------------------- -Unreleased +Released 2020-05-22 -- TODO: 核心能力抽象,支持普通函数入参校验能力 +- 修复发现的类型转换问题 Version 2.1.0 -------------------------- diff --git a/pre_request/__version__.py b/pre_request/__version__.py index b144393..18631e3 100644 --- a/pre_request/__version__.py +++ b/pre_request/__version__.py @@ -5,7 +5,7 @@ __title__ = 'pre_request' __description__ = 'Validate request arguments, Including Cross Field, Cross Struct' __url__ = 'https://github.com/Eastwu5788/pre-request' -__version__ = '2.1.0' +__version__ = '2.1.1' __build__ = 0x000001 __author_email__ = 'wudong@eastwu.cn' __license__ = 'MIT License'