77from jsonschema import validate
88from prance import ResolvingParser
99
10-
1110from staxapp .api import Api
1211from staxapp .auth import ApiTokenAuth
1312from staxapp .config import ApiException , Config
@@ -82,15 +81,14 @@ def _map_paths_to_operations(cls):
8281
8382 if not cls ._operation_map .get (api_class ):
8483 cls ._operation_map [api_class ] = dict ()
85- cls ._operation_map [api_class ][method_name ] = dict ()
86- cls ._operation_map [api_class ][method_name ]["path" ] = base_path
87- cls ._operation_map [api_class ][method_name ]["method" ] = method_type
88- if len (parameters ) > len (
89- cls ._operation_map [api_class ][method_name ].get ("parameters" , [])
90- ):
91- cls ._operation_map [api_class ][method_name ][
92- "parameters"
93- ] = parameters
84+ if not cls ._operation_map .get (api_class , {}).get (method_name ):
85+ cls ._operation_map [api_class ][method_name ] = dict ()
86+ cls ._operation_map [api_class ][method_name ]["path" ] = base_path
87+ cls ._operation_map [api_class ][method_name ]["method" ] = method_type
88+ cls ._operation_map [api_class ][method_name ]["parameters" ] = []
89+ cls ._operation_map [api_class ][method_name ]["parameters" ].append (
90+ parameters
91+ )
9492
9593 def __getattr__ (self , name ):
9694 self .name = name
@@ -104,18 +102,25 @@ def stax_wrapper(*args, **kwargs):
104102 )
105103 payload = {** kwargs }
106104 parameters = ""
107- preceding_parameter = False
108105 # All parameters starting with the most dependant
109- all_schema_parameters = self ._operation_map [self .classname ][self .name ].get (
106+ operation_parameters = self ._operation_map [self .classname ][self .name ].get (
110107 "parameters" , []
111108 )
112- # Get any parameters from the keyword args and remove them from the payload
113- for parameter in all_schema_parameters [::- 1 ]:
114- if parameter in payload :
115- parameters = f"/{ payload .pop (parameter , None )} { parameters } "
116- preceding_parameter = True
117- elif preceding_parameter :
118- raise ValidationException (f"Missing parameter: { parameter } " )
109+ # Sort the operation map parameters
110+ sorted_operation_parameters = sorted (
111+ operation_parameters , key = len , reverse = True
112+ )
113+
114+ # Check if the any of the parameter schemas match parameters provided
115+ for parameter_list in sorted_operation_parameters :
116+ # Get any parameters from the keyword args and remove them from the payload
117+ if set (parameter_list ).issubset (payload .keys ()):
118+ for parameter in parameter_list :
119+ parameters = f"{ parameters } /{ payload .pop (parameter , None )} "
120+ if parameters .count ("/" ) < len (sorted_operation_parameters [- 1 ]):
121+ raise ValidationException (
122+ f"Missing one or more parameters: { sorted_operation_parameters [- 1 ]} "
123+ )
119124
120125 if method ["method" ].lower () in ["put" , "post" ]:
121126 # We only validate the payload for POST/PUT routes
0 commit comments