def test_should_parse_redis_update_instance(self, mock_docstring_parser): mock_docstring_parser.parse_docstring.return_value = ( self.parse_docstring_return_value) target_fn = CloudRedisClient.list_instances result = cloud_client_parser.parse_action_method( "update_instance", target_fn) mock_docstring_parser.parse_docstring.assert_called_once_with( "DOCSTRING") self.assertEqual( ActionInfo( name="update_instance", desc=["TEXT1"], args={ "parent": ParameterInfo( name="parent", kind=TypeBrick(kind="str", indexes=[]), desc=["TEXT2"], ), "instance_id": ParameterInfo( name="instance_id", kind=TypeBrick(kind="str", indexes=[]), desc=["TEXT3"], ), }, return_kind=None, return_desc=[ "A :class:`~google.cloud.redis_v1.types._OperationFuture` instance." ], ), result, )
def test_should_look_at_method_and_action_args(self, mock_generate_constant_list): hook_method_blocks = [ MethodBlock( name="NAME", desc=None, args={"arg": ParameterBlock("arg")}, return_kind=None, return_desc=None, code_blocks=[], decorator_blocks=[], ) ] action_infos = [ ActionInfo( name="NAME2", desc=[], args={"arg2": ParameterInfo("arg2", kind=None, desc=[])}, return_kind=None, return_desc=None, ) ] result = hook_test_generator.generate_constants( hook_method_blocks, action_infos ) mock_generate_constant_list.assert_called_once_with({"arg": None, "arg2": None}) self.assertEqual("CONSTANTS", result)
def test_should_convert_with_not_matching_path_info(self): parameter = ParameterInfo( name="parent", kind=TypeBrick(kind="str", indexes=[]), desc=[ "Required. The resource name of the instance location using the form: " "``projects/{project_id}/locations/{location_id}`` where " "``locati`` refers to a GCP region" ], ) path_infos = { "location": PathInfo(name="location", args=["not_project", "not_location"]) } integration = Integration( service_name="SERVICE_NAME", class_prefix="CLASS_PREFIX", file_prefix="FILE_PREFFIX", client_path="CLOENT_PATH", ) req_params, opt_params, code = hook_generator.convert_path_parameter_block_to_individual_parameters( parameter, path_infos=path_infos, integration=integration) self.assertEqual( { "location": ParameterBlock( name="location", kind=TypeBrick(kind="str", indexes=[]), desc=["TODO: Fill description"], default_value=None, ) }, req_params, ) self.assertEqual( { "project_id": ParameterBlock( name="project_id", kind=TypeBrick(kind="str", indexes=[]), desc=["TODO: Fill description"], default_value="None", ) }, opt_params, ) self.assertEqual( CodeBlock( template_name="call_path.py.tpl", template_params={ "var_name": "parent", "fn_name": "TODO", "args": ["project_id", "location"], "client": TypeBrick(kind="CLOENT_PATH", indexes=[]), }, ), code, )
def _create_action_info(prefix: str): return ActionInfo( name=f"{prefix}NAME", desc=[f"{prefix}DESC_A", f"{prefix}DESC_B"], args={ f"{prefix}ARG_A": ParameterInfo( name=f"{prefix}ARG_A", kind=TypeBrick("str"), desc=[f"{prefix}DESC_C", f"{prefix}DESC_D"], ) }, return_kind=TypeBrick("float"), return_desc=[f"{prefix}DESC_E", f"{prefix}DESC_F"], )
def parse_action_method(name: str, method: Callable) -> ActionInfo: docstring = method.__doc__ if docstring is None: docstring = "None # TODO: Fill missing value" doc_sections = docstring_parser.parse_docstring(docstring) desc: Optional[List[str]] = None args: Dict[str, ParameterInfo] = {} return_kind: Optional[TypeBrick] = None return_desc: Optional[List[str]] = None for i, section in enumerate(doc_sections): if i == 0 and section.kind == "Text": assert isinstance(section.body, list) desc = section.body # type: ignore elif section.kind.lower() in ("args", "arguments", "parameters"): for arg in section.body: assert isinstance(arg, FieldBrick) args[arg.name] = ParameterInfo(name=arg.name, kind=arg.type_brick, desc=arg.desc[0].body) elif section.kind.lower() in ("return", "returns"): assert isinstance(section.body, list) assert len(section.body) == 1 assert isinstance(section.body[0], FieldBrick) field: FieldBrick = section.body[0] return_kind = field.type_brick return_desc = field.desc[0].body else: raise Exception(f"Unknown section: {section.kind}") assert desc is not None return ActionInfo( name=name, desc=desc, args=args, return_kind=return_kind, return_desc=return_desc, )
def test_generate_method_block( self, mock_convert_path_parameter_block_to_individual_parameters): action_info = ActionInfo( name="NAME", desc=["DESC_A", "DESC_B"], args={ "ARG_A": ParameterInfo(name="ARG_A", kind=TypeBrick("str"), desc=["DESC_C", "DESC_D"]) }, return_kind=TypeBrick("float"), return_desc=["DESC_E", "DESC_F"], ) integration = Integration( service_name="SERVICE_NAME", class_prefix="CLASS_PREFIX", file_prefix="FILE_PREFFIX", client_path="CLOENT_PATH", ) method_block = hook_generator.generate_method_block( action_info, path_infos="PATH_INFOS", integration=integration) self.assertEqual( MethodBlock( name="NAME", desc=["DESC_A", "DESC_B"], args={ "ARG_A": ParameterBlock( name="ARG_A", kind=TypeBrick(kind="str", indexes=[]), desc=["DESC_C", "DESC_D"], default_value=None, ) }, return_kind=TypeBrick(kind="float", indexes=[]), return_desc=["DESC_E", "DESC_F"], code_blocks=[ CodeBlock( template_name="method_call.py.tpl", template_params={ "var_name": "client", "target": "self.get_conn", "call_params": {}, }, ), CodeBlock( template_name="method_call.py.tpl", template_params={ "target": "client.NAME", "var_name": "result", "call_params": { "ARG_A": "ARG_A" }, }, ), CodeBlock( template_name="return.py.tpl", template_params={"var_name": "result"}, ), ], decorator_blocks=[], ), method_block, )