From 5ec044c1e07417d89d977dbc866d460ddb15aa3c Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 21 Apr 2020 12:54:57 +0800 Subject: [PATCH] feat: call with python builtin functions --- httprunner/v3/parser.py | 52 +++++++++++++++++++++++++++++++++--- httprunner/v3/parser_test.py | 5 ++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/httprunner/v3/parser.py b/httprunner/v3/parser.py index 1cfe8e98..617b0b02 100644 --- a/httprunner/v3/parser.py +++ b/httprunner/v3/parser.py @@ -1,7 +1,9 @@ import ast +import builtins import re from typing import Any, Set, Text, Callable, Tuple, List, Dict, Union +from httprunner import loader, utils from httprunner.v3 import exceptions from httprunner.v3.exceptions import VariableNotFound, FunctionNotFound @@ -180,6 +182,51 @@ def parse_function_params(params): return function_meta +def get_mapping_function(function_name: Text, functions_mapping: Dict[Text, Callable]) -> Callable: + """ get function from functions_mapping, + if not found, then try to check if builtin function. + + Args: + function_name (str): function name + functions_mapping (dict): functions mapping + + Returns: + mapping function object. + + Raises: + exceptions.FunctionNotFound: function is neither defined in debugtalk.py nor builtin. + + """ + if function_name in functions_mapping: + return functions_mapping[function_name] + + elif function_name in ["parameterize", "P"]: + return loader.load_csv_file + + elif function_name in ["environ", "ENV"]: + return utils.get_os_environ + + elif function_name in ["multipart_encoder", "multipart_content_type"]: + # extension for upload test + from httprunner.ext import uploader + return getattr(uploader, function_name) + + try: + # check if HttpRunner builtin functions + built_in_functions = loader.load_builtin_functions() + return built_in_functions[function_name] + except KeyError: + pass + + try: + # check if Python builtin functions + return getattr(builtins, function_name) + except AttributeError: + pass + + raise exceptions.FunctionNotFound(f"{function_name} is not found.") + + def parse_string( raw_string: Text, variables_mapping: Dict[Text, Any], @@ -225,10 +272,7 @@ def parse_string( func_match = function_regex_compile.match(raw_string, match_start_position) if func_match: func_name = func_match.group(1) - try: - func = functions_mapping[func_name] - except KeyError: - raise FunctionNotFound(f"{func_name} not found in {functions_mapping}") + func = get_mapping_function(func_name, functions_mapping) func_params_str = func_match.group(2) function_meta = parse_function_params(func_params_str) diff --git a/httprunner/v3/parser_test.py b/httprunner/v3/parser_test.py index e7957614..ee42c525 100644 --- a/httprunner/v3/parser_test.py +++ b/httprunner/v3/parser_test.py @@ -364,9 +364,8 @@ class TestParserBasic(unittest.TestCase): value = parser.parse_data("ABC$var_5${func1($var_1, $var_3)}", variables_mapping, functions_mapping) self.assertEqual(value, "ABCTrueabc123") - # TODO: Python builtin functions - # value = parser.parse_data("ABC${ord(a)}DEF${len(abcd)}", variables_mapping, functions_mapping) - # self.assertEqual(value, "ABC97DEF4") + value = parser.parse_data("ABC${ord(a)}DEF${len(abcd)}", variables_mapping, functions_mapping) + self.assertEqual(value, "ABC97DEF4") def test_parse_data_func_var_duplicate(self): variables_mapping = {