修复部分自定义函数如{{random_id_card()}}不带参数调用是,可能出现调用函数不正确的bug

This commit is contained in:
chenyongzhiaaron 2023-08-29 15:37:32 +08:00
parent 5c3909e1d6
commit b1a24049f1
3 changed files with 23 additions and 21 deletions

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module version="4"> <module version="4">
<component name="PyDocumentationSettings"> <component name="PyDocumentationSettings">
<option name="format" value="PLAIN" /> <option name="format" value="GOOGLE" />
<option name="myDocStringFormat" value="Plain" /> <option name="myDocStringFormat" value="Google" />
</component> </component>
<component name="TemplatesService"> <component name="TemplatesService">
<option name="TEMPLATE_FOLDERS"> <option name="TEMPLATE_FOLDERS">

View File

@ -16,7 +16,7 @@ __all__ = [
"random_string", "random_ssn", "random_string", "random_ssn",
"random_email", "random_id_card", "random_email", "random_id_card",
"random_int", "random_male_name", "random_int", "random_male_name",
"random_female_name", "random_current_time" "random_female_name", "random_current_time",
] ]
f = Faker(locale='Zh-CN') f = Faker(locale='Zh-CN')

View File

@ -31,8 +31,11 @@ class DependentParameter(DataExtractor):
""" """
def execute_method_chain(obj, methods, args=None): def execute_method_chain(obj, methods, args=None):
"""处理参数为调用链的函数"""
if not methods: if not methods:
return obj(*args) if callable(obj) else obj if args and args[0]:
return obj(*args) if callable(obj) else obj
return obj() if callable(obj) else obj
method_name, *remaining_methods = methods method_name, *remaining_methods = methods
if hasattr(obj(), method_name) and callable(getattr(obj(), method_name)): if hasattr(obj(), method_name) and callable(getattr(obj(), method_name)):
method = getattr(obj(), method_name) method = getattr(obj(), method_name)
@ -40,14 +43,16 @@ class DependentParameter(DataExtractor):
return None return None
def get_method_call_and_method_names(strings): def get_method_call_and_method_names(strings):
"""获取方法命名及参数列表"""
first_method_call_match = self.FUNCTION_CALL_MATCHER.search(strings) first_method_call_match = self.FUNCTION_CALL_MATCHER.search(strings)
if first_method_call_match: if first_method_call_match:
first_method_call = "{{" + f'{first_method_call_match.group()}'.split("(")[0] + "()" + "}}" first_method_call = "{{" + f'{first_method_call_match.group()}'.split("(")[0] + "()" + "}}"
first_fun = first_method_call_match.group() first_fun = first_method_call_match.group()
args_string = self.ARGS_MATCHER.search(first_method_call_match.group()) args_string = self.ARGS_MATCHER.search(first_method_call_match.group())
# 获取字符串参数
args_list = args_string.group(1).split(',') if args_string else [] args_list = args_string.group(1).split(',') if args_string else []
else: else:
raise ParameterExtractionError(key, "在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常") raise ParameterExtractionError(strings, "在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常")
# raise ValueError(f"函数写法错误:无法匹配函数调用格式,字符串为:{strings}") # raise ValueError(f"函数写法错误:无法匹配函数调用格式,字符串为:{strings}")
remaining_method_names = self.METHOD_NAME_MATCHER.findall(strings) remaining_method_names = self.METHOD_NAME_MATCHER.findall(strings)
@ -58,6 +63,7 @@ class DependentParameter(DataExtractor):
json_string = json.dumps(json_string) if isinstance(json_string, (dict, list)) else json_string json_string = json.dumps(json_string) if isinstance(json_string, (dict, list)) else json_string
while self.PARAMETER_MATCHER.search(json_string): while self.PARAMETER_MATCHER.search(json_string):
if self.FUNCTION_CHAIN_MATCHER.search(json_string): if self.FUNCTION_CHAIN_MATCHER.search(json_string):
# 匹配调用链
function_pattern = self.FUNCTION_CHAIN_MATCHER.search(json_string).group() function_pattern = self.FUNCTION_CHAIN_MATCHER.search(json_string).group()
function_with_args, key, remaining_methods, args = get_method_call_and_method_names(function_pattern) function_with_args, key, remaining_methods, args = get_method_call_and_method_names(function_pattern)
if key in self.get_environments().keys(): if key in self.get_environments().keys():
@ -66,7 +72,6 @@ class DependentParameter(DataExtractor):
json_string = json_string.replace(function_pattern, str(obj)) json_string = json_string.replace(function_pattern, str(obj))
else: else:
ParameterExtractionError(key, "在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常") ParameterExtractionError(key, "在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常")
# logger.error(f"函数key:{key},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
break break
else: else:
key = self.PARAMETER_MATCHER.search(json_string) key = self.PARAMETER_MATCHER.search(json_string)
@ -81,20 +86,21 @@ class DependentParameter(DataExtractor):
json_string = json_string.replace(key.group(), str(obj)) json_string = json_string.replace(key.group(), str(obj))
else: else:
ParameterExtractionError(key, "在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常") ParameterExtractionError(key, "在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常")
# logger.error(f"字符串key:{key},字符串在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
break break
json_string = json_string.replace("True", "true").replace("False", "false") json_string = json_string.replace("True", "true").replace("False", "false")
if self.BRACE_MATCHER.search(json_string) and not self.FUNCTION_CHAIN_MATCHER.search(json_string): if self.BRACE_MATCHER.search(json_string) and not self.FUNCTION_CHAIN_MATCHER.search(json_string):
try: try:
json_string = json.loads(json_string) json_string = json.loads(json_string)
except json.JSONDecodeError as e: except json.JSONDecodeError as e:
ResponseJsonConversionError(json_string,e) ResponseJsonConversionError(json_string, e)
# logger.error(f"JSONDecodeError:{json_string}:{e}")
return json_string return json_string
if __name__ == '__main__': if __name__ == '__main__':
from common.utils.environments import Environments from common.validation import loaders
from common import bif_functions
loader = loaders.Loaders()
dps = { dps = {
"{{var_a}}": "foo", "{{var_a}}": "foo",
@ -105,13 +111,8 @@ if __name__ == '__main__':
"{{var_f}}": ["baz", False], "{{var_f}}": ["baz", False],
"{{var_g}}": {'g': 'gg', 'g1': 'gg', 'g2': 'gg2'} "{{var_g}}": {'g': 'gg', 'g1': 'gg', 'g2': 'gg2'}
} }
loader.set_environments(dps)
d = Environments() loader.set_bif_fun(bif_functions)
d.set_environments(dps)
from common.validation import loaders
from common import bif_functions
loaders.Loaders().set_bif_fun(bif_functions)
dat = { dat = {
"a": "{{var_a}}", "a": "{{var_a}}",
"b": {"c": "{{var_c}}", "d": "{{var_d}}", "e": ["{{var_e_1}}", "{{var_e_2}}"]}, "b": {"c": "{{var_c}}", "d": "{{var_d}}", "e": ["{{var_e_1}}", "{{var_e_2}}"]},
@ -119,8 +120,9 @@ if __name__ == '__main__':
"g": "{{var_g}}", "g": "{{var_g}}",
"t": "{{get_timestamp()}}", "t": "{{get_timestamp()}}",
"fk": "{{fk().email()}}", "fk": "{{fk().email()}}",
"rt": "{{fk().ean(length=13)}}", "ft": "{{fk().ean(length=13)}}",
"st": "{{ms_fmt_hms(2000)}}" "st": "{{ms_fmt_hms(2000)}}",
"time": "{{random_id_card()}}",
} }
d = DependentParameter() ret = loader.replace_dependent_parameter(dat)
print(d.replace_dependent_parameter(dat)) print(ret)