Skip to content

Commit

Permalink
Merge pull request #96 from Eastwu5788/2.1.1
Browse files Browse the repository at this point in the history
2.1.1
  • Loading branch information
Eastwu5788 committed May 22, 2020
2 parents f0e26b3 + 266f1e4 commit 7b3cb43
Show file tree
Hide file tree
Showing 21 changed files with 417 additions and 197 deletions.
7 changes: 3 additions & 4 deletions CHANGES.rst
@@ -1,13 +1,12 @@
.. py:currentmodule:: pre_request
Version 2.2.0 (20200630)
Version 2.1.1
-------------------------

Unreleased
Released 2020-05-22

- TODO: 优化项目结构,脱离Flask限制,将不同web框架作为扩展实现
- TODO: 核心能力抽象,支持普通函数入参校验能力
- 修复发现的类型转换问题

Version 2.1.0
--------------------------
Expand Down
6 changes: 3 additions & 3 deletions docs/source/intro.rst
Expand Up @@ -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")
}


Expand Down
9 changes: 5 additions & 4 deletions examples/example_filter/example_gt_key.py
Expand Up @@ -7,6 +7,7 @@
""" 演示 pre-request 框架验证不同参数联动限制禁止相等
"""
import json
from datetime import datetime
from flask import Flask
from pre_request import pre, Rule

Expand All @@ -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")
}


Expand All @@ -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))

Expand Down
4 changes: 2 additions & 2 deletions examples/example_filter/example_required_with.py
Expand Up @@ -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")
}


Expand All @@ -36,7 +36,7 @@ def example_required_with_filter():
"p1": "H",
# "p2": 13
})
print(resp.data)
print(resp.json)


if __name__ == "__main__":
Expand Down
6 changes: 3 additions & 3 deletions examples/example_filter/example_type.py
Expand Up @@ -18,7 +18,7 @@

# 指定direct_type,此时框架会尝试将入参转换成目标格式
type_params = {
"params": Rule(type=int)
"params": Rule(type=str, gte=1, lte=11)
}


Expand All @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion pre_request/__version__.py
Expand Up @@ -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'
Expand Down
2 changes: 1 addition & 1 deletion pre_request/filters/cross/equal_key_filter.py
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion pre_request/filters/cross/required_with_filter.py
Expand Up @@ -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
5 changes: 1 addition & 4 deletions pre_request/filters/simple/type_filter.py
Expand Up @@ -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)
123 changes: 0 additions & 123 deletions tests/conftest.py
Expand Up @@ -177,39 +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)


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")
}
Expand Down Expand Up @@ -237,18 +204,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"])
Expand Down Expand Up @@ -393,84 +348,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"),
Expand Down
44 changes: 40 additions & 4 deletions tests/test_filter/test_callback.py
Expand Up @@ -4,26 +4,62 @@
# All rights reserved
# @Author: 'Wu Dong <wudong@eastwu.cn>'
# @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
})

Expand Down

0 comments on commit 7b3cb43

Please sign in to comment.