Skip to content

Commit 4434a54

Browse files
committed
feat(openapi) fix issue where parameters weren't required
1 parent e4c9d89 commit 4434a54

5 files changed

Lines changed: 31 additions & 25 deletions

File tree

staxapp/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
import requests
55

6-
from staxapp.exceptions import ApiException
76
from staxapp.config import Config
7+
from staxapp.exceptions import ApiException
88

99

1010
class Api:

staxapp/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#!/usr/local/bin/python3
22
import logging
3-
import jwt
43
import sys
54
from datetime import date, datetime, timedelta, timezone
65

76
import boto3
7+
import jwt
88
from aws_requests_auth.aws_auth import AWSRequestsAuth
99
from botocore import UNSIGNED
1010
from botocore.client import Config as BotoConfig

staxapp/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33

44
import requests
5+
56
from staxapp.exceptions import ApiException
67

78
logging.getLogger().setLevel(logging.DEBUG)

staxapp/contract.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import json
22
import logging
33
import os
4-
import requests
54
from contextlib import suppress
65

7-
from staxapp.exceptions import ValidationException
8-
from staxapp.config import Config
9-
6+
import requests
107
from jsonschema import validate as json_validate
118
from prance import ResolvingParser
129

10+
from staxapp.config import Config
11+
from staxapp.exceptions import ValidationException
12+
1313
logging.getLogger("openapi_spec_validator.validators").setLevel(logging.WARNING)
1414

1515

staxapp/openapi.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from jsonschema import validate
88
from prance import ResolvingParser
99

10-
1110
from staxapp.api import Api
1211
from staxapp.auth import ApiTokenAuth
1312
from 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

Comments
 (0)