66import os
77import config
88
9-
109RPC_DEFINITION_FILE = os .path .join (config .PROTO_DIR , config .RPC_DEFINITION_FILE )
1110
11+
1212def get_rpcs_from_sets (descriptor , matches , single_responses , single_requests , repo_path , tree_ish , request_path ,
1313 response_path ):
1414 content = []
@@ -22,13 +22,15 @@ def get_rpcs_from_sets(descriptor, matches, single_responses, single_requests, r
2222
2323 request_type = request [1 ].type_name .split ('.' )[- 1 ]
2424 line = putils .get_line_number_for_location (descriptor .source_code_info , message_path )
25- request_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory , line )
25+ request_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory ,
26+ line )
2627 content .append (gen .generate_rpc_message (request_type , request [1 ].name , True , request_link ))
2728
2829 response_type = response [1 ].type_name .split ('.' )[- 1 ]
2930 message_path = [4 , response_path , 2 , response [0 ]]
3031 line = putils .get_line_number_for_location (descriptor .source_code_info , message_path )
31- response_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory , line )
32+ response_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory ,
33+ line )
3234 content .append (gen .generate_rpc_message (response_type , response [1 ].name , False , response_link ))
3335
3436 for single_request in single_requests :
@@ -39,7 +41,8 @@ def get_rpcs_from_sets(descriptor, matches, single_responses, single_requests, r
3941
4042 request_type = single_request [1 ].type_name .split ('.' )[- 1 ]
4143 line = putils .get_line_number_for_location (descriptor .source_code_info , message_path )
42- request_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory , line )
44+ request_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory ,
45+ line )
4346 content .append (gen .generate_rpc_message (request_type , single_request [1 ].name , False , request_link ))
4447
4548 for single_response in single_responses :
@@ -50,7 +53,8 @@ def get_rpcs_from_sets(descriptor, matches, single_responses, single_requests, r
5053
5154 request_type = single_response [1 ].type_name .split ('.' )[- 1 ]
5255 line = putils .get_line_number_for_location (descriptor .source_code_info , message_path )
53- request_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory , line )
56+ request_link = utils .generate_link (repo_path , tree_ish , os .path .basename (RPC_DEFINITION_FILE ), short_directory ,
57+ line )
5458 content .append (gen .generate_rpc_message (request_type , single_response [1 ].name , True , request_link ))
5559
5660 return content
@@ -62,17 +66,17 @@ def rpc(repo_path, tree_ish):
6266 descriptor_set = putils .load_descriptor_set ()
6367 for descriptor in descriptor_set .file :
6468 check_required_fields (descriptor )
65- matches , single_responses , single_requests = get_rpc_sets_from_file_descriptor (descriptor )
66- requests_path , _ = get_message_descriptor (descriptor , config .REQUESTS_MESSAGE_NAME )
67- responses_path , _ = get_message_descriptor (descriptor , config .RESPONSES_MESSAGE_NAME )
69+ matches , single_responses , single_requests = _get_rpc_sets_from_file_descriptor (descriptor )
70+ requests_path , _ = _get_message_descriptor (descriptor , config .REQUESTS_MESSAGE_NAME )
71+ responses_path , _ = _get_message_descriptor (descriptor , config .RESPONSES_MESSAGE_NAME )
6872 content .extend (get_rpcs_from_sets (descriptor , matches , single_responses , single_requests , repo_path , tree_ish ,
6973 requests_path , responses_path ))
7074 return '' .join (content )
7175
7276
73- def get_message_field_descriptors (file_descriptor , message_name ):
77+ def _get_message_field_descriptors (file_descriptor , message_name ):
7478 message_descriptors = []
75- _ , message_descriptor = get_message_descriptor (file_descriptor , message_name )
79+ _ , message_descriptor = _get_message_descriptor (file_descriptor , message_name )
7680 if not message_descriptor :
7781 raise Exception (f'No message with name "{ message_name } " found.' )
7882 for field_id , field in enumerate (message_descriptor .field ):
@@ -82,29 +86,29 @@ def get_message_field_descriptors(file_descriptor, message_name):
8286 return message_descriptors
8387
8488
85- def get_message_descriptor (file_descriptor , message_name ):
89+ def _get_message_descriptor (file_descriptor , message_name ):
8690 for message_index , message in enumerate (file_descriptor .message_type ):
8791 if message .name == message_name :
8892 return message_index , message
8993 return None
9094
9195
92- def is_request_present (file_descriptor ):
93- return get_message_descriptor (file_descriptor , config .REQUESTS_MESSAGE_NAME ) is not None
96+ def _is_request_present (file_descriptor ):
97+ return _get_message_descriptor (file_descriptor , config .REQUESTS_MESSAGE_NAME ) is not None
9498
9599
96- def is_response_resent (file_descriptor ):
97- return get_message_descriptor (file_descriptor , config .RESPONSES_MESSAGE_NAME ) is not None
100+ def _is_response_resent (file_descriptor ):
101+ return _get_message_descriptor (file_descriptor , config .RESPONSES_MESSAGE_NAME ) is not None
98102
99103
100- def get_rpc_sets_from_file_descriptor (file_descriptor ):
101- if not is_request_present (file_descriptor ):
104+ def _get_rpc_sets_from_file_descriptor (file_descriptor ):
105+ if not _is_request_present (file_descriptor ):
102106 raise Exception ('Request message not present.' )
103- if not is_response_resent (file_descriptor ):
107+ if not _is_response_resent (file_descriptor ):
104108 raise Exception ('Response message not present.' )
105- request_messages = get_message_field_descriptors (file_descriptor , config .REQUESTS_MESSAGE_NAME )
106- response_messages = get_message_field_descriptors (file_descriptor , config .RESPONSES_MESSAGE_NAME )
107- matches , leftover_requests , leftover_responses = get_matches (request_messages , response_messages )
109+ request_messages = _get_message_field_descriptors (file_descriptor , config .REQUESTS_MESSAGE_NAME )
110+ response_messages = _get_message_field_descriptors (file_descriptor , config .RESPONSES_MESSAGE_NAME )
111+ matches , leftover_requests , leftover_responses = _get_matches (request_messages , response_messages )
108112 for left_request in leftover_requests :
109113 if left_request [1 ].name .endswith (config .REQUESTS_MESSAGE_NAME ):
110114 raise Exception (f'No matching response for { left_request .name } ' )
@@ -114,7 +118,7 @@ def get_rpc_sets_from_file_descriptor(file_descriptor):
114118 return matches , leftover_requests , leftover_responses
115119
116120
117- def get_matches (requests , responses ):
121+ def _get_matches (requests , responses ):
118122 matches = []
119123 leftover_requests = []
120124 leftover_responses = responses .copy ()
@@ -134,16 +138,18 @@ def get_matches(requests, responses):
134138
135139
136140def check_required_fields (file_descriptor ):
137- _ , request_descriptor = get_message_descriptor (file_descriptor , config .REQUESTS_MESSAGE_NAME )
138- request_fields = [field .name for field in request_descriptor .field ]
139- for required_field in config .REQUIRED_REQUEST_FIELDS :
140- if required_field in request_fields :
141- continue
142- raise Exception (f'Required field "{ required_field } " not present in request message.' )
141+ _ , request_descriptor = _get_message_descriptor (file_descriptor , config .REQUESTS_MESSAGE_NAME )
142+ request_fields = {field .name : field .number for field in request_descriptor .field }
143+ _check_for_missing_fields (request_fields , config .REQUIRED_REQUEST_FIELDS )
143144
144- _ , response_descriptor = get_message_descriptor (file_descriptor , config .RESPONSES_MESSAGE_NAME )
145- response_fields = [field .name for field in response_descriptor .field ]
146- for required_field in config .REQUIRED_RESPONSE_FIELDS :
147- if required_field in response_fields :
148- continue
149- raise Exception (f'Required field "{ required_field } " not present in response message.' )
145+ _ , response_descriptor = _get_message_descriptor (file_descriptor , config .RESPONSES_MESSAGE_NAME )
146+ response_fields = {field .name : field .number for field in response_descriptor .field }
147+ _check_for_missing_fields (response_fields , config .REQUIRED_RESPONSE_FIELDS )
148+
149+
150+ def _check_for_missing_fields (existing_fields , required_fields ):
151+ for required_field_name , required_field_number in required_fields :
152+ if required_field_name not in existing_fields :
153+ raise Exception (f'Required field "{ required_field_name } " not present in response message.' )
154+ if existing_fields [required_field_name ] != required_field_number :
155+ raise Exception (f'Required field "{ required_field_name } " in response message has incorrect number. Expected { required_field_number } , got { existing_fields [required_field_name ]} .' )
0 commit comments